@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,351 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Option from 'effect/Option';
7
+
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
+ import { AppCapabilities, LayoutOperation, Segments, getObjectPathFromObject } from '@dxos/app-toolkit';
10
+ import { SpaceState, getSpace, isSpace } from '@dxos/client/echo';
11
+ import { Collection, Obj, Type } from '@dxos/echo';
12
+ import { AtomObj } from '@dxos/echo-atom';
13
+ import { invariant } from '@dxos/invariant';
14
+ import { Operation } from '@dxos/operation';
15
+ import { CreateAtom, Graph, GraphBuilder, Node } from '@dxos/plugin-graph';
16
+ import { isNonNullable } from '@dxos/util';
17
+
18
+ import { meta } from '../../../meta';
19
+ import { SpaceCapabilities, SpaceOperation } from '../../../types';
20
+
21
+ import {
22
+ COLLECTIONS_SECTION_TYPE,
23
+ COPY_LINK_LABEL,
24
+ CREATE_OBJECT_IN_COLLECTION_LABEL,
25
+ EXPOSE_OBJECT_LABEL,
26
+ type MetadataResolver,
27
+ REMOVE_FROM_COLLECTION_LABEL,
28
+ createObjectNode,
29
+ getCollectionGraphNodePartials,
30
+ getDynamicLabel,
31
+ whenSpace,
32
+ } from './shared';
33
+
34
+ //
35
+ // Extension Factory
36
+ //
37
+
38
+ /** Creates collection-related extensions: collections section, collections, objects, and object actions. */
39
+ export const createCollectionExtensions = Effect.fnUntraced(function* ({
40
+ shareableLinkOrigin,
41
+ }: {
42
+ shareableLinkOrigin: string;
43
+ }) {
44
+ const capabilities = yield* Capability.Service;
45
+
46
+ const resolve = (get: any) => (typename: string) =>
47
+ capabilities.getAll(AppCapabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
48
+
49
+ return yield* Effect.all([
50
+ // Collections section virtual node under each space.
51
+ GraphBuilder.createExtension({
52
+ id: `${meta.id}.collections-section`,
53
+ match: whenSpace,
54
+ connector: (space, get) => {
55
+ const spaceState = get(CreateAtom.fromObservable(space.state));
56
+ if (spaceState !== SpaceState.SPACE_READY) {
57
+ return Effect.succeed([]);
58
+ }
59
+
60
+ const propertiesSnapshot = get(AtomObj.make(space.properties));
61
+ const collectionRef = propertiesSnapshot[Collection.Collection.typename] as any;
62
+ if (collectionRef) {
63
+ get(AtomObj.make(collectionRef));
64
+ }
65
+ const rootCollection = collectionRef?.target;
66
+ const collectionPartials = rootCollection
67
+ ? getCollectionGraphNodePartials({ collection: rootCollection, db: space.db, resolve: resolve(get) })
68
+ : undefined;
69
+
70
+ return Effect.succeed([
71
+ {
72
+ id: Segments.collections,
73
+ type: COLLECTIONS_SECTION_TYPE,
74
+ data: null,
75
+ properties: {
76
+ label: ['collections section label', { ns: meta.id }],
77
+ icon: 'ph--folder--regular',
78
+ iconHue: 'neutral',
79
+ role: 'branch',
80
+ position: 'hoist',
81
+ testId: 'spacePlugin.collectionsSection',
82
+ draggable: false,
83
+ droppable: false,
84
+ space,
85
+ ...collectionPartials,
86
+ },
87
+ },
88
+ ]);
89
+ },
90
+ }),
91
+
92
+ // Root collection objects under the Collections virtual node.
93
+ GraphBuilder.createExtension({
94
+ id: `${meta.id}.collections`,
95
+ match: (node) => {
96
+ const space = isSpace(node.properties.space) ? node.properties.space : undefined;
97
+ return node.type === COLLECTIONS_SECTION_TYPE && space ? Option.some(space) : Option.none();
98
+ },
99
+ connector: (space, get) => {
100
+ const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
101
+ const ephemeralState = get(ephemeralAtom);
102
+
103
+ const propertiesSnapshot = get(AtomObj.make(space.properties));
104
+ const collectionRef = propertiesSnapshot[Collection.Collection.typename] as any;
105
+ const collection = collectionRef ? get(AtomObj.make(collectionRef)) : undefined;
106
+ if (!collection) {
107
+ return Effect.succeed([]);
108
+ }
109
+
110
+ const rawRefs = collection.objects ?? [];
111
+
112
+ const objects = rawRefs
113
+ .map((ref: any) => {
114
+ get(AtomObj.make(ref));
115
+ return ref.target;
116
+ })
117
+ .filter(isNonNullable);
118
+
119
+ return Effect.succeed(
120
+ objects
121
+ .map((object: Obj.Unknown) =>
122
+ createObjectNode({
123
+ db: space.db,
124
+ object,
125
+ resolve: resolve(get),
126
+ navigable: ephemeralState.navigableCollections,
127
+ parentCollection: collectionRef?.target,
128
+ }),
129
+ )
130
+ .filter(isNonNullable),
131
+ );
132
+ },
133
+ }),
134
+
135
+ // Children of Collection.Collection nodes.
136
+ GraphBuilder.createExtension({
137
+ id: `${meta.id}.objects`,
138
+ match: (node) => (Obj.instanceOf(Collection.Collection, node.data) ? Option.some(node.data) : Option.none()),
139
+ connector: (collection, get) => {
140
+ const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
141
+ const ephemeralState = get(ephemeralAtom);
142
+ const space = getSpace(collection);
143
+
144
+ const collectionSnapshot = get(AtomObj.make(collection));
145
+ const refs = collectionSnapshot.objects ?? [];
146
+
147
+ const objects = refs
148
+ .map((ref: any) => {
149
+ get(AtomObj.make(ref));
150
+ return ref.target;
151
+ })
152
+ .filter(isNonNullable);
153
+
154
+ return Effect.succeed(
155
+ objects
156
+ .map(
157
+ (object: Obj.Unknown) =>
158
+ space &&
159
+ createObjectNode({
160
+ object,
161
+ db: space.db,
162
+ resolve: resolve(get),
163
+ navigable: ephemeralState.navigableCollections,
164
+ parentCollection: collection,
165
+ }),
166
+ )
167
+ .filter(isNonNullable),
168
+ );
169
+ },
170
+ // TODO(graph-path-ids): Resolver temporarily disabled; redesign needed for path-based IDs.
171
+ // resolver: (id, get) => { ... },
172
+ }),
173
+
174
+ // Object actions.
175
+ GraphBuilder.createExtension({
176
+ id: `${meta.id}.object-actions`,
177
+ match: (node) => {
178
+ const space = getSpace(node.data);
179
+ return space && Obj.isObject(node.data) && Obj.getTypename(node.data) === node.type
180
+ ? Option.some({ space, object: node.data, nodeId: node.id })
181
+ : Option.none();
182
+ },
183
+ actions: ({ space, object, nodeId }, get) => {
184
+ const deletable = !Obj.instanceOf(Type.PersistentType, object);
185
+
186
+ const [appGraph] = get(capabilities.atom(AppCapabilities.AppGraph));
187
+ const ephemeralAtom = capabilities.get(SpaceCapabilities.EphemeralState);
188
+ const ephemeralState = get(ephemeralAtom);
189
+
190
+ if (!appGraph) {
191
+ return Effect.succeed([]);
192
+ }
193
+
194
+ const parentId = nodeId.substring(0, nodeId.lastIndexOf('/'));
195
+ const parentNode = Option.getOrUndefined(Graph.getNode(appGraph.graph, parentId));
196
+ const parentCollection =
197
+ parentNode && Obj.instanceOf(Collection.Collection, parentNode.data) ? parentNode.data : undefined;
198
+
199
+ return Effect.succeed(
200
+ constructObjectActions({
201
+ object,
202
+ nodeId,
203
+ resolve: resolve(get),
204
+ deletable,
205
+ navigable: ephemeralState.navigableCollections,
206
+ shareableLinkOrigin,
207
+ parentCollection,
208
+ }),
209
+ );
210
+ },
211
+ }),
212
+ ]);
213
+ });
214
+
215
+ //
216
+ // Helpers
217
+ //
218
+
219
+ /** Builds the action list for an ECHO object node. */
220
+ const constructObjectActions = ({
221
+ object,
222
+ nodeId,
223
+ resolve,
224
+ deletable = true,
225
+ navigable = false,
226
+ shareableLinkOrigin,
227
+ parentCollection,
228
+ }: {
229
+ object: Obj.Unknown;
230
+ nodeId: string;
231
+ resolve: MetadataResolver;
232
+ shareableLinkOrigin: string;
233
+ deletable?: boolean;
234
+ navigable?: boolean;
235
+ parentCollection?: Collection.Collection;
236
+ }) => {
237
+ const db = Obj.getDatabase(object);
238
+ invariant(db, 'Database not found');
239
+ const typename = Obj.getTypename(object);
240
+ invariant(typename, 'Object has no typename');
241
+
242
+ const actions: Node.NodeArg<Node.ActionData<Operation.Service | Capability.Service>>[] = [
243
+ ...(Obj.instanceOf(Collection.Collection, object)
244
+ ? [
245
+ {
246
+ id: SpaceOperation.OpenCreateObject.meta.key,
247
+ type: Node.ActionType,
248
+ data: () => Operation.invoke(SpaceOperation.OpenCreateObject, { target: object, targetNodeId: nodeId }),
249
+ properties: {
250
+ label: CREATE_OBJECT_IN_COLLECTION_LABEL,
251
+ icon: 'ph--plus--regular',
252
+ disposition: 'list-item-primary',
253
+ testId: 'spacePlugin.createObject',
254
+ },
255
+ },
256
+ ]
257
+ : []),
258
+ {
259
+ id: SpaceOperation.RenameObject.meta.key,
260
+ type: Node.ActionType,
261
+ data: (params?: Node.InvokeProps) =>
262
+ Operation.invoke(SpaceOperation.RenameObject, { object, caller: `${params?.caller}:${params?.parent?.id}` }),
263
+ properties: {
264
+ label: getDynamicLabel('rename object label', typename, { defaultValue: 'Rename' }),
265
+ icon: 'ph--pencil-simple-line--regular',
266
+ disposition: 'list-item',
267
+ testId: 'spacePlugin.renameObject',
268
+ },
269
+ },
270
+ ...(parentCollection && !Obj.instanceOf(Collection.Collection, object)
271
+ ? [
272
+ {
273
+ id: 'remove-from-collection',
274
+ type: Node.ActionType,
275
+ data: () =>
276
+ Effect.gen(function* () {
277
+ const index = parentCollection.objects.findIndex((ref: any) => ref.target === object);
278
+ if (index !== -1) {
279
+ const layout = yield* Capabilities.getAtomValue(AppCapabilities.Layout);
280
+ const isActive = layout.active.includes(nodeId);
281
+
282
+ Obj.change(parentCollection, (mutable) => {
283
+ mutable.objects.splice(index, 1);
284
+ });
285
+
286
+ if (isActive) {
287
+ yield* Operation.invoke(LayoutOperation.Open, {
288
+ subject: [getObjectPathFromObject(object)],
289
+ });
290
+ }
291
+ }
292
+ }),
293
+ properties: {
294
+ label: REMOVE_FROM_COLLECTION_LABEL,
295
+ icon: 'ph--minus-circle--regular',
296
+ disposition: 'list-item',
297
+ testId: 'spacePlugin.removeFromCollection',
298
+ },
299
+ },
300
+ ]
301
+ : []),
302
+ {
303
+ id: SpaceOperation.RemoveObjects.meta.key,
304
+ type: Node.ActionType,
305
+ data: () =>
306
+ Operation.invoke(SpaceOperation.RemoveObjects, {
307
+ objects: [object],
308
+ target: parentCollection,
309
+ }),
310
+ properties: {
311
+ label: getDynamicLabel('delete object label', typename, { defaultValue: 'Delete' }),
312
+ icon: 'ph--trash--regular',
313
+ disposition: 'list-item',
314
+ disabled: !deletable,
315
+ testId: 'spacePlugin.deleteObject',
316
+ },
317
+ },
318
+ ...(navigable || !Obj.instanceOf(Collection.Collection, object)
319
+ ? [
320
+ {
321
+ id: 'copy-link',
322
+ type: Node.ActionType,
323
+ data: () =>
324
+ Effect.promise(async () => {
325
+ const url = `${shareableLinkOrigin}/${db.spaceId}/${Obj.getDXN(object).toString()}`;
326
+ await navigator.clipboard.writeText(url);
327
+ }),
328
+ properties: {
329
+ label: COPY_LINK_LABEL,
330
+ icon: 'ph--link--regular',
331
+ disposition: 'list-item',
332
+ testId: 'spacePlugin.copyLink',
333
+ },
334
+ },
335
+ ]
336
+ : []),
337
+ {
338
+ id: LayoutOperation.Expose.meta.key,
339
+ type: Node.ActionType,
340
+ data: () => Operation.invoke(LayoutOperation.Expose, { subject: getObjectPathFromObject(object) }),
341
+ properties: {
342
+ label: EXPOSE_OBJECT_LABEL,
343
+ icon: 'ph--eye--regular',
344
+ disposition: 'heading-list-item',
345
+ testId: 'spacePlugin.exposeObject',
346
+ },
347
+ },
348
+ ];
349
+
350
+ return actions;
351
+ };
@@ -0,0 +1,80 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Option from 'effect/Option';
7
+
8
+ import { COMPANION_PREFIX } from '@dxos/app-toolkit';
9
+ import { Obj } from '@dxos/echo';
10
+ import { PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
11
+ import { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';
12
+ // TODO(wittjosiah): This is currently necessary for type portability.
13
+ // eslint-disable-next-line unused-imports/no-unused-imports
14
+ import type { Node } from '@dxos/plugin-graph';
15
+ import { ViewAnnotation } from '@dxos/schema';
16
+
17
+ import { meta } from '../../../meta';
18
+
19
+ //
20
+ // Extension Factory
21
+ //
22
+
23
+ /** Creates companion panel extensions: object settings and selected-objects. */
24
+ export const createCompanionExtensions = Effect.fnUntraced(function* () {
25
+ return yield* Effect.all([
26
+ // Object settings plank companion.
27
+ GraphBuilder.createExtension({
28
+ id: `${meta.id}.settings`,
29
+ match: NodeMatcher.whenEchoObjectMatches,
30
+ connector: (node) =>
31
+ Effect.succeed([
32
+ {
33
+ id: `${COMPANION_PREFIX}settings`,
34
+ type: PLANK_COMPANION_TYPE,
35
+ data: 'settings',
36
+ properties: {
37
+ label: ['object settings label', { ns: meta.id }],
38
+ icon: 'ph--sliders--regular',
39
+ disposition: 'hidden',
40
+ position: 'fallback',
41
+ },
42
+ },
43
+ ]),
44
+ }),
45
+
46
+ // View selected objects companion.
47
+ GraphBuilder.createExtension({
48
+ id: `${meta.id}.selected-objects`,
49
+ match: (node) => {
50
+ if (!Obj.isObject(node.data)) {
51
+ return Option.none();
52
+ }
53
+
54
+ const schema = Obj.getSchema(node.data);
55
+ const isView = Option.fromNullable(schema).pipe(
56
+ Option.flatMap((candidate) => ViewAnnotation.get(candidate)),
57
+ Option.getOrElse(() => false),
58
+ );
59
+ if (!isView) {
60
+ return Option.none();
61
+ }
62
+
63
+ return Option.some(node);
64
+ },
65
+ connector: (node) =>
66
+ Effect.succeed([
67
+ {
68
+ id: `${COMPANION_PREFIX}selected-objects`,
69
+ type: PLANK_COMPANION_TYPE,
70
+ data: 'selected-objects',
71
+ properties: {
72
+ label: ['companion selected objects label', { ns: meta.id }],
73
+ icon: 'ph--tree-view--regular',
74
+ disposition: 'hidden',
75
+ },
76
+ },
77
+ ]),
78
+ }),
79
+ ]);
80
+ });
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { createSpaceExtensions } from './spaces';
6
+ export { createTypeExtensions } from './types';
7
+ export { createCollectionExtensions } from './collections';
8
+ export { createCompanionExtensions } from './companions';
9
+ export { createSettingsExtensions } from './settings';
@@ -0,0 +1,60 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';
8
+ // TODO(wittjosiah): This is currently necessary for type portability.
9
+ // eslint-disable-next-line unused-imports/no-unused-imports
10
+ import type { Node } from '@dxos/plugin-graph';
11
+
12
+ import { meta } from '../../../meta';
13
+
14
+ //
15
+ // Extension Factory
16
+ //
17
+
18
+ /** Creates the settings-sections extension for space settings panel. */
19
+ export const createSettingsExtensions = Effect.fnUntraced(function* () {
20
+ const extension = yield* GraphBuilder.createExtension({
21
+ id: `${meta.id}.settings-sections`,
22
+ match: NodeMatcher.whenNodeType(`${meta.id}.settings`),
23
+ connector: (node) =>
24
+ Effect.succeed([
25
+ {
26
+ id: `${meta.id}.general`,
27
+ type: `${meta.id}.general`,
28
+ data: `${meta.id}.general`,
29
+ properties: {
30
+ label: ['space settings properties label', { ns: meta.id }],
31
+ icon: 'ph--sliders--regular',
32
+ position: 'hoist',
33
+ testId: 'spacePlugin.general',
34
+ },
35
+ },
36
+ {
37
+ id: `${meta.id}.members`,
38
+ type: `${meta.id}.members`,
39
+ data: `${meta.id}.members`,
40
+ properties: {
41
+ label: ['members panel label', { ns: meta.id }],
42
+ icon: 'ph--users--regular',
43
+ position: 'hoist',
44
+ testId: 'spacePlugin.members',
45
+ },
46
+ },
47
+ {
48
+ id: `${meta.id}.schema`,
49
+ type: `${meta.id}.schema`,
50
+ data: `${meta.id}.schema`,
51
+ properties: {
52
+ label: ['space settings schema label', { ns: meta.id }],
53
+ icon: 'ph--shapes--regular',
54
+ testId: 'spacePlugin.schema',
55
+ },
56
+ },
57
+ ]),
58
+ });
59
+ return [extension];
60
+ });
@@ -0,0 +1,112 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Registry from '@effect-atom/atom/Registry';
6
+ import * as Schema from 'effect/Schema';
7
+ import { afterEach, beforeEach, describe, test } from 'vitest';
8
+
9
+ import { Filter, Obj, Query, Ref, Type, View } from '@dxos/echo';
10
+ import { type EchoDatabase } from '@dxos/echo-db';
11
+ import { EchoTestBuilder } from '@dxos/echo-db/testing';
12
+ import { ViewAnnotation } from '@dxos/schema';
13
+
14
+ import { buildViewIndex } from './shared';
15
+
16
+ const TestContact = Schema.Struct({
17
+ name: Schema.String,
18
+ }).pipe(
19
+ Type.object({
20
+ typename: 'test/Contact',
21
+ version: '0.1.0',
22
+ }),
23
+ );
24
+
25
+ const TestViewWrapper = Schema.Struct({
26
+ name: Schema.optional(Schema.String),
27
+ view: Ref.Ref(View.View),
28
+ }).pipe(
29
+ Type.object({
30
+ typename: 'test/ViewWrapper',
31
+ version: '0.1.0',
32
+ }),
33
+ ViewAnnotation.set(true),
34
+ );
35
+
36
+ describe('buildViewIndex', () => {
37
+ let testBuilder: EchoTestBuilder;
38
+ let db: EchoDatabase;
39
+ let registry: Registry.Registry;
40
+
41
+ beforeEach(async () => {
42
+ testBuilder = await new EchoTestBuilder().open();
43
+ const result = await testBuilder.createDatabase({ types: [TestContact, TestViewWrapper, View.View] });
44
+ db = result.db;
45
+ registry = Registry.make();
46
+ });
47
+
48
+ afterEach(async () => {
49
+ await testBuilder.close();
50
+ });
51
+
52
+ test('includes typename when a straightforward view targets it', async ({ expect }) => {
53
+ const viewObj = db.add(
54
+ View.make({
55
+ query: { ast: Query.select(Filter.type(TestContact)).ast },
56
+ }),
57
+ );
58
+ db.add(Obj.make(TestViewWrapper, { view: Ref.make(viewObj) }));
59
+ await db.flush();
60
+
61
+ const allSchemas = db.schemaRegistry.query({ location: ['runtime'] }).runSync();
62
+ const viewIndex = buildViewIndex(registry.get.bind(registry) as any, { db } as any, allSchemas);
63
+
64
+ expect(viewIndex.typenamesWithViews.has(Type.getTypename(TestContact))).toBe(true);
65
+ });
66
+
67
+ test('excludes typename when no straightforward view targets it', async ({ expect }) => {
68
+ const viewObj = db.add(
69
+ View.make({
70
+ query: { ast: Query.select(Filter.nothing()).ast },
71
+ }),
72
+ );
73
+ db.add(Obj.make(TestViewWrapper, { view: Ref.make(viewObj) }));
74
+ await db.flush();
75
+
76
+ const allSchemas = db.schemaRegistry.query({ location: ['runtime'] }).runSync();
77
+ const viewIndex = buildViewIndex(registry.get.bind(registry) as any, { db } as any, allSchemas);
78
+
79
+ expect(viewIndex.typenamesWithViews.has(Type.getTypename(TestContact))).toBe(false);
80
+ expect(viewIndex.typenamesWithViews.size).toBe(0);
81
+ });
82
+
83
+ test('getViewsForTypename returns matching view objects', async ({ expect }) => {
84
+ const viewObj = db.add(
85
+ View.make({
86
+ query: { ast: Query.select(Filter.type(TestContact)).ast },
87
+ }),
88
+ );
89
+ const tableView = db.add(Obj.make(TestViewWrapper, { view: Ref.make(viewObj) }));
90
+ await db.flush();
91
+
92
+ const allSchemas = db.schemaRegistry.query({ location: ['runtime'] }).runSync();
93
+ const viewIndex = buildViewIndex(registry.get.bind(registry) as any, { db } as any, allSchemas);
94
+
95
+ const views = viewIndex.getViewsForTypename(Type.getTypename(TestContact));
96
+ expect(views).toHaveLength(1);
97
+ expect(views[0].id).toBe(tableView.id);
98
+ });
99
+
100
+ test('returns empty index when no view schemas exist', async ({ expect }) => {
101
+ await db.flush();
102
+
103
+ const userSchemas = db.schemaRegistry
104
+ .query({ location: ['runtime'] })
105
+ .runSync()
106
+ .filter((schema) => !ViewAnnotation.get(schema).pipe((opt) => opt._tag === 'Some' && opt.value));
107
+ const viewIndex = buildViewIndex(registry.get.bind(registry) as any, { db } as any, userSchemas);
108
+
109
+ expect(viewIndex.typenamesWithViews.size).toBe(0);
110
+ expect(viewIndex.getViewsForTypename(Type.getTypename(TestContact))).toHaveLength(0);
111
+ });
112
+ });