@dxos/plugin-space 0.8.1-main.ae460ac → 0.8.1-staging.391c573

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 (102) hide show
  1. package/dist/lib/browser/{chunk-PCEP3KQY.mjs → chunk-OWVFWTX4.mjs} +6 -4
  2. package/dist/lib/browser/chunk-OWVFWTX4.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +8 -2
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/{intent-resolver-GPNAQ2SG.mjs → intent-resolver-7PY5WDYC.mjs} +2 -2
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/{react-root-4CCSD7TZ.mjs → react-root-EP4XP4IK.mjs} +2 -2
  8. package/dist/lib/browser/{react-surface-FKMRI3WV.mjs → react-surface-VNNI5POA.mjs} +2 -2
  9. package/dist/lib/browser/schema-tools-6J5ZEDBC.mjs +123 -0
  10. package/dist/lib/browser/schema-tools-6J5ZEDBC.mjs.map +7 -0
  11. package/dist/lib/node/{chunk-QE4GVR6C.cjs → chunk-53J7HLYX.cjs} +12 -9
  12. package/dist/lib/node/chunk-53J7HLYX.cjs.map +7 -0
  13. package/dist/lib/node/index.cjs +49 -44
  14. package/dist/lib/node/index.cjs.map +3 -3
  15. package/dist/lib/node/{intent-resolver-ICHHI6I6.cjs → intent-resolver-QEIKJ5FR.cjs} +13 -13
  16. package/dist/lib/node/meta.json +1 -1
  17. package/dist/lib/node/{react-root-TCBTUOOJ.cjs → react-root-OW5NTN2U.cjs} +6 -6
  18. package/dist/lib/node/{react-surface-JSCCIZS5.cjs → react-surface-JTIQUBHB.cjs} +38 -38
  19. package/dist/lib/node/schema-tools-OZS4OC6X.cjs +146 -0
  20. package/dist/lib/node/schema-tools-OZS4OC6X.cjs.map +7 -0
  21. package/dist/lib/node-esm/{chunk-HJCEJNW3.mjs → chunk-FDVNOFE3.mjs} +6 -4
  22. package/dist/lib/node-esm/chunk-FDVNOFE3.mjs.map +7 -0
  23. package/dist/lib/node-esm/index.mjs +8 -2
  24. package/dist/lib/node-esm/index.mjs.map +3 -3
  25. package/dist/lib/node-esm/{intent-resolver-VR42K5GE.mjs → intent-resolver-7EYVRN3R.mjs} +2 -2
  26. package/dist/lib/node-esm/meta.json +1 -1
  27. package/dist/lib/node-esm/{react-root-THJBSTQS.mjs → react-root-RCKGZSZB.mjs} +2 -2
  28. package/dist/lib/node-esm/{react-surface-Z3BBQ5HX.mjs → react-surface-WKKBE5V4.mjs} +2 -2
  29. package/dist/lib/node-esm/schema-tools-KJVXGDBO.mjs +125 -0
  30. package/dist/lib/node-esm/schema-tools-KJVXGDBO.mjs.map +7 -0
  31. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  32. package/dist/types/src/capabilities/index.d.ts +1 -0
  33. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  34. package/dist/types/src/capabilities/schema-tool.test.d.ts +2 -0
  35. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +1 -0
  36. package/dist/types/src/capabilities/schema-tools.d.ts +13 -0
  37. package/dist/types/src/capabilities/schema-tools.d.ts.map +1 -0
  38. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +2 -1
  39. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  40. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +2 -1
  41. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -1
  42. package/dist/types/src/components/AwaitingObject.d.ts +2 -1
  43. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  44. package/dist/types/src/components/BaseObjectSettings.d.ts +2 -1
  45. package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -1
  46. package/dist/types/src/components/CollectionMain.d.ts +2 -1
  47. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  48. package/dist/types/src/components/CollectionSection.d.ts +2 -1
  49. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  50. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -1
  51. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  52. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +2 -1
  53. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  54. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +2 -1
  55. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  56. package/dist/types/src/components/JoinDialog.d.ts +2 -1
  57. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  58. package/dist/types/src/components/MenuFooter.d.ts +2 -1
  59. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  60. package/dist/types/src/components/PersistenceStatus.d.ts +2 -1
  61. package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
  62. package/dist/types/src/components/PopoverAddSpace.d.ts +2 -1
  63. package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -1
  64. package/dist/types/src/components/PopoverRenameObject.d.ts +2 -1
  65. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  66. package/dist/types/src/components/PopoverRenameSpace.d.ts +2 -1
  67. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  68. package/dist/types/src/components/ShareSpaceButton.d.ts +3 -2
  69. package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
  70. package/dist/types/src/components/SpacePluginSettings.d.ts +2 -1
  71. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  72. package/dist/types/src/components/SpacePresence.d.ts +5 -4
  73. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  74. package/dist/types/src/components/SpacePresence.stories.d.ts +3 -2
  75. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +2 -1
  77. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
  78. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +2 -1
  79. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
  80. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts +2 -1
  81. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
  82. package/dist/types/src/components/SyncStatus/Space.d.ts +3 -2
  83. package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -1
  84. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +4 -3
  85. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  86. package/package.json +43 -40
  87. package/src/SpacePlugin.tsx +6 -0
  88. package/src/capabilities/index.ts +1 -0
  89. package/src/capabilities/schema-tool.test.ts +45 -0
  90. package/src/capabilities/schema-tools.ts +124 -0
  91. package/dist/lib/browser/chunk-PCEP3KQY.mjs.map +0 -7
  92. package/dist/lib/node/chunk-QE4GVR6C.cjs.map +0 -7
  93. package/dist/lib/node-esm/chunk-HJCEJNW3.mjs.map +0 -7
  94. /package/dist/lib/browser/{intent-resolver-GPNAQ2SG.mjs.map → intent-resolver-7PY5WDYC.mjs.map} +0 -0
  95. /package/dist/lib/browser/{react-root-4CCSD7TZ.mjs.map → react-root-EP4XP4IK.mjs.map} +0 -0
  96. /package/dist/lib/browser/{react-surface-FKMRI3WV.mjs.map → react-surface-VNNI5POA.mjs.map} +0 -0
  97. /package/dist/lib/node/{intent-resolver-ICHHI6I6.cjs.map → intent-resolver-QEIKJ5FR.cjs.map} +0 -0
  98. /package/dist/lib/node/{react-root-TCBTUOOJ.cjs.map → react-root-OW5NTN2U.cjs.map} +0 -0
  99. /package/dist/lib/node/{react-surface-JSCCIZS5.cjs.map → react-surface-JTIQUBHB.cjs.map} +0 -0
  100. /package/dist/lib/node-esm/{intent-resolver-VR42K5GE.mjs.map → intent-resolver-7EYVRN3R.mjs.map} +0 -0
  101. /package/dist/lib/node-esm/{react-root-THJBSTQS.mjs.map → react-root-RCKGZSZB.mjs.map} +0 -0
  102. /package/dist/lib/node-esm/{react-surface-Z3BBQ5HX.mjs.map → react-surface-WKKBE5V4.mjs.map} +0 -0
@@ -1,12 +1,13 @@
1
+ import React from 'react';
1
2
  import { type SpaceId } from '@dxos/react-client/echo';
2
3
  import { type PeerSyncState } from './sync-state';
3
4
  export declare const SYNC_STALLED_TIMEOUT = 5000;
4
5
  export type SpaceRowContainerProps = Omit<SpaceRowProps, 'spaceName'>;
5
- export declare const SpaceRowContainer: ({ spaceId, state }: SpaceRowContainerProps) => import("react/jsx-runtime").JSX.Element | null;
6
+ export declare const SpaceRowContainer: ({ spaceId, state }: SpaceRowContainerProps) => React.JSX.Element | null;
6
7
  export type SpaceRowProps = {
7
8
  spaceId: SpaceId;
8
9
  spaceName: string;
9
10
  state: PeerSyncState;
10
11
  };
11
- export declare const SpaceRow: ({ spaceId, spaceName, state: { localDocumentCount, remoteDocumentCount, missingOnLocal, missingOnRemote }, }: SpaceRowProps) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const SpaceRow: ({ spaceId, spaceName, state: { localDocumentCount, remoteDocumentCount, missingOnLocal, missingOnRemote }, }: SpaceRowProps) => React.JSX.Element;
12
13
  //# sourceMappingURL=Space.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Space.d.ts","sourceRoot":"","sources":["../../../../../src/components/SyncStatus/Space.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,OAAO,EAAY,MAAM,yBAAyB,CAAC;AAKjE,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAIjE,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AA+B1C,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAEtE,eAAO,MAAM,iBAAiB,uBAAwB,sBAAsB,mDAW3E,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,QAAQ,iHAIlB,aAAa,4CA8Bf,CAAC"}
1
+ {"version":3,"file":"Space.d.ts","sourceRoot":"","sources":["../../../../../src/components/SyncStatus/Space.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAGxE,OAAO,EAAE,KAAK,OAAO,EAAY,MAAM,yBAAyB,CAAC;AAKjE,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAIjE,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AA+B1C,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAEtE,eAAO,MAAM,iBAAiB,uBAAwB,sBAAsB,6BAW3E,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,QAAQ,iHAIlB,aAAa,sBA8Bf,CAAC"}
@@ -1,14 +1,15 @@
1
+ import React from 'react';
1
2
  import { type ThemedClassName } from '@dxos/react-ui';
2
3
  import { type PeerSyncState, type SpaceSyncStateMap } from './sync-state';
3
- export declare const SyncStatus: () => import("react/jsx-runtime").JSX.Element;
4
+ export declare const SyncStatus: () => React.JSX.Element;
4
5
  export declare const SyncStatusIndicator: ({ state, saved }: {
5
6
  state: SpaceSyncStateMap;
6
7
  saved: Boolean;
7
- }) => import("react/jsx-runtime").JSX.Element;
8
+ }) => React.JSX.Element;
8
9
  export type SyncStatusDetailProps = ThemedClassName<{
9
10
  state: SpaceSyncStateMap;
10
11
  summary: PeerSyncState;
11
12
  debug?: boolean;
12
13
  }>;
13
- export declare const SyncStatusDetail: ({ classNames, state, summary, debug }: SyncStatusDetailProps) => import("react/jsx-runtime").JSX.Element;
14
+ export declare const SyncStatusDetail: ({ classNames, state, summary, debug }: SyncStatusDetailProps) => React.JSX.Element;
14
15
  //# sourceMappingURL=SyncStatus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncStatus.d.ts","sourceRoot":"","sources":["../../../../../src/components/SyncStatus/SyncStatus.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOtD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAgC,MAAM,cAAc,CAAC;AAGxG,eAAO,MAAM,UAAU,+CAYtB,CAAC;AAEF,eAAO,MAAM,mBAAmB,qBAAsB;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,4CA0CjG,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC,CAAC;AAGH,eAAO,MAAM,gBAAgB,0CAA2C,qBAAqB,4CAmC5F,CAAC"}
1
+ {"version":3,"file":"SyncStatus.d.ts","sourceRoot":"","sources":["../../../../../src/components/SyncStatus/SyncStatus.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAMhE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOtD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAgC,MAAM,cAAc,CAAC;AAGxG,eAAO,MAAM,UAAU,yBAYtB,CAAC;AAEF,eAAO,MAAM,mBAAmB,qBAAsB;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,sBA0CjG,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC,CAAC;AAGH,eAAO,MAAM,gBAAgB,0CAA2C,qBAAqB,sBAmC5F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-space",
3
- "version": "0.8.1-main.ae460ac",
3
+ "version": "0.8.1-staging.391c573",
4
4
  "description": "DXOS Surface plugin for DXOS ECHO Spaces",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -34,44 +34,47 @@
34
34
  ],
35
35
  "dependencies": {
36
36
  "@preact/signals-core": "^1.6.0",
37
- "effect": "^3.12.3",
37
+ "effect": "3.13.3",
38
38
  "jszip": "^3.10.1",
39
39
  "localforage": "^1.10.0",
40
40
  "lodash.get": "^4.4.2",
41
41
  "react-drag-drop-files": "^2.3.8",
42
42
  "react-is": "~18.2.0",
43
- "@dxos/app-framework": "0.8.1-main.ae460ac",
44
- "@dxos/async": "0.8.1-main.ae460ac",
45
- "@dxos/automerge": "0.8.1-main.ae460ac",
46
- "@dxos/context": "0.8.1-main.ae460ac",
47
- "@dxos/display-name": "0.8.1-main.ae460ac",
48
- "@dxos/echo-schema": "0.8.1-main.ae460ac",
49
- "@dxos/client": "0.8.1-main.ae460ac",
50
- "@dxos/echo-signals": "0.8.1-main.ae460ac",
51
- "@dxos/invariant": "0.8.1-main.ae460ac",
52
- "@dxos/keys": "0.8.1-main.ae460ac",
53
- "@dxos/live-object": "0.8.1-main.ae460ac",
54
- "@dxos/log": "0.8.1-main.ae460ac",
55
- "@dxos/local-storage": "0.8.1-main.ae460ac",
56
- "@dxos/plugin-attention": "0.8.1-main.ae460ac",
57
- "@dxos/plugin-deck": "0.8.1-main.ae460ac",
58
- "@dxos/plugin-graph": "0.8.1-main.ae460ac",
59
- "@dxos/migrations": "0.8.1-main.ae460ac",
60
- "@dxos/plugin-client": "0.8.1-main.ae460ac",
61
- "@dxos/plugin-observability": "0.8.1-main.ae460ac",
62
- "@dxos/plugin-status-bar": "0.8.1-main.ae460ac",
63
- "@dxos/protocols": "0.8.1-main.ae460ac",
64
- "@dxos/react-ui-attention": "0.8.1-main.ae460ac",
65
- "@dxos/react-ui-editor": "0.8.1-main.ae460ac",
66
- "@dxos/react-client": "0.8.1-main.ae460ac",
67
- "@dxos/react-ui-form": "0.8.1-main.ae460ac",
68
- "@dxos/react-ui-pickers": "0.8.1-main.ae460ac",
69
- "@dxos/react-ui-searchlist": "0.8.1-main.ae460ac",
70
- "@dxos/react-ui-stack": "0.8.1-main.ae460ac",
71
- "@dxos/react-ui-syntax-highlighter": "0.8.1-main.ae460ac",
72
- "@dxos/react-ui-tabs": "0.8.1-main.ae460ac",
73
- "@dxos/shell": "0.8.1-main.ae460ac",
74
- "@dxos/util": "0.8.1-main.ae460ac"
43
+ "@dxos/app-framework": "0.8.1-staging.391c573",
44
+ "@dxos/artifact": "0.8.1-staging.391c573",
45
+ "@dxos/async": "0.8.1-staging.391c573",
46
+ "@dxos/client": "0.8.1-staging.391c573",
47
+ "@dxos/display-name": "0.8.1-staging.391c573",
48
+ "@dxos/context": "0.8.1-staging.391c573",
49
+ "@dxos/automerge": "0.8.1-staging.391c573",
50
+ "@dxos/echo-schema": "0.8.1-staging.391c573",
51
+ "@dxos/echo-signals": "0.8.1-staging.391c573",
52
+ "@dxos/invariant": "0.8.1-staging.391c573",
53
+ "@dxos/keys": "0.8.1-staging.391c573",
54
+ "@dxos/live-object": "0.8.1-staging.391c573",
55
+ "@dxos/log": "0.8.1-staging.391c573",
56
+ "@dxos/local-storage": "0.8.1-staging.391c573",
57
+ "@dxos/plugin-attention": "0.8.1-staging.391c573",
58
+ "@dxos/migrations": "0.8.1-staging.391c573",
59
+ "@dxos/plugin-client": "0.8.1-staging.391c573",
60
+ "@dxos/plugin-observability": "0.8.1-staging.391c573",
61
+ "@dxos/plugin-graph": "0.8.1-staging.391c573",
62
+ "@dxos/plugin-status-bar": "0.8.1-staging.391c573",
63
+ "@dxos/plugin-deck": "0.8.1-staging.391c573",
64
+ "@dxos/protocols": "0.8.1-staging.391c573",
65
+ "@dxos/react-client": "0.8.1-staging.391c573",
66
+ "@dxos/react-ui-attention": "0.8.1-staging.391c573",
67
+ "@dxos/react-ui-editor": "0.8.1-staging.391c573",
68
+ "@dxos/react-ui-searchlist": "0.8.1-staging.391c573",
69
+ "@dxos/react-ui-pickers": "0.8.1-staging.391c573",
70
+ "@dxos/react-ui-form": "0.8.1-staging.391c573",
71
+ "@dxos/react-ui-stack": "0.8.1-staging.391c573",
72
+ "@dxos/react-ui-syntax-highlighter": "0.8.1-staging.391c573",
73
+ "@dxos/react-ui-tabs": "0.8.1-staging.391c573",
74
+ "@dxos/schema": "0.8.1-staging.391c573",
75
+ "@dxos/react-ui-theme": "0.8.1-staging.391c573",
76
+ "@dxos/util": "0.8.1-staging.391c573",
77
+ "@dxos/shell": "0.8.1-staging.391c573"
75
78
  },
76
79
  "devDependencies": {
77
80
  "@babel/core": "^7.18.13",
@@ -82,17 +85,17 @@
82
85
  "react": "~18.2.0",
83
86
  "react-dom": "~18.2.0",
84
87
  "vite": "5.4.7",
85
- "@dxos/random": "0.8.1-main.ae460ac",
86
- "@dxos/react-ui": "0.8.1-main.ae460ac",
87
- "@dxos/react-ui-theme": "0.8.1-main.ae460ac",
88
- "@dxos/storybook-utils": "0.8.1-main.ae460ac"
88
+ "@dxos/random": "0.8.1-staging.391c573",
89
+ "@dxos/storybook-utils": "0.8.1-staging.391c573",
90
+ "@dxos/react-ui": "0.8.1-staging.391c573",
91
+ "@dxos/react-ui-theme": "0.8.1-staging.391c573"
89
92
  },
90
93
  "peerDependencies": {
91
94
  "@phosphor-icons/react": "^2.1.5",
92
95
  "react": "~18.2.0",
93
96
  "react-dom": "~18.2.0",
94
- "@dxos/react-ui": "0.8.1-main.ae460ac",
95
- "@dxos/react-ui-theme": "0.8.1-main.ae460ac"
97
+ "@dxos/react-ui": "0.8.1-staging.391c573",
98
+ "@dxos/react-ui-theme": "0.8.1-staging.391c573"
96
99
  },
97
100
  "publishConfig": {
98
101
  "access": "public"
@@ -28,6 +28,7 @@ import {
28
28
  ReactRoot,
29
29
  ReactSurface,
30
30
  Schema,
31
+ Tools,
31
32
  SpaceCapabilities,
32
33
  SpaceSettings,
33
34
  SpacesReady,
@@ -178,5 +179,10 @@ export const SpacePlugin = ({
178
179
  ),
179
180
  activate: SpacesReady,
180
181
  }),
182
+ defineModule({
183
+ id: `${meta.id}/module/tools`,
184
+ activatesOn: Events.SetupArtifactDefinition,
185
+ activate: Tools,
186
+ }),
181
187
  ]);
182
188
  };
@@ -11,6 +11,7 @@ export const IntentResolver = lazy(() => import('./intent-resolver'));
11
11
  export const ReactRoot = lazy(() => import('./react-root'));
12
12
  export const ReactSurface = lazy(() => import('./react-surface'));
13
13
  export const Schema = lazy(() => import('./schema'));
14
+ export const Tools = lazy(() => import('./schema-tools'));
14
15
  export const SpaceSettings = lazy(() => import('./settings'));
15
16
  export const SpaceState = lazy(() => import('./state'));
16
17
  export const SpacesReady = lazy(() => import('./spaces-ready'));
@@ -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
+ ]);