@dxos/plugin-space 0.8.4-main.c85a9c8dae → 0.8.4-main.d05673bc65

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 (344) hide show
  1. package/dist/lib/browser/{CollectionArticle-WASDM637.mjs → CollectionArticle-WPLUW5HF.mjs} +5 -36
  2. package/dist/lib/browser/CollectionArticle-WPLUW5HF.mjs.map +7 -0
  3. package/dist/lib/browser/{CollectionSection-LK4O6QDD.mjs → CollectionSection-H2MBNI63.mjs} +2 -2
  4. package/dist/lib/browser/{CreateObjectDialog-MA6DPYMD.mjs → CreateObjectDialog-YUBUWSEL.mjs} +17 -21
  5. package/dist/lib/browser/CreateObjectDialog-YUBUWSEL.mjs.map +7 -0
  6. package/dist/lib/browser/{CreateSpaceDialog-WCEICWIE.mjs → CreateSpaceDialog-3M2LAWV6.mjs} +7 -7
  7. package/dist/lib/browser/CreateSpaceDialog-3M2LAWV6.mjs.map +7 -0
  8. package/dist/lib/browser/{InlineSyncStatus-BT7BRBCO.mjs → InlineSyncStatus-K5MZ3YMZ.mjs} +9 -18
  9. package/dist/lib/browser/InlineSyncStatus-K5MZ3YMZ.mjs.map +7 -0
  10. package/dist/lib/browser/{JoinDialog-PMCAIRCU.mjs → JoinDialog-PBK2RE5F.mjs} +8 -10
  11. package/dist/lib/browser/JoinDialog-PBK2RE5F.mjs.map +7 -0
  12. package/dist/lib/browser/{MembersContainer-MMFCXLVZ.mjs → MembersContainer-OGYV2L4M.mjs} +4 -4
  13. package/dist/lib/browser/{MenuFooter-HYBTNOBT.mjs → MenuFooter-XCBDK7WP.mjs} +3 -4
  14. package/dist/lib/{node-esm/MenuFooter-2QB3453Y.mjs.map → browser/MenuFooter-XCBDK7WP.mjs.map} +1 -1
  15. package/dist/lib/browser/{ObjectCardStack-CHWNLUYQ.mjs → ObjectCardStack-OMXF2DSG.mjs} +6 -6
  16. package/dist/lib/browser/{ObjectDetails-YUGVDNSA.mjs → ObjectDetails-QFTQQN4W.mjs} +6 -6
  17. package/dist/lib/browser/{ObjectRenamePopover-RQUOVPFH.mjs → ObjectRenamePopover-JNPJIFIR.mjs} +3 -3
  18. package/dist/lib/browser/{ObjectRenamePopover-RQUOVPFH.mjs.map → ObjectRenamePopover-JNPJIFIR.mjs.map} +1 -1
  19. package/dist/lib/browser/{RecordArticle-ONWKYM3Z.mjs → RecordArticle-BO2XHBFN.mjs} +2 -2
  20. package/dist/lib/browser/{SchemaContainer-62AJXKAF.mjs → SchemaContainer-QWCSIZBS.mjs} +2 -2
  21. package/dist/lib/browser/SmallPresenceLive-AHHLBAUP.mjs +9 -0
  22. package/dist/lib/browser/{SpacePluginSettings-BRJTADV5.mjs → SpacePluginSettings-QGZKNQLK.mjs} +4 -4
  23. package/dist/lib/browser/SpacePresence-JIWLBUWO.mjs +12 -0
  24. package/dist/lib/browser/{SpaceRenamePopover-SAKMPDLX.mjs → SpaceRenamePopover-ZL6RRZ2B.mjs} +3 -3
  25. package/dist/lib/browser/{SpaceRenamePopover-SAKMPDLX.mjs.map → SpaceRenamePopover-ZL6RRZ2B.mjs.map} +1 -1
  26. package/dist/lib/browser/{SpaceSettingsContainer-UBMVKUPR.mjs → SpaceSettingsContainer-MIOOT63N.mjs} +5 -5
  27. package/dist/lib/browser/SpaceSettingsContainer-MIOOT63N.mjs.map +7 -0
  28. package/dist/lib/browser/{SyncStatus-5UQ7CIII.mjs → SyncStatus-6N7JJ7XF.mjs} +6 -6
  29. package/dist/lib/browser/{ViewEditor-F74RR542.mjs → ViewEditor-3FX5HDRT.mjs} +4 -7
  30. package/dist/lib/browser/ViewEditor-3FX5HDRT.mjs.map +7 -0
  31. package/dist/lib/browser/app-graph-builder-JORZZE3P.mjs +1203 -0
  32. package/dist/lib/browser/app-graph-builder-JORZZE3P.mjs.map +7 -0
  33. package/dist/lib/browser/{app-graph-serializer-KTQOBYUF.mjs → app-graph-serializer-UZWWGLGY.mjs} +5 -5
  34. package/dist/lib/browser/{chunk-RWOK4F4G.mjs → chunk-2WHUSAHE.mjs} +17 -14
  35. package/dist/lib/browser/chunk-2WHUSAHE.mjs.map +7 -0
  36. package/dist/lib/browser/{chunk-USN5QKRV.mjs → chunk-6IT5IBB5.mjs} +54 -86
  37. package/dist/lib/browser/chunk-6IT5IBB5.mjs.map +7 -0
  38. package/dist/lib/browser/chunk-6OA75CWN.mjs +77 -0
  39. package/dist/lib/browser/chunk-6OA75CWN.mjs.map +7 -0
  40. package/dist/lib/browser/{chunk-PXVKN4LU.mjs → chunk-AUX3RRLY.mjs} +34 -9
  41. package/dist/lib/browser/chunk-AUX3RRLY.mjs.map +7 -0
  42. package/dist/lib/browser/{chunk-HSMQFM57.mjs → chunk-CBWGVOJE.mjs} +2 -2
  43. package/dist/lib/browser/{chunk-HSMQFM57.mjs.map → chunk-CBWGVOJE.mjs.map} +1 -1
  44. package/dist/lib/browser/{chunk-XIIYC7P5.mjs → chunk-ICXESMDI.mjs} +6 -6
  45. package/dist/lib/browser/chunk-ICXESMDI.mjs.map +7 -0
  46. package/dist/lib/browser/chunk-RJUOHI3B.mjs +19 -0
  47. package/dist/lib/browser/{chunk-ASV6DYFH.mjs.map → chunk-RJUOHI3B.mjs.map} +1 -1
  48. package/dist/lib/browser/{chunk-J5F4LUJD.mjs → chunk-SSTUPFZ2.mjs} +3 -3
  49. package/dist/lib/browser/{chunk-ABCDB5YC.mjs → chunk-UYOJYBGW.mjs} +7 -16
  50. package/dist/lib/browser/chunk-UYOJYBGW.mjs.map +7 -0
  51. package/dist/lib/browser/cli/index.mjs +8 -17
  52. package/dist/lib/browser/cli/index.mjs.map +3 -3
  53. package/dist/lib/browser/{identity-created-VKLIZOXJ.mjs → identity-created-ETXNQYR6.mjs} +4 -4
  54. package/dist/lib/browser/{identity-created-VKLIZOXJ.mjs.map → identity-created-ETXNQYR6.mjs.map} +3 -3
  55. package/dist/lib/browser/index.mjs +33 -53
  56. package/dist/lib/browser/index.mjs.map +3 -3
  57. package/dist/lib/browser/meta.json +1 -1
  58. package/dist/lib/browser/{operation-resolver-Y3HYRXX7.mjs → operation-resolver-D4LHB4D4.mjs} +64 -88
  59. package/dist/lib/browser/operation-resolver-D4LHB4D4.mjs.map +7 -0
  60. package/dist/lib/browser/{react-root-UYBW5RE7.mjs → react-root-OD2HP63B.mjs} +6 -6
  61. package/dist/lib/browser/{react-surface-NJ23NZFF.mjs → react-surface-E4TAFED5.mjs} +57 -79
  62. package/dist/lib/browser/react-surface-E4TAFED5.mjs.map +7 -0
  63. package/dist/lib/browser/repair-NUVEV4AK.mjs +31 -0
  64. package/dist/lib/browser/repair-NUVEV4AK.mjs.map +7 -0
  65. package/dist/lib/browser/{settings-2ELVUFDR.mjs → settings-RUDP2Q56.mjs} +3 -3
  66. package/dist/lib/browser/{spaces-ready-Q6JASPT4.mjs → spaces-ready-B2GYL5IN.mjs} +6 -6
  67. package/dist/lib/browser/spaces-ready-B2GYL5IN.mjs.map +7 -0
  68. package/dist/lib/browser/{state-CTX4WQOM.mjs → state-I6JDZCDE.mjs} +5 -5
  69. package/dist/lib/browser/{state-CTX4WQOM.mjs.map → state-I6JDZCDE.mjs.map} +2 -2
  70. package/dist/lib/browser/types/index.mjs +2 -2
  71. package/dist/lib/node-esm/{CollectionArticle-A6GGG73Z.mjs → CollectionArticle-JGVNBX66.mjs} +5 -36
  72. package/dist/lib/node-esm/CollectionArticle-JGVNBX66.mjs.map +7 -0
  73. package/dist/lib/node-esm/{CollectionSection-WWKDOAAT.mjs → CollectionSection-BI66Y34F.mjs} +2 -2
  74. package/dist/lib/node-esm/{CreateObjectDialog-4WEFNDDF.mjs → CreateObjectDialog-B6OLP5VQ.mjs} +17 -21
  75. package/dist/lib/node-esm/CreateObjectDialog-B6OLP5VQ.mjs.map +7 -0
  76. package/dist/lib/node-esm/{CreateSpaceDialog-P7QCPB5J.mjs → CreateSpaceDialog-J47M5FPQ.mjs} +7 -7
  77. package/dist/lib/node-esm/CreateSpaceDialog-J47M5FPQ.mjs.map +7 -0
  78. package/dist/lib/node-esm/{InlineSyncStatus-3PCXU7NX.mjs → InlineSyncStatus-BLD57LB5.mjs} +9 -18
  79. package/dist/lib/node-esm/InlineSyncStatus-BLD57LB5.mjs.map +7 -0
  80. package/dist/lib/node-esm/{JoinDialog-XEOLJZVN.mjs → JoinDialog-XCOYKSHA.mjs} +8 -10
  81. package/dist/lib/node-esm/JoinDialog-XCOYKSHA.mjs.map +7 -0
  82. package/dist/lib/node-esm/{MembersContainer-UQZLW3YA.mjs → MembersContainer-4PV3Z4BA.mjs} +4 -4
  83. package/dist/lib/node-esm/{MenuFooter-2QB3453Y.mjs → MenuFooter-PXG2GV6A.mjs} +3 -4
  84. package/dist/lib/node-esm/{ObjectCardStack-UXEWG6RV.mjs → ObjectCardStack-457SNNVF.mjs} +6 -6
  85. package/dist/lib/node-esm/{ObjectDetails-26PVHUQL.mjs → ObjectDetails-OLF7HSM4.mjs} +6 -6
  86. package/dist/lib/node-esm/{ObjectRenamePopover-EHTP76G7.mjs → ObjectRenamePopover-BRPKVNVF.mjs} +3 -3
  87. package/dist/lib/node-esm/{ObjectRenamePopover-EHTP76G7.mjs.map → ObjectRenamePopover-BRPKVNVF.mjs.map} +1 -1
  88. package/dist/lib/node-esm/{RecordArticle-APY2WKUW.mjs → RecordArticle-XUIT25PP.mjs} +2 -2
  89. package/dist/lib/node-esm/{SchemaContainer-XR2D6MYX.mjs → SchemaContainer-5G4R3Z6O.mjs} +2 -2
  90. package/dist/lib/node-esm/SmallPresenceLive-4K7RJS74.mjs +10 -0
  91. package/dist/lib/node-esm/SmallPresenceLive-4K7RJS74.mjs.map +7 -0
  92. package/dist/lib/node-esm/{SpacePluginSettings-VEB5IGG7.mjs → SpacePluginSettings-PENV4GHL.mjs} +4 -4
  93. package/dist/lib/node-esm/SpacePresence-H3VZWFJV.mjs +13 -0
  94. package/dist/lib/node-esm/SpacePresence-H3VZWFJV.mjs.map +7 -0
  95. package/dist/lib/node-esm/{SpaceRenamePopover-WHM632OT.mjs → SpaceRenamePopover-XEMTI4PU.mjs} +3 -3
  96. package/dist/lib/node-esm/{SpaceRenamePopover-WHM632OT.mjs.map → SpaceRenamePopover-XEMTI4PU.mjs.map} +1 -1
  97. package/dist/lib/node-esm/{SpaceSettingsContainer-Y62J2L65.mjs → SpaceSettingsContainer-WI4D7RWA.mjs} +5 -5
  98. package/dist/lib/node-esm/SpaceSettingsContainer-WI4D7RWA.mjs.map +7 -0
  99. package/dist/lib/node-esm/{SyncStatus-XTJAVHPN.mjs → SyncStatus-YEBGTNSD.mjs} +6 -6
  100. package/dist/lib/node-esm/{ViewEditor-B2BLYF5U.mjs → ViewEditor-CUQVNM2H.mjs} +4 -7
  101. package/dist/lib/node-esm/ViewEditor-CUQVNM2H.mjs.map +7 -0
  102. package/dist/lib/node-esm/app-graph-builder-WTM6SSX7.mjs +1204 -0
  103. package/dist/lib/node-esm/app-graph-builder-WTM6SSX7.mjs.map +7 -0
  104. package/dist/lib/node-esm/{app-graph-serializer-GXQYSQAZ.mjs → app-graph-serializer-RT2RQTV2.mjs} +5 -5
  105. package/dist/lib/node-esm/{chunk-OSFH2XKO.mjs → chunk-2OLR2ZKH.mjs} +6 -6
  106. package/dist/lib/node-esm/chunk-2OLR2ZKH.mjs.map +7 -0
  107. package/dist/lib/node-esm/chunk-5KTTTTEX.mjs +20 -0
  108. package/dist/lib/node-esm/{chunk-CVXULIYC.mjs.map → chunk-5KTTTTEX.mjs.map} +1 -1
  109. package/dist/lib/node-esm/{chunk-SL4BJSUG.mjs → chunk-63N5JJXI.mjs} +2 -2
  110. package/dist/lib/node-esm/{chunk-SL4BJSUG.mjs.map → chunk-63N5JJXI.mjs.map} +1 -1
  111. package/dist/lib/node-esm/{chunk-UJQUBDQS.mjs → chunk-EDC2RUJU.mjs} +7 -16
  112. package/dist/lib/node-esm/chunk-EDC2RUJU.mjs.map +7 -0
  113. package/dist/lib/node-esm/{chunk-3DWZCVVQ.mjs → chunk-EVNSLSQS.mjs} +54 -86
  114. package/dist/lib/node-esm/chunk-EVNSLSQS.mjs.map +7 -0
  115. package/dist/lib/node-esm/chunk-GEGWQVZX.mjs +78 -0
  116. package/dist/lib/node-esm/chunk-GEGWQVZX.mjs.map +7 -0
  117. package/dist/lib/node-esm/{chunk-P2AVANDG.mjs → chunk-RYQQXNI7.mjs} +34 -9
  118. package/dist/lib/node-esm/chunk-RYQQXNI7.mjs.map +7 -0
  119. package/dist/lib/node-esm/{chunk-GWUPFA7J.mjs → chunk-S5BQUCL4.mjs} +17 -14
  120. package/dist/lib/node-esm/chunk-S5BQUCL4.mjs.map +7 -0
  121. package/dist/lib/node-esm/{chunk-S2IELCDF.mjs → chunk-XYLDAH5C.mjs} +3 -3
  122. package/dist/lib/node-esm/cli/index.mjs +8 -17
  123. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  124. package/dist/lib/node-esm/{identity-created-EGSTETJ5.mjs → identity-created-U5LGULVL.mjs} +4 -4
  125. package/dist/lib/node-esm/{identity-created-EGSTETJ5.mjs.map → identity-created-U5LGULVL.mjs.map} +3 -3
  126. package/dist/lib/node-esm/index.mjs +33 -53
  127. package/dist/lib/node-esm/index.mjs.map +3 -3
  128. package/dist/lib/node-esm/meta.json +1 -1
  129. package/dist/lib/node-esm/{operation-resolver-IRQ2NVUQ.mjs → operation-resolver-IL2AHNPN.mjs} +64 -88
  130. package/dist/lib/node-esm/operation-resolver-IL2AHNPN.mjs.map +7 -0
  131. package/dist/lib/node-esm/{react-root-UEN3LLJD.mjs → react-root-RILC5MBD.mjs} +6 -6
  132. package/dist/lib/node-esm/{react-surface-UDO3PGH6.mjs → react-surface-SWKRVK4S.mjs} +57 -79
  133. package/dist/lib/node-esm/react-surface-SWKRVK4S.mjs.map +7 -0
  134. package/dist/lib/node-esm/repair-LRZHFPSJ.mjs +32 -0
  135. package/dist/lib/node-esm/repair-LRZHFPSJ.mjs.map +7 -0
  136. package/dist/lib/node-esm/{settings-DCTVM2BV.mjs → settings-3EKSEAAG.mjs} +3 -3
  137. package/dist/lib/node-esm/{spaces-ready-XLGRTJV2.mjs → spaces-ready-QK3EHBOS.mjs} +6 -6
  138. package/dist/lib/node-esm/spaces-ready-QK3EHBOS.mjs.map +7 -0
  139. package/dist/lib/node-esm/{state-G74V3WZG.mjs → state-W36RRYUO.mjs} +5 -5
  140. package/dist/lib/node-esm/{state-G74V3WZG.mjs.map → state-W36RRYUO.mjs.map} +2 -2
  141. package/dist/lib/node-esm/types/index.mjs +2 -2
  142. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  143. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -2
  144. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  145. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts +33 -0
  146. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts.map +1 -0
  147. package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts +19 -0
  148. package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts.map +1 -0
  149. package/dist/types/src/capabilities/app-graph-builder/extensions/index.d.ts +6 -0
  150. package/dist/types/src/capabilities/app-graph-builder/extensions/index.d.ts.map +1 -0
  151. package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts +12 -0
  152. package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts.map +1 -0
  153. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts +57 -0
  154. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts.map +1 -0
  155. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.test.d.ts +2 -0
  156. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.test.d.ts.map +1 -0
  157. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts +24 -0
  158. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts.map +1 -0
  159. package/dist/types/src/capabilities/app-graph-builder/extensions/types.d.ts +38 -0
  160. package/dist/types/src/capabilities/app-graph-builder/extensions/types.d.ts.map +1 -0
  161. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  162. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  163. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -1
  164. package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
  165. package/dist/types/src/cli/commands/database/add.d.ts +0 -1
  166. package/dist/types/src/cli/commands/database/add.d.ts.map +1 -1
  167. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  168. package/dist/types/src/components/AwaitingObject/AwaitingObject.d.ts.map +1 -0
  169. package/dist/types/src/components/AwaitingObject/index.d.ts +2 -0
  170. package/dist/types/src/components/AwaitingObject/index.d.ts.map +1 -0
  171. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +0 -1
  172. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  173. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts +68 -14
  174. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -1
  176. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts +1 -2
  177. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts.map +1 -1
  178. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts +2 -1
  179. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts.map +1 -1
  180. package/dist/types/src/containers/CreateObjectDialog/index.d.ts +2 -2
  181. package/dist/types/src/containers/CreateObjectDialog/index.d.ts.map +1 -1
  182. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts.map +1 -1
  183. package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts.map +1 -1
  184. package/dist/types/src/containers/JoinDialog/index.d.ts +2 -2
  185. package/dist/types/src/containers/JoinDialog/index.d.ts.map +1 -1
  186. package/dist/types/src/containers/ObjectDetails/ObjectDetails.d.ts +1 -0
  187. package/dist/types/src/containers/ObjectDetails/ObjectDetails.d.ts.map +1 -1
  188. package/dist/types/src/containers/SmallPresenceLive/index.d.ts +1 -1
  189. package/dist/types/src/containers/SmallPresenceLive/index.d.ts.map +1 -1
  190. package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts.map +1 -1
  191. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts +67 -13
  192. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts.map +1 -1
  193. package/dist/types/src/containers/SpacePresence/index.d.ts +2 -2
  194. package/dist/types/src/containers/SpacePresence/index.d.ts.map +1 -1
  195. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts +67 -13
  196. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts.map +1 -1
  197. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts +67 -13
  198. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  199. package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts.map +1 -1
  200. package/dist/types/src/containers/index.d.ts +1 -1
  201. package/dist/types/src/containers/index.d.ts.map +1 -1
  202. package/dist/types/src/translations.d.ts +67 -13
  203. package/dist/types/src/translations.d.ts.map +1 -1
  204. package/dist/types/src/types/form.d.ts +0 -2
  205. package/dist/types/src/types/form.d.ts.map +1 -1
  206. package/dist/types/src/types/types.d.ts +29 -46
  207. package/dist/types/src/types/types.d.ts.map +1 -1
  208. package/dist/types/src/util.d.ts +4 -161
  209. package/dist/types/src/util.d.ts.map +1 -1
  210. package/dist/types/tsconfig.tsbuildinfo +1 -1
  211. package/package.json +57 -57
  212. package/src/SpacePlugin.ts +14 -22
  213. package/src/capabilities/app-graph-builder/app-graph-builder.ts +14 -657
  214. package/src/capabilities/app-graph-builder/extensions/collections.ts +351 -0
  215. package/src/capabilities/app-graph-builder/extensions/companions.ts +80 -0
  216. package/src/capabilities/app-graph-builder/extensions/index.ts +9 -0
  217. package/src/capabilities/app-graph-builder/extensions/settings.ts +60 -0
  218. package/src/capabilities/app-graph-builder/extensions/shared.test.ts +112 -0
  219. package/src/capabilities/app-graph-builder/extensions/shared.ts +171 -0
  220. package/src/capabilities/app-graph-builder/extensions/spaces.ts +338 -0
  221. package/src/capabilities/app-graph-builder/extensions/types.ts +421 -0
  222. package/src/capabilities/identity-created/identity-created.ts +3 -3
  223. package/src/capabilities/operation-resolver/operation-resolver.ts +65 -73
  224. package/src/capabilities/react-surface/react-surface.tsx +33 -58
  225. package/src/capabilities/repair/repair.ts +3 -32
  226. package/src/capabilities/spaces-ready/spaces-ready.ts +2 -2
  227. package/src/capabilities/state/state.ts +4 -2
  228. package/src/cli/commands/database/add.ts +0 -1
  229. package/src/cli/commands/space/close/close.ts +1 -1
  230. package/src/cli/commands/space/create/create.ts +1 -1
  231. package/src/cli/commands/space/join/join.ts +1 -1
  232. package/src/cli/commands/space/open/open.ts +1 -1
  233. package/src/cli/plugin.ts +0 -1
  234. package/src/components/{AwaitingObject.tsx → AwaitingObject/AwaitingObject.tsx} +2 -2
  235. package/src/components/AwaitingObject/index.ts +5 -0
  236. package/src/components/CreateDialog/CreateObjectPanel.tsx +5 -2
  237. package/src/components/ObjectDetails/BaseObjectSettings.stories.tsx +4 -4
  238. package/src/components/ObjectDetails/BaseObjectSettings.tsx +4 -4
  239. package/src/components/ObjectForm/ObjectForm.tsx +6 -4
  240. package/src/constants.ts +5 -5
  241. package/src/containers/CollectionArticle/CollectionArticle.tsx +7 -54
  242. package/src/containers/CreateObjectDialog/CreateObjectDialog.tsx +10 -10
  243. package/src/containers/CreateObjectDialog/index.ts +2 -3
  244. package/src/containers/CreateSpaceDialog/CreateSpaceDialog.tsx +5 -3
  245. package/src/containers/InlineSyncStatus/InlineSyncStatus.tsx +7 -18
  246. package/src/containers/JoinDialog/JoinDialog.tsx +4 -4
  247. package/src/containers/JoinDialog/index.ts +2 -3
  248. package/src/containers/ObjectRenamePopover/ObjectRenamePopover.tsx +1 -1
  249. package/src/containers/SmallPresenceLive/index.ts +1 -1
  250. package/src/containers/SpacePresence/SpacePresence.tsx +4 -16
  251. package/src/containers/SpacePresence/index.ts +2 -3
  252. package/src/containers/SpaceRenamePopover/SpaceRenamePopover.tsx +1 -1
  253. package/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.tsx +2 -2
  254. package/src/containers/ViewEditor/ViewEditor.tsx +0 -1
  255. package/src/containers/index.ts +1 -1
  256. package/src/helpers/query.test.ts +1 -1
  257. package/src/hooks/useActiveSpace.ts +4 -4
  258. package/src/meta.ts +1 -1
  259. package/src/translations.ts +27 -1
  260. package/src/types/capabilities.ts +7 -7
  261. package/src/types/events.ts +5 -5
  262. package/src/types/form.ts +1 -8
  263. package/src/types/types.ts +36 -58
  264. package/src/util.ts +82 -0
  265. package/dist/lib/browser/CollectionArticle-WASDM637.mjs.map +0 -7
  266. package/dist/lib/browser/CreateObjectDialog-MA6DPYMD.mjs.map +0 -7
  267. package/dist/lib/browser/CreateSpaceDialog-WCEICWIE.mjs.map +0 -7
  268. package/dist/lib/browser/InlineSyncStatus-BT7BRBCO.mjs.map +0 -7
  269. package/dist/lib/browser/JoinDialog-PMCAIRCU.mjs.map +0 -7
  270. package/dist/lib/browser/SmallPresenceLive-LZD2NGKK.mjs +0 -10
  271. package/dist/lib/browser/SpacePresence-MLU576L6.mjs +0 -13
  272. package/dist/lib/browser/SpacePresence-MLU576L6.mjs.map +0 -7
  273. package/dist/lib/browser/SpaceSettingsContainer-UBMVKUPR.mjs.map +0 -7
  274. package/dist/lib/browser/ViewEditor-F74RR542.mjs.map +0 -7
  275. package/dist/lib/browser/app-graph-builder-VFYFI7CD.mjs +0 -593
  276. package/dist/lib/browser/app-graph-builder-VFYFI7CD.mjs.map +0 -7
  277. package/dist/lib/browser/chunk-ABCDB5YC.mjs.map +0 -7
  278. package/dist/lib/browser/chunk-ASV6DYFH.mjs +0 -19
  279. package/dist/lib/browser/chunk-PXVKN4LU.mjs.map +0 -7
  280. package/dist/lib/browser/chunk-RWOK4F4G.mjs.map +0 -7
  281. package/dist/lib/browser/chunk-TPZUQ5DC.mjs +0 -749
  282. package/dist/lib/browser/chunk-TPZUQ5DC.mjs.map +0 -7
  283. package/dist/lib/browser/chunk-USN5QKRV.mjs.map +0 -7
  284. package/dist/lib/browser/chunk-XIIYC7P5.mjs.map +0 -7
  285. package/dist/lib/browser/operation-resolver-Y3HYRXX7.mjs.map +0 -7
  286. package/dist/lib/browser/react-surface-NJ23NZFF.mjs.map +0 -7
  287. package/dist/lib/browser/repair-N2I4DR2Z.mjs +0 -50
  288. package/dist/lib/browser/repair-N2I4DR2Z.mjs.map +0 -7
  289. package/dist/lib/browser/spaces-ready-Q6JASPT4.mjs.map +0 -7
  290. package/dist/lib/node-esm/CollectionArticle-A6GGG73Z.mjs.map +0 -7
  291. package/dist/lib/node-esm/CreateObjectDialog-4WEFNDDF.mjs.map +0 -7
  292. package/dist/lib/node-esm/CreateSpaceDialog-P7QCPB5J.mjs.map +0 -7
  293. package/dist/lib/node-esm/InlineSyncStatus-3PCXU7NX.mjs.map +0 -7
  294. package/dist/lib/node-esm/JoinDialog-XEOLJZVN.mjs.map +0 -7
  295. package/dist/lib/node-esm/SmallPresenceLive-K4243KXR.mjs +0 -11
  296. package/dist/lib/node-esm/SpacePresence-HC2XGQ54.mjs +0 -14
  297. package/dist/lib/node-esm/SpacePresence-HC2XGQ54.mjs.map +0 -7
  298. package/dist/lib/node-esm/SpaceSettingsContainer-Y62J2L65.mjs.map +0 -7
  299. package/dist/lib/node-esm/ViewEditor-B2BLYF5U.mjs.map +0 -7
  300. package/dist/lib/node-esm/app-graph-builder-N37ED6UI.mjs +0 -594
  301. package/dist/lib/node-esm/app-graph-builder-N37ED6UI.mjs.map +0 -7
  302. package/dist/lib/node-esm/chunk-3DWZCVVQ.mjs.map +0 -7
  303. package/dist/lib/node-esm/chunk-CVXULIYC.mjs +0 -20
  304. package/dist/lib/node-esm/chunk-GWUPFA7J.mjs.map +0 -7
  305. package/dist/lib/node-esm/chunk-OSFH2XKO.mjs.map +0 -7
  306. package/dist/lib/node-esm/chunk-P2AVANDG.mjs.map +0 -7
  307. package/dist/lib/node-esm/chunk-UJQUBDQS.mjs.map +0 -7
  308. package/dist/lib/node-esm/chunk-WW6YYBRG.mjs +0 -750
  309. package/dist/lib/node-esm/chunk-WW6YYBRG.mjs.map +0 -7
  310. package/dist/lib/node-esm/operation-resolver-IRQ2NVUQ.mjs.map +0 -7
  311. package/dist/lib/node-esm/react-surface-UDO3PGH6.mjs.map +0 -7
  312. package/dist/lib/node-esm/repair-P6ND7ZRU.mjs +0 -51
  313. package/dist/lib/node-esm/repair-P6ND7ZRU.mjs.map +0 -7
  314. package/dist/lib/node-esm/spaces-ready-XLGRTJV2.mjs.map +0 -7
  315. package/dist/types/src/components/AwaitingObject.d.ts.map +0 -1
  316. package/src/util.tsx +0 -956
  317. /package/dist/lib/browser/{CollectionSection-LK4O6QDD.mjs.map → CollectionSection-H2MBNI63.mjs.map} +0 -0
  318. /package/dist/lib/browser/{MembersContainer-MMFCXLVZ.mjs.map → MembersContainer-OGYV2L4M.mjs.map} +0 -0
  319. /package/dist/lib/browser/{ObjectCardStack-CHWNLUYQ.mjs.map → ObjectCardStack-OMXF2DSG.mjs.map} +0 -0
  320. /package/dist/lib/browser/{ObjectDetails-YUGVDNSA.mjs.map → ObjectDetails-QFTQQN4W.mjs.map} +0 -0
  321. /package/dist/lib/browser/{RecordArticle-ONWKYM3Z.mjs.map → RecordArticle-BO2XHBFN.mjs.map} +0 -0
  322. /package/dist/lib/browser/{SchemaContainer-62AJXKAF.mjs.map → SchemaContainer-QWCSIZBS.mjs.map} +0 -0
  323. /package/dist/lib/browser/{SmallPresenceLive-LZD2NGKK.mjs.map → SmallPresenceLive-AHHLBAUP.mjs.map} +0 -0
  324. /package/dist/lib/browser/{SpacePluginSettings-BRJTADV5.mjs.map → SpacePluginSettings-QGZKNQLK.mjs.map} +0 -0
  325. /package/dist/lib/{node-esm/SmallPresenceLive-K4243KXR.mjs.map → browser/SpacePresence-JIWLBUWO.mjs.map} +0 -0
  326. /package/dist/lib/browser/{SyncStatus-5UQ7CIII.mjs.map → SyncStatus-6N7JJ7XF.mjs.map} +0 -0
  327. /package/dist/lib/browser/{app-graph-serializer-KTQOBYUF.mjs.map → app-graph-serializer-UZWWGLGY.mjs.map} +0 -0
  328. /package/dist/lib/browser/{chunk-J5F4LUJD.mjs.map → chunk-SSTUPFZ2.mjs.map} +0 -0
  329. /package/dist/lib/browser/{react-root-UYBW5RE7.mjs.map → react-root-OD2HP63B.mjs.map} +0 -0
  330. /package/dist/lib/browser/{settings-2ELVUFDR.mjs.map → settings-RUDP2Q56.mjs.map} +0 -0
  331. /package/dist/lib/node-esm/{CollectionSection-WWKDOAAT.mjs.map → CollectionSection-BI66Y34F.mjs.map} +0 -0
  332. /package/dist/lib/node-esm/{MembersContainer-UQZLW3YA.mjs.map → MembersContainer-4PV3Z4BA.mjs.map} +0 -0
  333. /package/dist/lib/{browser/MenuFooter-HYBTNOBT.mjs.map → node-esm/MenuFooter-PXG2GV6A.mjs.map} +0 -0
  334. /package/dist/lib/node-esm/{ObjectCardStack-UXEWG6RV.mjs.map → ObjectCardStack-457SNNVF.mjs.map} +0 -0
  335. /package/dist/lib/node-esm/{ObjectDetails-26PVHUQL.mjs.map → ObjectDetails-OLF7HSM4.mjs.map} +0 -0
  336. /package/dist/lib/node-esm/{RecordArticle-APY2WKUW.mjs.map → RecordArticle-XUIT25PP.mjs.map} +0 -0
  337. /package/dist/lib/node-esm/{SchemaContainer-XR2D6MYX.mjs.map → SchemaContainer-5G4R3Z6O.mjs.map} +0 -0
  338. /package/dist/lib/node-esm/{SpacePluginSettings-VEB5IGG7.mjs.map → SpacePluginSettings-PENV4GHL.mjs.map} +0 -0
  339. /package/dist/lib/node-esm/{SyncStatus-XTJAVHPN.mjs.map → SyncStatus-YEBGTNSD.mjs.map} +0 -0
  340. /package/dist/lib/node-esm/{app-graph-serializer-GXQYSQAZ.mjs.map → app-graph-serializer-RT2RQTV2.mjs.map} +0 -0
  341. /package/dist/lib/node-esm/{chunk-S2IELCDF.mjs.map → chunk-XYLDAH5C.mjs.map} +0 -0
  342. /package/dist/lib/node-esm/{react-root-UEN3LLJD.mjs.map → react-root-RILC5MBD.mjs.map} +0 -0
  343. /package/dist/lib/node-esm/{settings-DCTVM2BV.mjs.map → settings-3EKSEAAG.mjs.map} +0 -0
  344. /package/dist/types/src/components/{AwaitingObject.d.ts → AwaitingObject/AwaitingObject.d.ts} +0 -0
@@ -0,0 +1,421 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Atom } from '@effect-atom/atom-react';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Match from 'effect/Match';
8
+ import * as Option from 'effect/Option';
9
+ import * as Schema from 'effect/Schema';
10
+
11
+ import { Capability } from '@dxos/app-framework';
12
+ import { AppCapabilities, LayoutOperation, Segments } from '@dxos/app-toolkit';
13
+ import { type Space, SpaceState, isSpace } from '@dxos/client/echo';
14
+ import { Collection, Filter, Obj, Query, Type } from '@dxos/echo';
15
+ import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from '@dxos/echo/internal';
16
+ import { AtomObj, AtomQuery } from '@dxos/echo-atom';
17
+ import { Operation } from '@dxos/operation';
18
+ import { ClientCapabilities } from '@dxos/plugin-client';
19
+ import { CreateAtom, GraphBuilder, Node } from '@dxos/plugin-graph';
20
+ import { ViewAnnotation } from '@dxos/schema';
21
+ import { createFilename, isNonNullable } from '@dxos/util';
22
+
23
+ import { meta } from '../../../meta';
24
+ import { SpaceOperation } from '../../../types';
25
+
26
+ import {
27
+ ADD_VIEW_TO_SCHEMA_LABEL,
28
+ BLOCK_REORDER_ABOVE,
29
+ type MetadataResolver,
30
+ SNAPSHOT_BY_SCHEMA_LABEL,
31
+ STATIC_SCHEMA_TYPE,
32
+ TYPES_SECTION_TYPE,
33
+ TYPE_COLLECTION_TYPE,
34
+ buildViewIndex,
35
+ createObjectNode,
36
+ downloadBlob,
37
+ getDynamicLabel,
38
+ whenSpace,
39
+ } from './shared';
40
+
41
+ //
42
+ // Extension Factory
43
+ //
44
+
45
+ /** Creates type-related extensions: types section, schema nodes, schema children, and schema actions. */
46
+ export const createTypeExtensions = Effect.fnUntraced(function* () {
47
+ const capabilities = yield* Capability.Service;
48
+
49
+ const resolve = (_get: any) => (typename: string) =>
50
+ capabilities.getAll(AppCapabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
51
+
52
+ return yield* Effect.all([
53
+ // Types section virtual node under each space.
54
+ GraphBuilder.createExtension({
55
+ id: `${meta.id}.types-section`,
56
+ match: whenSpace,
57
+ connector: (space, get) => {
58
+ const spaceState = get(CreateAtom.fromObservable(space.state));
59
+ if (spaceState !== SpaceState.SPACE_READY) {
60
+ return Effect.succeed([]);
61
+ }
62
+
63
+ return Effect.succeed([
64
+ {
65
+ id: Segments.types,
66
+ type: TYPES_SECTION_TYPE,
67
+ data: null,
68
+ properties: {
69
+ label: ['types section label', { ns: meta.id }],
70
+ icon: 'ph--shapes--regular',
71
+ iconHue: 'neutral',
72
+ role: 'branch',
73
+ testId: 'spacePlugin.typesSection',
74
+ draggable: false,
75
+ droppable: false,
76
+ space,
77
+ },
78
+ },
79
+ ]);
80
+ },
81
+ }),
82
+
83
+ // Schema nodes under the Types virtual node.
84
+ GraphBuilder.createExtension({
85
+ id: `${meta.id}.types`,
86
+ match: (node) => {
87
+ const space = isSpace(node.properties.space) ? node.properties.space : undefined;
88
+ return node.type === TYPES_SECTION_TYPE && space ? Option.some(space) : Option.none();
89
+ },
90
+ connector: (space, get) => {
91
+ // TODO(wittjosiah): Make schema queries reactive to simplify this.
92
+ // Reactive subscription to database schema objects so the connector re-runs on schema changes.
93
+ get(AtomQuery.make(space.db, Filter.type(Type.PersistentType)));
94
+ // Reactive subscription to client/plugin-contributed schemas so the connector re-runs when new schemas or static schemas are added.
95
+ get(capabilities.atom(AppCapabilities.Schema));
96
+ const allSchemas = space.db.schemaRegistry.query({ location: ['runtime', 'database'] }).runSync();
97
+
98
+ const userSchemas = allSchemas.filter((schema) => {
99
+ if (getTypeAnnotation(schema)?.kind === EntityKind.Relation) {
100
+ return false;
101
+ }
102
+ if (SystemTypeAnnotation.get(schema).pipe(Option.getOrElse(() => false))) {
103
+ return false;
104
+ }
105
+ if (ViewAnnotation.get(schema).pipe(Option.getOrElse(() => false))) {
106
+ return false;
107
+ }
108
+ if (Type.getTypename(schema) === Collection.Collection.typename) {
109
+ return false;
110
+ }
111
+ return true;
112
+ });
113
+
114
+ const viewIndex = buildViewIndex(get, space, allSchemas);
115
+
116
+ const visibleSchemas = userSchemas.filter((schema) => {
117
+ if (Type.isMutable(schema)) {
118
+ return true;
119
+ }
120
+ const typename = Type.getTypename(schema);
121
+ const objects = get(AtomQuery.make(space.db, Filter.typename(typename)));
122
+ return objects.length > 0 || viewIndex.typenamesWithViews.has(typename);
123
+ });
124
+
125
+ return Effect.succeed(
126
+ visibleSchemas.map((schema) => createSchemaNode({ schema, space, resolve: resolve(get), get })),
127
+ );
128
+ },
129
+ }),
130
+
131
+ // {All} virtual node + view objects under each schema node.
132
+ GraphBuilder.createExtension({
133
+ id: `${meta.id}.schema-children`,
134
+ match: (node) => {
135
+ const space = isSpace(node.properties.space) ? node.properties.space : undefined;
136
+ return space && (Obj.instanceOf(Type.PersistentType, node.data) || Schema.isSchema(node.data))
137
+ ? Option.some({ space, schema: node.data })
138
+ : Option.none();
139
+ },
140
+ connector: ({ space, schema }, get) => {
141
+ const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);
142
+ const schemas = client?.graph.schemaRegistry.query({ location: ['runtime'] }).runSync() ?? [];
143
+
144
+ const typename = Schema.isSchema(schema) ? Type.getTypename(schema as Type.AnyObj) : schema.typename;
145
+
146
+ // {All} virtual node.
147
+ const allNode = {
148
+ id: 'all',
149
+ type: TYPE_COLLECTION_TYPE,
150
+ data: { space, typename },
151
+ properties: {
152
+ label: ['type collection all label', { ns: meta.id }],
153
+ icon: 'ph--list--regular',
154
+ iconHue: 'neutral',
155
+ role: 'branch',
156
+ testId: `spacePlugin.typeCollectionAll.${typename}`,
157
+ selectable: false,
158
+ draggable: false,
159
+ droppable: false,
160
+ childrenDroppable: false,
161
+ blockInstruction: BLOCK_REORDER_ABOVE,
162
+ },
163
+ };
164
+
165
+ // View objects for this schema.
166
+ const viewIndex = buildViewIndex(get, space, schemas);
167
+ const viewNodes = viewIndex
168
+ .getViewsForTypename(typename)
169
+ .map((object: Obj.Unknown) =>
170
+ createObjectNode({
171
+ db: space.db,
172
+ object,
173
+ resolve: resolve(get),
174
+ droppable: false,
175
+ }),
176
+ )
177
+ .filter(isNonNullable);
178
+
179
+ return Effect.succeed([allNode, ...viewNodes]);
180
+ },
181
+ }),
182
+
183
+ // Objects of the schema type under the {All} node.
184
+ GraphBuilder.createExtension({
185
+ id: `${meta.id}.type-collection-objects`,
186
+ match: (node) => {
187
+ if (node.type !== TYPE_COLLECTION_TYPE || !node.data?.space || !node.data?.typename) {
188
+ return Option.none();
189
+ }
190
+ return Option.some({ space: node.data.space as Space, typename: node.data.typename as string });
191
+ },
192
+ connector: ({ space, typename }, get) => {
193
+ const objects = get(AtomQuery.make(space.db, Filter.typename(typename)));
194
+
195
+ return Effect.succeed(
196
+ objects
197
+ .map((object: Obj.Unknown) => {
198
+ get(AtomObj.make(object));
199
+ return createObjectNode({
200
+ db: space.db,
201
+ object,
202
+ resolve: resolve(get),
203
+ droppable: false,
204
+ });
205
+ })
206
+ .filter(isNonNullable),
207
+ );
208
+ },
209
+ }),
210
+
211
+ // Actions for schema nodes.
212
+ GraphBuilder.createExtension({
213
+ id: `${meta.id}.schema-actions`,
214
+ match: (node) => {
215
+ const space = isSpace(node.properties.space) ? node.properties.space : undefined;
216
+ return space && Schema.isSchema(node.data) ? Option.some({ space, schema: node.data }) : Option.none();
217
+ },
218
+ actions: ({ space, schema }, get) => {
219
+ const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);
220
+ const schemas = client?.graph.schemaRegistry.query({ location: ['runtime'] }).runSync() ?? [];
221
+
222
+ const targetTypename = Type.getTypename(schema as Type.AnyObj);
223
+ const viewIndex = buildViewIndex(get, space, schemas);
224
+ const deletable =
225
+ Type.isMutable(schema as Type.AnyObj) && viewIndex.getViewsForTypename(targetTypename).length === 0;
226
+
227
+ return Effect.succeed(
228
+ createSchemaActions({
229
+ schema: schema as Type.AnyObj,
230
+ space,
231
+ deletable,
232
+ resolve: resolve(get),
233
+ }),
234
+ );
235
+ },
236
+ }),
237
+ ]);
238
+ });
239
+
240
+ //
241
+ // Helpers
242
+ //
243
+
244
+ /** Builds a graph node for a schema in the Types subtree. */
245
+ const createSchemaNode = ({
246
+ schema,
247
+ space,
248
+ resolve,
249
+ get,
250
+ }: {
251
+ schema: Type.AnyEntity;
252
+ space: Space;
253
+ resolve: MetadataResolver;
254
+ get: Atom.Context;
255
+ }): Node.Node => {
256
+ const typename = Type.getTypename(schema);
257
+ const metadata = resolve(typename);
258
+ const { label, nodeId } = Match.value(schema).pipe(
259
+ Match.when(Type.isMutable, (mutableSchema) => {
260
+ const persistentSchema = mutableSchema.persistentSchema;
261
+ const snapshot = get(AtomObj.make(persistentSchema));
262
+ return {
263
+ label: snapshot.name || ['object name placeholder', { ns: Type.PersistentType.typename }],
264
+ nodeId: typename,
265
+ };
266
+ }),
267
+ Match.orElse(() => ({
268
+ label: getDynamicLabel('typename label', typename, { count: 2, default: typename }),
269
+ nodeId: typename,
270
+ })),
271
+ );
272
+ const icon = Type.isMutable(schema) ? 'ph--cube--regular' : (metadata.icon ?? 'ph--placeholder--regular');
273
+ const iconHue = Type.isMutable(schema) ? 'neutral' : metadata.iconHue;
274
+ return {
275
+ id: nodeId,
276
+ type: STATIC_SCHEMA_TYPE,
277
+ data: schema,
278
+ properties: {
279
+ label,
280
+ icon,
281
+ iconHue,
282
+ role: 'branch',
283
+ testId: `spacePlugin.schemaNode.${typename}`,
284
+ selectable: false,
285
+ draggable: false,
286
+ droppable: false,
287
+ childrenDroppable: false,
288
+ space,
289
+ },
290
+ };
291
+ };
292
+
293
+ /** Builds schema actions (add view, rename, delete, snapshot). */
294
+ const createSchemaActions = ({
295
+ schema,
296
+ space,
297
+ deletable,
298
+ resolve,
299
+ }: {
300
+ schema: Type.AnyObj;
301
+ space: Space;
302
+ deletable: boolean;
303
+ resolve: MetadataResolver;
304
+ }) => {
305
+ const typename = Type.getTypename(schema);
306
+ const metadata = resolve(typename);
307
+ const createObjectFn = metadata.createObject;
308
+ const inputSchema = metadata.inputSchema;
309
+
310
+ const actions: Node.NodeArg<Node.ActionData<Operation.Service>>[] = [
311
+ ...(createObjectFn
312
+ ? [
313
+ {
314
+ id: SpaceOperation.OpenCreateObject.meta.key,
315
+ type: Node.ActionType,
316
+ data: Effect.fnUntraced(function* () {
317
+ if (inputSchema) {
318
+ yield* Operation.invoke(SpaceOperation.OpenCreateObject, {
319
+ target: space.db,
320
+ typename,
321
+ });
322
+ } else {
323
+ const createdObject = yield* createObjectFn({}, { db: space.db }) as Effect.Effect<
324
+ Obj.Unknown,
325
+ Error,
326
+ never
327
+ >;
328
+ const addResult = yield* Operation.invoke(SpaceOperation.AddObject, {
329
+ target: space.db,
330
+ hidden: true,
331
+ object: createdObject,
332
+ });
333
+ if (addResult.subject) {
334
+ yield* Operation.invoke(LayoutOperation.Open, { subject: addResult.subject });
335
+ }
336
+ }
337
+ }),
338
+ properties: {
339
+ label: getDynamicLabel('add object label', typename),
340
+ icon: 'ph--plus--regular',
341
+ disposition: 'list-item-primary',
342
+ testId: 'spacePlugin.createObject',
343
+ },
344
+ },
345
+ ]
346
+ : []),
347
+ {
348
+ id: `${SpaceOperation.AddObject.meta.key}-view`,
349
+ type: Node.ActionType,
350
+ data: () =>
351
+ Operation.invoke(SpaceOperation.OpenCreateObject, {
352
+ target: space.db,
353
+ views: true,
354
+ initialFormValues: { typename: Type.getTypename(schema) },
355
+ }),
356
+ properties: {
357
+ label: ADD_VIEW_TO_SCHEMA_LABEL,
358
+ icon: 'ph--circles-three-plus--regular',
359
+ disposition: 'list-item',
360
+ testId: 'spacePlugin.addViewToSchema',
361
+ },
362
+ },
363
+ {
364
+ id: SpaceOperation.RenameObject.meta.key,
365
+ type: Node.ActionType,
366
+ data: (params?: Node.InvokeProps) =>
367
+ Type.isMutable(schema)
368
+ ? Operation.invoke(SpaceOperation.RenameObject, {
369
+ object: (schema as Type.RuntimeType).persistentSchema as any,
370
+ caller: `${params?.caller}:${params?.parent?.id}`,
371
+ })
372
+ : Effect.fail(new Error('Cannot rename immutable schema')),
373
+ properties: {
374
+ label: getDynamicLabel('rename object label', Type.getTypename(Type.PersistentType)),
375
+ icon: 'ph--pencil-simple-line--regular',
376
+ disabled: !Type.isMutable(schema),
377
+ disposition: 'list-item',
378
+ testId: 'spacePlugin.renameObject',
379
+ },
380
+ },
381
+ {
382
+ id: SpaceOperation.RemoveObjects.meta.key,
383
+ type: Node.ActionType,
384
+ data: () =>
385
+ Type.isMutable(schema)
386
+ ? Operation.invoke(SpaceOperation.RemoveObjects, {
387
+ objects: [(schema as Type.RuntimeType).persistentSchema as Obj.Unknown],
388
+ })
389
+ : Effect.succeed(undefined),
390
+ properties: {
391
+ label: getDynamicLabel('delete object label', Type.getTypename(Type.PersistentType)),
392
+ icon: 'ph--trash--regular',
393
+ disposition: 'list-item',
394
+ disabled: !deletable,
395
+ testId: 'spacePlugin.deleteObject',
396
+ },
397
+ },
398
+ {
399
+ id: SpaceOperation.Snapshot.meta.key,
400
+ type: Node.ActionType,
401
+ data: Effect.fnUntraced(function* () {
402
+ const result = yield* Operation.invoke(SpaceOperation.Snapshot, {
403
+ db: space.db,
404
+ query: Query.select(Filter.type(schema)).ast,
405
+ });
406
+ if (result.snapshot) {
407
+ yield* Effect.tryPromise(() =>
408
+ downloadBlob(result.snapshot, createFilename({ parts: [space.id, Type.getTypename(schema)], ext: 'json' })),
409
+ );
410
+ }
411
+ }),
412
+ properties: {
413
+ label: SNAPSHOT_BY_SCHEMA_LABEL,
414
+ icon: 'ph--camera--regular',
415
+ disposition: 'list-item',
416
+ },
417
+ },
418
+ ];
419
+
420
+ return actions;
421
+ };
@@ -19,10 +19,10 @@ export default Capability.makeModule(
19
19
  yield* Effect.tryPromise(() => defaultSpace.waitUntilReady());
20
20
 
21
21
  // Create root collection structure.
22
- Obj.change(defaultSpace.properties, (p) => {
23
- p[Collection.Collection.typename] = Ref.make(Collection.make());
22
+ Obj.change(defaultSpace.properties, (properties) => {
23
+ properties[Collection.Collection.typename] = Ref.make(Collection.make());
24
24
  if (Migrations.versionProperty) {
25
- p[Migrations.versionProperty] = Migrations.targetVersion;
25
+ properties[Migrations.versionProperty] = Migrations.targetVersion;
26
26
  }
27
27
  });
28
28
  }),
@@ -3,11 +3,19 @@
3
3
  //
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
+ import * as Option from 'effect/Option';
6
7
 
7
8
  import { Capabilities, Capability, Plugin, UndoMapping } from '@dxos/app-framework';
8
- import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
9
+ import {
10
+ AppCapabilities,
11
+ LayoutOperation,
12
+ getCollectionsPath,
13
+ getObjectPath,
14
+ getObjectPathFromObject,
15
+ getTypePath,
16
+ } from '@dxos/app-toolkit';
9
17
  import { SpaceState, getSpace } from '@dxos/client/echo';
10
- import { Database, Obj, Query, Ref, Relation, Type } from '@dxos/echo';
18
+ import { Database, Obj, Query, Ref, Relation, Type, View } from '@dxos/echo';
11
19
  import { Collection } from '@dxos/echo';
12
20
  import { EchoDatabaseImpl, Serializer } from '@dxos/echo-db';
13
21
  import { invariant } from '@dxos/invariant';
@@ -16,16 +24,11 @@ import { OperationResolver } from '@dxos/operation';
16
24
  import { Operation } from '@dxos/operation';
17
25
  import { ClientCapabilities } from '@dxos/plugin-client/types';
18
26
  import { ObservabilityOperation } from '@dxos/plugin-observability/types';
27
+ import { ViewAnnotation } from '@dxos/schema';
19
28
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
20
- import { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention/types';
29
+ import { getSpacePath } from '@dxos/app-toolkit';
21
30
  import { iconValues } from '@dxos/react-ui-pickers/icons';
22
- import {
23
- CollectionModel,
24
- ManagedCollection,
25
- ProjectionModel,
26
- createEchoChangeCallback,
27
- getTypenameFromQuery,
28
- } from '@dxos/schema';
31
+ import { CollectionModel, ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } from '@dxos/schema';
29
32
  import { hues } from '@dxos/ui-theme';
30
33
 
31
34
  import {
@@ -35,11 +38,12 @@ import {
35
38
  OBJECT_RENAME_POPOVER,
36
39
  SPACE_RENAME_POPOVER,
37
40
  } from '../../constants';
38
- import { type JoinDialogProps } from '../../containers/JoinDialog/JoinDialog';
41
+ import { type JoinDialogProps } from '../../containers/JoinDialog';
39
42
  import { meta } from '../../meta';
40
43
  import { SpaceEvents } from '../../types';
41
44
  import { SpaceCapabilities, SpaceOperation } from '../../types';
42
45
  import { COMPOSER_SPACE_LOCK, cloneObject, getNestedObjects } from '../../util';
46
+ import { isNonNullable } from '@dxos/util';
43
47
 
44
48
  type OperationResolverOptions = {
45
49
  createInvitationUrl: (invitationCode: string) => string;
@@ -80,7 +84,7 @@ export default Capability.makeModule(
80
84
  message: (input, _output) => {
81
85
  const ns = Obj.getTypename(input.objects[0]);
82
86
  return ns && input.objects.length === 1
83
- ? ['object deleted label', { ns: meta.id }]
87
+ ? ['object deleted label', { ns }]
84
88
  : ['objects deleted label', { ns: meta.id }];
85
89
  },
86
90
  }),
@@ -145,8 +149,8 @@ export default Capability.makeModule(
145
149
  operation: SpaceOperation.OpenSettings,
146
150
  handler: Effect.fnUntraced(function* (input) {
147
151
  yield* Operation.invoke(LayoutOperation.Open, {
148
- subject: [`properties-settings${ATTENDABLE_PATH_SEPARATOR}${input.space.id}`],
149
- workspace: input.space.id,
152
+ subject: [`${getSpacePath(input.space.id)}/settings`],
153
+ workspace: getSpacePath(input.space.id),
150
154
  });
151
155
  }),
152
156
  }),
@@ -163,7 +167,6 @@ export default Capability.makeModule(
163
167
  // All objects must be a member of the same space.
164
168
  const space = getSpace(objects[0]);
165
169
  invariant(space && objects.every((obj) => Obj.isObject(obj) && getSpace(obj) === space));
166
- const openObjectIds = new Set<string>(layout.active);
167
170
 
168
171
  const parentCollection: Collection.Collection =
169
172
  input.target ?? space.properties[Collection.Collection.typename]?.target;
@@ -182,8 +185,9 @@ export default Capability.makeModule(
182
185
  // Close objects that were open.
183
186
  const wasActive = objects
184
187
  .flatMap((obj, i) => [obj, ...nestedObjectsList[i]])
185
- .filter((obj) => Obj.isObject(obj) && openObjectIds.has(Obj.getDXN(obj).toString()))
186
- .map((obj) => Obj.getDXN(obj).toString());
188
+ .filter(Obj.isObject)
189
+ .map((object) => layout.active.find((graphId) => graphId.endsWith(object.id)))
190
+ .filter(isNonNullable);
187
191
 
188
192
  for (let i = 0; i < objects.length; i++) {
189
193
  const obj = objects[i];
@@ -278,11 +282,11 @@ export default Capability.makeModule(
278
282
  typename: input.typename,
279
283
  initialFormValues: input.initialFormValues,
280
284
  onCreateObject: input.onCreateObject,
285
+ targetNodeId: input.targetNodeId,
281
286
  shouldNavigate: navigable
282
287
  ? (object: Obj.Unknown) => {
283
288
  const isCollection = Obj.instanceOf(Collection.Collection, object);
284
- const isSystemCollection = Obj.instanceOf(ManagedCollection.ManagedCollection, object);
285
- return (!isCollection && !isSystemCollection) || ephemeralState.navigableCollections;
289
+ return !isCollection || ephemeralState.navigableCollections;
286
290
  }
287
291
  : () => false,
288
292
  },
@@ -307,6 +311,7 @@ export default Capability.makeModule(
307
311
  hidden: input.hidden,
308
312
  }).pipe(Effect.provide(Database.layer(db)));
309
313
 
314
+ const typename = Obj.getTypename(object)!;
310
315
  yield* Operation.schedule(ObservabilityOperation.SendEvent, {
311
316
  name: 'space.object.add',
312
317
  properties: {
@@ -316,9 +321,23 @@ export default Capability.makeModule(
316
321
  },
317
322
  });
318
323
 
324
+ const [schema] = db.schemaRegistry.query({ typename, location: ['runtime'] }).runSync();
325
+ const isViewSchema = schema !== undefined && ViewAnnotation.get(schema).pipe(Option.getOrElse(() => false));
326
+ const view = isViewSchema
327
+ ? yield* Effect.promise(() => (object as Obj.Any).view.load() as Promise<View.View>)
328
+ : undefined;
329
+ const viewTargetTypename = view ? getTypenameFromQuery(view.query.ast) : undefined;
330
+ const subject = getSubjectPathForNewObject({
331
+ spaceId: db.spaceId,
332
+ objectId: object.id,
333
+ nodeId: input.targetNodeId,
334
+ typename,
335
+ viewTargetTypename,
336
+ });
337
+
319
338
  return {
320
339
  id: Obj.getDXN(object).toString(),
321
- subject: [Obj.getDXN(object).toString()],
340
+ subject: [subject],
322
341
  object,
323
342
  };
324
343
  }),
@@ -422,13 +441,6 @@ export default Capability.makeModule(
422
441
  }
423
442
  });
424
443
 
425
- // Create records smart collection.
426
- Obj.change(collection, (c) => {
427
- c.objects.push(
428
- Ref.make(ManagedCollection.makeManagedCollection({ key: Type.getTypename(Type.PersistentType) })),
429
- );
430
- });
431
-
432
444
  // Allow other plugins to add default content.
433
445
  yield* Plugin.activate(SpaceEvents.SpaceCreated);
434
446
  const onCreateSpaceCallbacks = yield* Capability.getAll(SpaceCapabilities.OnCreateSpace);
@@ -507,7 +519,7 @@ export default Capability.makeModule(
507
519
  handler: Effect.fnUntraced(function* (input) {
508
520
  yield* Operation.invoke(LayoutOperation.UpdatePopover, {
509
521
  subject: SPACE_RENAME_POPOVER,
510
- anchorId: `dxos.org/ui/${input.caller}/${input.space.id}`,
522
+ anchorId: input.caller ?? '',
511
523
  props: input.space,
512
524
  });
513
525
  }),
@@ -522,7 +534,7 @@ export default Capability.makeModule(
522
534
  const object = input.object as Obj.Unknown;
523
535
  yield* Operation.invoke(LayoutOperation.UpdatePopover, {
524
536
  subject: OBJECT_RENAME_POPOVER,
525
- anchorId: `dxos.org/ui/${input.caller}/${Obj.getDXN(object).toString()}`,
537
+ anchorId: input.caller ?? '',
526
538
  props: object,
527
539
  });
528
540
  }),
@@ -535,8 +547,8 @@ export default Capability.makeModule(
535
547
  operation: SpaceOperation.OpenMembers,
536
548
  handler: Effect.fnUntraced(function* (input) {
537
549
  yield* Operation.invoke(LayoutOperation.Open, {
538
- subject: [`members-settings${ATTENDABLE_PATH_SEPARATOR}${input.space.id}`],
539
- workspace: input.space.id,
550
+ subject: [`${getSpacePath(input.space.id)}/settings`],
551
+ workspace: getSpacePath(input.space.id),
540
552
  });
541
553
  }),
542
554
  }),
@@ -578,48 +590,6 @@ export default Capability.makeModule(
578
590
  }),
579
591
  }),
580
592
 
581
- //
582
- // UseStaticSchema
583
- //
584
- OperationResolver.make({
585
- operation: SpaceOperation.UseStaticSchema,
586
- handler: Effect.fnUntraced(function* (input) {
587
- const db = input.db as Database.Database;
588
- const client = yield* Capability.get(ClientCapabilities.Client);
589
- const schema: any = yield* Effect.promise(() =>
590
- (client as any).graph.schemaRegistry.query({ typename: input.typename, location: ['runtime'] }).first(),
591
- );
592
- const space = client.spaces.get(db.spaceId);
593
- invariant(space, 'Space not found');
594
-
595
- Obj.change(space.properties, (p) => {
596
- if (!p.staticRecords) {
597
- p.staticRecords = [];
598
- }
599
- if (!p.staticRecords.includes(input.typename)) {
600
- p.staticRecords.push(input.typename);
601
- }
602
- });
603
-
604
- yield* Plugin.activate(SpaceEvents.SchemaAdded);
605
- const onSchemaAdded = yield* Capability.getAll(SpaceCapabilities.OnSchemaAdded);
606
- yield* Effect.all(
607
- onSchemaAdded.map((callback) => callback({ db, schema, show: input.show })),
608
- { concurrency: 'unbounded' },
609
- );
610
-
611
- yield* Operation.schedule(ObservabilityOperation.SendEvent, {
612
- name: 'space.schema.use',
613
- properties: {
614
- spaceId: space.id,
615
- typename: Type.getTypename(schema),
616
- },
617
- });
618
-
619
- return {};
620
- }),
621
- }),
622
-
623
593
  //
624
594
  // AddSchema
625
595
  //
@@ -769,3 +739,25 @@ export default Capability.makeModule(
769
739
  ];
770
740
  }),
771
741
  );
742
+
743
+ /** Resolves the subject path where a newly added object should be opened in the graph. */
744
+ const getSubjectPathForNewObject = (props: {
745
+ spaceId: string;
746
+ objectId: string;
747
+ nodeId?: string;
748
+ typename: string;
749
+ /** When set, the object is a view (e.g. Table) and should open under the type its query targets. */
750
+ viewTargetTypename?: string;
751
+ }): string => {
752
+ const { nodeId, typename, viewTargetTypename, spaceId, objectId } = props;
753
+ if (typeof nodeId === 'string') {
754
+ return `${nodeId}/${objectId}`;
755
+ }
756
+ if (typename === Collection.Collection.typename) {
757
+ return getCollectionsPath(spaceId, objectId);
758
+ }
759
+ if (viewTargetTypename) {
760
+ return getTypePath(spaceId, viewTargetTypename, objectId);
761
+ }
762
+ return getObjectPath(spaceId, typename, objectId);
763
+ };