@dxos/plugin-space 0.8.4-main.67995b8 → 0.8.4-main.70d3990

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 (376) 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/ObjectDetailsPanel-ACGHWPDX.mjs +141 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-ACGHWPDX.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectSettings-U3IH7BMV.mjs +144 -0
  6. package/dist/lib/browser/ObjectSettings-U3IH7BMV.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-HABMCWAI.mjs +517 -0
  10. package/dist/lib/browser/app-graph-builder-HABMCWAI.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-H6AW7KGS.mjs → app-graph-serializer-G3VFEGTN.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-G3VFEGTN.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-6A3NWBB6.mjs +392 -0
  14. package/dist/lib/browser/chunk-6A3NWBB6.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-XUYKJUU7.mjs → chunk-GJOZILGC.mjs} +262 -143
  18. package/dist/lib/browser/chunk-GJOZILGC.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-FBJEXW54.mjs → chunk-KCZ527AM.mjs} +667 -525
  20. package/dist/lib/browser/chunk-KCZ527AM.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs → chunk-P25R3AOK.mjs} +36 -6
  22. package/dist/lib/browser/chunk-P25R3AOK.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-QACNNDOT.mjs → chunk-POFUXISV.mjs} +69 -62
  24. package/dist/lib/browser/chunk-POFUXISV.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  26. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
  28. package/dist/lib/browser/chunk-WJXU4GKV.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 +88 -135
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-XHGD73WZ.mjs → intent-resolver-RZEWNJ2K.mjs} +114 -101
  34. package/dist/lib/browser/intent-resolver-RZEWNJ2K.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-JCRD74GI.mjs +30 -0
  37. package/dist/lib/browser/react-root-JCRD74GI.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-YWZZQF7H.mjs → react-surface-VOETEAG3.mjs} +101 -111
  39. package/dist/lib/browser/react-surface-VOETEAG3.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-TRLI52I5.mjs} +5 -5
  43. package/dist/lib/browser/{settings-4IMP5RYT.mjs.map → settings-TRLI52I5.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-TOPG6IV4.mjs → spaces-ready-OHGCWZHQ.mjs} +28 -19
  45. package/dist/lib/browser/spaces-ready-OHGCWZHQ.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/ObjectDetailsPanel-6OFTT3GG.mjs +142 -0
  52. package/dist/lib/node-esm/ObjectDetailsPanel-6OFTT3GG.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.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-T6VJKIOA.mjs +518 -0
  58. package/dist/lib/node-esm/app-graph-builder-T6VJKIOA.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-2ICUGQQT.mjs → app-graph-serializer-2NLWWFUB.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-2NLWWFUB.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs → chunk-7EV4SN47.mjs} +35 -6
  62. package/dist/lib/node-esm/chunk-7EV4SN47.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-4AOMYKDE.mjs → chunk-I6FZP42D.mjs} +262 -143
  70. package/dist/lib/node-esm/chunk-I6FZP42D.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-2A3VBXBP.mjs → chunk-JAMGJUFU.mjs} +667 -525
  72. package/dist/lib/node-esm/chunk-JAMGJUFU.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-X34VDVMY.mjs +393 -0
  76. package/dist/lib/node-esm/chunk-X34VDVMY.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 +88 -135
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-LEANKSKZ.mjs → intent-resolver-4PHJWDXW.mjs} +114 -101
  82. package/dist/lib/node-esm/intent-resolver-4PHJWDXW.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-5Y7LJRX6.mjs → react-root-O5I5CDJ7.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-O5I5CDJ7.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-YQFNIKYT.mjs → react-surface-J3XDMU2D.mjs} +101 -111
  87. package/dist/lib/node-esm/react-surface-J3XDMU2D.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-MNQTKHL7.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-SAOBPND3.mjs.map → settings-MNQTKHL7.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-HIUKNDZK.mjs → spaces-ready-ZPU24DA2.mjs} +28 -19
  93. package/dist/lib/node-esm/spaces-ready-ZPU24DA2.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/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
  145. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
  146. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
  147. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
  148. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
  149. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
  150. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  151. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  152. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  153. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  154. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  155. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
  156. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  157. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1424 -0
  158. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
  159. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +3 -3
  160. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
  161. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  162. package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
  163. package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
  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.map +1 -1
  182. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1421 -4
  183. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  184. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  185. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1422 -5
  186. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  187. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  188. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  189. package/dist/types/src/components/index.d.ts +10 -11
  190. package/dist/types/src/components/index.d.ts.map +1 -1
  191. package/dist/types/src/events.d.ts.map +1 -1
  192. package/dist/types/src/helpers/index.d.ts +2 -0
  193. package/dist/types/src/helpers/index.d.ts.map +1 -0
  194. package/dist/types/src/helpers/query.d.ts +8 -0
  195. package/dist/types/src/helpers/query.d.ts.map +1 -0
  196. package/dist/types/src/helpers/query.test.d.ts +2 -0
  197. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  198. package/dist/types/src/hooks/index.d.ts +1 -0
  199. package/dist/types/src/hooks/index.d.ts.map +1 -1
  200. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
  202. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  203. package/dist/types/src/hooks/usePath.d.ts +1 -1
  204. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  206. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  207. package/dist/types/src/index.d.ts +1 -0
  208. package/dist/types/src/index.d.ts.map +1 -1
  209. package/dist/types/src/meta.d.ts +0 -1
  210. package/dist/types/src/meta.d.ts.map +1 -1
  211. package/dist/types/src/translations.d.ts +1261 -67
  212. package/dist/types/src/translations.d.ts.map +1 -1
  213. package/dist/types/src/types/form.d.ts +24 -0
  214. package/dist/types/src/types/form.d.ts.map +1 -0
  215. package/dist/types/src/types/index.d.ts +1 -0
  216. package/dist/types/src/types/index.d.ts.map +1 -1
  217. package/dist/types/src/types/types.d.ts +94 -155
  218. package/dist/types/src/types/types.d.ts.map +1 -1
  219. package/dist/types/src/util.d.ts +25 -36
  220. package/dist/types/src/util.d.ts.map +1 -1
  221. package/dist/types/tsconfig.tsbuildinfo +1 -1
  222. package/package.json +72 -63
  223. package/src/SpacePlugin.ts +182 -222
  224. package/src/capabilities/app-graph-builder.ts +221 -237
  225. package/src/capabilities/app-graph-serializer.ts +12 -12
  226. package/src/capabilities/capabilities.ts +28 -17
  227. package/src/capabilities/identity-created.ts +3 -3
  228. package/src/capabilities/index.ts +1 -2
  229. package/src/capabilities/intent-resolver.ts +91 -79
  230. package/src/capabilities/react-root.tsx +6 -4
  231. package/src/capabilities/react-surface.tsx +108 -149
  232. package/src/capabilities/repair.ts +57 -0
  233. package/src/capabilities/spaces-ready.ts +23 -11
  234. package/src/capabilities/state.ts +5 -4
  235. package/src/components/AwaitingObject.tsx +12 -14
  236. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  237. package/src/components/CollectionSection.tsx +8 -6
  238. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
  239. package/src/components/CreateDialog/CreateObjectDialog.tsx +74 -46
  240. package/src/components/CreateDialog/CreateObjectPanel.tsx +51 -33
  241. package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
  242. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  243. package/src/components/JoinDialog/index.ts +5 -0
  244. package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
  245. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +22 -21
  246. package/src/components/MembersContainer/index.ts +5 -0
  247. package/src/components/MenuFooter.tsx +2 -2
  248. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
  249. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
  250. package/src/components/ObjectDetailsPanel/index.ts +7 -0
  251. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +10 -16
  252. package/src/components/ObjectRenamePopover/index.ts +5 -0
  253. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +7 -7
  254. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
  255. package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
  256. package/src/components/ObjectSettings/ForeignKeys.tsx +8 -8
  257. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
  258. package/src/components/ObjectSettings/index.ts +3 -1
  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 +68 -28
  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 +57 -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 +158 -0
  279. package/src/hooks/index.ts +1 -0
  280. package/src/hooks/useActiveSpace.ts +3 -2
  281. package/src/hooks/useInputSurfaceLookup.tsx +8 -3
  282. package/src/hooks/usePath.ts +1 -1
  283. package/src/hooks/useTypeOptions.ts +27 -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 +75 -0
  288. package/src/types/index.ts +1 -0
  289. package/src/types/types.ts +49 -50
  290. package/src/util.tsx +268 -145
  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-V3MP3CDK.mjs +0 -480
  295. package/dist/lib/browser/app-graph-builder-V3MP3CDK.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-FBJEXW54.mjs.map +0 -7
  302. package/dist/lib/browser/chunk-JS3MMC42.mjs +0 -19
  303. package/dist/lib/browser/chunk-JS3MMC42.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-QACNNDOT.mjs.map +0 -7
  305. package/dist/lib/browser/chunk-SGTQ52SU.mjs +0 -338
  306. package/dist/lib/browser/chunk-SGTQ52SU.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-XHGD73WZ.mjs.map +0 -7
  311. package/dist/lib/browser/react-root-CMWOGJG5.mjs +0 -29
  312. package/dist/lib/browser/react-root-CMWOGJG5.mjs.map +0 -7
  313. package/dist/lib/browser/react-surface-YWZZQF7H.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-SG4VECBB.mjs +0 -481
  324. package/dist/lib/node-esm/app-graph-builder-SG4VECBB.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-2A3VBXBP.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-4AOMYKDE.mjs.map +0 -7
  328. package/dist/lib/node-esm/chunk-5HHYE264.mjs +0 -20
  329. package/dist/lib/node-esm/chunk-5HHYE264.mjs.map +0 -7
  330. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs +0 -21
  331. package/dist/lib/node-esm/chunk-5T3ZH23B.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-LEANKSKZ.mjs.map +0 -7
  340. package/dist/lib/node-esm/react-root-5Y7LJRX6.mjs.map +0 -7
  341. package/dist/lib/node-esm/react-surface-YQFNIKYT.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/PersistenceStatus.d.ts +0 -6
  363. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  364. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  365. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  366. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  367. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  368. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  369. package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
  370. package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
  371. package/src/capabilities/schema-defs.ts +0 -30
  372. package/src/capabilities/schema-tool.test.ts +0 -44
  373. package/src/capabilities/schema-tools.ts +0 -125
  374. package/src/components/MembersContainer.stories.tsx +0 -30
  375. package/src/components/ObjectDetailsPanel.tsx +0 -77
  376. package/src/components/PersistenceStatus.tsx +0 -83
@@ -2,80 +2,71 @@
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';
14
+ import { type Space, SpaceState, getSpace, isLiveObject, isSpace, parseId, useSpace } from '@dxos/react-client/echo';
15
+ import { Input } from '@dxos/react-ui';
33
16
  import { type InputProps, SelectInput } 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, View, ViewAnnotation } from '@dxos/schema';
36
19
  import { type JoinPanelProps } from '@dxos/shell/react';
37
20
 
38
- import { SpaceCapabilities } from './capabilities';
21
+ // TODO(burdon): Component name standard: NounVerbComponent.
39
22
  import {
40
- CollectionMain,
41
- CollectionSection,
42
23
  CREATE_OBJECT_DIALOG,
43
24
  CREATE_SPACE_DIALOG,
25
+ CollectionArticle,
26
+ CollectionSection,
44
27
  CreateObjectDialog,
28
+ type CreateObjectDialogProps,
45
29
  CreateSpaceDialog,
46
30
  InlineSyncStatus,
47
31
  JOIN_DIALOG,
48
32
  JoinDialog,
49
33
  MembersContainer,
50
34
  MenuFooter,
35
+ OBJECT_RENAME_POPOVER,
51
36
  ObjectDetailsPanel,
37
+ ObjectRenamePopover,
52
38
  ObjectSettingsContainer,
53
- POPOVER_RENAME_OBJECT,
54
- POPOVER_RENAME_SPACE,
55
- PopoverRenameObject,
56
- PopoverRenameSpace,
39
+ RecordArticle,
40
+ SPACE_RENAME_POPOVER,
57
41
  SchemaContainer,
58
42
  SmallPresenceLive,
59
43
  SpacePluginSettings,
60
44
  SpacePresence,
45
+ SpaceRenamePopover,
61
46
  SpaceSettingsContainer,
62
47
  SyncStatus,
63
48
  ViewEditor,
64
- type CreateObjectDialogProps,
65
49
  } from '../components';
66
- import { SPACE_PLUGIN } from '../meta';
67
- import { HueAnnotationId, IconAnnotationId, type SpaceSettingsProps } from '../types';
50
+ import { useTypeOptions } from '../hooks';
51
+ import { meta } from '../meta';
52
+ import {
53
+ HueAnnotationId,
54
+ IconAnnotationId,
55
+ type SpaceSettingsProps,
56
+ type TypeInputOptions,
57
+ TypeInputOptionsAnnotationId,
58
+ } from '../types';
59
+
60
+ import { SpaceCapabilities } from './capabilities';
68
61
 
69
62
  type ReactSurfaceOptions = {
70
63
  createInvitationUrl: (invitationCode: string) => string;
71
64
  };
72
65
 
73
- const OMIT = [DataType.Collection.typename, DataType.QueryCollection.typename];
74
-
75
66
  export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
76
67
  contributes(Capabilities.ReactSurface, [
77
68
  createSurface({
78
- id: `${SPACE_PLUGIN}/article`,
69
+ id: `${meta.id}/article`,
79
70
  role: 'article',
80
71
  filter: (data): data is { subject: Space } =>
81
72
  // TODO(wittjosiah): Need to avoid shotgun parsing space state everywhere.
@@ -84,7 +75,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
84
75
  <Surface
85
76
  data={{
86
77
  id: data.subject.id,
87
- subject: data.subject.properties[DataType.Collection.typename]?.target,
78
+ subject: data.subject.properties[Collection.Collection.typename]?.target,
88
79
  }}
89
80
  role={role}
90
81
  {...rest}
@@ -92,29 +83,36 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
92
83
  ),
93
84
  }),
94
85
  createSurface({
95
- id: `${SPACE_PLUGIN}/collection-fallback`,
86
+ id: `${meta.id}/record-article`,
96
87
  role: 'article',
97
88
  position: 'fallback',
98
- filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
99
- component: ({ data }) => <CollectionMain collection={data.subject} />,
89
+ filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
90
+ component: ({ data }) => <RecordArticle subject={data.subject} />,
100
91
  }),
101
92
  createSurface({
102
- id: `${SPACE_PLUGIN}/plugin-settings`,
93
+ id: `${meta.id}/collection-fallback`,
94
+ role: 'article',
95
+ position: 'fallback',
96
+ filter: (data): data is { subject: Collection.Collection } => Obj.instanceOf(Collection.Collection, data.subject),
97
+ component: ({ data }) => <CollectionArticle subject={data.subject} />,
98
+ }),
99
+ createSurface({
100
+ id: `${meta.id}/plugin-settings`,
103
101
  role: 'article',
104
102
  filter: (data): data is { subject: SettingsStore<SpaceSettingsProps> } =>
105
- data.subject instanceof SettingsStore && data.subject.prefix === SPACE_PLUGIN,
103
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
106
104
  component: ({ data: { subject } }) => <SpacePluginSettings settings={subject.value} />,
107
105
  }),
108
106
  createSurface({
109
- id: `${SPACE_PLUGIN}/companion/object-settings`,
107
+ id: `${meta.id}/companion/object-settings`,
110
108
  role: 'article',
111
109
  filter: (data): data is { companionTo: Obj.Any } => Obj.isObject(data.companionTo) && data.subject === 'settings',
112
110
  component: ({ data, role }) => <ObjectSettingsContainer object={data.companionTo} role={role} />,
113
111
  }),
114
112
  createSurface({
115
- id: `${SPACE_PLUGIN}/space-settings-properties`,
113
+ id: `${meta.id}/space-settings-properties`,
116
114
  role: 'article',
117
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/properties`,
115
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/properties`,
118
116
  component: () => {
119
117
  const layout = useLayout();
120
118
  const { spaceId } = parseId(layout.workspace);
@@ -127,10 +125,10 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
127
125
  },
128
126
  }),
129
127
  createSurface({
130
- id: `${SPACE_PLUGIN}/space-settings-members`,
128
+ id: `${meta.id}/space-settings-members`,
131
129
  role: 'article',
132
130
  position: 'hoist',
133
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/members`,
131
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/members`,
134
132
  component: () => {
135
133
  const layout = useLayout();
136
134
  const { spaceId } = parseId(layout.workspace);
@@ -143,9 +141,9 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
143
141
  },
144
142
  }),
145
143
  createSurface({
146
- id: `${SPACE_PLUGIN}/space-settings-schema`,
144
+ id: `${meta.id}/space-settings-schema`,
147
145
  role: 'article',
148
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/schema`,
146
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/schema`,
149
147
  component: () => {
150
148
  const layout = useLayout();
151
149
  const { spaceId } = parseId(layout.workspace);
@@ -158,14 +156,14 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
158
156
  },
159
157
  }),
160
158
  createSurface({
161
- id: `${SPACE_PLUGIN}/selected-objects`,
159
+ id: `${meta.id}/selected-objects`,
162
160
  role: 'article',
163
- filter: (data): data is { companionTo: DataType.View; subject: 'selected-objects' } =>
164
- Obj.instanceOf(DataType.View, data.companionTo) && data.subject === 'selected-objects',
161
+ filter: (data): data is { companionTo: View.View; subject: 'selected-objects' } =>
162
+ Obj.instanceOf(View.View, data.companionTo) && data.subject === 'selected-objects',
165
163
  component: ({ data }) => (
166
164
  <ObjectDetailsPanel
167
- key={fullyQualifiedId(data.companionTo)}
168
- objectId={fullyQualifiedId(data.companionTo)}
165
+ key={Obj.getDXN(data.companionTo).toString()}
166
+ objectId={Obj.getDXN(data.companionTo).toString()}
169
167
  view={data.companionTo}
170
168
  />
171
169
  ),
@@ -189,154 +187,115 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
189
187
  component: ({ data }) => <CreateObjectDialog {...data.props} />,
190
188
  }),
191
189
  createSurface({
192
- id: `${SPACE_PLUGIN}/create-initial-space-form-[hue]`,
190
+ id: `${meta.id}/create-initial-space-form-[hue]`,
193
191
  role: 'form-input',
194
192
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
195
193
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, HueAnnotationId);
196
194
  return !!annotation;
197
195
  },
198
196
  component: ({ data: _, ...inputProps }) => {
199
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
197
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as InputProps;
200
198
  const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange]);
201
199
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
202
200
  return (
203
201
  <Input.Root>
204
202
  <Input.Label>{label}</Input.Label>
205
- <HuePicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
203
+ <HuePicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
206
204
  </Input.Root>
207
205
  );
208
206
  },
209
207
  }),
210
208
  createSurface({
211
- id: `${SPACE_PLUGIN}/create-initial-space-form-[icon]`,
209
+ id: `${meta.id}/create-initial-space-form-[icon]`,
212
210
  role: 'form-input',
213
211
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
214
212
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, IconAnnotationId);
215
213
  return !!annotation;
216
214
  },
217
215
  component: ({ data: _, ...inputProps }) => {
218
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
216
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as InputProps;
219
217
  const handleChange = useCallback((nextIcon: string) => onValueChange(type, nextIcon), [onValueChange]);
220
218
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
221
219
  return (
222
220
  <Input.Root>
223
221
  <Input.Label>{label}</Input.Label>
224
- <IconPicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
222
+ <IconPicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
225
223
  </Input.Root>
226
224
  );
227
225
  },
228
226
  }),
229
227
  createSurface({
230
- id: `${SPACE_PLUGIN}/typename-form-input`,
228
+ id: `${meta.id}/typename-form-input`,
231
229
  role: 'form-input',
232
230
  filter: (
233
231
  data,
234
- ): data is { prop: string; schema: Schema.Schema<any>; target: Space | DataType.Collection | undefined } => {
232
+ ): data is {
233
+ prop: string;
234
+ schema: Schema.Schema.Any;
235
+ target: Space | Collection.Collection | undefined;
236
+ } => {
235
237
  if (data.prop !== 'typename') {
236
238
  return false;
237
239
  }
238
240
 
239
- const annotation = findAnnotation((data.schema as Schema.Schema.All).ast, TypenameAnnotationId);
241
+ // TODO(wittjosiah): This doesn't work here.
242
+ // const annotation = TypeInputOptionsAnnotation.get(data.schema as Schema.Schema.Any);
243
+ const annotation = findAnnotation((data.schema as Schema.Schema.All).ast, TypeInputOptionsAnnotationId);
240
244
  return !!annotation;
241
245
  },
242
246
  component: ({ data: { schema, target }, ...inputProps }) => {
243
- const { t } = useTranslation();
244
- const client = useClient();
245
247
  const props = inputProps as any as InputProps;
246
248
  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 usedStatic =
279
- annotation.includes('used-static') &&
280
- whitelistedTypenames.has(Type.getTypename(schema)) &&
281
- space.properties.staticRecords?.includes(Type.getTypename(schema));
282
- const objectForm = annotation.includes('object-form') && objectFormTypenames.has(Type.getTypename(schema));
283
- return annotation.includes('static') || limitedStatic || unusedStatic || usedStatic || objectForm;
284
- });
285
- const dynamic = space?.db.schemaRegistry.query().runSync();
286
- const typenames = Array.from(
287
- new Set<string>([
288
- ...(annotation.includes('limited-static') ||
289
- annotation.includes('unused-static') ||
290
- annotation.includes('used-static') ||
291
- annotation.includes('static') ||
292
- annotation.includes('object-form')
293
- ? fixed.map((schema) => Type.getTypename(schema))
294
- : []),
295
- ...(annotation.includes('dynamic') ? dynamic.map((schema) => schema.typename) : []),
296
- ]),
297
- ).sort();
298
-
299
- const options = useMemo(
300
- () =>
301
- typenames
302
- .map((typename) => ({
303
- value: typename,
304
- label: t('typename label', { ns: typename, defaultValue: typename }),
305
- }))
306
- .toSorted((a, b) => a.label.localeCompare(b.label)),
307
- [t, typenames],
308
- );
249
+ const annotation = findAnnotation<TypeInputOptions>(schema.ast, TypeInputOptionsAnnotationId)!;
250
+ const options = useTypeOptions({ space, annotation });
309
251
 
310
252
  return <SelectInput {...props} options={options} />;
311
253
  },
312
254
  }),
313
255
  createSurface({
314
- id: `${SPACE_PLUGIN}/object-settings`,
256
+ id: `${meta.id}/object-settings`,
315
257
  role: 'object-settings',
316
- filter: (data): data is { subject: DataType.View } => Obj.instanceOf(DataType.View, data.subject),
317
- component: ({ data }) => <ViewEditor view={data.subject} />,
258
+ filter: (data): data is { subject: { view: Ref.Ref<View.View> } } => {
259
+ if (!Obj.isObject(data.subject)) {
260
+ return false;
261
+ }
262
+
263
+ const schema = Obj.getSchema(data.subject);
264
+ return Option.fromNullable(schema).pipe(
265
+ Option.flatMap((schema) => ViewAnnotation.get(schema)),
266
+ Option.getOrElse(() => false),
267
+ );
268
+ },
269
+ component: ({ data }) => {
270
+ const view = data.subject.view.target;
271
+ if (!view) {
272
+ return null;
273
+ }
274
+
275
+ return <ViewEditor view={view} />;
276
+ },
318
277
  }),
319
278
  createSurface({
320
- id: POPOVER_RENAME_SPACE,
279
+ id: SPACE_RENAME_POPOVER,
321
280
  role: 'card--popover',
322
- filter: (data): data is { props: Space } => data.component === POPOVER_RENAME_SPACE && isSpace(data.props),
323
- component: ({ data }) => <PopoverRenameSpace space={data.props} />,
281
+ filter: (data): data is { props: Space } => data.component === SPACE_RENAME_POPOVER && isSpace(data.props),
282
+ component: ({ data }) => <SpaceRenamePopover space={data.props} />,
324
283
  }),
325
284
  createSurface({
326
- id: POPOVER_RENAME_OBJECT,
285
+ id: OBJECT_RENAME_POPOVER,
327
286
  role: 'card--popover',
328
287
  filter: (data): data is { props: Obj.Any } =>
329
- data.component === POPOVER_RENAME_OBJECT && isLiveObject(data.props),
330
- component: ({ data }) => <PopoverRenameObject object={data.props} />,
288
+ data.component === OBJECT_RENAME_POPOVER && isLiveObject(data.props),
289
+ component: ({ data }) => <ObjectRenamePopover object={data.props} />,
331
290
  }),
332
291
  createSurface({
333
- id: `${SPACE_PLUGIN}/menu-footer`,
292
+ id: `${meta.id}/menu-footer`,
334
293
  role: 'menu-footer',
335
294
  filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
336
295
  component: ({ data }) => <MenuFooter object={data.subject} />,
337
296
  }),
338
297
  createSurface({
339
- id: `${SPACE_PLUGIN}/navtree-presence`,
298
+ id: `${meta.id}/navtree-presence`,
340
299
  role: 'navtree-item-end',
341
300
  filter: (data): data is { id: string; subject: Obj.Any; open?: boolean } =>
342
301
  typeof data.id === 'string' && Obj.isObject(data.subject),
@@ -348,7 +307,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
348
307
  }),
349
308
  // TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
350
309
  createSurface({
351
- id: `${SPACE_PLUGIN}/navtree-presence-fallback`,
310
+ id: `${meta.id}/navtree-presence-fallback`,
352
311
  role: 'navtree-item-end',
353
312
  position: 'fallback',
354
313
  filter: (data): data is { id: string; open?: boolean } => typeof data.id === 'string',
@@ -356,13 +315,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
356
315
  }),
357
316
  // TODO(wittjosiah): Broken?
358
317
  createSurface({
359
- id: `${SPACE_PLUGIN}/navtree-sync-status`,
318
+ id: `${meta.id}/navtree-sync-status`,
360
319
  role: 'navtree-item-end',
361
320
  filter: (data): data is { subject: Space; open?: boolean } => isSpace(data.subject),
362
321
  component: ({ data }) => <InlineSyncStatus space={data.subject} open={data.open} />,
363
322
  }),
364
323
  createSurface({
365
- id: `${SPACE_PLUGIN}/navbar-presence`,
324
+ id: `${meta.id}/navbar-presence`,
366
325
  role: 'navbar-end',
367
326
  position: 'hoist',
368
327
  filter: (data): data is { subject: Space | Obj.Any } => isSpace(data.subject) || Obj.isObject(data.subject),
@@ -370,7 +329,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
370
329
  const space = isSpace(data.subject) ? data.subject : getSpace(data.subject);
371
330
  const object = isSpace(data.subject)
372
331
  ? data.subject.state.get() === SpaceState.SPACE_READY
373
- ? (space?.properties[DataType.Collection.typename]?.target as DataType.Collection)
332
+ ? (space?.properties[Collection.Collection.typename]?.target as Collection.Collection)
374
333
  : undefined
375
334
  : data.subject;
376
335
 
@@ -378,13 +337,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
378
337
  },
379
338
  }),
380
339
  createSurface({
381
- id: `${SPACE_PLUGIN}/collection-section`,
340
+ id: `${meta.id}/collection-section`,
382
341
  role: 'section',
383
- filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
384
- component: ({ data }) => <CollectionSection collection={data.subject} />,
342
+ filter: (data): data is { subject: Collection.Collection } => Obj.instanceOf(Collection.Collection, data.subject),
343
+ component: ({ data }) => <CollectionSection subject={data.subject} />,
385
344
  }),
386
345
  createSurface({
387
- id: `${SPACE_PLUGIN}/status`,
346
+ id: `${meta.id}/status`,
388
347
  role: 'status',
389
348
  component: () => <SyncStatus />,
390
349
  }),
@@ -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();
@@ -66,12 +70,14 @@ export default async (context: PluginContext) => {
66
70
  return;
67
71
  }
68
72
 
69
- const node = graph.getNode(active[0]).pipe(Option.getOrNull);
70
- if (!node && active[0].length === FQ_ID_LENGTH) {
73
+ const id = active[0];
74
+ const node = graph.getNode(id).pipe(Option.getOrNull);
75
+ if (!node && id.length === ECHO_DXN_LENGTH) {
76
+ void graph.initialize(id);
71
77
  const timeout = setTimeout(async () => {
72
- const node = graph.getNode(active[0]).pipe(Option.getOrNull);
78
+ const node = graph.getNode(id).pipe(Option.getOrNull);
73
79
  if (!node) {
74
- await dispatch(createIntent(SpaceAction.WaitForObject, { id: active[0] }));
80
+ await dispatch(createIntent(SpaceAction.WaitForObject, { id }));
75
81
  }
76
82
  }, WAIT_FOR_OBJECT_TIMEOUT);
77
83
 
@@ -95,7 +101,13 @@ export default async (context: PluginContext) => {
95
101
  subscriptions.add(
96
102
  scheduledEffect(
97
103
  () => ({ name: space.properties.name }),
98
- ({ name }) => (state.spaceNames[space.id] = name),
104
+ ({ name }) => {
105
+ if (!name) {
106
+ delete state.spaceNames[space.id];
107
+ } else {
108
+ state.spaceNames[space.id] = name;
109
+ }
110
+ },
99
111
  ),
100
112
  );
101
113
  });
@@ -114,7 +126,7 @@ export default async (context: PluginContext) => {
114
126
  // Group parts by space for efficient messaging.
115
127
  const idsBySpace = reduceGroupBy(active, (id) => {
116
128
  try {
117
- const [spaceId] = parseFullyQualifiedId(id);
129
+ const { spaceId } = parseId(id);
118
130
  return spaceId;
119
131
  } catch {
120
132
  return null;
@@ -123,7 +135,7 @@ export default async (context: PluginContext) => {
123
135
 
124
136
  const removedBySpace = reduceGroupBy(inactive, (id) => {
125
137
  try {
126
- const [spaceId] = parseFullyQualifiedId(id);
138
+ const { spaceId } = parseId(id);
127
139
  return spaceId;
128
140
  } catch {
129
141
  return null;
@@ -4,17 +4,18 @@
4
4
 
5
5
  import { effect } from '@preact/signals-core';
6
6
 
7
- import { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';
7
+ import { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { LocalStorageStore } from '@dxos/local-storage';
10
10
  import { ComplexMap } from '@dxos/util';
11
11
 
12
- import { SpaceCapabilities } from './capabilities';
13
- import { SPACE_PLUGIN } from '../meta';
12
+ import { meta } from '../meta';
14
13
  import { type PluginState } from '../types';
15
14
 
15
+ import { SpaceCapabilities } from './capabilities';
16
+
16
17
  export default (context: PluginContext) => {
17
- const state = new LocalStorageStore<PluginState>(SPACE_PLUGIN, {
18
+ const state = new LocalStorageStore<PluginState>(meta.id, {
18
19
  awaiting: undefined,
19
20
  spaceNames: {},
20
21
  viewersByObject: {},