@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
@@ -2,674 +2,31 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Atom } from '@effect-atom/atom-react';
6
5
  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
6
 
11
7
  import { Capability } from '@dxos/app-framework';
12
8
  import { AppCapabilities } from '@dxos/app-toolkit';
13
- import { type Space, SpaceState, getSpace, isSpace, parseId } from '@dxos/client/echo';
14
- import { DXN, Feed, Filter, Obj, type Ref, Type } from '@dxos/echo';
15
- import { Collection } from '@dxos/echo';
16
- import { AtomObj, AtomQuery } from '@dxos/echo-atom';
17
- import { Operation } from '@dxos/operation';
18
- import { ClientCapabilities } from '@dxos/plugin-client';
19
- import { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
20
- import { CreateAtom, GraphBuilder, type Node, NodeMatcher } from '@dxos/plugin-graph';
21
- import { Expando, ManagedCollection, ViewAnnotation, getTypenameFromQuery } from '@dxos/schema';
22
- import { isNonNullable } from '@dxos/util';
23
9
 
24
- import { getActiveSpace } from '../../hooks';
25
- import { meta } from '../../meta';
26
- import { SPACE_TYPE, SpaceCapabilities, SpaceOperation, type SpacePluginOptions } from '../../types';
27
- import {
28
- SHARED,
29
- constructObjectActions,
30
- constructSpaceActions,
31
- constructSpaceNode,
32
- createObjectNode,
33
- createStaticSchemaActions,
34
- createStaticSchemaNode,
35
- } from '../../util';
10
+ import { type SpacePluginOptions } from '../../types';
36
11
 
37
- /** Match space nodes and return the Space object. */
38
- const whenSpace = (node: Node.Node): Option.Option<Space> =>
39
- node.type === SPACE_TYPE && isSpace(node.data) ? Option.some(node.data) : Option.none();
12
+ import {
13
+ createCollectionExtensions,
14
+ createCompanionExtensions,
15
+ createSettingsExtensions,
16
+ createSpaceExtensions,
17
+ createTypeExtensions,
18
+ } from './extensions';
40
19
 
41
20
  export default Capability.makeModule(
42
21
  Effect.fnUntraced(function* ({ shareableLinkOrigin = window.location.origin }: SpacePluginOptions = {}) {
43
- const capabilities = yield* Capability.Service;
44
-
45
- // TODO(wittjosiah): Using `get` and being reactive seems to cause a bug with Atom where disposed atoms are accessed.
46
- const resolve = (get: Atom.Context) => (typename: string) =>
47
- capabilities.getAll(AppCapabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
48
-
49
22
  const extensions = yield* Effect.all([
50
- // Primary actions.
51
- GraphBuilder.createExtension({
52
- id: `${meta.id}/primary-actions`,
53
- position: 'hoist',
54
- match: NodeMatcher.whenRoot,
55
- actions: () =>
56
- Effect.succeed([
57
- {
58
- id: SpaceOperation.OpenCreateSpace.meta.key,
59
- data: () => Operation.invoke(SpaceOperation.OpenCreateSpace),
60
- properties: {
61
- label: ['create space label', { ns: meta.id }],
62
- icon: 'ph--plus--regular',
63
- testId: 'spacePlugin.createSpace',
64
- disposition: 'menu',
65
- },
66
- },
67
- {
68
- id: SpaceOperation.Join.meta.key,
69
- data: () => Operation.invoke(SpaceOperation.Join, {}),
70
- properties: {
71
- label: ['join space label', { ns: meta.id }],
72
- icon: 'ph--sign-in--regular',
73
- testId: 'spacePlugin.joinSpace',
74
- disposition: 'menu',
75
- },
76
- },
77
- {
78
- id: SpaceOperation.OpenMembers.meta.key,
79
- data: Effect.fnUntraced(function* () {
80
- const client = yield* Capability.get(ClientCapabilities.Client);
81
- const space = getActiveSpace(capabilities) ?? client.spaces.default;
82
- yield* Operation.invoke(SpaceOperation.OpenMembers, { space });
83
- }),
84
- properties: {
85
- label: ['share space label', { ns: meta.id }],
86
- icon: 'ph--users--regular',
87
- testId: 'spacePlugin.shareSpace',
88
- keyBinding: {
89
- macos: 'meta+.',
90
- windows: 'alt+.',
91
- },
92
- },
93
- },
94
- {
95
- id: SpaceOperation.OpenSettings.meta.key,
96
- data: Effect.fnUntraced(function* () {
97
- const client = yield* Capability.get(ClientCapabilities.Client);
98
- const space = getActiveSpace(capabilities) ?? client.spaces.default;
99
- yield* Operation.invoke(SpaceOperation.OpenSettings, { space });
100
- }),
101
- properties: {
102
- label: ['open current space settings label', { ns: meta.id }],
103
- icon: 'ph--faders--regular',
104
- keyBinding: {
105
- macos: 'meta+shift+,',
106
- windows: 'ctrl+shift+,',
107
- },
108
- },
109
- },
110
- ]),
111
- }),
112
-
113
- // Create space nodes.
114
- GraphBuilder.createExtension({
115
- id: `${meta.id}/spaces`,
116
- match: NodeMatcher.whenRoot,
117
- connector: (node, get) => {
118
- const client = capabilities.get(ClientCapabilities.Client);
119
- const stateAtom = capabilities.get(SpaceCapabilities.State);
120
- const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
121
- const spacesAtom = CreateAtom.fromObservable(client.spaces);
122
- const isReadyAtom = CreateAtom.fromObservable(client.spaces.isReady);
123
-
124
- const spaces = get(spacesAtom);
125
- const isReady = get(isReadyAtom);
126
-
127
- if (!spaces || !isReady) {
128
- return Effect.succeed([]);
129
- }
130
-
131
- const settingsAtom = capabilities.get(SpaceCapabilities.Settings);
132
- const settings = get(settingsAtom);
133
- const state = get(stateAtom);
134
- const ephemeralState = get(ephemeralAtom);
135
-
136
- try {
137
- const [spacesOrder] = get(
138
- AtomQuery.make(client.spaces.default.db, Filter.type(Expando.Expando, { key: SHARED })),
139
- );
140
- const { graph } = capabilities.get(AppCapabilities.AppGraph);
141
-
142
- // Get order from spacesOrder snapshot using AtomObj (cached via Atom.family).
143
- const spacesOrderSnapshot = spacesOrder ? get(AtomObj.make(spacesOrder)) : undefined;
144
- const order: string[] = (spacesOrderSnapshot as any)?.order ?? [];
145
- const orderMap = new Map(order.map((id, index) => [id, index]));
146
-
147
- // Subscribe to space states for filtering.
148
- const spaceStates = spaces.map((space) => get(CreateAtom.fromObservable(space.state)));
149
-
150
- // Subscribe to space properties to react when root collection is assigned.
151
- spaces.forEach((space) => {
152
- if (space.state.get() === SpaceState.SPACE_READY) {
153
- get(AtomObj.make(space.properties));
154
- }
155
- });
156
-
157
- return Effect.succeed(
158
- [
159
- ...spaces
160
- .filter((space) => orderMap.has(space.id))
161
- .sort((a, b) => orderMap.get(a.id)! - orderMap.get(b.id)!),
162
- ...spaces.filter((space) => !orderMap.has(space.id)),
163
- ]
164
- .filter((space, i) => (settings?.showHidden ? true : spaceStates[i] !== SpaceState.SPACE_INACTIVE))
165
- .map((space) =>
166
- constructSpaceNode({
167
- space,
168
- navigable: ephemeralState.navigableCollections,
169
- personal: space === client.spaces.default,
170
- namesCache: state.spaceNames,
171
- resolve: resolve(get),
172
- graph,
173
- spacesOrder,
174
- }),
175
- ),
176
- );
177
- } catch {
178
- return Effect.succeed([]);
179
- }
180
- },
181
- resolver: (id, get) => {
182
- // Resolve space ID to space node.
183
- const { spaceId } = parseId(id);
184
- if (!spaceId) {
185
- return Effect.succeed(null);
186
- }
187
-
188
- const client = capabilities.get(ClientCapabilities.Client);
189
-
190
- // Subscribe to spaces observable to react when space becomes available.
191
- const spaces = get(CreateAtom.fromObservable(client.spaces));
192
- const space = spaces?.find((s) => s.id === spaceId);
193
- if (!space) {
194
- return Effect.succeed(null);
195
- }
196
-
197
- // Only subscribe to these atoms if the space exists.
198
- const state = get(capabilities.get(SpaceCapabilities.State));
199
- const ephemeralState = get(capabilities.get(SpaceCapabilities.EphemeralState));
200
-
201
- const { graph } = capabilities.get(AppCapabilities.AppGraph);
202
- const [spacesOrder] = get(
203
- AtomQuery.make(client.spaces.default.db, Filter.type(Expando.Expando, { key: SHARED })),
204
- );
205
-
206
- return Effect.succeed(
207
- constructSpaceNode({
208
- space,
209
- navigable: ephemeralState.navigableCollections,
210
- personal: space === client.spaces.default,
211
- namesCache: state.spaceNames,
212
- resolve: resolve(get),
213
- graph,
214
- spacesOrder,
215
- }),
216
- );
217
- },
218
- }),
219
-
220
- // Create space actions.
221
- GraphBuilder.createExtension({
222
- id: `${meta.id}/actions`,
223
- match: whenSpace,
224
- actions: (space, get) => {
225
- const [client] = get(capabilities.atom(ClientCapabilities.Client));
226
- const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
227
- const ephemeralState = get(ephemeralAtom);
228
-
229
- if (!client) {
230
- return Effect.succeed([]);
231
- }
232
-
233
- return Effect.succeed(
234
- constructSpaceActions({
235
- space,
236
- migrating: ephemeralState.sdkMigrationRunning[space.id],
237
- }),
238
- );
239
- },
240
- }),
241
-
242
- // Create nodes for objects in the root collection of a space.
243
- GraphBuilder.createExtension({
244
- id: `${meta.id}/root-collection`,
245
- match: whenSpace,
246
- connector: (space, get) => {
247
- const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
248
- const ephemeralState = get(ephemeralAtom);
249
- const spaceState = get(CreateAtom.fromObservable(space.state));
250
- if (spaceState !== SpaceState.SPACE_READY) {
251
- return Effect.succeed([]);
252
- }
253
-
254
- // Get the collection ref from space.properties snapshot (AtomObj cached via Atom.family).
255
- const propertiesSnapshot = get(AtomObj.make(space.properties));
256
- const collectionRef = propertiesSnapshot[Collection.Collection.typename] as
257
- | Ref.Ref<Collection.Collection>
258
- | undefined;
259
- // Resolve the collection using AtomObj (subscribes to collection changes).
260
- const collection = collectionRef ? get(AtomObj.make(collectionRef)) : undefined;
261
- if (!collection) {
262
- return Effect.succeed([]);
263
- }
264
-
265
- const rawRefs = collection.objects ?? [];
266
-
267
- // TODO(wittjosiah): Workaround for Obj.getTypename not working on snapshots.
268
- // AtomObj.make(ref) returns snapshots (plain objects without ECHO metadata),
269
- // but createObjectNode needs live objects to access typename and other metadata.
270
- // Once Obj.getTypename works on snapshots, we can use snapshots directly.
271
- const objects = rawRefs
272
- .map((ref) => {
273
- // Subscribe to the ref for reactivity (triggers re-render when target changes).
274
- get(AtomObj.make(ref));
275
- // Return the live object for createObjectNode (has typename metadata).
276
- return ref.target;
277
- })
278
- .filter(isNonNullable);
279
-
280
- return Effect.succeed(
281
- objects
282
- .map((object) =>
283
- createObjectNode({
284
- db: space.db,
285
- object,
286
- resolve: resolve(get),
287
- navigable: ephemeralState.navigableCollections,
288
- parentCollection: collectionRef?.target,
289
- }),
290
- )
291
- .filter(isNonNullable),
292
- );
293
- },
294
- }),
295
-
296
- // Create nodes for objects in a collection or by its DXN.
297
- GraphBuilder.createExtension({
298
- id: `${meta.id}/objects`,
299
- match: (node) => (Obj.instanceOf(Collection.Collection, node.data) ? Option.some(node.data) : Option.none()),
300
- connector: (collection, get) => {
301
- const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
302
- const ephemeralState = get(ephemeralAtom);
303
- const space = getSpace(collection);
304
-
305
- // Get collection snapshot using AtomObj (cached via Atom.family).
306
- const collectionSnapshot = get(AtomObj.make(collection));
307
- const refs = collectionSnapshot.objects ?? [];
308
-
309
- // TODO(wittjosiah): Workaround for Obj.getTypename not working on snapshots.
310
- // See root-collection connector for details.
311
- const objects = refs
312
- .map((ref) => {
313
- get(AtomObj.make(ref));
314
- return ref.target;
315
- })
316
- .filter(isNonNullable);
317
-
318
- return Effect.succeed(
319
- objects
320
- .map(
321
- (object) =>
322
- space &&
323
- createObjectNode({
324
- object,
325
- db: space.db,
326
- resolve: resolve(get),
327
- navigable: ephemeralState.navigableCollections,
328
- parentCollection: collection,
329
- }),
330
- )
331
- .filter(isNonNullable),
332
- );
333
- },
334
- resolver: (id, get) => {
335
- const client = capabilities.get(ClientCapabilities.Client);
336
- const dxn = DXN.tryParse(id)?.asEchoDXN();
337
- if (!dxn || !dxn.spaceId) {
338
- return Effect.succeed(null);
339
- }
340
-
341
- const space = client.spaces.get(dxn.spaceId);
342
- if (!space) {
343
- return Effect.succeed(null);
344
- }
345
-
346
- const object = get(AtomQuery.make(space.db, Filter.id(dxn.echoId))).at(0);
347
- if (!Obj.isObject(object)) {
348
- return Effect.succeed(null);
349
- }
350
-
351
- return Effect.succeed(
352
- createObjectNode({
353
- object,
354
- db: space.db,
355
- resolve: resolve(get),
356
- disposition: 'hidden',
357
- }),
358
- );
359
- },
360
- }),
361
-
362
- // Create object nodes for schema-based system collections.
363
- GraphBuilder.createExtension({
364
- id: `${meta.id}/system-collections`,
365
- match: (node) =>
366
- Obj.instanceOf(ManagedCollection.ManagedCollection, node.data) ? Option.some(node.data) : Option.none(),
367
- connector: (collection, get) => {
368
- const [typename, feedKind] = collection.key.split('~');
369
- const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);
370
- const space = getSpace(collection);
371
- if (!space || !client) {
372
- return Effect.succeed([]);
373
- }
374
-
375
- const filter = Match.value(typename).pipe(
376
- Match.when(Feed.Feed.typename, () => Filter.type(Feed.Feed, { kind: feedKind })),
377
- Match.orElse((typename) => {
378
- const schema = client.graph.schemaRegistry
379
- .query({ typename, location: ['runtime'], includeSystem: true })
380
- .runSync()[0];
381
- return schema ? Filter.type(schema) : undefined;
382
- }),
383
- );
384
- if (!filter) {
385
- return Effect.succeed([]);
386
- }
387
-
388
- return Effect.succeed(
389
- get(AtomQuery.make(space.db, filter))
390
- .map((object) => {
391
- get(AtomObj.make(object));
392
- return createObjectNode({
393
- object,
394
- db: space.db,
395
- managedCollectionChild: true,
396
- resolve: resolve(get),
397
- });
398
- })
399
- .filter(isNonNullable),
400
- );
401
- },
402
- }),
403
-
404
- // Create branch nodes for static schema record types.
405
- GraphBuilder.createExtension({
406
- id: `${meta.id}/static-schemas`,
407
- match: (node: Node.Node) =>
408
- Obj.instanceOf(ManagedCollection.ManagedCollection, node.data) &&
409
- node.data.key === Type.getTypename(Type.PersistentType)
410
- ? Option.some(node.data)
411
- : Option.none(),
412
- connector: (collection, get) => {
413
- const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);
414
- const space = getSpace(collection);
415
- if (!space) {
416
- return Effect.succeed([]);
417
- }
418
-
419
- // Get staticRecords from properties snapshot (AtomObj cached via Atom.family).
420
- const propertiesSnapshot = get(AtomObj.make(space.properties));
421
- const staticRecords = (propertiesSnapshot.staticRecords ?? []) as string[];
422
-
423
- return Effect.succeed(
424
- staticRecords
425
- .map((typename) => client?.graph.schemaRegistry.query({ typename, location: ['runtime'] }).runSync()[0])
426
- .filter(isNonNullable)
427
- .map((schema) => createStaticSchemaNode({ schema, space })),
428
- );
429
- },
430
- }),
431
-
432
- // Create actions for static schema record types.
433
- GraphBuilder.createExtension({
434
- id: `${meta.id}/static-schema-actions`,
435
- match: (node) => {
436
- const space = isSpace(node.properties.space) ? node.properties.space : undefined;
437
- return space && Schema.isSchema(node.data) ? Option.some({ space, schema: node.data }) : Option.none();
438
- },
439
- actions: ({ space, schema }, get) => {
440
- const schemas =
441
- get(capabilities.atom(ClientCapabilities.Client))
442
- .at(0)
443
- ?.graph.schemaRegistry.query({ location: ['runtime'] })
444
- .runSync() ?? [];
445
- const filter = Filter.or(
446
- ...schemas
447
- .filter((schema) => ViewAnnotation.get(schema).pipe(Option.getOrElse(() => false)))
448
- .map((schema) => Filter.type(schema)),
449
- );
450
-
451
- const objects = get(AtomQuery.make(space.db, filter));
452
-
453
- // Filter views that match the schema typename using AtomObj and AtomRef (cached via Atom.family).
454
- const targetTypename = Type.getTypename(schema as Type.AnyObj);
455
- const filteredViews = objects.filter((viewObject) => {
456
- const viewSnapshot = get(AtomObj.make(viewObject));
457
- const viewRef = (viewSnapshot as any).view;
458
- const viewTarget = viewRef ? get(AtomObj.make(viewRef)) : undefined;
459
- return getTypenameFromQuery((viewTarget as any)?.query?.ast) === targetTypename;
460
- });
461
- const deletable = filteredViews.length === 0;
462
-
463
- return Effect.succeed(
464
- createStaticSchemaActions({
465
- schema: schema as Type.AnyObj,
466
- space,
467
- deletable,
468
- }),
469
- );
470
- },
471
- }),
472
-
473
- // Create nodes for views of record types.
474
- GraphBuilder.createExtension({
475
- id: `${meta.id}/schema-views`,
476
- match: (node) => {
477
- const space = getSpace(node.data) ?? (isSpace(node.properties.space) ? node.properties.space : undefined);
478
- return space && (Obj.instanceOf(Type.PersistentType, node.data) || Schema.isSchema(node.data))
479
- ? Option.some({ space, schema: node.data })
480
- : Option.none();
481
- },
482
- connector: ({ space, schema }, get) => {
483
- const schemas =
484
- get(capabilities.atom(ClientCapabilities.Client))
485
- .at(0)
486
- ?.graph.schemaRegistry.query({ location: ['runtime'] })
487
- .runSync() ?? [];
488
- const filter = Filter.or(
489
- ...schemas
490
- .filter((schema) => ViewAnnotation.get(schema).pipe(Option.getOrElse(() => false)))
491
- .map((schema) => Filter.type(schema)),
492
- );
493
-
494
- const typename = Schema.isSchema(schema) ? Type.getTypename(schema as Type.AnyObj) : schema.typename;
495
- const objects = get(AtomQuery.make(space.db, filter));
496
-
497
- // Filter and map using AtomObj and AtomRef (cached via Atom.family).
498
- return Effect.succeed(
499
- objects
500
- .filter((object) => {
501
- const objectSnapshot = get(AtomObj.make(object));
502
- const viewRef = (objectSnapshot as any).view;
503
- const viewTarget = viewRef ? get(AtomObj.make(viewRef)) : undefined;
504
- return getTypenameFromQuery((viewTarget as any)?.query?.ast) === typename;
505
- })
506
- .map((object) =>
507
- createObjectNode({
508
- object,
509
- db: space.db,
510
- resolve: resolve(get),
511
- droppable: false,
512
- }),
513
- )
514
- .filter(isNonNullable),
515
- );
516
- },
517
- }),
518
-
519
- // Create collection actions and action groups.
520
- GraphBuilder.createExtension({
521
- id: `${meta.id}/object-actions`,
522
- match: (node) => {
523
- const space = getSpace(node.data);
524
- return space && Obj.isObject(node.data) && Obj.getTypename(node.data) === node.type
525
- ? Option.some({ space, object: node.data })
526
- : Option.none();
527
- },
528
- actions: ({ space, object }, get) => {
529
- const schemas =
530
- get(capabilities.atom(ClientCapabilities.Client))
531
- .at(0)
532
- ?.graph.schemaRegistry.query({ location: ['runtime'] })
533
- .runSync() ?? [];
534
- const filter = Filter.or(
535
- ...schemas
536
- .filter((schema) => ViewAnnotation.get(schema).pipe(Option.getOrElse(() => false)))
537
- .map((schema) => Filter.type(schema)),
538
- );
539
-
540
- const isSchema = Obj.instanceOf(Type.PersistentType, object);
541
-
542
- let deletable = !isSchema && !Obj.instanceOf(ManagedCollection.ManagedCollection, object);
543
- if (isSchema) {
544
- const objects = get(AtomQuery.make(space.db, filter));
545
- // Filter views using AtomObj and AtomRef (cached via Atom.family).
546
- const filteredViews = objects.filter((viewObject) => {
547
- const viewSnapshot = get(AtomObj.make(viewObject));
548
- const viewRef = (viewSnapshot as any).view;
549
- const viewTarget = viewRef ? get(AtomObj.make(viewRef)) : undefined;
550
- return getTypenameFromQuery((viewTarget as any)?.query?.ast) === object.typename;
551
- });
552
- deletable = filteredViews.length === 0;
553
- }
554
-
555
- const [appGraph] = get(capabilities.atom(AppCapabilities.AppGraph));
556
- const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
557
- const ephemeralState = get(ephemeralAtom);
558
-
559
- if (!appGraph) {
560
- return Effect.succeed([]);
561
- }
562
-
563
- return Effect.succeed(
564
- constructObjectActions({
565
- object,
566
- graph: appGraph.graph,
567
- resolve: resolve(get),
568
- capabilities,
569
- deletable,
570
- navigable: ephemeralState.navigableCollections,
571
- shareableLinkOrigin,
572
- }),
573
- );
574
- },
575
- }),
576
-
577
- // View selected objects.
578
- GraphBuilder.createExtension({
579
- id: `${meta.id}/selected-objects`,
580
- match: (node) => {
581
- if (!Obj.isObject(node.data)) {
582
- return Option.none();
583
- }
584
-
585
- const schema = Obj.getSchema(node.data);
586
- const isView = Option.fromNullable(schema).pipe(
587
- Option.flatMap((schema) => ViewAnnotation.get(schema)),
588
- Option.getOrElse(() => false),
589
- );
590
- if (!isView) {
591
- return Option.none();
592
- }
593
-
594
- return Option.some(node);
595
- },
596
- connector: (node) =>
597
- Effect.succeed([
598
- {
599
- id: [node.id, 'selected-objects'].join(ATTENDABLE_PATH_SEPARATOR),
600
- type: PLANK_COMPANION_TYPE,
601
- data: 'selected-objects',
602
- properties: {
603
- label: ['companion selected objects label', { ns: meta.id }],
604
- icon: 'ph--tree-view--regular',
605
- disposition: 'hidden',
606
- },
607
- },
608
- ]),
609
- }),
610
-
611
- // Space settings panel children (General settings, Members, Types).
612
- GraphBuilder.createExtension({
613
- id: `${meta.id}/settings-sections`,
614
- match: NodeMatcher.whenNodeType(`${meta.id}/settings`),
615
- connector: (node) =>
616
- Effect.succeed([
617
- {
618
- id: `properties-${node.id}`,
619
- type: `${meta.id}/properties`,
620
- data: `${meta.id}/properties`,
621
- properties: {
622
- label: ['space settings properties label', { ns: meta.id }],
623
- icon: 'ph--sliders--regular',
624
- position: 'hoist',
625
- testId: 'spacePlugin.general',
626
- },
627
- },
628
- {
629
- id: `members-${node.id}`,
630
- type: `${meta.id}/members`,
631
- data: `${meta.id}/members`,
632
- properties: {
633
- label: ['members panel label', { ns: meta.id }],
634
- icon: 'ph--users--regular',
635
- position: 'hoist',
636
- testId: 'spacePlugin.members',
637
- },
638
- },
639
- {
640
- id: `schema-${node.id}`,
641
- type: `${meta.id}/schema`,
642
- data: `${meta.id}/schema`,
643
- properties: {
644
- label: ['space settings schema label', { ns: meta.id }],
645
- icon: 'ph--shapes--regular',
646
- testId: 'spacePlugin.schema',
647
- },
648
- },
649
- ]),
650
- }),
651
-
652
- // Object settings plank companion.
653
- GraphBuilder.createExtension({
654
- id: `${meta.id}/settings`,
655
- match: NodeMatcher.whenEchoObjectMatches,
656
- connector: (node) =>
657
- Effect.succeed([
658
- {
659
- id: [node.id, 'settings'].join(ATTENDABLE_PATH_SEPARATOR),
660
- type: PLANK_COMPANION_TYPE,
661
- data: 'settings',
662
- properties: {
663
- label: ['object settings label', { ns: meta.id }],
664
- icon: 'ph--sliders--regular',
665
- disposition: 'hidden',
666
- position: 'fallback',
667
- },
668
- },
669
- ]),
670
- }),
23
+ createSpaceExtensions(),
24
+ createTypeExtensions(),
25
+ createCollectionExtensions({ shareableLinkOrigin }),
26
+ createCompanionExtensions(),
27
+ createSettingsExtensions(),
671
28
  ]);
672
29
 
673
- return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
30
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions.flat());
674
31
  }),
675
32
  );