@dxos/plugin-space 0.8.0 → 0.8.1-main.013e445

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 (212) hide show
  1. package/dist/lib/browser/{app-graph-builder-MGK5HWPZ.mjs → app-graph-builder-7NG7UNQD.mjs} +5 -5
  2. package/dist/lib/browser/{app-graph-serializer-FOWFLYGU.mjs → app-graph-serializer-OZNRXG62.mjs} +7 -7
  3. package/dist/lib/browser/{app-graph-serializer-FOWFLYGU.mjs.map → app-graph-serializer-OZNRXG62.mjs.map} +2 -2
  4. package/dist/lib/browser/{chunk-23RVI5FZ.mjs → chunk-KV4JWY3Z.mjs} +9 -8
  5. package/dist/lib/browser/{chunk-23RVI5FZ.mjs.map → chunk-KV4JWY3Z.mjs.map} +3 -3
  6. package/dist/lib/browser/{chunk-NU7WDVGN.mjs → chunk-O7LODPTY.mjs} +2 -2
  7. package/dist/lib/browser/{chunk-PCEP3KQY.mjs → chunk-PE2T7DOU.mjs} +22 -21
  8. package/dist/lib/browser/chunk-PE2T7DOU.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-PQXZCNAU.mjs → chunk-PTKYMZWO.mjs} +1 -1
  10. package/dist/lib/browser/chunk-PTKYMZWO.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-ULA2UQJ4.mjs → chunk-TYU27VTL.mjs} +6 -62
  12. package/dist/lib/browser/chunk-TYU27VTL.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-UDWHTKB5.mjs → chunk-VIU4XFXR.mjs} +6 -8
  14. package/dist/lib/browser/chunk-VIU4XFXR.mjs.map +7 -0
  15. package/dist/lib/browser/{identity-created-FYGS6TBH.mjs → identity-created-TG52G7RV.mjs} +3 -3
  16. package/dist/lib/browser/index.mjs +13 -13
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/{intent-resolver-GPNAQ2SG.mjs → intent-resolver-XAEHWUHJ.mjs} +11 -9
  19. package/dist/lib/browser/{intent-resolver-GPNAQ2SG.mjs.map → intent-resolver-XAEHWUHJ.mjs.map} +3 -3
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-root-4CCSD7TZ.mjs → react-root-H5WH6EUY.mjs} +6 -6
  22. package/dist/lib/browser/{react-surface-FKMRI3WV.mjs → react-surface-523S3CFL.mjs} +9 -8
  23. package/dist/lib/browser/react-surface-523S3CFL.mjs.map +7 -0
  24. package/dist/lib/browser/{schema-5W3DSY2E.mjs → schema-UOCBWGA4.mjs} +3 -3
  25. package/dist/lib/browser/schema-tools-6J5ZEDBC.mjs +123 -0
  26. package/dist/lib/browser/schema-tools-6J5ZEDBC.mjs.map +7 -0
  27. package/dist/lib/browser/{settings-PHPCXX33.mjs → settings-XCHJUNYL.mjs} +3 -3
  28. package/dist/lib/browser/{spaces-ready-K47RR7N2.mjs → spaces-ready-VVPJN6TU.mjs} +5 -5
  29. package/dist/lib/browser/{state-INJ63O57.mjs → state-BUM7SQUV.mjs} +3 -3
  30. package/dist/lib/browser/types/index.mjs +2 -10
  31. package/dist/lib/node/{app-graph-builder-ZIUBXRPA.cjs → app-graph-builder-G3O5GZMQ.cjs} +45 -45
  32. package/dist/lib/node/{app-graph-serializer-VQOGHKXL.cjs → app-graph-serializer-774VMAFT.cjs} +21 -21
  33. package/dist/lib/node/{app-graph-serializer-VQOGHKXL.cjs.map → app-graph-serializer-774VMAFT.cjs.map} +2 -2
  34. package/dist/lib/node/{chunk-WAJKBO3J.cjs → chunk-37QRDFMQ.cjs} +10 -70
  35. package/dist/lib/node/chunk-37QRDFMQ.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-U6DYXAR3.cjs → chunk-5MWD635N.cjs} +11 -13
  37. package/dist/lib/node/chunk-5MWD635N.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-WZR6OAN3.cjs → chunk-6P2DB4QQ.cjs} +4 -4
  39. package/dist/lib/node/{chunk-WZR6OAN3.cjs.map → chunk-6P2DB4QQ.cjs.map} +2 -2
  40. package/dist/lib/node/{chunk-OVGKWJOC.cjs → chunk-7BN5N2ND.cjs} +60 -59
  41. package/dist/lib/node/{chunk-OVGKWJOC.cjs.map → chunk-7BN5N2ND.cjs.map} +3 -3
  42. package/dist/lib/node/{chunk-QE4GVR6C.cjs → chunk-BN5K3SRF.cjs} +83 -80
  43. package/dist/lib/node/chunk-BN5K3SRF.cjs.map +7 -0
  44. package/dist/lib/node/{chunk-YZKNRFHU.cjs → chunk-GRM6AGWI.cjs} +10 -10
  45. package/dist/lib/node/{identity-created-AXI64BLE.cjs → identity-created-AQCHGXOF.cjs} +7 -7
  46. package/dist/lib/node/index.cjs +96 -97
  47. package/dist/lib/node/index.cjs.map +3 -3
  48. package/dist/lib/node/{intent-resolver-ICHHI6I6.cjs → intent-resolver-7DUDOPMC.cjs} +71 -69
  49. package/dist/lib/node/{intent-resolver-ICHHI6I6.cjs.map → intent-resolver-7DUDOPMC.cjs.map} +3 -3
  50. package/dist/lib/node/meta.json +1 -1
  51. package/dist/lib/node/{react-root-TCBTUOOJ.cjs → react-root-HCFNELCK.cjs} +12 -12
  52. package/dist/lib/node/{react-surface-JSCCIZS5.cjs → react-surface-VIGVLED7.cjs} +62 -61
  53. package/dist/lib/node/react-surface-VIGVLED7.cjs.map +7 -0
  54. package/dist/lib/node/{schema-YN7WVFRX.cjs → schema-EERAOETL.cjs} +7 -7
  55. package/dist/lib/node/schema-tools-OZS4OC6X.cjs +146 -0
  56. package/dist/lib/node/schema-tools-OZS4OC6X.cjs.map +7 -0
  57. package/dist/lib/node/{settings-5QYFWNH7.cjs → settings-VPFJWIWP.cjs} +8 -8
  58. package/dist/lib/node/{spaces-ready-FQNAKR7G.cjs → spaces-ready-BDKHLPYB.cjs} +14 -14
  59. package/dist/lib/node/{state-57UE3DYE.cjs → state-AIETH3DE.cjs} +8 -8
  60. package/dist/lib/node/types/index.cjs +13 -21
  61. package/dist/lib/node/types/index.cjs.map +2 -2
  62. package/dist/lib/node-esm/{app-graph-builder-TERVM2SL.mjs → app-graph-builder-LJAESOIB.mjs} +5 -5
  63. package/dist/lib/node-esm/{app-graph-serializer-GZRSWHEN.mjs → app-graph-serializer-YATEFHDI.mjs} +7 -7
  64. package/dist/lib/node-esm/{app-graph-serializer-GZRSWHEN.mjs.map → app-graph-serializer-YATEFHDI.mjs.map} +2 -2
  65. package/dist/lib/node-esm/{chunk-6RSVVEPS.mjs → chunk-AJ4IZAKT.mjs} +2 -2
  66. package/dist/lib/node-esm/{chunk-HJCEJNW3.mjs → chunk-G6EUAPVP.mjs} +22 -21
  67. package/dist/lib/node-esm/chunk-G6EUAPVP.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-TRNZQEEN.mjs → chunk-KNJZGST5.mjs} +6 -62
  69. package/dist/lib/node-esm/chunk-KNJZGST5.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs → chunk-MSWEFAPD.mjs} +1 -1
  71. package/dist/lib/node-esm/chunk-MSWEFAPD.mjs.map +7 -0
  72. package/dist/lib/node-esm/{chunk-2TQ2AJEZ.mjs → chunk-TTHJ55CE.mjs} +6 -8
  73. package/dist/lib/node-esm/chunk-TTHJ55CE.mjs.map +7 -0
  74. package/dist/lib/node-esm/{chunk-PGH5L7MV.mjs → chunk-XRC7NH6E.mjs} +9 -8
  75. package/dist/lib/node-esm/{chunk-PGH5L7MV.mjs.map → chunk-XRC7NH6E.mjs.map} +3 -3
  76. package/dist/lib/node-esm/{identity-created-3CGEXNPO.mjs → identity-created-CK3VMR6Q.mjs} +3 -3
  77. package/dist/lib/node-esm/index.mjs +13 -13
  78. package/dist/lib/node-esm/index.mjs.map +3 -3
  79. package/dist/lib/node-esm/{intent-resolver-VR42K5GE.mjs → intent-resolver-7MLSVU7R.mjs} +11 -9
  80. package/dist/lib/node-esm/{intent-resolver-VR42K5GE.mjs.map → intent-resolver-7MLSVU7R.mjs.map} +3 -3
  81. package/dist/lib/node-esm/meta.json +1 -1
  82. package/dist/lib/node-esm/{react-root-THJBSTQS.mjs → react-root-PLKZW44B.mjs} +6 -6
  83. package/dist/lib/node-esm/{react-surface-Z3BBQ5HX.mjs → react-surface-DTT3ZJVO.mjs} +9 -8
  84. package/dist/lib/node-esm/react-surface-DTT3ZJVO.mjs.map +7 -0
  85. package/dist/lib/node-esm/{schema-LOR2EVGY.mjs → schema-LOOOBN6J.mjs} +3 -3
  86. package/dist/lib/node-esm/schema-tools-KJVXGDBO.mjs +125 -0
  87. package/dist/lib/node-esm/schema-tools-KJVXGDBO.mjs.map +7 -0
  88. package/dist/lib/node-esm/{settings-H6MXTEQM.mjs → settings-2VSJTVUW.mjs} +3 -3
  89. package/dist/lib/node-esm/{spaces-ready-HKAQG5SA.mjs → spaces-ready-7ROQ7PRB.mjs} +5 -5
  90. package/dist/lib/node-esm/{state-VYA6OFHD.mjs → state-DWUAP6MH.mjs} +3 -3
  91. package/dist/lib/node-esm/types/index.mjs +2 -10
  92. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/index.d.ts +1 -0
  95. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/schema-tool.test.d.ts +2 -0
  99. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/schema-tools.d.ts +13 -0
  101. package/dist/types/src/capabilities/schema-tools.d.ts.map +1 -0
  102. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +2 -1
  103. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  104. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +2 -1
  105. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -1
  106. package/dist/types/src/components/AwaitingObject.d.ts +2 -1
  107. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  108. package/dist/types/src/components/BaseObjectSettings.d.ts +2 -1
  109. package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -1
  110. package/dist/types/src/components/CollectionMain.d.ts +2 -1
  111. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  112. package/dist/types/src/components/CollectionSection.d.ts +2 -1
  113. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  114. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -1
  115. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  116. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +2 -1
  117. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  118. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +2 -1
  119. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  120. package/dist/types/src/components/JoinDialog.d.ts +2 -1
  121. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  122. package/dist/types/src/components/MenuFooter.d.ts +2 -1
  123. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  124. package/dist/types/src/components/PersistenceStatus.d.ts +2 -1
  125. package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
  126. package/dist/types/src/components/PopoverAddSpace.d.ts +2 -1
  127. package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -1
  128. package/dist/types/src/components/PopoverRenameObject.d.ts +2 -1
  129. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  130. package/dist/types/src/components/PopoverRenameSpace.d.ts +2 -1
  131. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  132. package/dist/types/src/components/ShareSpaceButton.d.ts +3 -2
  133. package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
  134. package/dist/types/src/components/SpacePluginSettings.d.ts +2 -1
  135. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  136. package/dist/types/src/components/SpacePresence.d.ts +5 -4
  137. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  138. package/dist/types/src/components/SpacePresence.stories.d.ts +3 -2
  139. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +2 -1
  141. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
  142. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +2 -1
  143. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
  144. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts +2 -1
  145. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
  146. package/dist/types/src/components/SyncStatus/Space.d.ts +3 -2
  147. package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -1
  148. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +4 -3
  149. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  150. package/dist/types/src/meta.d.ts +2 -5
  151. package/dist/types/src/meta.d.ts.map +1 -1
  152. package/dist/types/src/translations.d.ts +5 -12
  153. package/dist/types/src/translations.d.ts.map +1 -1
  154. package/dist/types/src/types/thread.d.ts +177 -174
  155. package/dist/types/src/types/thread.d.ts.map +1 -1
  156. package/dist/types/src/types/types.d.ts +2 -0
  157. package/dist/types/src/types/types.d.ts.map +1 -1
  158. package/dist/types/src/util.d.ts.map +1 -1
  159. package/package.json +43 -41
  160. package/src/SpacePlugin.tsx +6 -1
  161. package/src/capabilities/app-graph-serializer.ts +2 -2
  162. package/src/capabilities/index.ts +1 -0
  163. package/src/capabilities/intent-resolver.ts +3 -1
  164. package/src/capabilities/react-surface.tsx +3 -2
  165. package/src/capabilities/schema-tool.test.ts +45 -0
  166. package/src/capabilities/schema-tools.ts +124 -0
  167. package/src/components/BaseObjectSettings.tsx +3 -1
  168. package/src/components/CreateDialog/CreateObjectDialog.tsx +3 -6
  169. package/src/components/PopoverRenameObject.tsx +1 -1
  170. package/src/meta.ts +2 -2
  171. package/src/translations.ts +2 -4
  172. package/src/types/thread.ts +2 -56
  173. package/src/types/types.ts +3 -0
  174. package/src/util.tsx +1 -2
  175. package/dist/lib/browser/chunk-PCEP3KQY.mjs.map +0 -7
  176. package/dist/lib/browser/chunk-PQXZCNAU.mjs.map +0 -7
  177. package/dist/lib/browser/chunk-UDWHTKB5.mjs.map +0 -7
  178. package/dist/lib/browser/chunk-ULA2UQJ4.mjs.map +0 -7
  179. package/dist/lib/browser/react-surface-FKMRI3WV.mjs.map +0 -7
  180. package/dist/lib/node/chunk-QE4GVR6C.cjs.map +0 -7
  181. package/dist/lib/node/chunk-U6DYXAR3.cjs.map +0 -7
  182. package/dist/lib/node/chunk-WAJKBO3J.cjs.map +0 -7
  183. package/dist/lib/node/react-surface-JSCCIZS5.cjs.map +0 -7
  184. package/dist/lib/node-esm/chunk-2TQ2AJEZ.mjs.map +0 -7
  185. package/dist/lib/node-esm/chunk-HJCEJNW3.mjs.map +0 -7
  186. package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs.map +0 -7
  187. package/dist/lib/node-esm/chunk-TRNZQEEN.mjs.map +0 -7
  188. package/dist/lib/node-esm/react-surface-Z3BBQ5HX.mjs.map +0 -7
  189. /package/dist/lib/browser/{app-graph-builder-MGK5HWPZ.mjs.map → app-graph-builder-7NG7UNQD.mjs.map} +0 -0
  190. /package/dist/lib/browser/{chunk-NU7WDVGN.mjs.map → chunk-O7LODPTY.mjs.map} +0 -0
  191. /package/dist/lib/browser/{identity-created-FYGS6TBH.mjs.map → identity-created-TG52G7RV.mjs.map} +0 -0
  192. /package/dist/lib/browser/{react-root-4CCSD7TZ.mjs.map → react-root-H5WH6EUY.mjs.map} +0 -0
  193. /package/dist/lib/browser/{schema-5W3DSY2E.mjs.map → schema-UOCBWGA4.mjs.map} +0 -0
  194. /package/dist/lib/browser/{settings-PHPCXX33.mjs.map → settings-XCHJUNYL.mjs.map} +0 -0
  195. /package/dist/lib/browser/{spaces-ready-K47RR7N2.mjs.map → spaces-ready-VVPJN6TU.mjs.map} +0 -0
  196. /package/dist/lib/browser/{state-INJ63O57.mjs.map → state-BUM7SQUV.mjs.map} +0 -0
  197. /package/dist/lib/node/{app-graph-builder-ZIUBXRPA.cjs.map → app-graph-builder-G3O5GZMQ.cjs.map} +0 -0
  198. /package/dist/lib/node/{chunk-YZKNRFHU.cjs.map → chunk-GRM6AGWI.cjs.map} +0 -0
  199. /package/dist/lib/node/{identity-created-AXI64BLE.cjs.map → identity-created-AQCHGXOF.cjs.map} +0 -0
  200. /package/dist/lib/node/{react-root-TCBTUOOJ.cjs.map → react-root-HCFNELCK.cjs.map} +0 -0
  201. /package/dist/lib/node/{schema-YN7WVFRX.cjs.map → schema-EERAOETL.cjs.map} +0 -0
  202. /package/dist/lib/node/{settings-5QYFWNH7.cjs.map → settings-VPFJWIWP.cjs.map} +0 -0
  203. /package/dist/lib/node/{spaces-ready-FQNAKR7G.cjs.map → spaces-ready-BDKHLPYB.cjs.map} +0 -0
  204. /package/dist/lib/node/{state-57UE3DYE.cjs.map → state-AIETH3DE.cjs.map} +0 -0
  205. /package/dist/lib/node-esm/{app-graph-builder-TERVM2SL.mjs.map → app-graph-builder-LJAESOIB.mjs.map} +0 -0
  206. /package/dist/lib/node-esm/{chunk-6RSVVEPS.mjs.map → chunk-AJ4IZAKT.mjs.map} +0 -0
  207. /package/dist/lib/node-esm/{identity-created-3CGEXNPO.mjs.map → identity-created-CK3VMR6Q.mjs.map} +0 -0
  208. /package/dist/lib/node-esm/{react-root-THJBSTQS.mjs.map → react-root-PLKZW44B.mjs.map} +0 -0
  209. /package/dist/lib/node-esm/{schema-LOR2EVGY.mjs.map → schema-LOOOBN6J.mjs.map} +0 -0
  210. /package/dist/lib/node-esm/{settings-H6MXTEQM.mjs.map → settings-2VSJTVUW.mjs.map} +0 -0
  211. /package/dist/lib/node-esm/{spaces-ready-HKAQG5SA.mjs.map → spaces-ready-7ROQ7PRB.mjs.map} +0 -0
  212. /package/dist/lib/node-esm/{state-VYA6OFHD.mjs.map → state-DWUAP6MH.mjs.map} +0 -0
@@ -318,7 +318,7 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
318
318
  }),
319
319
  createResolver({
320
320
  intent: SpaceAction.AddObject,
321
- resolve: async ({ target, object }) => {
321
+ resolve: async ({ target, object, hidden }) => {
322
322
  const space = isSpace(target) ? target : getSpace(target);
323
323
  invariant(space, 'Space not found.');
324
324
 
@@ -356,6 +356,8 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
356
356
 
357
357
  if (target instanceof CollectionType) {
358
358
  target.objects.push(makeRef(object as HasId));
359
+ } else if (isSpace(target) && hidden) {
360
+ space.db.add(object);
359
361
  } else if (isSpace(target)) {
360
362
  const collection = space.properties[CollectionType.typename]?.target;
361
363
  if (collection instanceof CollectionType) {
@@ -5,6 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Capabilities, contributes, createSurface, Surface, useCapability } from '@dxos/app-framework';
8
+ import { isInstanceOf } from '@dxos/echo-schema';
8
9
  import { SettingsStore } from '@dxos/local-storage';
9
10
  import {
10
11
  getSpace,
@@ -74,7 +75,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
74
75
  id: `${SPACE_PLUGIN}/collection-fallback`,
75
76
  role: 'article',
76
77
  position: 'fallback',
77
- filter: (data): data is { subject: CollectionType } => data.subject instanceof CollectionType,
78
+ filter: (data): data is { subject: CollectionType } => isInstanceOf(CollectionType, data.subject),
78
79
  component: ({ data }) => <CollectionMain collection={data.subject} />,
79
80
  }),
80
81
  createSurface({
@@ -186,7 +187,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
186
187
  createSurface({
187
188
  id: `${SPACE_PLUGIN}/collection-section`,
188
189
  role: 'section',
189
- filter: (data): data is { subject: CollectionType } => data.subject instanceof CollectionType,
190
+ filter: (data): data is { subject: CollectionType } => isInstanceOf(CollectionType, data.subject),
190
191
  component: ({ data }) => <CollectionSection collection={data.subject} />,
191
192
  }),
192
193
  createSurface({
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, it, expect } from 'vitest';
6
+
7
+ import { S } from '@dxos/echo-schema';
8
+
9
+ import { TypeNameSchema } from './schema-tools';
10
+
11
+ describe('TypeNameSchema format', () => {
12
+ const valid = [
13
+ 'example.com/usCities',
14
+ 'dxos.org/Contact',
15
+ 'dxos.org/Table',
16
+ 'dxos.org/Table/Contact',
17
+ 'dxos.org/PluginName/TypeName',
18
+ // Case variations
19
+ 'DXOS.org/Table',
20
+ 'dxos.ORG/table',
21
+ ];
22
+
23
+ const invalid = [
24
+ 'http://dxos.org/Table', // No protocol allowed
25
+ 'dxos.org/', // Must have type path
26
+ // TODO(dmaretskyi): Decide if we want to ban numbers.
27
+ // 'dxos.org/1Type', // Path segments must start with letter
28
+ 'dxos.org/Type!', // Invalid character
29
+ '.org/Type', // Must have domain
30
+ ];
31
+
32
+ const validate = S.validateSync(TypeNameSchema);
33
+
34
+ valid.forEach((typename) => {
35
+ it(`should accept valid typename: ${typename}`, () => {
36
+ expect(() => validate(typename)).not.toThrow();
37
+ });
38
+ });
39
+
40
+ invalid.forEach((typename) => {
41
+ it(`should reject invalid typename: ${typename}`, () => {
42
+ expect(() => validate(typename)).toThrow();
43
+ });
44
+ });
45
+ });
@@ -0,0 +1,124 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { DescriptionAnnotationId, ExamplesAnnotationId, TitleAnnotationId } from 'effect/SchemaAST';
6
+
7
+ import { Capabilities, contributes, type PromiseIntentDispatcher } from '@dxos/app-framework';
8
+ import { defineTool, ToolResult } from '@dxos/artifact';
9
+ import { type Space } from '@dxos/client/echo';
10
+ import { FormatEnum, FormatEnums, S, SelectOptionSchema, GeoPoint, toJsonSchema } from '@dxos/echo-schema';
11
+ import { invariant } from '@dxos/invariant';
12
+ import { hues } from '@dxos/react-ui-theme';
13
+ import { echoSchemaFromPropertyDefinitions } from '@dxos/schema';
14
+
15
+ // TODO(burdon): Factor out.
16
+ declare global {
17
+ interface ToolContextExtensions {
18
+ space?: Space;
19
+ dispatch?: PromiseIntentDispatcher;
20
+ }
21
+ }
22
+
23
+ // TODO(ZaymonFC): Move this somewhere common.
24
+ export const TypeNameSchema = S.String.pipe(
25
+ S.pattern(/^\w+\.\w{2,}\/[\w/]+$/i),
26
+ S.annotations({
27
+ [TitleAnnotationId]: 'TypeName',
28
+ [DescriptionAnnotationId]:
29
+ 'Domain-style type name path. Dashes are not allowed. Use camel case for the final component of the type name.',
30
+ [ExamplesAnnotationId]: ['example.com/type/Document', 'example.com/type/FlightList'],
31
+ }),
32
+ );
33
+
34
+ const formatDescription = `The format of the property. Additional information:
35
+ ${FormatEnum.GeoPoint}: ${JSON.stringify(toJsonSchema(GeoPoint))}
36
+ This tuple is GeoJSON. You must specify \`${FormatEnum.GeoPoint}\` as [Longitude, Latitude]`;
37
+
38
+ // TODO(ZaymonFC): All properties are default optional, but maybe we should allow for required properties.
39
+ const PropertyDefinitionSchema = S.Struct({
40
+ name: S.String.annotations({ [DescriptionAnnotationId]: 'The name of the property.' }),
41
+ format: S.Union(...FormatEnums.map((format) => S.Literal(format))).annotations({
42
+ [DescriptionAnnotationId]: formatDescription,
43
+ }),
44
+ config: S.optional(
45
+ S.Struct({
46
+ options: S.optional(
47
+ S.Array(SelectOptionSchema)
48
+ .annotations({
49
+ description: `Options for SingleSelect/MultiSelect formats. Available colors: ${hues.join(', ')}`,
50
+ })
51
+ .pipe(S.mutable),
52
+ ),
53
+ }),
54
+ ),
55
+ }).pipe(S.mutable);
56
+
57
+ const SYSTEM_NAMESPACE = 'dxos.org/echo/schema';
58
+
59
+ export default () =>
60
+ contributes(Capabilities.Tools, [
61
+ defineTool(SYSTEM_NAMESPACE, {
62
+ name: 'list',
63
+ description: 'List registered schemas in the space.',
64
+ caption: 'Listing registered schemas...',
65
+ schema: S.Struct({}),
66
+ execute: async (_input, { extensions }) => {
67
+ invariant(extensions?.space, 'No space.');
68
+ const space = extensions.space;
69
+
70
+ const schemas = await space.db.schemaRegistry.query({}).run();
71
+ return ToolResult.Success(
72
+ schemas.map((schema) => ({
73
+ typename: schema.typename,
74
+ version: schema.version,
75
+ })),
76
+ );
77
+ },
78
+ }),
79
+ defineTool(SYSTEM_NAMESPACE, {
80
+ name: 'get',
81
+ description: 'Get a specific schema by its typename.',
82
+ caption: 'Getting schema...',
83
+ schema: S.Struct({
84
+ typename: S.String.annotations({
85
+ description: 'The fully qualified typename of the schema.',
86
+ }),
87
+ }),
88
+ execute: async ({ typename }, { extensions }) => {
89
+ invariant(extensions?.space, 'No space.');
90
+ const space = extensions.space;
91
+
92
+ const schema = await space.db.schemaRegistry.query({ typename }).firstOrUndefined();
93
+ if (!schema) {
94
+ return ToolResult.Error(`Schema not found: ${typename}`);
95
+ }
96
+
97
+ return ToolResult.Success(schema);
98
+ },
99
+ }),
100
+ defineTool(SYSTEM_NAMESPACE, {
101
+ name: 'create',
102
+ description: 'Create a new schema with the provided definition.',
103
+ caption: 'Creating schema...',
104
+ schema: S.Struct({
105
+ typename: TypeNameSchema.annotations({
106
+ description:
107
+ 'The fully qualified schema typename. Must start with a domain, and then one or more path components (e.g., "example.com/type/TypeName").',
108
+ }),
109
+ properties: S.Array(PropertyDefinitionSchema).pipe(
110
+ S.annotations({ description: 'Array of property definitions for the schema.' }),
111
+ S.mutable,
112
+ ),
113
+ }),
114
+ execute: async ({ typename, properties }, { extensions }) => {
115
+ invariant(extensions?.space, 'No space.');
116
+ const space = extensions.space;
117
+
118
+ const schema = echoSchemaFromPropertyDefinitions(typename, properties);
119
+ const [registeredSchema] = await space.db.schemaRegistry.register([schema]);
120
+
121
+ return ToolResult.Success(registeredSchema);
122
+ },
123
+ }),
124
+ ]);
@@ -16,7 +16,9 @@ export type BaseObjectSettingsProps = {
16
16
  export const BaseObjectSettings = ({ object }: BaseObjectSettingsProps) => {
17
17
  const { t } = useTranslation(SPACE_PLUGIN);
18
18
  const inputRef = React.useRef<HTMLInputElement>(null);
19
- // TODO(burdon): Standardize forms.
19
+ // TODO(wittjosiah): This should be a form based on the schema of the object.
20
+ // The form should only include fields with a specific settings annotation.
21
+ // Perhaps also including the field of the title annotation as well.
20
22
  return (
21
23
  <div role='form' className='flex flex-col w-full p-2 gap-1'>
22
24
  <Input.Root>
@@ -22,7 +22,7 @@ import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
22
22
  import { CreateObjectPanel, type CreateObjectPanelProps } from './CreateObjectPanel';
23
23
  import { SpaceCapabilities } from '../../capabilities';
24
24
  import { SPACE_PLUGIN } from '../../meta';
25
- import { CollectionType, type ObjectForm, SpaceAction } from '../../types';
25
+ import { type ObjectForm, SpaceAction } from '../../types';
26
26
 
27
27
  export const CREATE_OBJECT_DIALOG = `${SPACE_PLUGIN}/CreateObjectDialog`;
28
28
 
@@ -53,16 +53,13 @@ export const CreateObjectDialog = ({
53
53
  const handleCreateObject = useCallback(
54
54
  async ({
55
55
  form,
56
- target: _target,
56
+ target,
57
57
  data = {},
58
58
  }: {
59
59
  form: ObjectForm;
60
60
  target: CreateObjectPanelProps['target'];
61
61
  data?: Record<string, any>;
62
62
  }) => {
63
- const target = isSpace(_target)
64
- ? (_target.properties[CollectionType.typename]?.target as CollectionType | undefined)
65
- : _target;
66
63
  if (!target) {
67
64
  // TODO(wittjosiah): UI feedback.
68
65
  return;
@@ -76,7 +73,7 @@ export const CreateObjectDialog = ({
76
73
  const result = await dispatch(form.getIntent(data, { space }));
77
74
  const object = result.data?.object;
78
75
  if (isReactiveObject(object)) {
79
- const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object });
76
+ const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object, hidden: form.hidden });
80
77
  const shouldNavigate = _shouldNavigate ?? (() => true);
81
78
  if (shouldNavigate(object)) {
82
79
  await dispatch(pipe(addObjectIntent, chain(LayoutAction.Open, { part: 'main' })));
@@ -38,7 +38,7 @@ export const PopoverRenameObject = ({ object: obj }: { object: ReactiveObject<an
38
38
  <Input.Root>
39
39
  <Input.Label srOnly>{t('object name label')}</Input.Label>
40
40
  <Input.TextInput
41
- placeholder={t('object title placeholder')}
41
+ placeholder={t('object placeholder')}
42
42
  value={name}
43
43
  data-testid='spacePlugin.renameObject.input'
44
44
  onChange={({ target: { value } }) => setName(value)}
package/src/meta.ts CHANGED
@@ -6,8 +6,8 @@ import { type PluginMeta } from '@dxos/app-framework';
6
6
 
7
7
  export const SPACE_PLUGIN = 'dxos.org/plugin/space';
8
8
 
9
- export const meta = {
9
+ export const meta: PluginMeta = {
10
10
  id: SPACE_PLUGIN,
11
11
  name: 'Spaces',
12
12
  icon: 'ph--planet--regular',
13
- } satisfies PluginMeta;
13
+ };
@@ -10,6 +10,7 @@ export default [
10
10
  'en-US': {
11
11
  [CollectionType.typename]: {
12
12
  'typename label': 'Collection',
13
+ 'object name placeholder': 'New collection',
13
14
  },
14
15
  [SPACE_PLUGIN]: {
15
16
  'plugin name': 'Spaces',
@@ -39,7 +40,7 @@ export default [
39
40
  'confirm restore title': 'Overwrite files in this space?',
40
41
  'confirm restore body': 'Restoring from a backup will overwrite the contents of any documents that match.',
41
42
  'upload file message': 'Drag file here or click to browse',
42
- 'object title placeholder': 'Type a title here…',
43
+ 'object placeholder': 'Type a title here…',
43
44
  'personal space label': 'Personal Space',
44
45
  'spaces label': 'Spaces',
45
46
  'show hidden spaces label': 'Show closed spaces',
@@ -64,9 +65,6 @@ export default [
64
65
  'missing object message': 'Object not available.',
65
66
  'missing object description':
66
67
  'The requested object has not been found yet. Ensure there are enough peers online in the space with an updated copy.',
67
- 'create collection label': 'Create collection',
68
- 'unnamed object label': 'New object',
69
- 'unnamed collection label': 'New collection',
70
68
  'create object in space label': 'Add to space',
71
69
  'create object in collection label': 'Add to collection',
72
70
  'share space label': 'Share',
@@ -2,66 +2,12 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Expando, Ref, S, TypedObject } from '@dxos/echo-schema';
5
+ import { Ref, S, TypedObject } from '@dxos/echo-schema';
6
+ import { MessageType } from '@dxos/schema';
6
7
 
7
8
  // TODO(wittjosiah): These types were placed here rather than in @dxos/plugin-thread
8
9
  // in order to avoid a circular dependency between threads and other objects that use threads.
9
10
 
10
- // TODO(wittjosiah): Factor out to halo?
11
- export class ContactType extends TypedObject({ typename: 'dxos.org/type/Contact', version: '0.1.0' })({
12
- name: S.optional(S.String),
13
- identifiers: S.mutable(
14
- S.Array(
15
- S.Struct({
16
- type: S.String,
17
- value: S.String,
18
- }),
19
- ),
20
- ),
21
- }) {}
22
-
23
- export const ActorSchema = S.mutable(
24
- S.Struct({
25
- contact: S.optional(Ref(ContactType)),
26
- // TODO(wittjosiah): Should the below fields just be the contact schema?
27
- // i.e. it should either be a reference to an existing contact or an inline contact schema.
28
- identityKey: S.optional(S.String),
29
- // TODO(burdon): Generalize to handle/identifier?
30
- email: S.optional(S.String),
31
- name: S.optional(S.String),
32
- }),
33
- );
34
-
35
- export type ActorType = S.Schema.Type<typeof ActorSchema>;
36
-
37
- export enum MessageState {
38
- NONE = 0,
39
- ARCHIVED = 1,
40
- DELETED = 2,
41
- SPAM = 3,
42
- }
43
-
44
- export class MessageType extends TypedObject({ typename: 'dxos.org/type/Message', version: '0.1.0' })({
45
- /** ISO date string when the message was sent. */
46
- timestamp: S.String,
47
- /** Message state. */
48
- state: S.optional(S.Enums(MessageState)),
49
- /** Identity of the message sender. */
50
- sender: ActorSchema,
51
- /** Text content of the message. */
52
- text: S.String,
53
- /** Non-text content sent with a message (e.g., files, polls, etc.) */
54
- parts: S.optional(S.mutable(S.Array(Ref(Expando)))),
55
- /** Custom properties for specific message types (e.g. email subject or cc fields). */
56
- properties: S.optional(S.mutable(S.Record({ key: S.String, value: S.Any }))),
57
- // TODO(wittjosiah): Add read status:
58
- // - Read receipts need to be per space member.
59
- // - Read receipts don't need to be added to schema until they being implemented.
60
- /** Context of the application when message was created. */
61
- // TODO(burdon): Evolve "attention object" to be current UX state? E.g., of Deck?
62
- context: S.optional(Ref(Expando)),
63
- }) {}
64
-
65
11
  export const ThreadStatus = S.Union(S.Literal('staged'), S.Literal('active'), S.Literal('resolved'));
66
12
 
67
13
  export class ThreadType extends TypedObject({ typename: 'dxos.org/type/Thread', version: '0.1.0' })({
@@ -94,8 +94,10 @@ export const SpaceForm = S.Struct({
94
94
  });
95
95
 
96
96
  export type ObjectForm<T extends BaseObject = BaseObject> = {
97
+ // TODO(dmaretskyi): Change to S.Schema.AnyNoContext
97
98
  objectSchema: TypedObject;
98
99
  formSchema?: S.Schema<T, any>;
100
+ hidden?: boolean;
99
101
  getIntent: (props: T, options: { space: Space }) => AnyIntentChain;
100
102
  };
101
103
 
@@ -206,6 +208,7 @@ export namespace SpaceAction {
206
208
  input: S.Struct({
207
209
  object: ReactiveObjectSchema,
208
210
  target: S.Union(SpaceSchema, CollectionType),
211
+ hidden: S.optional(S.Boolean),
209
212
  }),
210
213
  output: S.Struct({
211
214
  id: S.String,
package/src/util.tsx CHANGED
@@ -399,8 +399,7 @@ export const createObjectNode = ({
399
399
  properties: {
400
400
  ...partials,
401
401
  label: metadata.label?.(object) ||
402
- object.name ||
403
- metadata.placeholder || ['unnamed object label', { ns: SPACE_PLUGIN }],
402
+ object.name || ['object name placeholder', { ns: type, default: 'New object' }],
404
403
  icon: metadata.icon ?? 'ph--placeholder--regular',
405
404
  testId: 'spacePlugin.object',
406
405
  persistenceClass: 'echo',