Package not found. Please check the package name and try again.

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

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 (770) hide show
  1. package/dist/lib/browser/CollectionArticle-WASDM637.mjs +142 -0
  2. package/dist/lib/browser/CollectionArticle-WASDM637.mjs.map +7 -0
  3. package/dist/lib/browser/CollectionSection-LK4O6QDD.mjs +23 -0
  4. package/dist/lib/browser/CollectionSection-LK4O6QDD.mjs.map +7 -0
  5. package/dist/lib/browser/CreateObjectDialog-MA6DPYMD.mjs +146 -0
  6. package/dist/lib/browser/CreateObjectDialog-MA6DPYMD.mjs.map +7 -0
  7. package/dist/lib/browser/CreateSpaceDialog-WCEICWIE.mjs +64 -0
  8. package/dist/lib/browser/CreateSpaceDialog-WCEICWIE.mjs.map +7 -0
  9. package/dist/lib/browser/InlineSyncStatus-BT7BRBCO.mjs +62 -0
  10. package/dist/lib/browser/InlineSyncStatus-BT7BRBCO.mjs.map +7 -0
  11. package/dist/lib/browser/JoinDialog-PMCAIRCU.mjs +117 -0
  12. package/dist/lib/browser/JoinDialog-PMCAIRCU.mjs.map +7 -0
  13. package/dist/lib/browser/MembersContainer-MMFCXLVZ.mjs +257 -0
  14. package/dist/lib/browser/MembersContainer-MMFCXLVZ.mjs.map +7 -0
  15. package/dist/lib/browser/MenuFooter-HYBTNOBT.mjs +38 -0
  16. package/dist/lib/browser/MenuFooter-HYBTNOBT.mjs.map +7 -0
  17. package/dist/lib/browser/ObjectCardStack-CHWNLUYQ.mjs +64 -0
  18. package/dist/lib/browser/ObjectCardStack-CHWNLUYQ.mjs.map +7 -0
  19. package/dist/lib/browser/ObjectDetails-YUGVDNSA.mjs +43 -0
  20. package/dist/lib/browser/ObjectDetails-YUGVDNSA.mjs.map +7 -0
  21. package/dist/lib/browser/ObjectRenamePopover-RQUOVPFH.mjs +70 -0
  22. package/dist/lib/browser/ObjectRenamePopover-RQUOVPFH.mjs.map +7 -0
  23. package/dist/lib/browser/RecordArticle-ONWKYM3Z.mjs +112 -0
  24. package/dist/lib/browser/RecordArticle-ONWKYM3Z.mjs.map +7 -0
  25. package/dist/lib/browser/SchemaContainer-62AJXKAF.mjs +49 -0
  26. package/dist/lib/browser/SchemaContainer-62AJXKAF.mjs.map +7 -0
  27. package/dist/lib/browser/SmallPresenceLive-LZD2NGKK.mjs +10 -0
  28. package/dist/lib/browser/SmallPresenceLive-LZD2NGKK.mjs.map +7 -0
  29. package/dist/lib/browser/SpacePluginSettings-BRJTADV5.mjs +59 -0
  30. package/dist/lib/browser/SpacePluginSettings-BRJTADV5.mjs.map +7 -0
  31. package/dist/lib/browser/SpacePresence-MLU576L6.mjs +13 -0
  32. package/dist/lib/browser/SpacePresence-MLU576L6.mjs.map +7 -0
  33. package/dist/lib/browser/SpaceRenamePopover-SAKMPDLX.mjs +62 -0
  34. package/dist/lib/browser/SpaceRenamePopover-SAKMPDLX.mjs.map +7 -0
  35. package/dist/lib/browser/SpaceSettingsContainer-UBMVKUPR.mjs +242 -0
  36. package/dist/lib/browser/SpaceSettingsContainer-UBMVKUPR.mjs.map +7 -0
  37. package/dist/lib/browser/SyncStatus-5UQ7CIII.mjs +141 -0
  38. package/dist/lib/browser/SyncStatus-5UQ7CIII.mjs.map +7 -0
  39. package/dist/lib/browser/ViewEditor-F74RR542.mjs +116 -0
  40. package/dist/lib/browser/ViewEditor-F74RR542.mjs.map +7 -0
  41. package/dist/lib/browser/app-graph-builder-VFYFI7CD.mjs +593 -0
  42. package/dist/lib/browser/app-graph-builder-VFYFI7CD.mjs.map +7 -0
  43. package/dist/lib/browser/app-graph-serializer-KTQOBYUF.mjs +85 -0
  44. package/dist/lib/browser/app-graph-serializer-KTQOBYUF.mjs.map +7 -0
  45. package/dist/lib/browser/chunk-ABCDB5YC.mjs +177 -0
  46. package/dist/lib/browser/chunk-ABCDB5YC.mjs.map +7 -0
  47. package/dist/lib/browser/chunk-ASV6DYFH.mjs +19 -0
  48. package/dist/lib/browser/chunk-ASV6DYFH.mjs.map +7 -0
  49. package/dist/lib/browser/chunk-HSMQFM57.mjs +16 -0
  50. package/dist/lib/browser/chunk-HSMQFM57.mjs.map +7 -0
  51. package/dist/lib/browser/chunk-J5F4LUJD.mjs +13 -0
  52. package/dist/lib/browser/chunk-J5F4LUJD.mjs.map +7 -0
  53. package/dist/lib/browser/{chunk-YZJWWMNB.mjs → chunk-PXVKN4LU.mjs} +69 -62
  54. package/dist/lib/browser/chunk-PXVKN4LU.mjs.map +7 -0
  55. package/dist/lib/browser/chunk-RWOK4F4G.mjs +576 -0
  56. package/dist/lib/browser/chunk-RWOK4F4G.mjs.map +7 -0
  57. package/dist/lib/browser/chunk-SJCNERZI.mjs +115 -0
  58. package/dist/lib/browser/chunk-SJCNERZI.mjs.map +7 -0
  59. package/dist/lib/browser/chunk-TPZUQ5DC.mjs +749 -0
  60. package/dist/lib/browser/chunk-TPZUQ5DC.mjs.map +7 -0
  61. package/dist/lib/browser/chunk-USN5QKRV.mjs +715 -0
  62. package/dist/lib/browser/chunk-USN5QKRV.mjs.map +7 -0
  63. package/dist/lib/browser/chunk-XIIYC7P5.mjs +118 -0
  64. package/dist/lib/browser/chunk-XIIYC7P5.mjs.map +7 -0
  65. package/dist/lib/browser/cli/index.mjs +852 -0
  66. package/dist/lib/browser/cli/index.mjs.map +7 -0
  67. package/dist/lib/browser/identity-created-VKLIZOXJ.mjs +23 -0
  68. package/dist/lib/browser/identity-created-VKLIZOXJ.mjs.map +7 -0
  69. package/dist/lib/browser/index.mjs +241 -283
  70. package/dist/lib/browser/index.mjs.map +4 -4
  71. package/dist/lib/browser/meta.json +1 -1
  72. package/dist/lib/browser/operation-resolver-Y3HYRXX7.mjs +831 -0
  73. package/dist/lib/browser/operation-resolver-Y3HYRXX7.mjs.map +7 -0
  74. package/dist/lib/browser/react-root-UYBW5RE7.mjs +30 -0
  75. package/dist/lib/browser/react-root-UYBW5RE7.mjs.map +7 -0
  76. package/dist/lib/browser/react-surface-NJ23NZFF.mjs +386 -0
  77. package/dist/lib/browser/react-surface-NJ23NZFF.mjs.map +7 -0
  78. package/dist/lib/browser/repair-N2I4DR2Z.mjs +50 -0
  79. package/dist/lib/browser/repair-N2I4DR2Z.mjs.map +7 -0
  80. package/dist/lib/browser/settings-2ELVUFDR.mjs +34 -0
  81. package/dist/lib/browser/settings-2ELVUFDR.mjs.map +7 -0
  82. package/dist/lib/browser/spaces-ready-Q6JASPT4.mjs +243 -0
  83. package/dist/lib/browser/spaces-ready-Q6JASPT4.mjs.map +7 -0
  84. package/dist/lib/browser/state-CTX4WQOM.mjs +58 -0
  85. package/dist/lib/browser/state-CTX4WQOM.mjs.map +7 -0
  86. package/dist/lib/browser/types/index.mjs +18 -10
  87. package/dist/lib/node-esm/CollectionArticle-A6GGG73Z.mjs +143 -0
  88. package/dist/lib/node-esm/CollectionArticle-A6GGG73Z.mjs.map +7 -0
  89. package/dist/lib/node-esm/CollectionSection-WWKDOAAT.mjs +24 -0
  90. package/dist/lib/node-esm/CollectionSection-WWKDOAAT.mjs.map +7 -0
  91. package/dist/lib/node-esm/CreateObjectDialog-4WEFNDDF.mjs +147 -0
  92. package/dist/lib/node-esm/CreateObjectDialog-4WEFNDDF.mjs.map +7 -0
  93. package/dist/lib/node-esm/CreateSpaceDialog-P7QCPB5J.mjs +65 -0
  94. package/dist/lib/node-esm/CreateSpaceDialog-P7QCPB5J.mjs.map +7 -0
  95. package/dist/lib/node-esm/InlineSyncStatus-3PCXU7NX.mjs +63 -0
  96. package/dist/lib/node-esm/InlineSyncStatus-3PCXU7NX.mjs.map +7 -0
  97. package/dist/lib/node-esm/JoinDialog-XEOLJZVN.mjs +118 -0
  98. package/dist/lib/node-esm/JoinDialog-XEOLJZVN.mjs.map +7 -0
  99. package/dist/lib/node-esm/MembersContainer-UQZLW3YA.mjs +258 -0
  100. package/dist/lib/node-esm/MembersContainer-UQZLW3YA.mjs.map +7 -0
  101. package/dist/lib/node-esm/MenuFooter-2QB3453Y.mjs +39 -0
  102. package/dist/lib/node-esm/MenuFooter-2QB3453Y.mjs.map +7 -0
  103. package/dist/lib/node-esm/ObjectCardStack-UXEWG6RV.mjs +65 -0
  104. package/dist/lib/node-esm/ObjectCardStack-UXEWG6RV.mjs.map +7 -0
  105. package/dist/lib/node-esm/ObjectDetails-26PVHUQL.mjs +44 -0
  106. package/dist/lib/node-esm/ObjectDetails-26PVHUQL.mjs.map +7 -0
  107. package/dist/lib/node-esm/ObjectRenamePopover-EHTP76G7.mjs +71 -0
  108. package/dist/lib/node-esm/ObjectRenamePopover-EHTP76G7.mjs.map +7 -0
  109. package/dist/lib/node-esm/RecordArticle-APY2WKUW.mjs +113 -0
  110. package/dist/lib/node-esm/RecordArticle-APY2WKUW.mjs.map +7 -0
  111. package/dist/lib/node-esm/SchemaContainer-XR2D6MYX.mjs +50 -0
  112. package/dist/lib/node-esm/SchemaContainer-XR2D6MYX.mjs.map +7 -0
  113. package/dist/lib/node-esm/SmallPresenceLive-K4243KXR.mjs +11 -0
  114. package/dist/lib/node-esm/SmallPresenceLive-K4243KXR.mjs.map +7 -0
  115. package/dist/lib/node-esm/SpacePluginSettings-VEB5IGG7.mjs +60 -0
  116. package/dist/lib/node-esm/SpacePluginSettings-VEB5IGG7.mjs.map +7 -0
  117. package/dist/lib/node-esm/SpacePresence-HC2XGQ54.mjs +14 -0
  118. package/dist/lib/node-esm/SpacePresence-HC2XGQ54.mjs.map +7 -0
  119. package/dist/lib/node-esm/SpaceRenamePopover-WHM632OT.mjs +63 -0
  120. package/dist/lib/node-esm/SpaceRenamePopover-WHM632OT.mjs.map +7 -0
  121. package/dist/lib/node-esm/SpaceSettingsContainer-Y62J2L65.mjs +243 -0
  122. package/dist/lib/node-esm/SpaceSettingsContainer-Y62J2L65.mjs.map +7 -0
  123. package/dist/lib/node-esm/SyncStatus-XTJAVHPN.mjs +142 -0
  124. package/dist/lib/node-esm/SyncStatus-XTJAVHPN.mjs.map +7 -0
  125. package/dist/lib/node-esm/ViewEditor-B2BLYF5U.mjs +117 -0
  126. package/dist/lib/node-esm/ViewEditor-B2BLYF5U.mjs.map +7 -0
  127. package/dist/lib/node-esm/app-graph-builder-N37ED6UI.mjs +594 -0
  128. package/dist/lib/node-esm/app-graph-builder-N37ED6UI.mjs.map +7 -0
  129. package/dist/lib/node-esm/app-graph-serializer-GXQYSQAZ.mjs +86 -0
  130. package/dist/lib/node-esm/app-graph-serializer-GXQYSQAZ.mjs.map +7 -0
  131. package/dist/lib/node-esm/chunk-3DWZCVVQ.mjs +716 -0
  132. package/dist/lib/node-esm/chunk-3DWZCVVQ.mjs.map +7 -0
  133. package/dist/lib/node-esm/chunk-CVXULIYC.mjs +20 -0
  134. package/dist/lib/node-esm/chunk-CVXULIYC.mjs.map +7 -0
  135. package/dist/lib/node-esm/chunk-GWUPFA7J.mjs +577 -0
  136. package/dist/lib/node-esm/chunk-GWUPFA7J.mjs.map +7 -0
  137. package/dist/lib/node-esm/chunk-IV7VKVGC.mjs +117 -0
  138. package/dist/lib/node-esm/chunk-IV7VKVGC.mjs.map +7 -0
  139. package/dist/lib/node-esm/chunk-OSFH2XKO.mjs +119 -0
  140. package/dist/lib/node-esm/chunk-OSFH2XKO.mjs.map +7 -0
  141. package/dist/lib/node-esm/{chunk-7UIEPBQJ.mjs → chunk-P2AVANDG.mjs} +69 -62
  142. package/dist/lib/node-esm/chunk-P2AVANDG.mjs.map +7 -0
  143. package/dist/lib/node-esm/chunk-S2IELCDF.mjs +15 -0
  144. package/dist/lib/node-esm/chunk-S2IELCDF.mjs.map +7 -0
  145. package/dist/lib/node-esm/chunk-SL4BJSUG.mjs +18 -0
  146. package/dist/lib/node-esm/chunk-SL4BJSUG.mjs.map +7 -0
  147. package/dist/lib/node-esm/chunk-UJQUBDQS.mjs +178 -0
  148. package/dist/lib/node-esm/chunk-UJQUBDQS.mjs.map +7 -0
  149. package/dist/lib/node-esm/chunk-WW6YYBRG.mjs +750 -0
  150. package/dist/lib/node-esm/chunk-WW6YYBRG.mjs.map +7 -0
  151. package/dist/lib/node-esm/cli/index.mjs +853 -0
  152. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  153. package/dist/lib/node-esm/identity-created-EGSTETJ5.mjs +25 -0
  154. package/dist/lib/node-esm/identity-created-EGSTETJ5.mjs.map +7 -0
  155. package/dist/lib/node-esm/index.mjs +241 -283
  156. package/dist/lib/node-esm/index.mjs.map +4 -4
  157. package/dist/lib/node-esm/meta.json +1 -1
  158. package/dist/lib/node-esm/operation-resolver-IRQ2NVUQ.mjs +832 -0
  159. package/dist/lib/node-esm/operation-resolver-IRQ2NVUQ.mjs.map +7 -0
  160. package/dist/lib/node-esm/react-root-UEN3LLJD.mjs +31 -0
  161. package/dist/lib/node-esm/react-root-UEN3LLJD.mjs.map +7 -0
  162. package/dist/lib/node-esm/react-surface-UDO3PGH6.mjs +387 -0
  163. package/dist/lib/node-esm/react-surface-UDO3PGH6.mjs.map +7 -0
  164. package/dist/lib/node-esm/repair-P6ND7ZRU.mjs +51 -0
  165. package/dist/lib/node-esm/repair-P6ND7ZRU.mjs.map +7 -0
  166. package/dist/lib/node-esm/settings-DCTVM2BV.mjs +35 -0
  167. package/dist/lib/node-esm/settings-DCTVM2BV.mjs.map +7 -0
  168. package/dist/lib/node-esm/spaces-ready-XLGRTJV2.mjs +244 -0
  169. package/dist/lib/node-esm/spaces-ready-XLGRTJV2.mjs.map +7 -0
  170. package/dist/lib/node-esm/state-G74V3WZG.mjs +59 -0
  171. package/dist/lib/node-esm/state-G74V3WZG.mjs.map +7 -0
  172. package/dist/lib/node-esm/types/index.mjs +18 -10
  173. package/dist/types/src/SpacePlugin.d.ts +3 -15
  174. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  175. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +7 -0
  176. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  177. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  178. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  179. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts +5 -0
  180. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts.map +1 -0
  181. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts +3 -0
  182. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts.map +1 -0
  183. package/dist/types/src/capabilities/identity-created/identity-created.d.ts +5 -0
  184. package/dist/types/src/capabilities/identity-created/identity-created.d.ts.map +1 -0
  185. package/dist/types/src/capabilities/identity-created/index.d.ts +3 -0
  186. package/dist/types/src/capabilities/identity-created/index.d.ts.map +1 -0
  187. package/dist/types/src/capabilities/index.d.ts +10 -20
  188. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  189. package/dist/types/src/capabilities/operation-resolver/index.d.ts +6 -0
  190. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  191. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +9 -0
  192. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  193. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  194. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  195. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  196. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  197. package/dist/types/src/capabilities/react-surface/index.d.ts +5 -0
  198. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  199. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +8 -0
  200. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  201. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  202. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  203. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  204. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  205. package/dist/types/src/capabilities/settings/index.d.ts +7 -0
  206. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  207. package/dist/types/src/capabilities/settings/settings.d.ts +10 -0
  208. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  209. package/dist/types/src/capabilities/spaces-ready/index.d.ts +3 -0
  210. package/dist/types/src/capabilities/spaces-ready/index.d.ts.map +1 -0
  211. package/dist/types/src/capabilities/spaces-ready/spaces-ready.d.ts +5 -0
  212. package/dist/types/src/capabilities/spaces-ready/spaces-ready.d.ts.map +1 -0
  213. package/dist/types/src/capabilities/state/index.d.ts +13 -0
  214. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  215. package/dist/types/src/capabilities/state/state.d.ts +17 -0
  216. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  217. package/dist/types/src/cli/commands/database/add.d.ts +17 -0
  218. package/dist/types/src/cli/commands/database/add.d.ts.map +1 -0
  219. package/dist/types/src/cli/commands/database/index.d.ts +3 -0
  220. package/dist/types/src/cli/commands/database/index.d.ts.map +1 -0
  221. package/dist/types/src/cli/commands/database/query/index.d.ts +2 -0
  222. package/dist/types/src/cli/commands/database/query/index.d.ts.map +1 -0
  223. package/dist/types/src/cli/commands/database/query/query.d.ts +13 -0
  224. package/dist/types/src/cli/commands/database/query/query.d.ts.map +1 -0
  225. package/dist/types/src/cli/commands/database/query/query.test.d.ts +2 -0
  226. package/dist/types/src/cli/commands/database/query/query.test.d.ts.map +1 -0
  227. package/dist/types/src/cli/commands/database/remove.d.ts +9 -0
  228. package/dist/types/src/cli/commands/database/remove.d.ts.map +1 -0
  229. package/dist/types/src/cli/commands/database/stats.d.ts +6 -0
  230. package/dist/types/src/cli/commands/database/stats.d.ts.map +1 -0
  231. package/dist/types/src/cli/commands/database/util.d.ts +14 -0
  232. package/dist/types/src/cli/commands/database/util.d.ts.map +1 -0
  233. package/dist/types/src/cli/commands/index.d.ts +4 -0
  234. package/dist/types/src/cli/commands/index.d.ts.map +1 -0
  235. package/dist/types/src/cli/commands/queue/index.d.ts +7 -0
  236. package/dist/types/src/cli/commands/queue/index.d.ts.map +1 -0
  237. package/dist/types/src/cli/commands/queue/query.d.ts +8 -0
  238. package/dist/types/src/cli/commands/queue/query.d.ts.map +1 -0
  239. package/dist/types/src/cli/commands/queue/util.d.ts +6 -0
  240. package/dist/types/src/cli/commands/queue/util.d.ts.map +1 -0
  241. package/dist/types/src/cli/commands/space/close/close.d.ts +12 -0
  242. package/dist/types/src/cli/commands/space/close/close.d.ts.map +1 -0
  243. package/dist/types/src/cli/commands/space/close/index.d.ts +2 -0
  244. package/dist/types/src/cli/commands/space/close/index.d.ts.map +1 -0
  245. package/dist/types/src/cli/commands/space/create/create.d.ts +12 -0
  246. package/dist/types/src/cli/commands/space/create/create.d.ts.map +1 -0
  247. package/dist/types/src/cli/commands/space/create/create.test.d.ts +2 -0
  248. package/dist/types/src/cli/commands/space/create/create.test.d.ts.map +1 -0
  249. package/dist/types/src/cli/commands/space/create/index.d.ts +2 -0
  250. package/dist/types/src/cli/commands/space/create/index.d.ts.map +1 -0
  251. package/dist/types/src/cli/commands/space/index.d.ts +31 -0
  252. package/dist/types/src/cli/commands/space/index.d.ts.map +1 -0
  253. package/dist/types/src/cli/commands/space/info/index.d.ts +2 -0
  254. package/dist/types/src/cli/commands/space/info/index.d.ts.map +1 -0
  255. package/dist/types/src/cli/commands/space/info/info.d.ts +13 -0
  256. package/dist/types/src/cli/commands/space/info/info.d.ts.map +1 -0
  257. package/dist/types/src/cli/commands/space/info/info.test.d.ts +2 -0
  258. package/dist/types/src/cli/commands/space/info/info.test.d.ts.map +1 -0
  259. package/dist/types/src/cli/commands/space/join/index.d.ts +2 -0
  260. package/dist/types/src/cli/commands/space/join/index.d.ts.map +1 -0
  261. package/dist/types/src/cli/commands/space/join/join.d.ts +14 -0
  262. package/dist/types/src/cli/commands/space/join/join.d.ts.map +1 -0
  263. package/dist/types/src/cli/commands/space/join/util.d.ts +17 -0
  264. package/dist/types/src/cli/commands/space/join/util.d.ts.map +1 -0
  265. package/dist/types/src/cli/commands/space/list/index.d.ts +2 -0
  266. package/dist/types/src/cli/commands/space/list/index.d.ts.map +1 -0
  267. package/dist/types/src/cli/commands/space/list/list.d.ts +7 -0
  268. package/dist/types/src/cli/commands/space/list/list.d.ts.map +1 -0
  269. package/dist/types/src/cli/commands/space/list/list.test.d.ts +2 -0
  270. package/dist/types/src/cli/commands/space/list/list.test.d.ts.map +1 -0
  271. package/dist/types/src/cli/commands/space/members/index.d.ts +2 -0
  272. package/dist/types/src/cli/commands/space/members/index.d.ts.map +1 -0
  273. package/dist/types/src/cli/commands/space/members/members.d.ts +13 -0
  274. package/dist/types/src/cli/commands/space/members/members.d.ts.map +1 -0
  275. package/dist/types/src/cli/commands/space/members/members.test.d.ts +2 -0
  276. package/dist/types/src/cli/commands/space/members/members.test.d.ts.map +1 -0
  277. package/dist/types/src/cli/commands/space/members/util.d.ts +9 -0
  278. package/dist/types/src/cli/commands/space/members/util.d.ts.map +1 -0
  279. package/dist/types/src/cli/commands/space/open/index.d.ts +2 -0
  280. package/dist/types/src/cli/commands/space/open/index.d.ts.map +1 -0
  281. package/dist/types/src/cli/commands/space/open/open.d.ts +12 -0
  282. package/dist/types/src/cli/commands/space/open/open.d.ts.map +1 -0
  283. package/dist/types/src/cli/commands/space/schema/index.d.ts +8 -0
  284. package/dist/types/src/cli/commands/space/schema/index.d.ts.map +1 -0
  285. package/dist/types/src/cli/commands/space/schema/list/index.d.ts +2 -0
  286. package/dist/types/src/cli/commands/space/schema/list/index.d.ts.map +1 -0
  287. package/dist/types/src/cli/commands/space/schema/list/list.d.ts +15 -0
  288. package/dist/types/src/cli/commands/space/schema/list/list.d.ts.map +1 -0
  289. package/dist/types/src/cli/commands/space/schema/list/list.test.d.ts +2 -0
  290. package/dist/types/src/cli/commands/space/schema/list/list.test.d.ts.map +1 -0
  291. package/dist/types/src/cli/commands/space/schema/list/util.d.ts +15 -0
  292. package/dist/types/src/cli/commands/space/schema/list/util.d.ts.map +1 -0
  293. package/dist/types/src/cli/commands/space/share/index.d.ts +2 -0
  294. package/dist/types/src/cli/commands/space/share/index.d.ts.map +1 -0
  295. package/dist/types/src/cli/commands/space/share/share.d.ts +19 -0
  296. package/dist/types/src/cli/commands/space/share/share.d.ts.map +1 -0
  297. package/dist/types/src/cli/commands/space/sync/index.d.ts +2 -0
  298. package/dist/types/src/cli/commands/space/sync/index.d.ts.map +1 -0
  299. package/dist/types/src/cli/commands/space/sync/sync.d.ts +6 -0
  300. package/dist/types/src/cli/commands/space/sync/sync.d.ts.map +1 -0
  301. package/dist/types/src/cli/commands/space/sync/sync.test.d.ts +2 -0
  302. package/dist/types/src/cli/commands/space/sync/sync.test.d.ts.map +1 -0
  303. package/dist/types/src/cli/index.d.ts +2 -0
  304. package/dist/types/src/cli/index.d.ts.map +1 -0
  305. package/dist/types/src/cli/plugin.d.ts +4 -0
  306. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  307. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  308. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +27 -11
  309. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  310. package/dist/types/src/components/CreateDialog/index.d.ts +1 -2
  311. package/dist/types/src/components/CreateDialog/index.d.ts.map +1 -1
  312. package/dist/types/src/components/{ObjectSettings → ObjectDetails}/BaseObjectSettings.d.ts +3 -3
  313. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.d.ts.map +1 -0
  314. package/dist/types/src/components/{MembersContainer.stories.d.ts → ObjectDetails/BaseObjectSettings.stories.d.ts} +230 -384
  315. package/dist/types/src/components/{MembersContainer.stories.d.ts.map → ObjectDetails/BaseObjectSettings.stories.d.ts.map} +1 -1
  316. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts +8 -0
  317. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts.map +1 -0
  318. package/dist/types/src/components/ObjectDetails/index.d.ts +3 -0
  319. package/dist/types/src/components/ObjectDetails/index.d.ts.map +1 -0
  320. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts +9 -0
  321. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -0
  322. package/dist/types/src/components/ObjectForm/index.d.ts +2 -0
  323. package/dist/types/src/components/ObjectForm/index.d.ts.map +1 -0
  324. package/dist/types/src/components/SyncStatus/index.d.ts +2 -2
  325. package/dist/types/src/components/SyncStatus/index.d.ts.map +1 -1
  326. package/dist/types/src/components/index.d.ts +2 -26
  327. package/dist/types/src/components/index.d.ts.map +1 -1
  328. package/dist/types/src/constants.d.ts +6 -0
  329. package/dist/types/src/constants.d.ts.map +1 -0
  330. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts +9 -0
  331. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts.map +1 -0
  332. package/dist/types/src/containers/CollectionArticle/index.d.ts +3 -0
  333. package/dist/types/src/containers/CollectionArticle/index.d.ts.map +1 -0
  334. package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts +5 -0
  335. package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts.map +1 -0
  336. package/dist/types/src/containers/CollectionSection/index.d.ts +3 -0
  337. package/dist/types/src/containers/CollectionSection/index.d.ts.map +1 -0
  338. package/dist/types/src/{components/CreateDialog → containers/CreateObjectDialog}/CreateObjectDialog.d.ts +5 -4
  339. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts.map +1 -0
  340. package/dist/types/src/containers/CreateObjectDialog/index.d.ts +3 -0
  341. package/dist/types/src/containers/CreateObjectDialog/index.d.ts.map +1 -0
  342. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts.map +1 -0
  343. package/dist/types/src/containers/CreateSpaceDialog/index.d.ts +3 -0
  344. package/dist/types/src/containers/CreateSpaceDialog/index.d.ts.map +1 -0
  345. package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts.map +1 -0
  346. package/dist/types/src/containers/InlineSyncStatus/index.d.ts +3 -0
  347. package/dist/types/src/containers/InlineSyncStatus/index.d.ts.map +1 -0
  348. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -0
  349. package/dist/types/src/containers/JoinDialog/index.d.ts +3 -0
  350. package/dist/types/src/containers/JoinDialog/index.d.ts.map +1 -0
  351. package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts.map +1 -0
  352. package/dist/types/src/containers/MembersContainer/index.d.ts +3 -0
  353. package/dist/types/src/containers/MembersContainer/index.d.ts.map +1 -0
  354. package/dist/types/src/{components → containers/MenuFooter}/MenuFooter.d.ts +1 -1
  355. package/dist/types/src/containers/MenuFooter/MenuFooter.d.ts.map +1 -0
  356. package/dist/types/src/containers/MenuFooter/index.d.ts +3 -0
  357. package/dist/types/src/containers/MenuFooter/index.d.ts.map +1 -0
  358. package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts +11 -0
  359. package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts.map +1 -0
  360. package/dist/types/src/containers/ObjectCardStack/index.d.ts +3 -0
  361. package/dist/types/src/containers/ObjectCardStack/index.d.ts.map +1 -0
  362. package/dist/types/src/containers/ObjectDetails/ObjectDetails.d.ts +9 -0
  363. package/dist/types/src/containers/ObjectDetails/ObjectDetails.d.ts.map +1 -0
  364. package/dist/types/src/containers/ObjectDetails/index.d.ts +3 -0
  365. package/dist/types/src/containers/ObjectDetails/index.d.ts.map +1 -0
  366. package/dist/types/src/containers/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  367. package/dist/types/src/containers/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  368. package/dist/types/src/containers/ObjectRenamePopover/index.d.ts +3 -0
  369. package/dist/types/src/containers/ObjectRenamePopover/index.d.ts.map +1 -0
  370. package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts +4 -0
  371. package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts.map +1 -0
  372. package/dist/types/src/containers/RecordArticle/index.d.ts +3 -0
  373. package/dist/types/src/containers/RecordArticle/index.d.ts.map +1 -0
  374. package/dist/types/src/{components → containers/SchemaContainer}/SchemaContainer.d.ts +2 -2
  375. package/dist/types/src/containers/SchemaContainer/SchemaContainer.d.ts.map +1 -0
  376. package/dist/types/src/containers/SchemaContainer/index.d.ts +3 -0
  377. package/dist/types/src/containers/SchemaContainer/index.d.ts.map +1 -0
  378. package/dist/types/src/containers/SmallPresenceLive/index.d.ts +2 -0
  379. package/dist/types/src/containers/SmallPresenceLive/index.d.ts.map +1 -0
  380. package/dist/types/src/containers/SpacePluginSettings/SpacePluginSettings.d.ts +8 -0
  381. package/dist/types/src/containers/SpacePluginSettings/SpacePluginSettings.d.ts.map +1 -0
  382. package/dist/types/src/containers/SpacePluginSettings/index.d.ts +3 -0
  383. package/dist/types/src/containers/SpacePluginSettings/index.d.ts.map +1 -0
  384. package/dist/types/src/{components → containers/SpacePresence}/SpacePresence.d.ts +7 -6
  385. package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts.map +1 -0
  386. package/dist/types/src/{components → containers/SpacePresence}/SpacePresence.stories.d.ts +227 -214
  387. package/dist/types/src/{components → containers/SpacePresence}/SpacePresence.stories.d.ts.map +1 -1
  388. package/dist/types/src/containers/SpacePresence/index.d.ts +3 -0
  389. package/dist/types/src/containers/SpacePresence/index.d.ts.map +1 -0
  390. package/dist/types/src/containers/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  391. package/dist/types/src/containers/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  392. package/dist/types/src/containers/SpaceRenamePopover/index.d.ts +3 -0
  393. package/dist/types/src/containers/SpaceRenamePopover/index.d.ts.map +1 -0
  394. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.d.ts +10 -0
  395. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.d.ts.map +1 -0
  396. package/dist/types/src/{components/SpaceSettings → containers/SpaceSettingsContainer}/SpaceSettingsContainer.stories.d.ts +231 -215
  397. package/dist/types/src/{components/SpaceSettings → containers/SpaceSettingsContainer}/SpaceSettingsContainer.stories.d.ts.map +1 -1
  398. package/dist/types/src/containers/SpaceSettingsContainer/index.d.ts +3 -0
  399. package/dist/types/src/containers/SpaceSettingsContainer/index.d.ts.map +1 -0
  400. package/dist/types/src/containers/SyncStatus/SyncStatus.d.ts.map +1 -0
  401. package/dist/types/src/{components → containers}/SyncStatus/SyncStatus.stories.d.ts +228 -215
  402. package/dist/types/src/{components → containers}/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  403. package/dist/types/src/containers/SyncStatus/index.d.ts +3 -0
  404. package/dist/types/src/containers/SyncStatus/index.d.ts.map +1 -0
  405. package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts +7 -0
  406. package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts.map +1 -0
  407. package/dist/types/src/containers/ViewEditor/index.d.ts +3 -0
  408. package/dist/types/src/containers/ViewEditor/index.d.ts.map +1 -0
  409. package/dist/types/src/containers/index.d.ts +23 -0
  410. package/dist/types/src/containers/index.d.ts.map +1 -0
  411. package/dist/types/src/helpers/index.d.ts +2 -0
  412. package/dist/types/src/helpers/index.d.ts.map +1 -0
  413. package/dist/types/src/helpers/query.d.ts +7 -0
  414. package/dist/types/src/helpers/query.d.ts.map +1 -0
  415. package/dist/types/src/helpers/query.test.d.ts +2 -0
  416. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  417. package/dist/types/src/hooks/index.d.ts +1 -0
  418. package/dist/types/src/hooks/index.d.ts.map +1 -1
  419. package/dist/types/src/hooks/useActiveSpace.d.ts +2 -2
  420. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  421. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +2 -8
  422. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  423. package/dist/types/src/hooks/usePath.d.ts +2 -2
  424. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  425. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  426. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  427. package/dist/types/src/index.d.ts +3 -3
  428. package/dist/types/src/index.d.ts.map +1 -1
  429. package/dist/types/src/meta.d.ts +2 -2
  430. package/dist/types/src/meta.d.ts.map +1 -1
  431. package/dist/types/src/translations.d.ts +227 -214
  432. package/dist/types/src/translations.d.ts.map +1 -1
  433. package/dist/types/src/types/capabilities.d.ts +71 -0
  434. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  435. package/dist/types/src/types/events.d.ts +9 -0
  436. package/dist/types/src/types/events.d.ts.map +1 -0
  437. package/dist/types/src/types/form.d.ts +22 -0
  438. package/dist/types/src/types/form.d.ts.map +1 -0
  439. package/dist/types/src/types/index.d.ts +3 -0
  440. package/dist/types/src/types/index.d.ts.map +1 -1
  441. package/dist/types/src/types/types.d.ts +594 -396
  442. package/dist/types/src/types/types.d.ts.map +1 -1
  443. package/dist/types/src/util.d.ts +122 -90
  444. package/dist/types/src/util.d.ts.map +1 -1
  445. package/dist/types/tsconfig.tsbuildinfo +1 -1
  446. package/package.json +84 -61
  447. package/src/SpacePlugin.ts +191 -235
  448. package/src/capabilities/app-graph-builder/app-graph-builder.ts +675 -0
  449. package/src/capabilities/app-graph-builder/index.ts +7 -0
  450. package/src/capabilities/app-graph-serializer/app-graph-serializer.ts +83 -0
  451. package/src/capabilities/app-graph-serializer/index.ts +7 -0
  452. package/src/capabilities/identity-created/identity-created.ts +29 -0
  453. package/src/capabilities/identity-created/index.ts +7 -0
  454. package/src/capabilities/index.ts +10 -14
  455. package/src/capabilities/operation-resolver/index.ts +7 -0
  456. package/src/capabilities/operation-resolver/operation-resolver.ts +771 -0
  457. package/src/capabilities/react-root/index.ts +7 -0
  458. package/src/capabilities/react-root/react-root.tsx +25 -0
  459. package/src/capabilities/react-surface/index.ts +7 -0
  460. package/src/capabilities/react-surface/react-surface.tsx +380 -0
  461. package/src/capabilities/repair/index.ts +7 -0
  462. package/src/capabilities/repair/repair.ts +71 -0
  463. package/src/capabilities/settings/index.ts +7 -0
  464. package/src/capabilities/settings/settings.ts +33 -0
  465. package/src/capabilities/spaces-ready/index.ts +7 -0
  466. package/src/capabilities/spaces-ready/spaces-ready.ts +290 -0
  467. package/src/capabilities/state/index.ts +7 -0
  468. package/src/capabilities/state/state.ts +64 -0
  469. package/src/cli/commands/database/add.ts +115 -0
  470. package/src/cli/commands/database/index.ts +16 -0
  471. package/src/cli/commands/database/query/index.ts +5 -0
  472. package/src/cli/commands/database/query/query.test.ts +55 -0
  473. package/src/cli/commands/database/query/query.ts +44 -0
  474. package/src/cli/commands/database/remove.ts +51 -0
  475. package/src/cli/commands/database/stats.ts +44 -0
  476. package/src/cli/commands/database/util.ts +32 -0
  477. package/src/cli/commands/index.ts +7 -0
  478. package/src/cli/commands/queue/index.ts +12 -0
  479. package/src/cli/commands/queue/query.ts +45 -0
  480. package/src/cli/commands/queue/util.ts +19 -0
  481. package/src/cli/commands/space/close/close.ts +40 -0
  482. package/src/cli/commands/space/close/index.ts +5 -0
  483. package/src/cli/commands/space/create/create.test.ts +67 -0
  484. package/src/cli/commands/space/create/create.ts +61 -0
  485. package/src/cli/commands/space/create/index.ts +5 -0
  486. package/src/cli/commands/space/index.ts +21 -0
  487. package/src/cli/commands/space/info/index.ts +5 -0
  488. package/src/cli/commands/space/info/info.test.ts +47 -0
  489. package/src/cli/commands/space/info/info.ts +37 -0
  490. package/src/cli/commands/space/join/index.ts +5 -0
  491. package/src/cli/commands/space/join/join.ts +122 -0
  492. package/src/cli/commands/space/join/util.ts +82 -0
  493. package/src/cli/commands/space/list/index.ts +5 -0
  494. package/src/cli/commands/space/list/list.test.ts +36 -0
  495. package/src/cli/commands/space/list/list.ts +30 -0
  496. package/src/cli/commands/space/members/index.ts +5 -0
  497. package/src/cli/commands/space/members/members.test.ts +46 -0
  498. package/src/cli/commands/space/members/members.ts +40 -0
  499. package/src/cli/commands/space/members/util.ts +29 -0
  500. package/src/cli/commands/space/open/index.ts +5 -0
  501. package/src/cli/commands/space/open/open.ts +39 -0
  502. package/src/cli/commands/space/schema/index.ts +12 -0
  503. package/src/cli/commands/space/schema/list/index.ts +5 -0
  504. package/src/cli/commands/space/schema/list/list.test.ts +42 -0
  505. package/src/cli/commands/space/schema/list/list.ts +64 -0
  506. package/src/cli/commands/space/schema/list/util.ts +39 -0
  507. package/src/cli/commands/space/share/index.ts +5 -0
  508. package/src/cli/commands/space/share/share.ts +112 -0
  509. package/src/cli/commands/space/sync/index.ts +5 -0
  510. package/src/cli/commands/space/sync/sync.test.ts +12 -0
  511. package/src/cli/commands/space/sync/sync.ts +33 -0
  512. package/src/cli/index.ts +5 -0
  513. package/src/cli/plugin.ts +89 -0
  514. package/src/components/AwaitingObject.tsx +22 -20
  515. package/src/components/CreateDialog/CreateObjectPanel.tsx +152 -114
  516. package/src/components/CreateDialog/index.ts +1 -2
  517. package/src/components/ObjectDetails/BaseObjectSettings.stories.tsx +63 -0
  518. package/src/components/ObjectDetails/BaseObjectSettings.tsx +122 -0
  519. package/src/components/{ObjectSettings → ObjectDetails}/ForeignKeys.tsx +5 -5
  520. package/src/components/ObjectDetails/index.ts +6 -0
  521. package/src/components/ObjectForm/ObjectForm.tsx +97 -0
  522. package/src/components/ObjectForm/index.ts +5 -0
  523. package/src/components/SyncStatus/index.ts +2 -2
  524. package/src/components/SyncStatus/save-tracker.ts +2 -2
  525. package/src/components/index.ts +2 -19
  526. package/src/constants.ts +11 -0
  527. package/src/containers/CollectionArticle/CollectionArticle.tsx +180 -0
  528. package/src/containers/CollectionArticle/index.ts +7 -0
  529. package/src/containers/CollectionSection/CollectionSection.tsx +22 -0
  530. package/src/containers/CollectionSection/index.ts +7 -0
  531. package/src/containers/CreateObjectDialog/CreateObjectDialog.tsx +164 -0
  532. package/src/containers/CreateObjectDialog/index.ts +7 -0
  533. package/src/containers/CreateSpaceDialog/CreateSpaceDialog.tsx +70 -0
  534. package/src/containers/CreateSpaceDialog/index.ts +7 -0
  535. package/src/{components/SyncStatus → containers/InlineSyncStatus}/InlineSyncStatus.tsx +6 -6
  536. package/src/containers/InlineSyncStatus/index.ts +7 -0
  537. package/src/{components → containers/JoinDialog}/JoinDialog.tsx +27 -37
  538. package/src/containers/JoinDialog/index.ts +7 -0
  539. package/src/{components → containers/MembersContainer}/MembersContainer.tsx +86 -89
  540. package/src/containers/MembersContainer/index.ts +7 -0
  541. package/src/{components → containers/MenuFooter}/MenuFooter.tsx +6 -6
  542. package/src/containers/MenuFooter/index.ts +7 -0
  543. package/src/containers/ObjectCardStack/ObjectCardStack.tsx +82 -0
  544. package/src/containers/ObjectCardStack/index.ts +7 -0
  545. package/src/containers/ObjectDetails/ObjectDetails.tsx +36 -0
  546. package/src/containers/ObjectDetails/index.ts +7 -0
  547. package/src/{components/PopoverRenameObject.tsx → containers/ObjectRenamePopover/ObjectRenamePopover.tsx} +11 -15
  548. package/src/containers/ObjectRenamePopover/index.ts +7 -0
  549. package/src/containers/RecordArticle/RecordArticle.tsx +124 -0
  550. package/src/containers/RecordArticle/index.ts +7 -0
  551. package/src/containers/SchemaContainer/SchemaContainer.tsx +60 -0
  552. package/src/containers/SchemaContainer/index.ts +7 -0
  553. package/src/containers/SmallPresenceLive/index.ts +5 -0
  554. package/src/containers/SpacePluginSettings/SpacePluginSettings.tsx +65 -0
  555. package/src/containers/SpacePluginSettings/index.ts +7 -0
  556. package/src/{components → containers/SpacePresence}/SpacePresence.stories.tsx +3 -3
  557. package/src/{components → containers/SpacePresence}/SpacePresence.tsx +26 -22
  558. package/src/containers/SpacePresence/index.ts +7 -0
  559. package/src/{components/PopoverRenameSpace.tsx → containers/SpaceRenamePopover/SpaceRenamePopover.tsx} +15 -15
  560. package/src/containers/SpaceRenamePopover/index.ts +7 -0
  561. package/src/{components/SpaceSettings → containers/SpaceSettingsContainer}/SpaceSettingsContainer.stories.tsx +7 -7
  562. package/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.tsx +202 -0
  563. package/src/containers/SpaceSettingsContainer/index.ts +7 -0
  564. package/src/{components → containers}/SyncStatus/SyncStatus.stories.tsx +4 -3
  565. package/src/containers/SyncStatus/SyncStatus.tsx +153 -0
  566. package/src/containers/SyncStatus/index.ts +7 -0
  567. package/src/containers/ViewEditor/ViewEditor.tsx +103 -0
  568. package/src/containers/ViewEditor/index.ts +7 -0
  569. package/src/containers/index.ts +28 -0
  570. package/src/helpers/index.ts +5 -0
  571. package/src/helpers/query.test.ts +24 -0
  572. package/src/helpers/query.ts +166 -0
  573. package/src/hooks/index.ts +1 -0
  574. package/src/hooks/useActiveSpace.ts +8 -4
  575. package/src/hooks/useInputSurfaceLookup.tsx +9 -13
  576. package/src/hooks/usePath.ts +4 -4
  577. package/src/hooks/useTypeOptions.ts +25 -0
  578. package/src/index.ts +4 -3
  579. package/src/meta.ts +7 -2
  580. package/src/translations.ts +69 -58
  581. package/src/types/capabilities.ts +73 -0
  582. package/src/types/events.ts +16 -0
  583. package/src/types/form.ts +69 -0
  584. package/src/types/index.ts +3 -0
  585. package/src/types/types.ts +539 -256
  586. package/src/util.tsx +707 -476
  587. package/dist/lib/browser/CollectionMain-AX7KKXWP.mjs +0 -31
  588. package/dist/lib/browser/CollectionMain-AX7KKXWP.mjs.map +0 -7
  589. package/dist/lib/browser/ObjectDetailsPanel-SJ4XUXXX.mjs +0 -90
  590. package/dist/lib/browser/ObjectDetailsPanel-SJ4XUXXX.mjs.map +0 -7
  591. package/dist/lib/browser/RecordMain-FHPCS6GM.mjs +0 -68
  592. package/dist/lib/browser/RecordMain-FHPCS6GM.mjs.map +0 -7
  593. package/dist/lib/browser/app-graph-builder-Y2LBZX2G.mjs +0 -520
  594. package/dist/lib/browser/app-graph-builder-Y2LBZX2G.mjs.map +0 -7
  595. package/dist/lib/browser/app-graph-serializer-425OVRTW.mjs +0 -80
  596. package/dist/lib/browser/app-graph-serializer-425OVRTW.mjs.map +0 -7
  597. package/dist/lib/browser/chunk-6KVKMOGQ.mjs +0 -1975
  598. package/dist/lib/browser/chunk-6KVKMOGQ.mjs.map +0 -7
  599. package/dist/lib/browser/chunk-CVZAZRW4.mjs +0 -94
  600. package/dist/lib/browser/chunk-CVZAZRW4.mjs.map +0 -7
  601. package/dist/lib/browser/chunk-EIXZABXD.mjs +0 -19
  602. package/dist/lib/browser/chunk-EIXZABXD.mjs.map +0 -7
  603. package/dist/lib/browser/chunk-IRKDREHY.mjs +0 -11
  604. package/dist/lib/browser/chunk-IRKDREHY.mjs.map +0 -7
  605. package/dist/lib/browser/chunk-OYHC63NL.mjs +0 -344
  606. package/dist/lib/browser/chunk-OYHC63NL.mjs.map +0 -7
  607. package/dist/lib/browser/chunk-PUF3B7XO.mjs +0 -20
  608. package/dist/lib/browser/chunk-PUF3B7XO.mjs.map +0 -7
  609. package/dist/lib/browser/chunk-X6COEDOD.mjs +0 -704
  610. package/dist/lib/browser/chunk-X6COEDOD.mjs.map +0 -7
  611. package/dist/lib/browser/chunk-YZJWWMNB.mjs.map +0 -7
  612. package/dist/lib/browser/identity-created-PW2BA46S.mjs +0 -23
  613. package/dist/lib/browser/identity-created-PW2BA46S.mjs.map +0 -7
  614. package/dist/lib/browser/intent-resolver-2TBYHOBA.mjs +0 -765
  615. package/dist/lib/browser/intent-resolver-2TBYHOBA.mjs.map +0 -7
  616. package/dist/lib/browser/react-root-KMJXJ5VX.mjs +0 -29
  617. package/dist/lib/browser/react-root-KMJXJ5VX.mjs.map +0 -7
  618. package/dist/lib/browser/react-surface-YAJUAMER.mjs +0 -385
  619. package/dist/lib/browser/react-surface-YAJUAMER.mjs.map +0 -7
  620. package/dist/lib/browser/schema-defs-2OCPV7JF.mjs +0 -26
  621. package/dist/lib/browser/schema-defs-2OCPV7JF.mjs.map +0 -7
  622. package/dist/lib/browser/settings-UYYJ225A.mjs +0 -24
  623. package/dist/lib/browser/settings-UYYJ225A.mjs.map +0 -7
  624. package/dist/lib/browser/spaces-ready-YNZPWXA3.mjs +0 -201
  625. package/dist/lib/browser/spaces-ready-YNZPWXA3.mjs.map +0 -7
  626. package/dist/lib/browser/state-BPU73TYO.mjs +0 -47
  627. package/dist/lib/browser/state-BPU73TYO.mjs.map +0 -7
  628. package/dist/lib/node-esm/CollectionMain-EU57SRYK.mjs +0 -32
  629. package/dist/lib/node-esm/CollectionMain-EU57SRYK.mjs.map +0 -7
  630. package/dist/lib/node-esm/ObjectDetailsPanel-P7D727OV.mjs +0 -91
  631. package/dist/lib/node-esm/ObjectDetailsPanel-P7D727OV.mjs.map +0 -7
  632. package/dist/lib/node-esm/RecordMain-V73AEB6N.mjs +0 -70
  633. package/dist/lib/node-esm/RecordMain-V73AEB6N.mjs.map +0 -7
  634. package/dist/lib/node-esm/app-graph-builder-DMNLDT7E.mjs +0 -521
  635. package/dist/lib/node-esm/app-graph-builder-DMNLDT7E.mjs.map +0 -7
  636. package/dist/lib/node-esm/app-graph-serializer-ZEDSY77N.mjs +0 -81
  637. package/dist/lib/node-esm/app-graph-serializer-ZEDSY77N.mjs.map +0 -7
  638. package/dist/lib/node-esm/chunk-36TAYXV7.mjs +0 -21
  639. package/dist/lib/node-esm/chunk-36TAYXV7.mjs.map +0 -7
  640. package/dist/lib/node-esm/chunk-7UIEPBQJ.mjs.map +0 -7
  641. package/dist/lib/node-esm/chunk-ADEZJQE3.mjs +0 -345
  642. package/dist/lib/node-esm/chunk-ADEZJQE3.mjs.map +0 -7
  643. package/dist/lib/node-esm/chunk-FLRC6XWU.mjs +0 -96
  644. package/dist/lib/node-esm/chunk-FLRC6XWU.mjs.map +0 -7
  645. package/dist/lib/node-esm/chunk-L26ZIGHA.mjs +0 -1976
  646. package/dist/lib/node-esm/chunk-L26ZIGHA.mjs.map +0 -7
  647. package/dist/lib/node-esm/chunk-MWNATOXL.mjs +0 -13
  648. package/dist/lib/node-esm/chunk-MWNATOXL.mjs.map +0 -7
  649. package/dist/lib/node-esm/chunk-SVFKU7EW.mjs +0 -20
  650. package/dist/lib/node-esm/chunk-SVFKU7EW.mjs.map +0 -7
  651. package/dist/lib/node-esm/chunk-ZFCCFELA.mjs +0 -705
  652. package/dist/lib/node-esm/chunk-ZFCCFELA.mjs.map +0 -7
  653. package/dist/lib/node-esm/identity-created-MWTLGQRU.mjs +0 -25
  654. package/dist/lib/node-esm/identity-created-MWTLGQRU.mjs.map +0 -7
  655. package/dist/lib/node-esm/intent-resolver-YOG27WOG.mjs +0 -766
  656. package/dist/lib/node-esm/intent-resolver-YOG27WOG.mjs.map +0 -7
  657. package/dist/lib/node-esm/react-root-27QMJZD2.mjs +0 -30
  658. package/dist/lib/node-esm/react-root-27QMJZD2.mjs.map +0 -7
  659. package/dist/lib/node-esm/react-surface-RC73GAN5.mjs +0 -386
  660. package/dist/lib/node-esm/react-surface-RC73GAN5.mjs.map +0 -7
  661. package/dist/lib/node-esm/schema-defs-X2Z7F2EV.mjs +0 -27
  662. package/dist/lib/node-esm/schema-defs-X2Z7F2EV.mjs.map +0 -7
  663. package/dist/lib/node-esm/settings-Q736OQRP.mjs +0 -25
  664. package/dist/lib/node-esm/settings-Q736OQRP.mjs.map +0 -7
  665. package/dist/lib/node-esm/spaces-ready-XZQD7Q65.mjs +0 -202
  666. package/dist/lib/node-esm/spaces-ready-XZQD7Q65.mjs.map +0 -7
  667. package/dist/lib/node-esm/state-BY75TM32.mjs +0 -48
  668. package/dist/lib/node-esm/state-BY75TM32.mjs.map +0 -7
  669. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  670. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  671. package/dist/types/src/capabilities/app-graph-serializer.d.ts +0 -4
  672. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +0 -1
  673. package/dist/types/src/capabilities/capabilities.d.ts +0 -28
  674. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  675. package/dist/types/src/capabilities/identity-created.d.ts +0 -4
  676. package/dist/types/src/capabilities/identity-created.d.ts.map +0 -1
  677. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -9
  678. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  679. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  680. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  681. package/dist/types/src/capabilities/react-surface.d.ts +0 -7
  682. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  683. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  684. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  685. package/dist/types/src/capabilities/settings.d.ts +0 -4
  686. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  687. package/dist/types/src/capabilities/spaces-ready.d.ts +0 -4
  688. package/dist/types/src/capabilities/spaces-ready.d.ts.map +0 -1
  689. package/dist/types/src/capabilities/state.d.ts +0 -5
  690. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  691. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  692. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  693. package/dist/types/src/components/CollectionSection.d.ts +0 -6
  694. package/dist/types/src/components/CollectionSection.d.ts.map +0 -1
  695. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +0 -1
  696. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +0 -1590
  697. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +0 -1
  698. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +0 -1
  699. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  700. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  701. package/dist/types/src/components/MenuFooter.d.ts.map +0 -1
  702. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  703. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  704. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts +0 -7
  705. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
  706. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +0 -1
  707. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +0 -8
  708. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +0 -1
  709. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts +0 -8
  710. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +0 -1
  711. package/dist/types/src/components/ObjectSettings/index.d.ts +0 -2
  712. package/dist/types/src/components/ObjectSettings/index.d.ts.map +0 -1
  713. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  714. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  715. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  716. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  717. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  718. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  719. package/dist/types/src/components/RecordMain.d.ts +0 -7
  720. package/dist/types/src/components/RecordMain.d.ts.map +0 -1
  721. package/dist/types/src/components/SchemaContainer.d.ts.map +0 -1
  722. package/dist/types/src/components/SpacePluginSettings.d.ts +0 -6
  723. package/dist/types/src/components/SpacePluginSettings.d.ts.map +0 -1
  724. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  725. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +0 -7
  726. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +0 -1
  727. package/dist/types/src/components/SpaceSettings/index.d.ts +0 -2
  728. package/dist/types/src/components/SpaceSettings/index.d.ts.map +0 -1
  729. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +0 -1
  730. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +0 -1
  731. package/dist/types/src/components/ViewEditor.d.ts +0 -8
  732. package/dist/types/src/components/ViewEditor.d.ts.map +0 -1
  733. package/dist/types/src/events.d.ts +0 -8
  734. package/dist/types/src/events.d.ts.map +0 -1
  735. package/src/capabilities/app-graph-builder.ts +0 -757
  736. package/src/capabilities/app-graph-serializer.ts +0 -76
  737. package/src/capabilities/capabilities.ts +0 -30
  738. package/src/capabilities/identity-created.ts +0 -25
  739. package/src/capabilities/intent-resolver.ts +0 -706
  740. package/src/capabilities/react-root.tsx +0 -21
  741. package/src/capabilities/react-surface.tsx +0 -400
  742. package/src/capabilities/schema-defs.ts +0 -31
  743. package/src/capabilities/settings.ts +0 -21
  744. package/src/capabilities/spaces-ready.ts +0 -234
  745. package/src/capabilities/state.ts +0 -46
  746. package/src/components/CollectionMain.tsx +0 -32
  747. package/src/components/CollectionSection.tsx +0 -20
  748. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +0 -85
  749. package/src/components/CreateDialog/CreateObjectDialog.tsx +0 -135
  750. package/src/components/CreateDialog/CreateSpaceDialog.tsx +0 -67
  751. package/src/components/MembersContainer.stories.tsx +0 -56
  752. package/src/components/ObjectDetailsPanel.tsx +0 -79
  753. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +0 -81
  754. package/src/components/ObjectSettings/BaseObjectSettings.tsx +0 -47
  755. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +0 -37
  756. package/src/components/ObjectSettings/index.ts +0 -5
  757. package/src/components/PersistenceStatus.tsx +0 -83
  758. package/src/components/RecordMain.tsx +0 -43
  759. package/src/components/SchemaContainer.tsx +0 -59
  760. package/src/components/SpacePluginSettings.tsx +0 -52
  761. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +0 -185
  762. package/src/components/SpaceSettings/index.ts +0 -5
  763. package/src/components/SyncStatus/SyncStatus.tsx +0 -59
  764. package/src/components/ViewEditor.tsx +0 -59
  765. package/src/events.ts +0 -15
  766. /package/dist/types/src/{components/CreateDialog → containers/CreateSpaceDialog}/CreateSpaceDialog.d.ts +0 -0
  767. /package/dist/types/src/{components/SyncStatus → containers/InlineSyncStatus}/InlineSyncStatus.d.ts +0 -0
  768. /package/dist/types/src/{components → containers/JoinDialog}/JoinDialog.d.ts +0 -0
  769. /package/dist/types/src/{components → containers/MembersContainer}/MembersContainer.d.ts +0 -0
  770. /package/dist/types/src/{components → containers}/SyncStatus/SyncStatus.d.ts +0 -0
package/src/util.tsx CHANGED
@@ -2,228 +2,202 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import * as Function from 'effect/Function';
7
-
8
- import { LayoutAction, type PromiseIntentDispatcher, chain, createIntent } from '@dxos/app-framework';
9
- import { Obj, Ref, Type } from '@dxos/echo';
10
- import { type AnyEchoObject, EXPANDO_TYPENAME } from '@dxos/echo/internal';
5
+ import { type Instruction } from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Match from 'effect/Match';
8
+ import * as Option from 'effect/Option';
9
+
10
+ import { type CapabilityManager } from '@dxos/app-framework';
11
+ import { LayoutOperation } from '@dxos/app-toolkit';
12
+ import { type Space, SpaceState, isSpace } from '@dxos/client/echo';
13
+ import { type Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Type } from '@dxos/echo';
14
+ import { Collection } from '@dxos/echo';
11
15
  import { invariant } from '@dxos/invariant';
12
16
  import { Migrations } from '@dxos/migrations';
13
- import {
14
- ACTION_GROUP_TYPE,
15
- ACTION_TYPE,
16
- type ActionData,
17
- type InvokeParams,
18
- type Node,
19
- type NodeArg,
20
- type ReadableGraph,
21
- isGraphNode,
22
- } from '@dxos/plugin-graph';
23
- import { type QueryResult, type Space, SpaceState, fullyQualifiedId, getSpace, isSpace } from '@dxos/react-client/echo';
24
- import { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';
17
+ import { Operation } from '@dxos/operation';
18
+ import { Graph, Node } from '@dxos/plugin-graph';
19
+ import { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention/types';
25
20
  import { type TreeData } from '@dxos/react-ui-list';
26
- import { DataType, getTypenameFromQuery } from '@dxos/schema';
21
+ import { Expando, ManagedCollection } from '@dxos/schema';
22
+ import { type Label } from '@dxos/ui-types';
23
+ import { createFilename } from '@dxos/util';
27
24
 
28
25
  import { meta } from './meta';
29
- import { type ObjectForm, SPACE_TYPE, SpaceAction } from './types';
26
+ import { SPACE_TYPE, SpaceOperation } from './types';
27
+
28
+ //
29
+ // Constants
30
+ //
31
+
32
+ const CACHEABLE_PROPS: string[] = ['label', 'icon', 'role'];
33
+ const ACCEPT_ECHO_CLASS: Set<string> = new Set(['echo']);
34
+
35
+ /** Shared translation namespace descriptor. */
36
+ const META_NS: { ns: string } = { ns: meta.id };
37
+
38
+ /** Static label tuples (translation key + namespace). */
39
+ const PERSONAL_SPACE_LABEL: Label = ['personal space label', META_NS];
40
+ const UNNAMED_SPACE_LABEL: Label = ['unnamed space label', META_NS];
41
+ const SETTINGS_PANEL_LABEL: Label = ['settings panel label', META_NS];
42
+ const MIGRATE_SPACE_LABEL: Label = ['migrate space label', META_NS];
43
+ const CREATE_OBJECT_IN_SPACE_LABEL: Label = ['create object in space label', META_NS];
44
+ const RENAME_SPACE_LABEL: Label = ['rename space label', META_NS];
45
+ const ADD_VIEW_TO_SCHEMA_LABEL: Label = ['add view to schema label', META_NS];
46
+ const SNAPSHOT_BY_SCHEMA_LABEL: Label = ['snapshot by schema label', META_NS];
47
+ const CREATE_OBJECT_IN_COLLECTION_LABEL: Label = ['create object in collection label', META_NS];
48
+ const CREATE_OBJECT_IN_SYSTEM_COLLECTION_LABEL: Label = ['create object in system collection label', META_NS];
49
+ const COPY_LINK_LABEL: Label = ['copy link label', META_NS];
50
+ const EXPOSE_OBJECT_LABEL: Label = ['expose object label', META_NS];
51
+
52
+ /** Stable callback constants (no closed-over state). */
53
+ const CAN_DROP_FALSE = () => false;
54
+ const CAN_DROP_SPACE = (source: TreeData) => Obj.isObject(source.item.data) || isSpace(source.item.data);
55
+ const CAN_DROP_OBJECT = (source: TreeData) => Node.isGraphNode(source.item) && Obj.isObject(source.item.data);
30
56
 
31
57
  export const SPACES = `${meta.id}-spaces`;
32
58
  export const COMPOSER_SPACE_LOCK = `${meta.id}/lock`;
33
59
  // TODO(wittjosiah): Remove.
34
60
  export const SHARED = 'shared-spaces';
35
61
 
36
- /**
37
- * Convert a query result to an Rx value of the objects.
38
- */
39
- export const rxFromQuery = <T extends AnyEchoObject>(query: QueryResult<T>): Rx.Rx<T[]> => {
40
- return Rx.make((get) => {
41
- const unsubscribe = query.subscribe((result) => {
42
- get.setSelf(result.objects);
43
- });
44
-
45
- get.addFinalizer(() => unsubscribe());
46
- return query.objects;
47
- });
48
- };
62
+ const SCHEMA_GRAPH_NODE_PARTIALS = {
63
+ role: 'branch',
64
+ canDrop: CAN_DROP_FALSE,
65
+ } as const;
49
66
 
50
- // TODO(wittjosiah): Factor out? Expose via capability?
51
- export const getSpaceDisplayName = (
52
- space: Space,
53
- { personal, namesCache = {} }: { personal?: boolean; namesCache?: Record<string, string> } = {},
54
- ): string | [string, { ns: string }] => {
55
- return space.state.get() === SpaceState.SPACE_READY && (space.properties.name?.length ?? 0) > 0
56
- ? space.properties.name
57
- : namesCache[space.id]
58
- ? namesCache[space.id]
59
- : personal
60
- ? ['personal space label', { ns: meta.id }]
61
- : ['unnamed space label', { ns: meta.id }];
62
- };
63
-
64
- const getCollectionGraphNodePartials = ({
65
- collection,
66
- space,
67
- resolve,
68
- }: {
69
- collection: DataType.Collection;
70
- space: Space;
71
- resolve: (typename: string) => Record<string, any>;
72
- }) => {
73
- return {
74
- acceptPersistenceClass: new Set(['echo']),
75
- acceptPersistenceKey: new Set([space.id]),
76
- role: 'branch',
77
- onRearrangeChildren: (nextOrder: unknown[]) => {
78
- // Change on disk.
79
- collection.objects = nextOrder.filter(Obj.isObject).map(Ref.make);
80
- },
81
- onTransferStart: (child: Node<Obj.Any>, index?: number) => {
82
- // TODO(wittjosiah): Support transfer between spaces.
83
- // const childSpace = getSpace(child.data);
84
- // if (space && childSpace && !childSpace.key.equals(space.key)) {
85
- // // Create clone of child and add to destination space.
86
- // const newObject = clone(child.data, {
87
- // // TODO(wittjosiah): This needs to be generalized and not hardcoded here.
88
- // additional: [
89
- // child.data.content,
90
- // ...(child.data.objects ?? []),
91
- // ...(child.data.objects ?? []).map((object: TypedObject) => object.content),
92
- // ],
93
- // });
94
- // space.db.add(newObject);
95
- // collection.objects.push(newObject);
96
- // } else {
97
-
98
- // Add child to destination collection.
99
- // TODO(dmaretskyi): Compare by id.
100
- if (!collection.objects.find((object) => object.target === child.data)) {
101
- if (typeof index !== 'undefined') {
102
- collection.objects.splice(index, 0, Ref.make(child.data));
103
- } else {
104
- collection.objects.push(Ref.make(child.data));
105
- }
106
- }
107
-
108
- // }
109
- },
110
- onTransferEnd: (child: Node<Obj.Any>, destination: Node) => {
111
- // Remove child from origin collection.
112
- const index = collection.objects.findIndex((object) => object.target === child.data);
113
- if (index > -1) {
114
- collection.objects.splice(index, 1);
115
- }
116
-
117
- // TODO(wittjosiah): Support transfer between spaces.
118
- // const childSpace = getSpace(child.data);
119
- // const destinationSpace =
120
- // destination.data instanceof SpaceProxy ? destination.data : getSpace(destination.data);
121
- // if (destinationSpace && childSpace && !childSpace.key.equals(destinationSpace.key)) {
122
- // // Mark child as deleted in origin space.
123
- // childSpace.db.remove(child.data);
124
- // }
125
- },
126
- onCopy: async (child: Node<Obj.Any>, index?: number) => {
127
- // Create clone of child and add to destination space.
128
- const newObject = await cloneObject(child.data, resolve, space);
129
- space.db.add(newObject);
130
- if (typeof index !== 'undefined') {
131
- collection.objects.splice(index, 0, Ref.make(newObject));
132
- } else {
133
- collection.objects.push(Ref.make(newObject));
134
- }
135
- },
136
- };
137
- };
67
+ const getSchemaGraphNodePartials = () => SCHEMA_GRAPH_NODE_PARTIALS;
138
68
 
139
- const getQueryCollectionNodePartials = ({
140
- collection,
141
- space,
142
- resolve,
143
- }: {
144
- collection: DataType.QueryCollection;
145
- space: Space;
146
- resolve: (typename: string) => Record<string, any>;
147
- }) => {
148
- const typename = getTypenameFromQuery(collection.query);
149
- return {
150
- icon: typename && resolve(typename)?.icon,
151
- acceptPersistenceClass: new Set(['echo']),
152
- acceptPersistenceKey: new Set([space.id]),
153
- role: 'branch',
154
- canDrop: (source: TreeData) => {
155
- return (
156
- isGraphNode(source.item) && Obj.isObject(source.item.data) && Obj.getTypename(source.item.data) === typename
157
- );
158
- },
159
- onTransferStart: (child: Node<Obj.Any>, index?: number) => {
160
- // No-op. Objects are moved into query collections by being removed from their original collection.
161
- },
162
- onTransferEnd: (child: Node<Obj.Any>, destination: Node) => {
163
- // No-op. Objects are moved out of query collections by being added to another collection.
164
- },
165
- };
166
- };
69
+ //
70
+ // Caching Infrastructure
71
+ //
167
72
 
168
- const getSchemaGraphNodePartials = () => {
169
- return {
170
- role: 'branch',
171
- canDrop: () => false,
73
+ /** Creates a string-keyed memoized factory. Returns the same instance for the same key. */
74
+ // TODO(wittjosiah): Factor out as app-graph utility.
75
+ function createFactory<T>(create: (key: string) => T): (key: string) => T;
76
+ function createFactory<TArgs extends any[], T>(
77
+ create: (...args: TArgs) => T,
78
+ keyFn: (...args: TArgs) => string,
79
+ ): (...args: TArgs) => T;
80
+ function createFactory<TArgs extends any[], T>(
81
+ create: (...args: TArgs) => T,
82
+ keyFn?: (...args: TArgs) => string,
83
+ ): (...args: TArgs) => T {
84
+ const cache = new Map<string, T>();
85
+ return (...args: TArgs) => {
86
+ const key = keyFn ? keyFn(...args) : (args[0] as string);
87
+ if (cache.has(key)) {
88
+ return cache.get(key)!;
89
+ }
90
+ const value = create(...args);
91
+ cache.set(key, value);
92
+ return value;
172
93
  };
173
- };
174
-
175
- const getViewGraphNodePartials = ({
176
- view,
177
- resolve,
178
- }: {
179
- view: DataType.View;
180
- resolve: (typename: string) => Record<string, any>;
181
- }) => {
182
- const presentation = view.presentation.target;
183
- const typename = presentation ? Obj.getTypename(presentation) : undefined;
184
- const metadata = typename ? resolve(typename) : {};
94
+ }
95
+
96
+ /** Stable Set instances keyed by spaceId. */
97
+ const getAcceptPersistenceKey = createFactory((spaceId: string) => new Set([spaceId]));
98
+
99
+ /** Caches for closures that capture ECHO objects, keyed by DXN/ID string. */
100
+ const rearrangeCache = new Map<string, (nextOrder: unknown[]) => void>();
101
+ const blockInstructionCache = new Map<string, (source: TreeData, instruction: Instruction) => boolean>();
102
+ const spaceRearrangeCache = new Map<string, (nextOrder: Space[]) => void>();
103
+ const collectionPartialsCache = new Map<string, ReturnType<typeof buildCollectionPartials>>();
104
+ const systemCollectionPartialsCache = new Map<
105
+ string,
106
+ {
107
+ label: Label;
108
+ icon?: string;
109
+ iconHue?: string;
110
+ acceptPersistenceClass: Set<string>;
111
+ acceptPersistenceKey: Set<string>;
112
+ role: string;
113
+ }
114
+ >();
115
+ const spaceActionsCache = new Map<
116
+ string,
117
+ {
118
+ state: SpaceState;
119
+ hasPendingMigration: boolean;
120
+ migrating: boolean;
121
+ actions: Node.NodeArg<Node.ActionData<Operation.Service>>[];
122
+ }
123
+ >();
185
124
 
186
- return {
187
- label: view.name || ['object name placeholder', { ns: typename, default: 'New view' }],
188
- icon: metadata.icon,
189
- canDrop: () => false,
190
- };
191
- };
125
+ /** Dynamic label tuples keyed by composite key string. */
126
+ const getDynamicLabel = createFactory(
127
+ (key: string, ns: string, extra?: Record<string, any>): Label => [key, { ns, ...extra }],
128
+ (key: string, ns: string, extra?: Record<string, any>) => `${key}\0${ns}${extra ? `\0${JSON.stringify(extra)}` : ''}`,
129
+ );
192
130
 
193
- const checkPendingMigration = (space: Space) => {
194
- return (
195
- space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION ||
196
- (space.state.get() === SpaceState.SPACE_READY &&
197
- !!Migrations.versionProperty &&
198
- space.properties[Migrations.versionProperty] !== Migrations.targetVersion)
199
- );
200
- };
131
+ //
132
+ // Node Constructors
133
+ //
201
134
 
135
+ /**
136
+ * Builds an app-graph node for a space (workspace), including settings children and optional rearrange handler.
137
+ *
138
+ * @param space - Space to wrap as a graph node.
139
+ * @param navigable - Whether the space node is navigable; affects disabled state.
140
+ * @param personal - Passed to display name resolution (e.g. "Personal space" fallback).
141
+ * @param namesCache - Optional cache of space id to display name.
142
+ * @param resolve - Metadata resolver for typename.
143
+ * @param graph - Optional expandable graph for sorting edges on rearrange.
144
+ * @param spacesOrder - Optional ECHO object holding workspace order; used with graph for persist on rearrange.
145
+ * @returns A graph node for the space.
146
+ */
202
147
  export const constructSpaceNode = ({
203
148
  space,
204
149
  navigable = false,
205
150
  personal,
206
151
  namesCache,
207
152
  resolve,
153
+ graph,
154
+ spacesOrder,
208
155
  }: {
209
156
  space: Space;
210
157
  navigable?: boolean;
211
158
  personal?: boolean;
212
159
  namesCache?: Record<string, string>;
213
160
  resolve: (typename: string) => Record<string, any>;
161
+ /** Graph for sorting edges on rearrange. */
162
+ graph?: Graph.ExpandableGraph;
163
+ // TODO(wittjosiah): Should be Type.Expando but it doesn't work with the AtomQuery result type.
164
+ /** Spaces order object for persisting workspace order. */
165
+ spacesOrder?: Obj.Any;
214
166
  }) => {
215
167
  const hasPendingMigration = checkPendingMigration(space);
216
168
  const collection =
217
- space.state.get() === SpaceState.SPACE_READY && space.properties[DataType.Collection.typename]?.target;
169
+ space.state.get() === SpaceState.SPACE_READY && space.properties[Collection.Collection.typename]?.target;
218
170
  const partials =
219
- space.state.get() === SpaceState.SPACE_READY && Obj.instanceOf(DataType.Collection, collection)
220
- ? getCollectionGraphNodePartials({ collection, space, resolve })
171
+ space.state.get() === SpaceState.SPACE_READY && Obj.instanceOf(Collection.Collection, collection)
172
+ ? getCollectionGraphNodePartials({ collection, db: space.db, resolve })
221
173
  : {};
222
174
 
175
+ let onRearrange: ((nextOrder: Space[]) => void) | undefined;
176
+ if (graph && spacesOrder) {
177
+ onRearrange = spaceRearrangeCache.get(space.id);
178
+ if (!onRearrange) {
179
+ onRearrange = (nextOrder: Space[]) => {
180
+ // NOTE: This is needed to ensure order is updated by next animation frame.
181
+ Graph.sortEdges(
182
+ graph,
183
+ Node.RootId,
184
+ 'outbound',
185
+ nextOrder.map(({ id }) => id),
186
+ );
187
+
188
+ // Persist order to database.
189
+ Obj.change(spacesOrder, (mutableOrder: any) => {
190
+ mutableOrder.order = nextOrder.map(({ id }) => id);
191
+ });
192
+ };
193
+ spaceRearrangeCache.set(space.id, onRearrange);
194
+ }
195
+ }
196
+
223
197
  return {
224
198
  id: space.id,
225
199
  type: SPACE_TYPE,
226
- cacheable: ['label', 'icon', 'role'],
200
+ cacheable: CACHEABLE_PROPS,
227
201
  data: space,
228
202
  properties: {
229
203
  ...partials,
@@ -234,12 +208,13 @@ export const constructSpaceNode = ({
234
208
  space.state.get() === SpaceState.SPACE_READY && space.properties.icon
235
209
  ? `ph--${space.properties.icon}--regular`
236
210
  : undefined,
211
+ iconHue: space.state.get() === SpaceState.SPACE_READY && space.properties.iconHue,
237
212
  disabled: !navigable || space.state.get() !== SpaceState.SPACE_READY || hasPendingMigration,
213
+ disposition: 'workspace',
238
214
  testId: 'spacePlugin.space',
239
- canDrop: (source: TreeData) => {
240
- // TODO(wittjosiah): Find a way to only allow space as source for rearranging.
241
- return Obj.isObject(source.item.data) || isSpace(source.item.data);
242
- },
215
+ onRearrange,
216
+ // TODO(wittjosiah): Find a way to only allow space as source for rearranging.
217
+ canDrop: CAN_DROP_SPACE,
243
218
  },
244
219
  nodes: [
245
220
  {
@@ -247,74 +222,201 @@ export const constructSpaceNode = ({
247
222
  type: `${meta.id}/settings`,
248
223
  data: null,
249
224
  properties: {
250
- label: ['settings panel label', { ns: meta.id }],
225
+ label: SETTINGS_PANEL_LABEL,
251
226
  icon: 'ph--faders--regular',
252
227
  disposition: 'alternate-tree',
253
228
  },
254
- nodes: [
255
- {
256
- id: `properties-settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
257
- type: `${meta.id}/properties`,
258
- data: `${meta.id}/properties`,
259
- properties: {
260
- label: ['space settings properties label', { ns: meta.id }],
261
- icon: 'ph--sliders--regular',
262
- position: 'hoist',
263
- },
264
- },
265
- {
266
- id: `members-settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
267
- type: `${meta.id}/members`,
268
- data: `${meta.id}/members`,
269
- properties: {
270
- label: ['members panel label', { ns: meta.id }],
271
- icon: 'ph--users--regular',
272
- position: 'hoist',
273
- },
274
- },
275
- {
276
- id: `schema-settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
277
- type: `${meta.id}/schema`,
278
- data: `${meta.id}/schema`,
279
- properties: {
280
- label: ['space settings schema label', { ns: meta.id }],
281
- icon: 'ph--shapes--regular',
282
- },
283
- },
284
- ],
285
229
  },
286
230
  ],
287
231
  };
288
232
  };
289
233
 
290
- export const constructSpaceActions = ({
291
- space,
292
- dispatch,
293
- personal,
294
- migrating,
234
+ /**
235
+ * Builds an app-graph node for an ECHO object (collection, managed feed, schema, or generic object).
236
+ *
237
+ * @param db - Database for the object's space.
238
+ * @param object - ECHO object to wrap.
239
+ * @param disposition - Optional UI disposition.
240
+ * @param droppable - Whether the node accepts drops.
241
+ * @param navigable - Whether the node is navigable.
242
+ * @param managedCollectionChild - Whether the object is a managed collection child (affects blockInstruction).
243
+ * @param resolve - Metadata resolver for typename.
244
+ * @param parentCollection - Parent collection for rearranging objects.
245
+ * @returns A graph node or null if the object has no typename.
246
+ */
247
+ export const createObjectNode = ({
248
+ db,
249
+ object,
250
+ disposition,
251
+ droppable = true,
252
+ navigable = false,
253
+ managedCollectionChild = false,
254
+ resolve,
255
+ parentCollection,
295
256
  }: {
296
- space: Space;
297
- dispatch: PromiseIntentDispatcher;
298
- personal?: boolean;
299
- migrating?: boolean;
257
+ db: Database.Database;
258
+ object: Obj.Unknown;
259
+ disposition?: string;
260
+ droppable?: boolean;
261
+ navigable?: boolean;
262
+ managedCollectionChild?: boolean;
263
+ resolve: (typename: string) => Record<string, any>;
264
+ /** Parent collection for rearranging objects. */
265
+ parentCollection?: Collection.Collection;
300
266
  }) => {
267
+ const type = Obj.getTypename(object);
268
+ if (!type) {
269
+ return null;
270
+ }
271
+
272
+ // For feeds, use the kind property for metadata lookup instead of the generic Feed typename.
273
+ const metadataKey = Obj.instanceOf(Feed.Feed, object) ? (object.kind ?? type) : type;
274
+ const metadata = resolve(metadataKey);
275
+ const partials = Obj.instanceOf(Collection.Collection, object)
276
+ ? getCollectionGraphNodePartials({ collection: object, db, resolve })
277
+ : Obj.instanceOf(ManagedCollection.ManagedCollection, object)
278
+ ? getSystemCollectionNodePartials({ collection: object, db, resolve })
279
+ : Obj.instanceOf(Type.PersistentType, object)
280
+ ? getSchemaGraphNodePartials()
281
+ : metadata.graphProps;
282
+
283
+ // TODO(wittjosiah): Obj.getLabel isn't triggering reactivity in some cases.
284
+ // e.g., create new collection with no name and rename it.
285
+ const label =
286
+ (object as any).name ||
287
+ Obj.getLabel(object) ||
288
+ // TODO(wittjosiah): Remove metadata labels.
289
+ metadata.label?.(object) ||
290
+ getDynamicLabel('object name placeholder', metadataKey, { default: 'New item' });
291
+
292
+ const selectable =
293
+ (!Obj.instanceOf(Type.PersistentType, object) &&
294
+ !Obj.instanceOf(ManagedCollection.ManagedCollection, object) &&
295
+ !Obj.instanceOf(Collection.Collection, object)) ||
296
+ (navigable && Obj.instanceOf(Collection.Collection, object));
297
+
298
+ let onRearrange: ((nextOrder: unknown[]) => void) | undefined;
299
+ if (parentCollection) {
300
+ const collectionId = Obj.getDXN(parentCollection).toString();
301
+ onRearrange = rearrangeCache.get(collectionId);
302
+ if (!onRearrange) {
303
+ onRearrange = (nextOrder: unknown[]) => {
304
+ Obj.change(parentCollection, (c) => {
305
+ c.objects = nextOrder.filter(Obj.isObject).map(Ref.make);
306
+ });
307
+ };
308
+ rearrangeCache.set(collectionId, onRearrange);
309
+ }
310
+ }
311
+
312
+ const objectId = Obj.getDXN(object).toString();
313
+ const blockInstructionKey = `${objectId}:${managedCollectionChild}`;
314
+ let blockInstruction = blockInstructionCache.get(blockInstructionKey);
315
+ if (!blockInstruction) {
316
+ blockInstruction = (source: TreeData, instruction: Instruction) => {
317
+ if (source.item.properties.managedCollectionChild) {
318
+ return true;
319
+ }
320
+ if (Obj.instanceOf(ManagedCollection.ManagedCollection, object)) {
321
+ return !instruction.type.startsWith('reorder');
322
+ }
323
+ return managedCollectionChild;
324
+ };
325
+ blockInstructionCache.set(blockInstructionKey, blockInstruction);
326
+ }
327
+
328
+ const canDrop = droppable ? CAN_DROP_OBJECT : CAN_DROP_FALSE;
329
+
330
+ return {
331
+ id: Obj.getDXN(object).toString(),
332
+ type,
333
+ cacheable: CACHEABLE_PROPS,
334
+ data: object,
335
+ properties: {
336
+ label,
337
+ icon: metadata.icon ?? 'ph--placeholder--regular',
338
+ iconHue: metadata.iconHue,
339
+ disposition,
340
+ testId: 'spacePlugin.object',
341
+ persistenceClass: 'echo',
342
+ persistenceKey: db.spaceId,
343
+ selectable,
344
+ managedCollectionChild,
345
+ onRearrange,
346
+ blockInstruction,
347
+ canDrop,
348
+ ...partials,
349
+ },
350
+ };
351
+ };
352
+
353
+ /**
354
+ * Builds a static schema node for the app graph.
355
+ *
356
+ * @param schema - ECHO schema entity.
357
+ * @param space - Space that owns the schema.
358
+ * @returns A graph node for the schema.
359
+ */
360
+ export const createStaticSchemaNode = ({ schema, space }: { schema: Type.AnyEntity; space: Space }): Node.Node => {
361
+ return {
362
+ id: `${space.id}/${Type.getTypename(schema)}`,
363
+ type: `${meta.id}/static-schema`,
364
+ data: schema,
365
+ properties: {
366
+ label: getDynamicLabel('typename label', Type.getTypename(schema), {
367
+ count: 2,
368
+ default: Type.getTypename(schema),
369
+ }),
370
+ icon: 'ph--database--regular',
371
+ iconHue: 'green',
372
+ role: 'branch',
373
+ selectable: false,
374
+ canDrop: CAN_DROP_FALSE,
375
+ space,
376
+ },
377
+ };
378
+ };
379
+
380
+ //
381
+ // Action Constructors
382
+ //
383
+
384
+ /**
385
+ * Builds the action list for a space node (migrate, create object, rename).
386
+ * Results are cached by space id and state flags.
387
+ *
388
+ * @param space - Space to build actions for.
389
+ * @param migrating - When true, treats the space as currently migrating (disables migrate action).
390
+ * @returns Array of graph action descriptors for the space.
391
+ */
392
+ export const constructSpaceActions = ({ space, migrating }: { space: Space; migrating?: boolean }) => {
301
393
  const state = space.state.get();
302
394
  const hasPendingMigration = checkPendingMigration(space);
395
+ const isMigrating = migrating || Migrations.running(space);
396
+
397
+ const cached = spaceActionsCache.get(space.id);
398
+ if (
399
+ cached &&
400
+ cached.state === state &&
401
+ cached.hasPendingMigration === hasPendingMigration &&
402
+ cached.migrating === isMigrating
403
+ ) {
404
+ return cached.actions;
405
+ }
406
+
303
407
  const getId = (id: string) => `${id}/${space.id}`;
304
- const actions: NodeArg<ActionData>[] = [];
408
+ const actions: Node.NodeArg<Node.ActionData<Operation.Service>>[] = [];
305
409
 
306
410
  if (hasPendingMigration) {
307
411
  actions.push({
308
- id: getId(SpaceAction.Migrate._tag),
309
- type: ACTION_GROUP_TYPE,
310
- data: async () => {
311
- await dispatch(createIntent(SpaceAction.Migrate, { space }));
312
- },
412
+ id: getId(SpaceOperation.Migrate.meta.key),
413
+ type: Node.ActionGroupType,
414
+ data: () => Operation.invoke(SpaceOperation.Migrate, { space }),
313
415
  properties: {
314
- label: ['migrate space label', { ns: meta.id }],
416
+ label: MIGRATE_SPACE_LABEL,
315
417
  icon: 'ph--database--regular',
316
418
  disposition: 'list-item-primary',
317
- disabled: migrating || Migrations.running(space),
419
+ disabled: isMigrating,
318
420
  },
319
421
  });
320
422
  }
@@ -322,26 +424,22 @@ export const constructSpaceActions = ({
322
424
  if (state === SpaceState.SPACE_READY && !hasPendingMigration) {
323
425
  actions.push(
324
426
  {
325
- id: getId(SpaceAction.OpenCreateObject._tag),
326
- type: ACTION_TYPE,
327
- data: async () => {
328
- await dispatch(createIntent(SpaceAction.OpenCreateObject, { target: space }));
329
- },
427
+ id: getId(SpaceOperation.OpenCreateObject.meta.key),
428
+ type: Node.ActionType,
429
+ data: () => Operation.invoke(SpaceOperation.OpenCreateObject, { target: space.db }),
330
430
  properties: {
331
- label: ['create object in space label', { ns: meta.id }],
431
+ label: CREATE_OBJECT_IN_SPACE_LABEL,
332
432
  icon: 'ph--plus--regular',
333
- disposition: 'item',
433
+ disposition: 'list-item-primary',
334
434
  testId: 'spacePlugin.createObject',
335
435
  },
336
436
  },
337
437
  {
338
- id: getId(SpaceAction.Rename._tag),
339
- type: ACTION_TYPE,
340
- data: async (params?: InvokeParams) => {
341
- await dispatch(createIntent(SpaceAction.Rename, { space, caller: params?.caller }));
342
- },
438
+ id: getId(SpaceOperation.Rename.meta.key),
439
+ type: Node.ActionType,
440
+ data: (params?: Node.InvokeProps) => Operation.invoke(SpaceOperation.Rename, { space, caller: params?.caller }),
343
441
  properties: {
344
- label: ['rename space label', { ns: meta.id }],
442
+ label: RENAME_SPACE_LABEL,
345
443
  icon: 'ph--pencil-simple-line--regular',
346
444
  keyBinding: {
347
445
  macos: 'shift+F6',
@@ -352,66 +450,52 @@ export const constructSpaceActions = ({
352
450
  );
353
451
  }
354
452
 
453
+ spaceActionsCache.set(space.id, { state, hasPendingMigration, migrating: isMigrating, actions });
355
454
  return actions;
356
455
  };
357
456
 
358
- export const createStaticSchemaNode = ({ schema, space }: { schema: Type.Obj.Any; space: Space }) => {
359
- return {
360
- id: `${space.id}/${Type.getTypename(schema)}`,
361
- type: `${meta.id}/static-schema`,
362
- data: schema,
363
- properties: {
364
- label: ['typename label', { ns: Type.getTypename(schema), default: Type.getTypename(schema) }],
365
- icon: 'ph--database--regular',
366
- role: 'branch',
367
- selectable: false,
368
- canDrop: () => false,
369
- space,
370
- },
371
- };
372
- };
373
-
457
+ /**
458
+ * Builds the action list for a static schema node (add view, rename, delete, snapshot).
459
+ *
460
+ * @param schema - ECHO schema entity (e.g. static record type).
461
+ * @param space - Space that owns the schema.
462
+ * @param deletable - Whether the delete/snapshot actions are enabled.
463
+ * @returns Array of graph action descriptors for the schema.
464
+ */
374
465
  export const createStaticSchemaActions = ({
375
466
  schema,
376
467
  space,
377
- dispatch,
378
468
  deletable,
379
469
  }: {
380
- schema: Type.Obj.Any;
470
+ schema: Type.AnyObj;
381
471
  space: Space;
382
- dispatch: PromiseIntentDispatcher;
383
472
  deletable: boolean;
384
473
  }) => {
385
474
  const getId = (id: string) => `${space.id}/${Type.getTypename(schema)}/${id}`;
386
475
 
387
- const actions: NodeArg<ActionData>[] = [
476
+ const actions: Node.NodeArg<Node.ActionData<Operation.Service>>[] = [
388
477
  {
389
- id: getId(SpaceAction.AddObject._tag),
390
- type: ACTION_TYPE,
391
- data: async () => {
392
- await dispatch(
393
- createIntent(SpaceAction.OpenCreateObject, {
394
- target: space,
395
- views: true,
396
- initialFormValues: { typename: Type.getTypename(schema) },
397
- }),
398
- );
399
- },
478
+ id: getId(SpaceOperation.AddObject.meta.key),
479
+ type: Node.ActionType,
480
+ data: () =>
481
+ Operation.invoke(SpaceOperation.OpenCreateObject, {
482
+ target: space.db,
483
+ views: true,
484
+ initialFormValues: { typename: Type.getTypename(schema) },
485
+ }),
400
486
  properties: {
401
- label: ['add view to schema label', { ns: Type.getTypename(DataType.StoredSchema) }],
487
+ label: ADD_VIEW_TO_SCHEMA_LABEL,
402
488
  icon: 'ph--plus--regular',
403
489
  disposition: 'list-item-primary',
404
490
  testId: 'spacePlugin.addViewToSchema',
405
491
  },
406
492
  },
407
493
  {
408
- id: getId(SpaceAction.RenameObject._tag),
409
- type: ACTION_TYPE,
410
- data: async (params?: InvokeParams) => {
411
- throw new Error('Not implemented');
412
- },
494
+ id: getId(SpaceOperation.RenameObject.meta.key),
495
+ type: Node.ActionType,
496
+ data: () => Effect.fail(new Error('Not implemented')),
413
497
  properties: {
414
- label: ['rename object label', { ns: Type.getTypename(DataType.StoredSchema) }],
498
+ label: getDynamicLabel('rename object label', Type.getTypename(Type.PersistentType)),
415
499
  icon: 'ph--pencil-simple-line--regular',
416
500
  disabled: true,
417
501
  disposition: 'list-item',
@@ -419,132 +503,113 @@ export const createStaticSchemaActions = ({
419
503
  },
420
504
  },
421
505
  {
422
- id: getId(SpaceAction.RemoveObjects._tag),
423
- type: ACTION_TYPE,
424
- data: async () => {
425
- const index = space.properties.staticRecords.findIndex(
426
- (typename: string) => typename === Type.getTypename(schema),
427
- );
428
- if (index > -1) {
429
- space.properties.staticRecords.splice(index, 1);
430
- }
431
- },
506
+ id: getId(SpaceOperation.RemoveObjects.meta.key),
507
+ type: Node.ActionType,
508
+ data: () =>
509
+ Effect.sync(() => {
510
+ const index = space.properties.staticRecords.findIndex(
511
+ (typename: string) => typename === Type.getTypename(schema),
512
+ );
513
+ if (index > -1) {
514
+ Obj.change(space.properties, (p) => {
515
+ p.staticRecords.splice(index, 1);
516
+ });
517
+ }
518
+ }),
432
519
  properties: {
433
- label: ['delete object label', { ns: Type.getTypename(DataType.StoredSchema) }],
520
+ label: getDynamicLabel('delete object label', Type.getTypename(Type.PersistentType)),
434
521
  icon: 'ph--trash--regular',
435
522
  disposition: 'list-item',
436
523
  disabled: !deletable,
437
524
  testId: 'spacePlugin.deleteObject',
438
525
  },
439
526
  },
527
+ {
528
+ id: getId(SpaceOperation.Snapshot.meta.key),
529
+ type: Node.ActionType,
530
+ data: Effect.fnUntraced(function* () {
531
+ const result = yield* Operation.invoke(SpaceOperation.Snapshot, {
532
+ db: space.db,
533
+ query: Query.select(Filter.type(schema)).ast,
534
+ });
535
+ if (result.snapshot) {
536
+ yield* Effect.tryPromise(() =>
537
+ downloadBlob(result.snapshot, createFilename({ parts: [space.id, Type.getTypename(schema)], ext: 'json' })),
538
+ );
539
+ }
540
+ }),
541
+ properties: {
542
+ label: SNAPSHOT_BY_SCHEMA_LABEL,
543
+ icon: 'ph--camera--regular',
544
+ disposition: 'list-item',
545
+ },
546
+ },
440
547
  ];
441
548
 
442
549
  return actions;
443
550
  };
444
551
 
445
- export const createObjectNode = ({
446
- space,
447
- object,
448
- disposition,
449
- droppable = true,
450
- navigable = false,
451
- resolve,
452
- }: {
453
- space: Space;
454
- object: Obj.Any;
455
- disposition?: string;
456
- droppable?: boolean;
457
- navigable?: boolean;
458
- resolve: (typename: string) => Record<string, any>;
459
- }) => {
460
- const type = Obj.getTypename(object);
461
- if (!type) {
462
- return null;
463
- }
464
-
465
- const metadata = resolve(type);
466
- const partials = Obj.instanceOf(DataType.Collection, object)
467
- ? getCollectionGraphNodePartials({ collection: object, space, resolve })
468
- : Obj.instanceOf(DataType.QueryCollection, object)
469
- ? getQueryCollectionNodePartials({ collection: object, space, resolve })
470
- : Obj.instanceOf(DataType.StoredSchema, object)
471
- ? getSchemaGraphNodePartials()
472
- : Obj.instanceOf(DataType.View, object)
473
- ? getViewGraphNodePartials({ view: object, resolve })
474
- : metadata.graphProps;
475
-
476
- // TODO(wittjosiah): Obj.getLabel isn't triggering reactivity in some cases.
477
- // e.g., create new collection with no name and rename it.
478
- const label = (object as any).name ||
479
- Obj.getLabel(object) ||
480
- // TODO(wittjosiah): Remove metadata labels.
481
- metadata.label?.(object) || ['object name placeholder', { ns: type, default: 'New item' }];
482
-
483
- const selectable =
484
- (!Obj.instanceOf(DataType.StoredSchema, object) &&
485
- !Obj.instanceOf(DataType.QueryCollection, object) &&
486
- !Obj.instanceOf(DataType.Collection, object)) ||
487
- (navigable && Obj.instanceOf(DataType.Collection, object));
488
-
489
- return {
490
- id: fullyQualifiedId(object),
491
- type,
492
- cacheable: ['label', 'icon', 'role'],
493
- data: object,
494
- properties: {
495
- label,
496
- icon: metadata.icon ?? 'ph--placeholder--regular',
497
- disposition,
498
- testId: 'spacePlugin.object',
499
- persistenceClass: 'echo',
500
- persistenceKey: space?.id,
501
- selectable,
502
- canDrop: (source: TreeData) => {
503
- return droppable && isGraphNode(source.item) && Obj.isObject(source.item.data);
504
- },
505
- ...partials,
506
- },
507
- };
508
- };
509
-
552
+ /**
553
+ * Builds the action list for an ECHO object node (create, rename, delete, copy link, etc.).
554
+ *
555
+ * @param object - ECHO object to build actions for.
556
+ * @param graph - Readable app graph (used for action wiring).
557
+ * @param resolve - Metadata resolver for typename.
558
+ * @param capabilities - Capability manager for feature checks.
559
+ * @param shareableLinkOrigin - Origin URL for shareable links.
560
+ * @param deletable - Whether delete action is included. Defaults to true.
561
+ * @param navigable - Whether the object is navigable (affects available actions). Defaults to false.
562
+ * @returns Array of graph action descriptors for the object.
563
+ */
510
564
  export const constructObjectActions = ({
511
565
  object,
512
566
  graph,
513
- dispatch,
514
- objectForms,
567
+ resolve,
568
+ capabilities,
515
569
  deletable = true,
516
570
  navigable = false,
571
+ shareableLinkOrigin,
517
572
  }: {
518
- object: Obj.Any;
519
- graph: ReadableGraph;
520
- dispatch: PromiseIntentDispatcher;
521
- objectForms: ObjectForm<any>[];
573
+ object: Obj.Unknown;
574
+ graph: Graph.ReadableGraph;
575
+ resolve: (typename: string) => Record<string, any>;
576
+ capabilities: CapabilityManager.CapabilityManager;
577
+ shareableLinkOrigin: string;
522
578
  deletable?: boolean;
523
579
  navigable?: boolean;
524
580
  }) => {
525
- const space = getSpace(object);
526
- invariant(space, 'Space not found');
581
+ const db = Obj.getDatabase(object);
582
+ invariant(db, 'Database not found');
527
583
  const typename = Obj.getTypename(object);
528
584
  invariant(typename, 'Object has no typename');
529
585
 
530
- const getId = (id: string) => `${id}/${fullyQualifiedId(object)}`;
586
+ const getId = (id: string) => `${id}/${Obj.getDXN(object).toString()}`;
531
587
 
532
- const queryCollection = Obj.instanceOf(DataType.QueryCollection, object) ? object : undefined;
533
- const matchingObjectForm = queryCollection
534
- ? objectForms.find((form) => Type.getTypename(form.objectSchema) === getTypenameFromQuery(queryCollection.query))
535
- : undefined;
588
+ const metadataKey = Match.value(object).pipe(
589
+ Match.when(Obj.instanceOf(Feed.Feed), (feed: Feed.Feed) => feed.kind ?? Obj.getTypename(feed)!),
590
+ Match.when(Obj.instanceOf(ManagedCollection.ManagedCollection), (managed) => {
591
+ const [, feedKind] = managed.key.split('~') ?? [];
592
+ return feedKind ?? managed.key;
593
+ }),
594
+ Match.orElse((obj) => Obj.getTypename(obj)!),
595
+ );
596
+ const managedCollection = Option.some(object).pipe(
597
+ Option.filter(Obj.instanceOf(ManagedCollection.ManagedCollection)),
598
+ Option.getOrUndefined,
599
+ );
600
+ const metadata = metadataKey ? resolve(metadataKey) : {};
601
+ const createObject = metadata.createObject;
602
+ const inputSchema = metadata.inputSchema;
536
603
 
537
- const actions: NodeArg<ActionData>[] = [
538
- ...(Obj.instanceOf(DataType.Collection, object)
604
+ const actions: Node.NodeArg<Node.ActionData<Operation.Service>>[] = [
605
+ ...(Obj.instanceOf(Collection.Collection, object)
539
606
  ? [
540
607
  {
541
- id: getId(SpaceAction.OpenCreateObject._tag),
542
- type: ACTION_TYPE,
543
- data: async () => {
544
- await dispatch(createIntent(SpaceAction.OpenCreateObject, { target: object }));
545
- },
608
+ id: getId(SpaceOperation.OpenCreateObject.meta.key),
609
+ type: Node.ActionType,
610
+ data: () => Operation.invoke(SpaceOperation.OpenCreateObject, { target: object }),
546
611
  properties: {
547
- label: ['create object in collection label', { ns: meta.id }],
612
+ label: CREATE_OBJECT_IN_COLLECTION_LABEL,
548
613
  icon: 'ph--plus--regular',
549
614
  disposition: 'list-item-primary',
550
615
  testId: 'spacePlugin.createObject',
@@ -552,54 +617,75 @@ export const constructObjectActions = ({
552
617
  },
553
618
  ]
554
619
  : []),
555
- ...(Obj.instanceOf(DataType.StoredSchema, object)
620
+ ...(Obj.instanceOf(Type.PersistentType, object)
556
621
  ? [
557
622
  {
558
- id: getId(SpaceAction.AddObject._tag),
559
- type: ACTION_TYPE,
560
- data: async () => {
561
- await dispatch(
562
- createIntent(SpaceAction.OpenCreateObject, {
563
- target: space,
564
- views: true,
565
- initialFormValues: { typename: object.typename },
566
- }),
567
- );
568
- },
623
+ id: getId(SpaceOperation.AddObject.meta.key),
624
+ type: Node.ActionType,
625
+ data: () =>
626
+ Operation.invoke(SpaceOperation.OpenCreateObject, {
627
+ target: db,
628
+ views: true,
629
+ initialFormValues: { typename: object.typename },
630
+ }),
569
631
  properties: {
570
- label: ['add view to schema label', { ns: Type.getTypename(DataType.StoredSchema) }],
632
+ label: ADD_VIEW_TO_SCHEMA_LABEL,
571
633
  icon: 'ph--plus--regular',
572
634
  disposition: 'list-item-primary',
573
635
  testId: 'spacePlugin.addViewToSchema',
574
636
  },
575
637
  },
638
+ {
639
+ id: getId(SpaceOperation.Snapshot.meta.key),
640
+ type: Node.ActionType,
641
+ data: Effect.fnUntraced(function* () {
642
+ const result = yield* Operation.invoke(SpaceOperation.Snapshot, {
643
+ db,
644
+ query: Query.select(Filter.type(JsonSchema.toEffectSchema(object.jsonSchema))).ast,
645
+ });
646
+ if (result.snapshot) {
647
+ yield* Effect.promise(() =>
648
+ downloadBlob(result.snapshot, createFilename({ parts: [db.spaceId, object.typename], ext: 'json' })),
649
+ );
650
+ }
651
+ }),
652
+ properties: {
653
+ label: SNAPSHOT_BY_SCHEMA_LABEL,
654
+ icon: 'ph--camera--regular',
655
+ disposition: 'list-item',
656
+ },
657
+ },
576
658
  ]
577
659
  : []),
578
- ...(matchingObjectForm
660
+ ...(createObject && managedCollection
579
661
  ? [
580
662
  {
581
- id: getId(SpaceAction.OpenCreateObject._tag),
582
- type: ACTION_TYPE,
583
- data: async () => {
584
- if (matchingObjectForm.formSchema) {
585
- await dispatch(
586
- createIntent(SpaceAction.OpenCreateObject, {
587
- target: space,
588
- typename: queryCollection ? getTypenameFromQuery(queryCollection.query) : undefined,
589
- }),
590
- );
663
+ id: getId(SpaceOperation.OpenCreateObject.meta.key),
664
+ type: Node.ActionType,
665
+ data: Effect.fnUntraced(function* () {
666
+ if (inputSchema) {
667
+ yield* Operation.invoke(SpaceOperation.OpenCreateObject, {
668
+ target: db,
669
+ typename: managedCollection ? metadataKey : undefined,
670
+ });
591
671
  } else {
592
- await dispatch(
593
- Function.pipe(
594
- matchingObjectForm.getIntent({}, { space }),
595
- chain(SpaceAction.AddObject, { target: space, hidden: true }),
596
- chain(LayoutAction.Open, { part: 'main' }),
597
- ),
598
- );
672
+ const createdObject = yield* createObject({}, { db, capabilities }) as Effect.Effect<
673
+ Obj.Unknown,
674
+ Error,
675
+ never
676
+ >;
677
+ const addResult = yield* Operation.invoke(SpaceOperation.AddObject, {
678
+ target: db,
679
+ hidden: true,
680
+ object: createdObject,
681
+ });
682
+ if (addResult.id) {
683
+ yield* Operation.invoke(LayoutOperation.Open, { subject: [addResult.id] });
684
+ }
599
685
  }
600
- },
686
+ }),
601
687
  properties: {
602
- label: ['create object in smart collection label', { ns: meta.id }],
688
+ label: CREATE_OBJECT_IN_SYSTEM_COLLECTION_LABEL,
603
689
  icon: 'ph--plus--regular',
604
690
  disposition: 'list-item-primary',
605
691
  testId: 'spacePlugin.createObject',
@@ -607,56 +693,64 @@ export const constructObjectActions = ({
607
693
  },
608
694
  ]
609
695
  : []),
610
- {
611
- id: getId(SpaceAction.RenameObject._tag),
612
- type: ACTION_TYPE,
613
- data: async (params?: InvokeParams) => {
614
- await dispatch(createIntent(SpaceAction.RenameObject, { object, caller: params?.caller }));
615
- },
616
- properties: {
617
- label: ['rename object label', { ns: typename }],
618
- icon: 'ph--pencil-simple-line--regular',
619
- disposition: 'list-item',
620
- // TODO(wittjosiah): Not working.
621
- // keyBinding: {
622
- // macos: 'shift+F6',
623
- // },
624
- testId: 'spacePlugin.renameObject',
625
- },
626
- },
627
- {
628
- id: getId(SpaceAction.RemoveObjects._tag),
629
- type: ACTION_TYPE,
630
- data: async () => {
631
- const collection = graph
632
- .getConnections(fullyQualifiedId(object), 'inbound')
633
- .find(({ data }) => Obj.instanceOf(DataType.Collection, data))?.data;
634
- await dispatch(createIntent(SpaceAction.RemoveObjects, { objects: [object], target: collection }));
635
- },
636
- properties: {
637
- label: ['delete object label', { ns: typename }],
638
- icon: 'ph--trash--regular',
639
- disposition: 'list-item',
640
- disabled: !deletable,
641
- // TODO(wittjosiah): This is a browser shortcut.
642
- // keyBinding: object instanceof CollectionType ? undefined : 'shift+meta+Backspace',
643
- testId: 'spacePlugin.deleteObject',
644
- },
645
- },
696
+ ...(managedCollection
697
+ ? []
698
+ : [
699
+ {
700
+ id: getId(SpaceOperation.RenameObject.meta.key),
701
+ type: Node.ActionType,
702
+ data: (params?: Node.InvokeProps) =>
703
+ Operation.invoke(SpaceOperation.RenameObject, { object, caller: params?.caller }),
704
+ properties: {
705
+ label: getDynamicLabel('rename object label', metadataKey),
706
+ icon: 'ph--pencil-simple-line--regular',
707
+ disposition: 'list-item',
708
+ // TODO(wittjosiah): Not working.
709
+ // keyBinding: {
710
+ // macos: 'shift+F6',
711
+ // },
712
+ testId: 'spacePlugin.renameObject',
713
+ },
714
+ },
715
+ {
716
+ id: getId(SpaceOperation.RemoveObjects.meta.key),
717
+ type: Node.ActionType,
718
+ data: Effect.fnUntraced(function* () {
719
+ const collection = Graph.getConnections(
720
+ graph,
721
+ Obj.getDXN(object).toString(),
722
+ Node.childRelation('inbound'),
723
+ ).find((node: Node.Node): node is Node.Node<Collection.Collection> =>
724
+ Obj.instanceOf(Collection.Collection, node.data),
725
+ )?.data;
726
+ yield* Operation.invoke(SpaceOperation.RemoveObjects, { objects: [object], target: collection });
727
+ }),
728
+ properties: {
729
+ label: getDynamicLabel('delete object label', metadataKey),
730
+ icon: 'ph--trash--regular',
731
+ disposition: 'list-item',
732
+ disabled: !deletable,
733
+ // TODO(wittjosiah): This is a browser shortcut.
734
+ // keyBinding: object instanceof CollectionType ? undefined : 'shift+meta+Backspace',
735
+ testId: 'spacePlugin.deleteObject',
736
+ },
737
+ },
738
+ ]),
646
739
  ...(navigable ||
647
- (!Obj.instanceOf(DataType.Collection, object) &&
648
- !Obj.instanceOf(DataType.QueryCollection, object) &&
649
- !Obj.instanceOf(DataType.StoredSchema, object))
740
+ (!Obj.instanceOf(Collection.Collection, object) &&
741
+ !Obj.instanceOf(ManagedCollection.ManagedCollection, object) &&
742
+ !Obj.instanceOf(Type.PersistentType, object))
650
743
  ? [
651
744
  {
652
745
  id: getId('copy-link'),
653
- type: ACTION_TYPE,
654
- data: async () => {
655
- const url = `${window.location.origin}/${space.id}/${fullyQualifiedId(object)}`;
656
- await navigator.clipboard.writeText(url);
657
- },
746
+ type: Node.ActionType,
747
+ data: () =>
748
+ Effect.promise(async () => {
749
+ const url = `${shareableLinkOrigin}/${db.spaceId}/${Obj.getDXN(object).toString()}`;
750
+ await navigator.clipboard.writeText(url);
751
+ }),
658
752
  properties: {
659
- label: ['copy link label', { ns: meta.id }],
753
+ label: COPY_LINK_LABEL,
660
754
  icon: 'ph--link--regular',
661
755
  disposition: 'list-item',
662
756
  testId: 'spacePlugin.copyLink',
@@ -666,13 +760,11 @@ export const constructObjectActions = ({
666
760
  : []),
667
761
  // TODO(wittjosiah): Factor out and apply to all nodes.
668
762
  {
669
- id: getId(LayoutAction.Expose._tag),
670
- type: ACTION_TYPE,
671
- data: async () => {
672
- await dispatch(createIntent(LayoutAction.Expose, { part: 'navigation', subject: fullyQualifiedId(object) }));
673
- },
763
+ id: getId(LayoutOperation.Expose.meta.key),
764
+ type: Node.ActionType,
765
+ data: () => Operation.invoke(LayoutOperation.Expose, { subject: Obj.getDXN(object).toString() }),
674
766
  properties: {
675
- label: ['expose object label', { ns: meta.id }],
767
+ label: EXPOSE_OBJECT_LABEL,
676
768
  icon: 'ph--eye--regular',
677
769
  disposition: 'heading-list-item',
678
770
  testId: 'spacePlugin.exposeObject',
@@ -683,13 +775,152 @@ export const constructObjectActions = ({
683
775
  return actions;
684
776
  };
685
777
 
778
+ //
779
+ // Helpers
780
+ //
781
+
782
+ const checkPendingMigration = (space: Space) => {
783
+ return (
784
+ space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION ||
785
+ (space.state.get() === SpaceState.SPACE_READY &&
786
+ !!Migrations.versionProperty &&
787
+ space.properties[Migrations.versionProperty] !== Migrations.targetVersion)
788
+ );
789
+ };
790
+
791
+ /**
792
+ * Returns the display label for a space (name, namesCache entry, or fallback).
793
+ *
794
+ * @param space - Space to label.
795
+ * @param options.personal - If true, use personal-space fallback when unnamed.
796
+ * @param options.namesCache - Optional cache of space id to display name.
797
+ * @returns Label tuple (translation key or string, and namespace).
798
+ */
799
+ // TODO(wittjosiah): Factor out? Exposer via capability?
800
+ export const getSpaceDisplayName = (
801
+ space: Space,
802
+ { personal, namesCache = {} }: { personal?: boolean; namesCache?: Record<string, string> } = {},
803
+ ): Label => {
804
+ return space.state.get() === SpaceState.SPACE_READY && (space.properties.name?.length ?? 0) > 0
805
+ ? space.properties.name!
806
+ : namesCache[space.id]
807
+ ? namesCache[space.id]
808
+ : personal
809
+ ? PERSONAL_SPACE_LABEL
810
+ : UNNAMED_SPACE_LABEL;
811
+ };
812
+
813
+ // TODO(wittjosiah): Factor out.
814
+ const downloadBlob = async (blob: Blob, filename: string) => {
815
+ const url = URL.createObjectURL(blob);
816
+ const a = document.createElement('a');
817
+ a.href = url;
818
+ a.download = filename;
819
+
820
+ document.body.appendChild(a);
821
+ a.click();
822
+
823
+ document.body.removeChild(a);
824
+ URL.revokeObjectURL(url);
825
+ };
826
+
827
+ const buildCollectionPartials = (
828
+ collection: Collection.Collection,
829
+ db: Database.Database,
830
+ resolve: (typename: string) => Record<string, any>,
831
+ ) => ({
832
+ acceptPersistenceClass: ACCEPT_ECHO_CLASS,
833
+ acceptPersistenceKey: getAcceptPersistenceKey(db.spaceId),
834
+ role: 'branch' as const,
835
+ onTransferStart: (child: Node.Node<Obj.Unknown>, index?: number) => {
836
+ Obj.change(collection, (c) => {
837
+ if (!c.objects.find((object) => object.target === child.data)) {
838
+ if (typeof index !== 'undefined') {
839
+ c.objects.splice(index, 0, Ref.make(child.data));
840
+ } else {
841
+ c.objects.push(Ref.make(child.data));
842
+ }
843
+ }
844
+ });
845
+ },
846
+ onTransferEnd: (child: Node.Node<Obj.Unknown>, _destination: Node.Node) => {
847
+ Obj.change(collection, (c) => {
848
+ const index = c.objects.findIndex((object) => object.target === child.data);
849
+ if (index > -1) {
850
+ c.objects.splice(index, 1);
851
+ }
852
+ });
853
+ },
854
+ onCopy: async (child: Node.Node<Obj.Unknown>, index?: number) => {
855
+ const newObject = await cloneObject(child.data, resolve, db);
856
+ db.add(newObject);
857
+ Obj.change(collection, (c) => {
858
+ if (typeof index !== 'undefined') {
859
+ c.objects.splice(index, 0, Ref.make(newObject));
860
+ } else {
861
+ c.objects.push(Ref.make(newObject));
862
+ }
863
+ });
864
+ },
865
+ });
866
+
867
+ const getCollectionGraphNodePartials = ({
868
+ collection,
869
+ db,
870
+ resolve,
871
+ }: {
872
+ collection: Collection.Collection;
873
+ db: Database.Database;
874
+ resolve: (typename: string) => Record<string, any>;
875
+ }) => {
876
+ const id = Obj.getDXN(collection).toString();
877
+ let cached = collectionPartialsCache.get(id);
878
+ if (!cached) {
879
+ cached = buildCollectionPartials(collection, db, resolve);
880
+ collectionPartialsCache.set(id, cached);
881
+ }
882
+ return cached;
883
+ };
884
+
885
+ const getSystemCollectionNodePartials = ({
886
+ collection,
887
+ db,
888
+ resolve,
889
+ }: {
890
+ collection: ManagedCollection.ManagedCollection;
891
+ db: Database.Database;
892
+ resolve: (typename: string) => Record<string, any>;
893
+ }) => {
894
+ const cacheKey = `${db.spaceId}:${collection.key}`;
895
+ let cached = systemCollectionPartialsCache.get(cacheKey);
896
+ if (!cached) {
897
+ const [, feedKind] = collection.key.split('~');
898
+ const metadataKey = feedKind ?? collection.key;
899
+ const metadata = resolve(metadataKey);
900
+ cached = {
901
+ label: getDynamicLabel('typename label', metadataKey, { count: 2 }),
902
+ icon: metadata.icon,
903
+ iconHue: metadata.iconHue,
904
+ acceptPersistenceClass: ACCEPT_ECHO_CLASS,
905
+ acceptPersistenceKey: getAcceptPersistenceKey(db.spaceId),
906
+ role: 'branch',
907
+ };
908
+ systemCollectionPartialsCache.set(cacheKey, cached);
909
+ }
910
+ return cached;
911
+ };
912
+
913
+ //
914
+ // Deprecated
915
+ //
916
+
686
917
  /**
687
918
  * @deprecated This is a temporary solution.
688
919
  */
689
920
  export const getNestedObjects = async (
690
- object: Obj.Any,
921
+ object: Obj.Unknown,
691
922
  resolve: (typename: string) => Record<string, any>,
692
- ): Promise<Obj.Any[]> => {
923
+ ): Promise<Obj.Unknown[]> => {
693
924
  const type = Obj.getTypename(object);
694
925
  if (!type) {
695
926
  return [];
@@ -701,7 +932,7 @@ export const getNestedObjects = async (
701
932
  return [];
702
933
  }
703
934
 
704
- const objects: Obj.Any[] = await loadReferences(object);
935
+ const objects: Obj.Unknown[] = await loadReferences(object);
705
936
  const nested = await Promise.all(objects.map((object) => getNestedObjects(object, resolve)));
706
937
  return [...objects, ...nested.flat()];
707
938
  };
@@ -711,15 +942,15 @@ export const getNestedObjects = async (
711
942
  */
712
943
  // TODO(burdon): Remove.
713
944
  export const cloneObject = async (
714
- object: Type.Expando,
945
+ object: Obj.Unknown,
715
946
  resolve: (typename: string) => Record<string, any>,
716
- newSpace: Space,
717
- ): Promise<Type.Expando> => {
947
+ newDb: Database.Database,
948
+ ): Promise<Obj.Unknown> => {
718
949
  const schema = Obj.getSchema(object);
719
- const typename = schema ? (Type.getTypename(schema) ?? EXPANDO_TYPENAME) : EXPANDO_TYPENAME;
950
+ const typename = schema ? (Type.getTypename(schema) ?? Expando.Expando.typename) : Expando.Expando.typename;
720
951
  const metadata = resolve(typename);
721
952
  const serializer = metadata.serializer;
722
953
  invariant(serializer, `No serializer for type: ${typename}`);
723
954
  const content = await serializer.serialize({ object });
724
- return serializer.deserialize({ content, space: newSpace, newId: true });
955
+ return serializer.deserialize({ content, db: newDb, newId: true });
725
956
  };