@dxos/plugin-space 0.8.4-main.2e9d522 → 0.8.4-main.3c1ae3b

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 (389) hide show
  1. package/dist/lib/browser/{CollectionMain-D2B75XBS.mjs → CollectionArticle-WTHWY4YS.mjs} +10 -10
  2. package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectCardStack-TE7AWPMH.mjs +144 -0
  4. package/dist/lib/browser/ObjectCardStack-TE7AWPMH.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectDetails-666IBRHE.mjs +144 -0
  6. package/dist/lib/browser/ObjectDetails-666IBRHE.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-USKWFIDK.mjs +551 -0
  10. package/dist/lib/browser/app-graph-builder-USKWFIDK.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-H6AW7KGS.mjs → app-graph-serializer-SXIQ425K.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-SXIQ425K.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs → chunk-5CSSKOWR.mjs} +42 -16
  14. package/dist/lib/browser/chunk-5CSSKOWR.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-C6DAPIFF.mjs +20 -0
  16. package/dist/lib/browser/chunk-C6DAPIFF.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-E4BEMEZ3.mjs +399 -0
  18. package/dist/lib/browser/chunk-E4BEMEZ3.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-XUYKJUU7.mjs → chunk-IJCMB5B5.mjs} +269 -145
  20. package/dist/lib/browser/chunk-IJCMB5B5.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-QACNNDOT.mjs → chunk-POFUXISV.mjs} +69 -62
  22. package/dist/lib/browser/chunk-POFUXISV.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  24. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
  26. package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-V7MJSSBQ.mjs → chunk-XKQCDLXX.mjs} +734 -615
  28. package/dist/lib/browser/chunk-XKQCDLXX.mjs.map +7 -0
  29. package/dist/lib/browser/{identity-created-23XJJV2N.mjs → identity-created-NAXTPQXE.mjs} +6 -6
  30. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +92 -139
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-TIXVDYN7.mjs → intent-resolver-QEIM7NQT.mjs} +118 -109
  34. package/dist/lib/browser/intent-resolver-QEIM7NQT.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-T6ZETLD2.mjs +30 -0
  37. package/dist/lib/browser/react-root-T6ZETLD2.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-TPNLWJJH.mjs → react-surface-MLN5BZ2G.mjs} +120 -120
  39. package/dist/lib/browser/react-surface-MLN5BZ2G.mjs.map +7 -0
  40. package/dist/lib/browser/repair-CNLE35NF.mjs +44 -0
  41. package/dist/lib/browser/repair-CNLE35NF.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-4IMP5RYT.mjs → settings-EGTCHS7U.mjs} +5 -5
  43. package/dist/lib/browser/{settings-4IMP5RYT.mjs.map → settings-EGTCHS7U.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-TOPG6IV4.mjs → spaces-ready-YS4BBZXW.mjs} +29 -20
  45. package/dist/lib/browser/spaces-ready-YS4BBZXW.mjs.map +7 -0
  46. package/dist/lib/browser/{state-QYZAB45H.mjs → state-C7N6EDDZ.mjs} +7 -7
  47. package/dist/lib/browser/state-C7N6EDDZ.mjs.map +7 -0
  48. package/dist/lib/browser/types/index.mjs +10 -4
  49. package/dist/lib/node-esm/{CollectionMain-ZJIFCWKZ.mjs → CollectionArticle-KHXYT3SH.mjs} +10 -10
  50. package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.mjs.map +7 -0
  51. package/dist/lib/node-esm/ObjectCardStack-AAKMAQ6T.mjs +145 -0
  52. package/dist/lib/node-esm/ObjectCardStack-AAKMAQ6T.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectDetails-TZ5YKXGN.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectDetails-TZ5YKXGN.mjs.map +7 -0
  55. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs.map +7 -0
  57. package/dist/lib/node-esm/app-graph-builder-QRQ5EQLB.mjs +552 -0
  58. package/dist/lib/node-esm/app-graph-builder-QRQ5EQLB.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-2ICUGQQT.mjs → app-graph-serializer-P2X4W7LI.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-P2X4W7LI.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-4AOMYKDE.mjs → chunk-3D4NGZPW.mjs} +269 -145
  62. package/dist/lib/node-esm/chunk-3D4NGZPW.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-P442DOQ3.mjs → chunk-AX3UGL5D.mjs} +69 -62
  64. package/dist/lib/node-esm/chunk-AX3UGL5D.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  66. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-H4JILUJK.mjs +20 -0
  68. package/dist/lib/node-esm/chunk-H4JILUJK.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-QQQE2ZCX.mjs +400 -0
  70. package/dist/lib/node-esm/chunk-QQQE2ZCX.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs → chunk-UMZ7G6G4.mjs} +41 -16
  72. package/dist/lib/node-esm/chunk-UMZ7G6G4.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs +21 -0
  74. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-6X5DLJM5.mjs → chunk-XD532BVR.mjs} +734 -615
  76. package/dist/lib/node-esm/chunk-XD532BVR.mjs.map +7 -0
  77. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs → identity-created-OXLKCJE3.mjs} +6 -6
  78. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +92 -139
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-MHGHRGDT.mjs → intent-resolver-ZWCBVABN.mjs} +118 -109
  82. package/dist/lib/node-esm/intent-resolver-ZWCBVABN.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-KW3TGJGY.mjs → react-root-SKB4UJ4K.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-SKB4UJ4K.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-UUIUUD6P.mjs → react-surface-BVZGNSBB.mjs} +120 -120
  87. package/dist/lib/node-esm/react-surface-BVZGNSBB.mjs.map +7 -0
  88. package/dist/lib/node-esm/repair-EHZS6MFY.mjs +45 -0
  89. package/dist/lib/node-esm/repair-EHZS6MFY.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-SAOBPND3.mjs → settings-N3F6JCIR.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-SAOBPND3.mjs.map → settings-N3F6JCIR.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-HIUKNDZK.mjs → spaces-ready-U2K5P4LB.mjs} +29 -20
  93. package/dist/lib/node-esm/spaces-ready-U2K5P4LB.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-ZVEHQ4BJ.mjs → state-45TXZQJ6.mjs} +7 -7
  95. package/dist/lib/node-esm/state-45TXZQJ6.mjs.map +7 -0
  96. package/dist/lib/node-esm/types/index.mjs +10 -4
  97. package/dist/types/src/SpacePlugin.d.ts +1 -1
  98. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  102. package/dist/types/src/capabilities/capabilities.d.ts +14 -8
  103. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/identity-created.d.ts +1 -1
  105. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/index.d.ts +11 -12
  107. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  111. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  113. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/repair.d.ts +4 -0
  115. package/dist/types/src/capabilities/repair.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/settings.d.ts +1 -1
  117. package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
  118. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/state.d.ts +1 -1
  120. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  121. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  122. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  123. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  124. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  125. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  126. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +3 -3
  127. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1588 -4
  129. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +18 -9
  131. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  132. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  133. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  134. package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
  135. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  136. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  137. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  138. package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +3 -2
  139. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  140. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1591 -0
  141. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts.map +1 -0
  142. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  143. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  144. package/dist/types/src/components/ObjectCardStack/ObjectCardStack.d.ts +8 -0
  145. package/dist/types/src/components/ObjectCardStack/ObjectCardStack.d.ts.map +1 -0
  146. package/dist/types/src/components/ObjectCardStack/ObjectForm.d.ts +9 -0
  147. package/dist/types/src/components/ObjectCardStack/ObjectForm.d.ts.map +1 -0
  148. package/dist/types/src/components/ObjectCardStack/index.d.ts +3 -0
  149. package/dist/types/src/components/ObjectCardStack/index.d.ts.map +1 -0
  150. package/dist/types/src/components/{ObjectSettings → ObjectDetails}/BaseObjectSettings.d.ts +2 -2
  151. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.d.ts.map +1 -0
  152. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts +1424 -0
  153. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts.map +1 -0
  154. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts +8 -0
  155. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts.map +1 -0
  156. package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts +8 -0
  157. package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts.map +1 -0
  158. package/dist/types/src/components/ObjectDetails/index.d.ts +3 -0
  159. package/dist/types/src/components/ObjectDetails/index.d.ts.map +1 -0
  160. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  161. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  162. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  163. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  164. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  165. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  166. package/dist/types/src/components/RecordArticle.stories.d.ts +1591 -0
  167. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  168. package/dist/types/src/components/SchemaContainer.d.ts +2 -2
  169. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  170. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  171. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +6 -5
  172. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  173. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts +1421 -0
  174. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  176. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  177. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  178. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  179. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  180. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  181. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +1 -1
  182. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  183. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1421 -4
  184. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  186. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1422 -5
  187. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  189. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  190. package/dist/types/src/components/index.d.ts +10 -12
  191. package/dist/types/src/components/index.d.ts.map +1 -1
  192. package/dist/types/src/events.d.ts.map +1 -1
  193. package/dist/types/src/helpers/index.d.ts +2 -0
  194. package/dist/types/src/helpers/index.d.ts.map +1 -0
  195. package/dist/types/src/helpers/query.d.ts +7 -0
  196. package/dist/types/src/helpers/query.d.ts.map +1 -0
  197. package/dist/types/src/helpers/query.test.d.ts +2 -0
  198. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  199. package/dist/types/src/hooks/index.d.ts +1 -0
  200. package/dist/types/src/hooks/index.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  202. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +2 -8
  203. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  204. package/dist/types/src/hooks/usePath.d.ts +1 -1
  205. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  206. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  207. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  208. package/dist/types/src/index.d.ts +1 -0
  209. package/dist/types/src/index.d.ts.map +1 -1
  210. package/dist/types/src/meta.d.ts +0 -1
  211. package/dist/types/src/meta.d.ts.map +1 -1
  212. package/dist/types/src/translations.d.ts +1261 -67
  213. package/dist/types/src/translations.d.ts.map +1 -1
  214. package/dist/types/src/types/form.d.ts +22 -0
  215. package/dist/types/src/types/form.d.ts.map +1 -0
  216. package/dist/types/src/types/index.d.ts +1 -0
  217. package/dist/types/src/types/index.d.ts.map +1 -1
  218. package/dist/types/src/types/types.d.ts +96 -157
  219. package/dist/types/src/types/types.d.ts.map +1 -1
  220. package/dist/types/src/util.d.ts +25 -36
  221. package/dist/types/src/util.d.ts.map +1 -1
  222. package/dist/types/tsconfig.tsbuildinfo +1 -1
  223. package/package.json +70 -59
  224. package/src/SpacePlugin.ts +182 -222
  225. package/src/capabilities/app-graph-builder.ts +271 -246
  226. package/src/capabilities/app-graph-serializer.ts +12 -12
  227. package/src/capabilities/capabilities.ts +28 -17
  228. package/src/capabilities/identity-created.ts +3 -3
  229. package/src/capabilities/index.ts +1 -2
  230. package/src/capabilities/intent-resolver.ts +92 -81
  231. package/src/capabilities/react-root.tsx +6 -4
  232. package/src/capabilities/react-surface.tsx +127 -155
  233. package/src/capabilities/repair.ts +57 -0
  234. package/src/capabilities/spaces-ready.ts +38 -17
  235. package/src/capabilities/state.ts +5 -4
  236. package/src/components/AwaitingObject.tsx +12 -14
  237. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  238. package/src/components/CollectionSection.tsx +8 -6
  239. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
  240. package/src/components/CreateDialog/CreateObjectDialog.tsx +74 -46
  241. package/src/components/CreateDialog/CreateObjectPanel.tsx +65 -43
  242. package/src/components/CreateDialog/CreateSpaceDialog.tsx +45 -22
  243. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  244. package/src/components/JoinDialog/index.ts +5 -0
  245. package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
  246. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +22 -21
  247. package/src/components/MembersContainer/index.ts +5 -0
  248. package/src/components/MenuFooter.tsx +2 -2
  249. package/src/components/ObjectCardStack/ObjectCardStack.tsx +64 -0
  250. package/src/components/ObjectCardStack/ObjectForm.tsx +90 -0
  251. package/src/components/ObjectCardStack/index.ts +7 -0
  252. package/src/components/ObjectDetails/BaseObjectSettings.stories.tsx +63 -0
  253. package/src/components/ObjectDetails/BaseObjectSettings.tsx +118 -0
  254. package/src/components/{ObjectSettings → ObjectDetails}/ForeignKeys.tsx +8 -8
  255. package/src/components/ObjectDetails/ObjectDetails.tsx +35 -0
  256. package/src/components/ObjectDetails/index.ts +7 -0
  257. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +10 -16
  258. package/src/components/ObjectRenamePopover/index.ts +5 -0
  259. package/src/components/RecordArticle.stories.tsx +115 -0
  260. package/src/components/RecordArticle.tsx +114 -0
  261. package/src/components/SchemaContainer.tsx +26 -29
  262. package/src/components/SpacePluginSettings.tsx +16 -11
  263. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +24 -23
  264. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +22 -17
  265. package/src/components/SpacePresence/index.ts +5 -0
  266. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  267. package/src/components/SpaceRenamePopover/index.ts +5 -0
  268. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +17 -9
  269. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +190 -155
  270. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  271. package/src/components/SyncStatus/SyncStatus.stories.tsx +9 -9
  272. package/src/components/SyncStatus/SyncStatus.tsx +109 -12
  273. package/src/components/ViewEditor.tsx +56 -23
  274. package/src/components/index.ts +7 -7
  275. package/src/events.ts +7 -7
  276. package/src/helpers/index.ts +5 -0
  277. package/src/helpers/query.test.ts +24 -0
  278. package/src/helpers/query.ts +152 -0
  279. package/src/hooks/index.ts +1 -0
  280. package/src/hooks/useActiveSpace.ts +3 -2
  281. package/src/hooks/useInputSurfaceLookup.tsx +9 -13
  282. package/src/hooks/usePath.ts +1 -1
  283. package/src/hooks/useTypeOptions.ts +25 -0
  284. package/src/index.ts +1 -0
  285. package/src/meta.ts +6 -3
  286. package/src/translations.ts +68 -58
  287. package/src/types/form.ts +69 -0
  288. package/src/types/index.ts +1 -0
  289. package/src/types/types.ts +51 -52
  290. package/src/util.tsx +269 -147
  291. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
  292. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs +0 -88
  293. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs.map +0 -7
  294. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs +0 -479
  295. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs.map +0 -7
  296. package/dist/lib/browser/app-graph-serializer-H6AW7KGS.mjs.map +0 -7
  297. package/dist/lib/browser/chunk-CEFHNVU7.mjs +0 -20
  298. package/dist/lib/browser/chunk-CEFHNVU7.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  300. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-JS3MMC42.mjs +0 -19
  302. package/dist/lib/browser/chunk-JS3MMC42.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-QACNNDOT.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-SGTQ52SU.mjs +0 -338
  305. package/dist/lib/browser/chunk-SGTQ52SU.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-V7MJSSBQ.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-VLBRSGJ2.mjs.map +0 -7
  308. package/dist/lib/browser/chunk-XUYKJUU7.mjs.map +0 -7
  309. package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +0 -7
  310. package/dist/lib/browser/intent-resolver-TIXVDYN7.mjs.map +0 -7
  311. package/dist/lib/browser/react-root-N2J7TDRX.mjs +0 -29
  312. package/dist/lib/browser/react-root-N2J7TDRX.mjs.map +0 -7
  313. package/dist/lib/browser/react-surface-TPNLWJJH.mjs.map +0 -7
  314. package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs +0 -26
  315. package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs.map +0 -7
  316. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
  317. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  318. package/dist/lib/browser/spaces-ready-TOPG6IV4.mjs.map +0 -7
  319. package/dist/lib/browser/state-QYZAB45H.mjs.map +0 -7
  320. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
  321. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs +0 -89
  322. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs.map +0 -7
  323. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs +0 -480
  324. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs.map +0 -7
  325. package/dist/lib/node-esm/app-graph-serializer-2ICUGQQT.mjs.map +0 -7
  326. package/dist/lib/node-esm/chunk-4AOMYKDE.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-5HHYE264.mjs +0 -20
  328. package/dist/lib/node-esm/chunk-5HHYE264.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs +0 -21
  330. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-6X5DLJM5.mjs.map +0 -7
  332. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  333. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs +0 -339
  335. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-P442DOQ3.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-SSLBYZEY.mjs.map +0 -7
  338. package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +0 -7
  339. package/dist/lib/node-esm/intent-resolver-MHGHRGDT.mjs.map +0 -7
  340. package/dist/lib/node-esm/react-root-KW3TGJGY.mjs.map +0 -7
  341. package/dist/lib/node-esm/react-surface-UUIUUD6P.mjs.map +0 -7
  342. package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs +0 -27
  343. package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs.map +0 -7
  344. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
  345. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  346. package/dist/lib/node-esm/spaces-ready-HIUKNDZK.mjs.map +0 -7
  347. package/dist/lib/node-esm/state-ZVEHQ4BJ.mjs.map +0 -7
  348. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  349. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  350. package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
  351. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
  352. package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
  353. package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
  354. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  355. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  356. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  357. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  358. package/dist/types/src/components/MembersContainer.stories.d.ts +0 -8
  359. package/dist/types/src/components/MembersContainer.stories.d.ts.map +0 -1
  360. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  361. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  362. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts +0 -7
  363. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
  364. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +0 -1
  365. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +0 -8
  366. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +0 -1
  367. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts +0 -8
  368. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +0 -1
  369. package/dist/types/src/components/ObjectSettings/index.d.ts +0 -2
  370. package/dist/types/src/components/ObjectSettings/index.d.ts.map +0 -1
  371. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  372. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  373. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  374. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  375. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  376. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  377. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  378. package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
  379. package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
  380. package/src/capabilities/schema-defs.ts +0 -30
  381. package/src/capabilities/schema-tool.test.ts +0 -44
  382. package/src/capabilities/schema-tools.ts +0 -125
  383. package/src/components/MembersContainer.stories.tsx +0 -30
  384. package/src/components/ObjectDetailsPanel.tsx +0 -77
  385. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +0 -80
  386. package/src/components/ObjectSettings/BaseObjectSettings.tsx +0 -47
  387. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +0 -36
  388. package/src/components/ObjectSettings/index.ts +0 -5
  389. package/src/components/PersistenceStatus.tsx +0 -83
@@ -2,80 +2,70 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Schema } from 'effect';
6
- import React, { useCallback, useMemo } from 'react';
5
+ import * as Option from 'effect/Option';
6
+ import type * as Schema from 'effect/Schema';
7
+ import React, { useCallback } from 'react';
7
8
 
8
- import {
9
- Capabilities,
10
- contributes,
11
- createSurface,
12
- Surface,
13
- useCapabilities,
14
- useCapability,
15
- useLayout,
16
- } from '@dxos/app-framework';
17
- import { Obj, Type } from '@dxos/echo';
9
+ import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
10
+ import { Surface, useCapability, useLayout } from '@dxos/app-framework/react';
11
+ import { Obj, type Ref } from '@dxos/echo';
18
12
  import { findAnnotation } from '@dxos/effect';
19
13
  import { SettingsStore } from '@dxos/local-storage';
20
- import { ClientCapabilities } from '@dxos/plugin-client';
21
- import { useClient } from '@dxos/react-client';
22
- import {
23
- fullyQualifiedId,
24
- getSpace,
25
- isLiveObject,
26
- isSpace,
27
- parseId,
28
- SpaceState,
29
- useSpace,
30
- type Space,
31
- } from '@dxos/react-client/echo';
32
- import { Input, useTranslation } from '@dxos/react-ui';
33
- import { type InputProps, SelectInput } from '@dxos/react-ui-form';
14
+ import { type Space, SpaceState, getSpace, isLiveObject, isSpace, parseId, useSpace } from '@dxos/react-client/echo';
15
+ import { Input } from '@dxos/react-ui';
16
+ import { type FormFieldComponentProps, SelectField } from '@dxos/react-ui-form';
34
17
  import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
35
- import { DataType, type TypenameAnnotation, TypenameAnnotationId } from '@dxos/schema';
18
+ import { Collection, type View, ViewAnnotation } from '@dxos/schema';
36
19
  import { type JoinPanelProps } from '@dxos/shell/react';
37
20
 
38
- import { SpaceCapabilities } from './capabilities';
39
21
  import {
40
- CollectionMain,
41
- CollectionSection,
42
22
  CREATE_OBJECT_DIALOG,
43
23
  CREATE_SPACE_DIALOG,
24
+ CollectionArticle,
25
+ CollectionSection,
44
26
  CreateObjectDialog,
27
+ type CreateObjectDialogProps,
45
28
  CreateSpaceDialog,
46
29
  InlineSyncStatus,
47
30
  JOIN_DIALOG,
48
31
  JoinDialog,
49
32
  MembersContainer,
50
33
  MenuFooter,
51
- ObjectDetailsPanel,
52
- ObjectSettingsContainer,
53
- POPOVER_RENAME_OBJECT,
54
- POPOVER_RENAME_SPACE,
55
- PopoverRenameObject,
56
- PopoverRenameSpace,
34
+ OBJECT_RENAME_POPOVER,
35
+ ObjectCardStack,
36
+ ObjectDetails,
37
+ ObjectRenamePopover,
38
+ RecordArticle,
39
+ SPACE_RENAME_POPOVER,
57
40
  SchemaContainer,
58
41
  SmallPresenceLive,
59
42
  SpacePluginSettings,
60
43
  SpacePresence,
44
+ SpaceRenamePopover,
61
45
  SpaceSettingsContainer,
62
46
  SyncStatus,
63
47
  ViewEditor,
64
- type CreateObjectDialogProps,
65
48
  } from '../components';
66
- import { SPACE_PLUGIN } from '../meta';
67
- import { HueAnnotationId, IconAnnotationId, type SpaceSettingsProps } from '../types';
49
+ import { useTypeOptions } from '../hooks';
50
+ import { meta } from '../meta';
51
+ import {
52
+ HueAnnotationId,
53
+ IconAnnotationId,
54
+ type SpaceSettingsProps,
55
+ type TypeInputOptions,
56
+ TypeInputOptionsAnnotationId,
57
+ } from '../types';
58
+
59
+ import { SpaceCapabilities } from './capabilities';
68
60
 
69
61
  type ReactSurfaceOptions = {
70
62
  createInvitationUrl: (invitationCode: string) => string;
71
63
  };
72
64
 
73
- const OMIT = [DataType.Collection.typename, DataType.QueryCollection.typename];
74
-
75
65
  export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
76
66
  contributes(Capabilities.ReactSurface, [
77
67
  createSurface({
78
- id: `${SPACE_PLUGIN}/article`,
68
+ id: `${meta.id}/article`,
79
69
  role: 'article',
80
70
  filter: (data): data is { subject: Space } =>
81
71
  // TODO(wittjosiah): Need to avoid shotgun parsing space state everywhere.
@@ -84,7 +74,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
84
74
  <Surface
85
75
  data={{
86
76
  id: data.subject.id,
87
- subject: data.subject.properties[DataType.Collection.typename]?.target,
77
+ subject: data.subject.properties[Collection.Collection.typename]?.target,
88
78
  }}
89
79
  role={role}
90
80
  {...rest}
@@ -92,30 +82,37 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
92
82
  ),
93
83
  }),
94
84
  createSurface({
95
- id: `${SPACE_PLUGIN}/collection-fallback`,
85
+ id: `${meta.id}/record-article`,
96
86
  role: 'article',
97
87
  position: 'fallback',
98
- filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
99
- component: ({ data }) => <CollectionMain collection={data.subject} />,
88
+ filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
89
+ component: ({ data }) => <RecordArticle subject={data.subject} />,
90
+ }),
91
+ createSurface({
92
+ id: `${meta.id}/collection-fallback`,
93
+ role: 'article',
94
+ position: 'fallback',
95
+ filter: (data): data is { subject: Collection.Collection } => Obj.instanceOf(Collection.Collection, data.subject),
96
+ component: ({ data }) => <CollectionArticle subject={data.subject} />,
100
97
  }),
101
98
  createSurface({
102
- id: `${SPACE_PLUGIN}/plugin-settings`,
99
+ id: `${meta.id}/plugin-settings`,
103
100
  role: 'article',
104
101
  filter: (data): data is { subject: SettingsStore<SpaceSettingsProps> } =>
105
- data.subject instanceof SettingsStore && data.subject.prefix === SPACE_PLUGIN,
102
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
106
103
  component: ({ data: { subject } }) => <SpacePluginSettings settings={subject.value} />,
107
104
  }),
108
105
  createSurface({
109
- id: `${SPACE_PLUGIN}/companion/object-settings`,
106
+ id: `${meta.id}/companion/object-settings`,
110
107
  role: 'article',
111
108
  filter: (data): data is { companionTo: Obj.Any } => Obj.isObject(data.companionTo) && data.subject === 'settings',
112
- component: ({ data, role }) => <ObjectSettingsContainer object={data.companionTo} role={role} />,
109
+ component: ({ ref, data, role }) => <ObjectDetails object={data.companionTo} role={role} ref={ref} />,
113
110
  }),
114
111
  createSurface({
115
- id: `${SPACE_PLUGIN}/space-settings-properties`,
112
+ id: `${meta.id}/space-settings-properties`,
116
113
  role: 'article',
117
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/properties`,
118
- component: () => {
114
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/properties`,
115
+ component: ({ ref }) => {
119
116
  const layout = useLayout();
120
117
  const { spaceId } = parseId(layout.workspace);
121
118
  const space = useSpace(spaceId);
@@ -123,14 +120,14 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
123
120
  return null;
124
121
  }
125
122
 
126
- return <SpaceSettingsContainer space={space} />;
123
+ return <SpaceSettingsContainer space={space} ref={ref} />;
127
124
  },
128
125
  }),
129
126
  createSurface({
130
- id: `${SPACE_PLUGIN}/space-settings-members`,
127
+ id: `${meta.id}/space-settings-members`,
131
128
  role: 'article',
132
129
  position: 'hoist',
133
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/members`,
130
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/members`,
134
131
  component: () => {
135
132
  const layout = useLayout();
136
133
  const { spaceId } = parseId(layout.workspace);
@@ -143,9 +140,9 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
143
140
  },
144
141
  }),
145
142
  createSurface({
146
- id: `${SPACE_PLUGIN}/space-settings-schema`,
143
+ id: `${meta.id}/space-settings-schema`,
147
144
  role: 'article',
148
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/schema`,
145
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/schema`,
149
146
  component: () => {
150
147
  const layout = useLayout();
151
148
  const { spaceId } = parseId(layout.workspace);
@@ -158,15 +155,26 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
158
155
  },
159
156
  }),
160
157
  createSurface({
161
- id: `${SPACE_PLUGIN}/selected-objects`,
158
+ id: `${meta.id}/selected-objects`,
162
159
  role: 'article',
163
- filter: (data): data is { companionTo: DataType.View; subject: 'selected-objects' } =>
164
- Obj.instanceOf(DataType.View, data.companionTo) && data.subject === 'selected-objects',
165
- component: ({ data }) => (
166
- <ObjectDetailsPanel
167
- key={fullyQualifiedId(data.companionTo)}
168
- objectId={fullyQualifiedId(data.companionTo)}
169
- view={data.companionTo}
160
+ filter: (data): data is { companionTo: Obj.Obj<{ view: Ref.Ref<View.View> }>; subject: 'selected-objects' } => {
161
+ if (data.subject !== 'selected-objects' || !Obj.isObject(data.companionTo)) {
162
+ return false;
163
+ }
164
+
165
+ // TODO(burdon): Check companionTo.view.target is valid.
166
+ const schema = Obj.getSchema(data.companionTo);
167
+ return Option.fromNullable(schema).pipe(
168
+ Option.flatMap((schema) => ViewAnnotation.get(schema)),
169
+ Option.getOrElse(() => false),
170
+ );
171
+ },
172
+ component: ({ data, ref }) => (
173
+ <ObjectCardStack
174
+ key={Obj.getDXN(data.companionTo).toString()}
175
+ objectId={Obj.getDXN(data.companionTo).toString()}
176
+ view={data.companionTo.view.target!}
177
+ ref={ref}
170
178
  />
171
179
  ),
172
180
  }),
@@ -189,149 +197,113 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
189
197
  component: ({ data }) => <CreateObjectDialog {...data.props} />,
190
198
  }),
191
199
  createSurface({
192
- id: `${SPACE_PLUGIN}/create-initial-space-form-[hue]`,
200
+ id: `${meta.id}/create-initial-space-form-[hue]`,
193
201
  role: 'form-input',
194
202
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
195
203
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, HueAnnotationId);
196
204
  return !!annotation;
197
205
  },
198
206
  component: ({ data: _, ...inputProps }) => {
199
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
207
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as FormFieldComponentProps;
200
208
  const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange]);
201
209
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
202
210
  return (
203
211
  <Input.Root>
204
212
  <Input.Label>{label}</Input.Label>
205
- <HuePicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
213
+ <HuePicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
206
214
  </Input.Root>
207
215
  );
208
216
  },
209
217
  }),
210
218
  createSurface({
211
- id: `${SPACE_PLUGIN}/create-initial-space-form-[icon]`,
219
+ id: `${meta.id}/create-initial-space-form-[icon]`,
212
220
  role: 'form-input',
213
221
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
214
222
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, IconAnnotationId);
215
223
  return !!annotation;
216
224
  },
217
225
  component: ({ data: _, ...inputProps }) => {
218
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
226
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as FormFieldComponentProps;
219
227
  const handleChange = useCallback((nextIcon: string) => onValueChange(type, nextIcon), [onValueChange]);
220
228
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
221
229
  return (
222
230
  <Input.Root>
223
231
  <Input.Label>{label}</Input.Label>
224
- <IconPicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
232
+ <IconPicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
225
233
  </Input.Root>
226
234
  );
227
235
  },
228
236
  }),
229
237
  createSurface({
230
- id: `${SPACE_PLUGIN}/typename-form-input`,
238
+ id: `${meta.id}/typename-form-input`,
231
239
  role: 'form-input',
232
240
  filter: (
233
241
  data,
234
- ): data is { prop: string; schema: Schema.Schema<any>; target: Space | DataType.Collection | undefined } => {
242
+ ): data is {
243
+ prop: string;
244
+ schema: Schema.Schema.Any;
245
+ target: Space | Collection.Collection | undefined;
246
+ } => {
235
247
  if (data.prop !== 'typename') {
236
248
  return false;
237
249
  }
238
250
 
239
- const annotation = findAnnotation((data.schema as Schema.Schema.All).ast, TypenameAnnotationId);
251
+ const annotation = findAnnotation((data.schema as Schema.Schema.All).ast, TypeInputOptionsAnnotationId);
240
252
  return !!annotation;
241
253
  },
242
254
  component: ({ data: { schema, target }, ...inputProps }) => {
243
- const { t } = useTranslation();
244
- const client = useClient();
245
- const props = inputProps as any as InputProps;
255
+ const props = inputProps as any as FormFieldComponentProps;
246
256
  const space = isSpace(target) ? target : getSpace(target);
247
- if (!space) {
248
- return null;
249
- }
250
-
251
- const annotation = findAnnotation<TypenameAnnotation[]>(schema.ast, TypenameAnnotationId)!;
252
-
253
- const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);
254
- const whitelistedTypenames = useMemo(
255
- () => new Set(schemaWhitelists.flatMap((typeArray) => typeArray.map((type) => Type.getTypename(type)))),
256
- [schemaWhitelists],
257
- );
258
-
259
- const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
260
- const objectFormTypenames = useMemo(
261
- () =>
262
- new Set(
263
- objectForms
264
- .map((form) => Type.getTypename(form.objectSchema))
265
- // TODO(wittjosiah): Remove.
266
- .filter((typename) => !OMIT.includes(typename) && !typename.endsWith('View')),
267
- ),
268
- [objectForms],
269
- );
270
-
271
- const fixed = client.graph.schemaRegistry.schemas.filter((schema) => {
272
- const limitedStatic =
273
- annotation.includes('limited-static') && whitelistedTypenames.has(Type.getTypename(schema));
274
- const unusedStatic =
275
- annotation.includes('unused-static') &&
276
- whitelistedTypenames.has(Type.getTypename(schema)) &&
277
- !space.properties.staticRecords?.includes(Type.getTypename(schema));
278
- const objectForm = annotation.includes('object-form') && objectFormTypenames.has(Type.getTypename(schema));
279
- return annotation.includes('static') || limitedStatic || unusedStatic || objectForm;
280
- });
281
- const dynamic = space?.db.schemaRegistry.query().runSync();
282
- const typenames = Array.from(
283
- new Set<string>([
284
- ...(annotation.includes('limited-static') ||
285
- annotation.includes('unused-static') ||
286
- annotation.includes('static') ||
287
- annotation.includes('object-form')
288
- ? fixed.map((schema) => Type.getTypename(schema))
289
- : []),
290
- ...(annotation.includes('dynamic') ? dynamic.map((schema) => schema.typename) : []),
291
- ]),
292
- ).sort();
293
-
294
- const options = useMemo(
295
- () =>
296
- typenames
297
- .map((typename) => ({
298
- value: typename,
299
- label: t('typename label', { ns: typename, defaultValue: typename }),
300
- }))
301
- .toSorted((a, b) => a.label.localeCompare(b.label)),
302
- [t, typenames],
303
- );
257
+ const annotation = findAnnotation<TypeInputOptions>(schema.ast, TypeInputOptionsAnnotationId)!;
258
+ const options = useTypeOptions({ space, annotation });
304
259
 
305
- return <SelectInput {...props} options={options} />;
260
+ return <SelectField {...props} options={options} />;
306
261
  },
307
262
  }),
308
263
  createSurface({
309
- id: `${SPACE_PLUGIN}/object-settings`,
264
+ id: `${meta.id}/object-settings`,
310
265
  role: 'object-settings',
311
- filter: (data): data is { subject: DataType.View } => Obj.instanceOf(DataType.View, data.subject),
312
- component: ({ data }) => <ViewEditor view={data.subject} />,
266
+ filter: (data): data is { subject: { view: Ref.Ref<View.View> } } => {
267
+ if (!Obj.isObject(data.subject)) {
268
+ return false;
269
+ }
270
+
271
+ const schema = Obj.getSchema(data.subject);
272
+ return Option.fromNullable(schema).pipe(
273
+ Option.flatMap((schema) => ViewAnnotation.get(schema)),
274
+ Option.getOrElse(() => false),
275
+ );
276
+ },
277
+ component: ({ data }) => {
278
+ const view = data.subject.view.target;
279
+ if (!view) {
280
+ return null;
281
+ }
282
+
283
+ return <ViewEditor view={view} />;
284
+ },
313
285
  }),
314
286
  createSurface({
315
- id: POPOVER_RENAME_SPACE,
287
+ id: SPACE_RENAME_POPOVER,
316
288
  role: 'card--popover',
317
- filter: (data): data is { props: Space } => data.component === POPOVER_RENAME_SPACE && isSpace(data.props),
318
- component: ({ data }) => <PopoverRenameSpace space={data.props} />,
289
+ filter: (data): data is { props: Space } => data.component === SPACE_RENAME_POPOVER && isSpace(data.props),
290
+ component: ({ data }) => <SpaceRenamePopover space={data.props} />,
319
291
  }),
320
292
  createSurface({
321
- id: POPOVER_RENAME_OBJECT,
293
+ id: OBJECT_RENAME_POPOVER,
322
294
  role: 'card--popover',
323
295
  filter: (data): data is { props: Obj.Any } =>
324
- data.component === POPOVER_RENAME_OBJECT && isLiveObject(data.props),
325
- component: ({ data }) => <PopoverRenameObject object={data.props} />,
296
+ data.component === OBJECT_RENAME_POPOVER && isLiveObject(data.props),
297
+ component: ({ data }) => <ObjectRenamePopover object={data.props} />,
326
298
  }),
327
299
  createSurface({
328
- id: `${SPACE_PLUGIN}/menu-footer`,
300
+ id: `${meta.id}/menu-footer`,
329
301
  role: 'menu-footer',
330
302
  filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
331
303
  component: ({ data }) => <MenuFooter object={data.subject} />,
332
304
  }),
333
305
  createSurface({
334
- id: `${SPACE_PLUGIN}/navtree-presence`,
306
+ id: `${meta.id}/navtree-presence`,
335
307
  role: 'navtree-item-end',
336
308
  filter: (data): data is { id: string; subject: Obj.Any; open?: boolean } =>
337
309
  typeof data.id === 'string' && Obj.isObject(data.subject),
@@ -343,7 +315,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
343
315
  }),
344
316
  // TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
345
317
  createSurface({
346
- id: `${SPACE_PLUGIN}/navtree-presence-fallback`,
318
+ id: `${meta.id}/navtree-presence-fallback`,
347
319
  role: 'navtree-item-end',
348
320
  position: 'fallback',
349
321
  filter: (data): data is { id: string; open?: boolean } => typeof data.id === 'string',
@@ -351,13 +323,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
351
323
  }),
352
324
  // TODO(wittjosiah): Broken?
353
325
  createSurface({
354
- id: `${SPACE_PLUGIN}/navtree-sync-status`,
326
+ id: `${meta.id}/navtree-sync-status`,
355
327
  role: 'navtree-item-end',
356
328
  filter: (data): data is { subject: Space; open?: boolean } => isSpace(data.subject),
357
329
  component: ({ data }) => <InlineSyncStatus space={data.subject} open={data.open} />,
358
330
  }),
359
331
  createSurface({
360
- id: `${SPACE_PLUGIN}/navbar-presence`,
332
+ id: `${meta.id}/navbar-presence`,
361
333
  role: 'navbar-end',
362
334
  position: 'hoist',
363
335
  filter: (data): data is { subject: Space | Obj.Any } => isSpace(data.subject) || Obj.isObject(data.subject),
@@ -365,7 +337,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
365
337
  const space = isSpace(data.subject) ? data.subject : getSpace(data.subject);
366
338
  const object = isSpace(data.subject)
367
339
  ? data.subject.state.get() === SpaceState.SPACE_READY
368
- ? (space?.properties[DataType.Collection.typename]?.target as DataType.Collection)
340
+ ? (space?.properties[Collection.Collection.typename]?.target as Collection.Collection)
369
341
  : undefined
370
342
  : data.subject;
371
343
 
@@ -373,13 +345,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
373
345
  },
374
346
  }),
375
347
  createSurface({
376
- id: `${SPACE_PLUGIN}/collection-section`,
348
+ id: `${meta.id}/collection-section`,
377
349
  role: 'section',
378
- filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
379
- component: ({ data }) => <CollectionSection collection={data.subject} />,
350
+ filter: (data): data is { subject: Collection.Collection } => Obj.instanceOf(Collection.Collection, data.subject),
351
+ component: ({ data }) => <CollectionSection subject={data.subject} />,
380
352
  }),
381
353
  createSurface({
382
- id: `${SPACE_PLUGIN}/status`,
354
+ id: `${meta.id}/status`,
383
355
  role: 'status',
384
356
  component: () => <SyncStatus />,
385
357
  }),
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { contributes } from '@dxos/app-framework';
6
+ import { Obj, Ref, Type } from '@dxos/echo';
7
+ import { type Space } from '@dxos/react-client/echo';
8
+ import { Collection } from '@dxos/schema';
9
+
10
+ import { SpaceCapabilities } from './capabilities';
11
+
12
+ export default () =>
13
+ contributes(SpaceCapabilities.Repair, async ({ space }) => {
14
+ await removeQueryCollections(space);
15
+ await ensureSystemCollection(space);
16
+ });
17
+
18
+ /**
19
+ * Remove all existing query collections from the root collection.
20
+ */
21
+ const removeQueryCollections = async (space: Space) => {
22
+ const rootCollection: Collection.Collection = await space.properties[Collection.Collection.typename]?.load();
23
+ if (!rootCollection) {
24
+ return;
25
+ }
26
+
27
+ const objects = await Promise.all(rootCollection.objects.map((ref) => ref.load()));
28
+ const queryCollections = objects.filter((object) => Obj.getTypename(object) === 'dxos.org/type/QueryCollection');
29
+ if (queryCollections.length === 0) {
30
+ return;
31
+ }
32
+
33
+ rootCollection.objects = objects
34
+ .filter((object) => Obj.getTypename(object) !== 'dxos.org/type/QueryCollection')
35
+ .map((object) => Ref.make(object));
36
+ queryCollections.forEach((object) => space.db.remove(object));
37
+ };
38
+
39
+ /**
40
+ * Ensure the root collection has a system collection for StoredSchema.
41
+ */
42
+ const ensureSystemCollection = async (space: Space) => {
43
+ const rootCollection: Collection.Collection = await space.properties[Collection.Collection.typename]?.load();
44
+ if (!rootCollection) {
45
+ return;
46
+ }
47
+
48
+ const objects = await Promise.all(rootCollection.objects.map((ref) => ref.load()));
49
+ const records = objects.find(
50
+ (object) => Obj.instanceOf(Collection.Managed, object) && object.key === Type.getTypename(Type.PersistentType),
51
+ );
52
+ if (records) {
53
+ return;
54
+ }
55
+
56
+ rootCollection.objects.push(Ref.make(Collection.makeManaged({ key: Type.getTypename(Type.PersistentType) })));
57
+ };
@@ -2,9 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Option } from 'effect';
5
+ import * as Option from 'effect/Option';
6
6
 
7
- import { contributes, createIntent, Capabilities, LayoutAction, type PluginContext } from '@dxos/app-framework';
7
+ import { Capabilities, LayoutAction, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
8
8
  import { SubscriptionList } from '@dxos/async';
9
9
  import { Filter, Obj, Type } from '@dxos/echo';
10
10
  import { scheduledEffect } from '@dxos/echo-signals/core';
@@ -14,16 +14,20 @@ import { ClientCapabilities } from '@dxos/plugin-client';
14
14
  import { DeckCapabilities } from '@dxos/plugin-deck';
15
15
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
16
16
  import { PublicKey } from '@dxos/react-client';
17
- import { FQ_ID_LENGTH, parseFullyQualifiedId, SpaceState } from '@dxos/react-client/echo';
17
+ import { SpaceState, parseId } from '@dxos/react-client/echo';
18
18
  import { ComplexMap, reduceGroupBy } from '@dxos/util';
19
19
 
20
- import { SpaceCapabilities } from './capabilities';
21
20
  import { SpaceAction } from '../types';
22
21
  import { COMPOSER_SPACE_LOCK, SHARED } from '../util';
23
22
 
23
+ import { SpaceCapabilities } from './capabilities';
24
+
24
25
  const ACTIVE_NODE_BROADCAST_INTERVAL = 30_000;
25
26
  const WAIT_FOR_OBJECT_TIMEOUT = 5_000;
26
27
 
28
+ // E.g., dxn:echo:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
29
+ const ECHO_DXN_LENGTH = 3 + 1 + 4 + 1 + 33 + 1 + 26;
30
+
27
31
  export default async (context: PluginContext) => {
28
32
  const subscriptions = new SubscriptionList();
29
33
  const spaceSubscriptions = new SubscriptionList();
@@ -40,7 +44,12 @@ export default async (context: PluginContext) => {
40
44
  await defaultSpace.waitUntilReady();
41
45
 
42
46
  if (deck?.activeDeck === 'default') {
43
- await dispatch(createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: defaultSpace.id }));
47
+ await dispatch(
48
+ createIntent(LayoutAction.SwitchWorkspace, {
49
+ part: 'workspace',
50
+ subject: defaultSpace.id,
51
+ }),
52
+ );
44
53
  }
45
54
 
46
55
  // Initialize space sharing lock in default space.
@@ -48,9 +57,7 @@ export default async (context: PluginContext) => {
48
57
  defaultSpace.properties[COMPOSER_SPACE_LOCK] = true;
49
58
  }
50
59
 
51
- const {
52
- objects: [spacesOrder],
53
- } = await defaultSpace.db.query(Filter.type(Type.Expando, { key: SHARED })).run();
60
+ const [spacesOrder] = await defaultSpace.db.query(Filter.type(Type.Expando, { key: SHARED })).run();
54
61
  if (!spacesOrder) {
55
62
  // TODO(wittjosiah): Cannot be a Folder because Spaces are not TypedObjects so can't be saved in the database.
56
63
  // Instead, we store order as an array of space ids.
@@ -66,12 +73,14 @@ export default async (context: PluginContext) => {
66
73
  return;
67
74
  }
68
75
 
69
- const node = graph.getNode(active[0]).pipe(Option.getOrNull);
70
- if (!node && active[0].length === FQ_ID_LENGTH) {
76
+ const id = active[0];
77
+ const node = graph.getNode(id).pipe(Option.getOrNull);
78
+ if (!node && id.length === ECHO_DXN_LENGTH) {
79
+ void graph.initialize(id);
71
80
  const timeout = setTimeout(async () => {
72
- const node = graph.getNode(active[0]).pipe(Option.getOrNull);
81
+ const node = graph.getNode(id).pipe(Option.getOrNull);
73
82
  if (!node) {
74
- await dispatch(createIntent(SpaceAction.WaitForObject, { id: active[0] }));
83
+ await dispatch(createIntent(SpaceAction.WaitForObject, { id }));
75
84
  }
76
85
  }, WAIT_FOR_OBJECT_TIMEOUT);
77
86
 
@@ -95,7 +104,13 @@ export default async (context: PluginContext) => {
95
104
  subscriptions.add(
96
105
  scheduledEffect(
97
106
  () => ({ name: space.properties.name }),
98
- ({ name }) => (state.spaceNames[space.id] = name),
107
+ ({ name }) => {
108
+ if (!name) {
109
+ delete state.spaceNames[space.id];
110
+ } else {
111
+ state.spaceNames[space.id] = name;
112
+ }
113
+ },
99
114
  ),
100
115
  );
101
116
  });
@@ -105,7 +120,11 @@ export default async (context: PluginContext) => {
105
120
  // Broadcast active node to other peers in the space.
106
121
  subscriptions.add(
107
122
  scheduledEffect(
108
- () => ({ current: attention.current, active: layout.active, inactive: layout.inactive }),
123
+ () => ({
124
+ current: attention.current,
125
+ active: layout.active,
126
+ inactive: layout.inactive,
127
+ }),
109
128
  ({ current, active, inactive }) => {
110
129
  const send = () => {
111
130
  const spaces = client.spaces.get();
@@ -114,7 +133,7 @@ export default async (context: PluginContext) => {
114
133
  // Group parts by space for efficient messaging.
115
134
  const idsBySpace = reduceGroupBy(active, (id) => {
116
135
  try {
117
- const [spaceId] = parseFullyQualifiedId(id);
136
+ const { spaceId } = parseId(id);
118
137
  return spaceId;
119
138
  } catch {
120
139
  return null;
@@ -123,7 +142,7 @@ export default async (context: PluginContext) => {
123
142
 
124
143
  const removedBySpace = reduceGroupBy(inactive, (id) => {
125
144
  try {
126
- const [spaceId] = parseFullyQualifiedId(id);
145
+ const { spaceId } = parseId(id);
127
146
  return spaceId;
128
147
  } catch {
129
148
  return null;
@@ -153,7 +172,9 @@ export default async (context: PluginContext) => {
153
172
  })
154
173
  // TODO(burdon): This seems defensive; why would this fail? Backoff interval.
155
174
  .catch((err) => {
156
- log.warn('Failed to broadcast active node for presence.', { err: err.message });
175
+ log.warn('Failed to broadcast active node for presence.', {
176
+ err: err.message,
177
+ });
157
178
  });
158
179
  }
159
180
  }