@dxos/plugin-debug 0.8.4-main.c85a9c8dae → 0.8.4-main.dfabb4ec29

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 (198) hide show
  1. package/dist/lib/{browser/DebugGraph-7HXJ2PS2.mjs → neutral/DebugGraph-G4FWS57E.mjs} +4 -5
  2. package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs.map +7 -0
  3. package/dist/lib/neutral/DebugObjectPanel-UJ63CV25.mjs +59 -0
  4. package/dist/lib/neutral/DebugObjectPanel-UJ63CV25.mjs.map +7 -0
  5. package/dist/lib/neutral/DebugPlugin.mjs +47 -0
  6. package/dist/lib/neutral/DebugPlugin.mjs.map +7 -0
  7. package/dist/lib/neutral/DebugPlugin.node.mjs +18 -0
  8. package/dist/lib/neutral/DebugPlugin.node.mjs.map +7 -0
  9. package/dist/lib/neutral/DebugSettings-Z3XADRNK.mjs +224 -0
  10. package/dist/lib/neutral/DebugSettings-Z3XADRNK.mjs.map +7 -0
  11. package/dist/lib/{browser/DebugSpaceObjectsPanel-7NRPLWZ4.mjs → neutral/DebugSpaceObjectsPanel-NISULU6U.mjs} +10 -26
  12. package/dist/lib/neutral/DebugSpaceObjectsPanel-NISULU6U.mjs.map +7 -0
  13. package/dist/lib/{browser/DebugStatus-COQGH37G.mjs → neutral/DebugStatus-YB3KFP7G.mjs} +35 -39
  14. package/dist/lib/neutral/DebugStatus-YB3KFP7G.mjs.map +7 -0
  15. package/dist/lib/{browser/DevtoolsOverviewContainer-C75NFVER.mjs → neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs} +9 -6
  16. package/dist/lib/neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs.map +7 -0
  17. package/dist/lib/neutral/SpaceGenerator-UBYB4NPD.mjs +143 -0
  18. package/dist/lib/neutral/SpaceGenerator-UBYB4NPD.mjs.map +7 -0
  19. package/dist/lib/{browser/Wireframe-KAGOKEFW.mjs → neutral/Wireframe-7SNRUKET.mjs} +8 -9
  20. package/dist/lib/neutral/Wireframe-7SNRUKET.mjs.map +7 -0
  21. package/dist/lib/{browser/app-graph-builder-LGUQNXHD.mjs → neutral/app-graph-builder-YPYHL2K5.mjs} +210 -258
  22. package/dist/lib/neutral/app-graph-builder-YPYHL2K5.mjs.map +7 -0
  23. package/dist/lib/neutral/capabilities/index.mjs +15 -0
  24. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  25. package/dist/lib/{browser/chunk-A5H5GRV6.mjs → neutral/chunk-3OGPOE7H.mjs} +2 -2
  26. package/dist/lib/{browser/chunk-A5H5GRV6.mjs.map → neutral/chunk-3OGPOE7H.mjs.map} +3 -3
  27. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  28. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  29. package/dist/lib/{browser/chunk-4UFQXPP7.mjs → neutral/chunk-NFIOTQRZ.mjs} +23 -12
  30. package/dist/lib/neutral/chunk-NFIOTQRZ.mjs.map +7 -0
  31. package/dist/lib/{browser/SpaceGenerator-SWSGJEEL.mjs → neutral/components/index.mjs} +60 -253
  32. package/dist/lib/neutral/components/index.mjs.map +7 -0
  33. package/dist/lib/neutral/containers/index.mjs +21 -0
  34. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  35. package/dist/lib/neutral/index.mjs +18 -0
  36. package/dist/lib/neutral/index.mjs.map +7 -0
  37. package/dist/lib/neutral/meta.json +1 -0
  38. package/dist/lib/neutral/meta.mjs +8 -0
  39. package/dist/lib/neutral/meta.mjs.map +7 -0
  40. package/dist/lib/neutral/plugin.mjs +12 -0
  41. package/dist/lib/neutral/plugin.mjs.map +7 -0
  42. package/dist/lib/{browser/react-context-I3USIAF6.mjs → neutral/react-context-MUZ3KVLU.mjs} +6 -6
  43. package/dist/lib/neutral/react-context-MUZ3KVLU.mjs.map +7 -0
  44. package/dist/lib/{browser/react-surface-BTVNKKVQ.mjs → neutral/react-surface-NH2H63KW.mjs} +153 -176
  45. package/dist/lib/neutral/react-surface-NH2H63KW.mjs.map +7 -0
  46. package/dist/lib/{browser/settings-SLTQJJNF.mjs → neutral/settings-MPM6YUP4.mjs} +7 -11
  47. package/dist/lib/neutral/settings-MPM6YUP4.mjs.map +7 -0
  48. package/dist/lib/neutral/translations.mjs +83 -0
  49. package/dist/lib/neutral/translations.mjs.map +7 -0
  50. package/dist/lib/neutral/types/index.mjs +14 -0
  51. package/dist/lib/neutral/types/index.mjs.map +7 -0
  52. package/dist/types/src/DebugPlugin.d.ts +2 -5
  53. package/dist/types/src/DebugPlugin.d.ts.map +1 -1
  54. package/dist/types/src/DebugPlugin.node.d.ts +5 -0
  55. package/dist/types/src/DebugPlugin.node.d.ts.map +1 -0
  56. package/dist/types/src/DebugPlugin.test.d.ts +2 -0
  57. package/dist/types/src/DebugPlugin.test.d.ts.map +1 -0
  58. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/index.d.ts +11 -4
  60. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  61. package/dist/types/src/capabilities/react-context.d.ts.map +1 -0
  62. package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +2 -2
  63. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  64. package/dist/types/src/capabilities/{settings/settings.d.ts → settings.d.ts} +2 -1
  65. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  66. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts +11 -0
  67. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts.map +1 -0
  68. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts +99 -0
  69. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts.map +1 -0
  70. package/dist/types/src/components/DebugSettings/index.d.ts +2 -0
  71. package/dist/types/src/components/DebugSettings/index.d.ts.map +1 -0
  72. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
  73. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +2 -2
  74. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
  75. package/dist/types/src/components/SpaceGenerator/draw-util.d.ts.map +1 -1
  76. package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
  77. package/dist/types/src/components/index.d.ts +2 -0
  78. package/dist/types/src/components/index.d.ts.map +1 -1
  79. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +2 -2
  80. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +1 -1
  81. package/dist/types/src/containers/DebugGraph/index.d.ts +1 -2
  82. package/dist/types/src/containers/DebugGraph/index.d.ts.map +1 -1
  83. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +3 -4
  84. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
  85. package/dist/types/src/containers/DebugObjectPanel/index.d.ts +1 -2
  86. package/dist/types/src/containers/DebugObjectPanel/index.d.ts.map +1 -1
  87. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +3 -1
  88. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
  89. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts +1 -2
  90. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts.map +1 -1
  91. package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -1
  92. package/dist/types/src/containers/DebugStatus/index.d.ts +1 -2
  93. package/dist/types/src/containers/DebugStatus/index.d.ts.map +1 -1
  94. package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts.map +1 -1
  95. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +1 -2
  96. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +1 -1
  97. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts +3 -1
  98. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
  99. package/dist/types/src/containers/SpaceGenerator/index.d.ts +1 -2
  100. package/dist/types/src/containers/SpaceGenerator/index.d.ts.map +1 -1
  101. package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
  102. package/dist/types/src/containers/Wireframe/index.d.ts +1 -2
  103. package/dist/types/src/containers/Wireframe/index.d.ts.map +1 -1
  104. package/dist/types/src/containers/index.d.ts +0 -1
  105. package/dist/types/src/containers/index.d.ts.map +1 -1
  106. package/dist/types/src/index.d.ts +1 -1
  107. package/dist/types/src/index.d.ts.map +1 -1
  108. package/dist/types/src/plugin.d.ts +4 -0
  109. package/dist/types/src/plugin.d.ts.map +1 -0
  110. package/dist/types/src/translations.d.ts +80 -61
  111. package/dist/types/src/translations.d.ts.map +1 -1
  112. package/dist/types/src/types/Settings.d.ts +8 -0
  113. package/dist/types/src/types/Settings.d.ts.map +1 -0
  114. package/dist/types/src/types/index.d.ts +69 -0
  115. package/dist/types/src/types/index.d.ts.map +1 -0
  116. package/dist/types/tsconfig.tsbuildinfo +1 -1
  117. package/package.json +115 -64
  118. package/src/DebugPlugin.node.ts +18 -0
  119. package/src/DebugPlugin.test.ts +29 -0
  120. package/src/DebugPlugin.tsx +9 -11
  121. package/src/capabilities/app-graph-builder.ts +405 -0
  122. package/src/capabilities/index.ts +6 -4
  123. package/src/capabilities/{react-context/react-context.tsx → react-context.tsx} +7 -2
  124. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +169 -158
  125. package/src/capabilities/{settings/settings.ts → settings.ts} +4 -4
  126. package/src/components/DebugSettings/DebugSettings.stories.tsx +36 -0
  127. package/src/components/DebugSettings/DebugSettings.tsx +262 -0
  128. package/src/components/DebugSettings/index.ts +5 -0
  129. package/src/components/SpaceGenerator/ObjectGenerator.tsx +13 -15
  130. package/src/components/SpaceGenerator/draw-util.ts +8 -8
  131. package/src/components/SpaceGenerator/presets.ts +28 -50
  132. package/src/components/index.ts +4 -0
  133. package/src/containers/DebugGraph/DebugGraph.tsx +3 -2
  134. package/src/containers/DebugGraph/index.ts +1 -3
  135. package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +47 -16
  136. package/src/containers/DebugObjectPanel/index.ts +1 -3
  137. package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +10 -23
  138. package/src/containers/DebugSpaceObjectsPanel/index.ts +1 -3
  139. package/src/containers/DebugStatus/DebugStatus.tsx +41 -19
  140. package/src/containers/DebugStatus/index.ts +1 -3
  141. package/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx +8 -1
  142. package/src/containers/DevtoolsOverviewContainer/index.ts +1 -3
  143. package/src/containers/SpaceGenerator/SpaceGenerator.tsx +102 -103
  144. package/src/containers/SpaceGenerator/index.ts +1 -3
  145. package/src/containers/Wireframe/Wireframe.tsx +2 -6
  146. package/src/containers/Wireframe/index.ts +1 -3
  147. package/src/containers/index.ts +0 -1
  148. package/src/index.ts +1 -1
  149. package/src/meta.ts +1 -1
  150. package/src/plugin.ts +10 -0
  151. package/src/translations.ts +75 -60
  152. package/src/types/Settings.ts +16 -0
  153. package/src/{types.ts → types/index.ts} +15 -14
  154. package/dist/lib/browser/DebugGraph-7HXJ2PS2.mjs.map +0 -7
  155. package/dist/lib/browser/DebugObjectPanel-3TCDNUNW.mjs +0 -33
  156. package/dist/lib/browser/DebugObjectPanel-3TCDNUNW.mjs.map +0 -7
  157. package/dist/lib/browser/DebugSettings-JZMIUDYB.mjs +0 -174
  158. package/dist/lib/browser/DebugSettings-JZMIUDYB.mjs.map +0 -7
  159. package/dist/lib/browser/DebugSpaceObjectsPanel-7NRPLWZ4.mjs.map +0 -7
  160. package/dist/lib/browser/DebugStatus-COQGH37G.mjs.map +0 -7
  161. package/dist/lib/browser/DevtoolsOverviewContainer-C75NFVER.mjs.map +0 -7
  162. package/dist/lib/browser/SpaceGenerator-SWSGJEEL.mjs.map +0 -7
  163. package/dist/lib/browser/Wireframe-KAGOKEFW.mjs.map +0 -7
  164. package/dist/lib/browser/app-graph-builder-LGUQNXHD.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-4UFQXPP7.mjs.map +0 -7
  166. package/dist/lib/browser/index.mjs +0 -132
  167. package/dist/lib/browser/index.mjs.map +0 -7
  168. package/dist/lib/browser/meta.json +0 -1
  169. package/dist/lib/browser/react-context-I3USIAF6.mjs.map +0 -7
  170. package/dist/lib/browser/react-surface-BTVNKKVQ.mjs.map +0 -7
  171. package/dist/lib/browser/settings-SLTQJJNF.mjs.map +0 -7
  172. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  173. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  174. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  175. package/dist/types/src/capabilities/react-context/index.d.ts +0 -7
  176. package/dist/types/src/capabilities/react-context/index.d.ts.map +0 -1
  177. package/dist/types/src/capabilities/react-context/react-context.d.ts.map +0 -1
  178. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -5
  179. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  180. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  181. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  182. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  183. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  184. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +0 -10
  185. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +0 -1
  186. package/dist/types/src/containers/DebugSettings/index.d.ts +0 -3
  187. package/dist/types/src/containers/DebugSettings/index.d.ts.map +0 -1
  188. package/dist/types/src/types.d.ts +0 -68
  189. package/dist/types/src/types.d.ts.map +0 -1
  190. package/src/capabilities/app-graph-builder/app-graph-builder.ts +0 -441
  191. package/src/capabilities/app-graph-builder/index.ts +0 -7
  192. package/src/capabilities/react-context/index.ts +0 -7
  193. package/src/capabilities/react-surface/index.ts +0 -7
  194. package/src/capabilities/settings/index.ts +0 -7
  195. package/src/containers/DebugSettings/DebugSettings.tsx +0 -201
  196. package/src/containers/DebugSettings/index.ts +0 -7
  197. /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
  198. /package/dist/types/src/capabilities/{react-context/react-context.d.ts → react-context.d.ts} +0 -0
@@ -0,0 +1,262 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
+ import { AppCapabilities, getPersonalSpace } from '@dxos/app-toolkit';
8
+ import { type AppSurface } from '@dxos/app-toolkit/ui';
9
+ import { type ConfigProto, SaveConfig, Storage, defs } from '@dxos/config';
10
+ import { log } from '@dxos/log';
11
+ import { type IdbLogStore } from '@dxos/log-store-idb';
12
+ import { useClient } from '@dxos/react-client';
13
+ import { Icon, IconButton, Input, Select, Toast, useFileDownload, useTranslation } from '@dxos/react-ui';
14
+ import { Settings as SettingsForm } from '@dxos/react-ui-form';
15
+ import { TRACE_ALL_KEY } from '@dxos/tracing';
16
+ import { setDeep } from '@dxos/util';
17
+
18
+ import { meta } from '#meta';
19
+ import { type Settings } from '#types';
20
+
21
+ type Toast = {
22
+ title: string;
23
+ description?: string;
24
+ };
25
+
26
+ const StorageAdapters = {
27
+ opfs: defs.Runtime.Client.Storage.StorageDriver.WEBFS,
28
+ idb: defs.Runtime.Client.Storage.StorageDriver.IDB,
29
+ } as const;
30
+
31
+ export type DebugSettingsProps = AppSurface.SettingsArticleProps<
32
+ Settings.Settings,
33
+ {
34
+ logStore: IdbLogStore;
35
+ onUpload?: AppCapabilities.FileUploader;
36
+ }
37
+ >;
38
+
39
+ export const DebugSettings = ({ settings, onSettingsChange, logStore, onUpload }: DebugSettingsProps) => {
40
+ const { t } = useTranslation(meta.id);
41
+ const [toast, setToast] = useState<Toast>();
42
+ const download = useFileDownload();
43
+ const [storageConfig, setStorageConfig] = useState<ConfigProto>({});
44
+ const client = useClient();
45
+
46
+ useEffect(() => {
47
+ void Storage().then((config) => setStorageConfig(config));
48
+ }, []);
49
+
50
+ const handleToast = useCallback(
51
+ (toast: Toast) => {
52
+ setToast(toast);
53
+ const timer = setTimeout(() => setToast(undefined), 5_000);
54
+ return () => clearTimeout(timer);
55
+ },
56
+ [setToast],
57
+ );
58
+
59
+ const handleDownload = useCallback(async () => {
60
+ const data = await client.diagnostics();
61
+ const file = new Blob([JSON.stringify(data, undefined, 2)], {
62
+ type: 'text/plain',
63
+ });
64
+ const fileName = `composer-${new Date().toISOString().replace(/\W/g, '-')}.json`;
65
+ download(file, fileName);
66
+
67
+ if (onUpload) {
68
+ const personalSpace = getPersonalSpace(client);
69
+ if (!personalSpace) {
70
+ log.error('no personal space available for upload');
71
+ return;
72
+ }
73
+ const info = await onUpload(personalSpace.db, new File([file], fileName));
74
+ if (!info) {
75
+ log.error('diagnostics failed to upload to IPFS');
76
+ return;
77
+ }
78
+ handleToast({
79
+ title: t('settings.uploaded.message'),
80
+ description: t('settings.uploaded.description'),
81
+ });
82
+
83
+ // TODO(nf): move to IpfsPlugin?
84
+ const url = client.config.values.runtime!.services!.ipfs!.gateway + '/' + info.cid;
85
+ void navigator.clipboard.writeText(url);
86
+ handleToast({
87
+ title: t('settings.uploaded.message'),
88
+ description: t('settings.uploaded.description'),
89
+ });
90
+ log.info('diagnostics', { url });
91
+ }
92
+ }, [client, download, handleToast, onUpload, t]);
93
+
94
+ const handleDownloadLogs = useCallback(async () => {
95
+ const ndjson = await logStore.export();
96
+ const file = new Blob([ndjson], { type: 'application/x-ndjson' });
97
+ const fileName = `composer-logs-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.ndjson`;
98
+ download(file, fileName);
99
+ }, [download, logStore]);
100
+
101
+ const handleRepair = useCallback(async () => {
102
+ try {
103
+ const info = await client.repair();
104
+ setStorageConfig(await Storage());
105
+ handleToast({
106
+ title: t('settings.repair-success.message'),
107
+ description: JSON.stringify(info, undefined, 2),
108
+ });
109
+ } catch (err: any) {
110
+ handleToast({
111
+ title: t('settings.repair-failed.message'),
112
+ description: err.message,
113
+ });
114
+ }
115
+ }, [client, handleToast, t]);
116
+
117
+ const handleWireframeChange = useCallback(
118
+ (checked: boolean) => onSettingsChange?.((s) => ({ ...s, wireframe: !!checked })),
119
+ [onSettingsChange],
120
+ );
121
+
122
+ const traceAll = useMemo(
123
+ () => settings.traceAll ?? (typeof localStorage !== 'undefined' && localStorage.getItem(TRACE_ALL_KEY) === 'true'),
124
+ [settings.traceAll],
125
+ );
126
+
127
+ const handleTraceAllChange = useCallback(
128
+ (checked: boolean) => {
129
+ const value = !!checked;
130
+ localStorage.setItem(TRACE_ALL_KEY, String(value));
131
+ onSettingsChange?.((s) => ({ ...s, traceAll: value }));
132
+ },
133
+ [onSettingsChange],
134
+ );
135
+
136
+ const handleOpenTracingPanel = useCallback(() => {
137
+ window.open('about:blank', '_blank');
138
+ }, []);
139
+
140
+ const handleStorageAdapterChange = useCallback(
141
+ (value: string) => {
142
+ if (confirm(t('settings.storage-adapter.changed-alert.message'))) {
143
+ updateConfig(
144
+ storageConfig,
145
+ setStorageConfig,
146
+ ['runtime', 'client', 'storage', 'dataStore'],
147
+ StorageAdapters[value as keyof typeof StorageAdapters],
148
+ );
149
+ }
150
+ },
151
+ [storageConfig, t],
152
+ );
153
+
154
+ return (
155
+ <SettingsForm.Viewport>
156
+ <SettingsForm.Section title={t('settings.title', { ns: meta.id })}>
157
+ <SettingsForm.Item title={t('settings.wireframe.label')} description={t('settings.wireframe.description')}>
158
+ <Input.Switch
159
+ disabled={!onSettingsChange}
160
+ checked={settings.wireframe}
161
+ onCheckedChange={handleWireframeChange}
162
+ />
163
+ </SettingsForm.Item>
164
+ <SettingsForm.Item title={t('settings.trace-all.label')} description={t('settings.trace-all.description')}>
165
+ <Input.Switch disabled={!onSettingsChange} checked={traceAll} onCheckedChange={handleTraceAllChange} />
166
+ </SettingsForm.Item>
167
+ <SettingsForm.Item
168
+ title={t('settings.tracing-panel.label')}
169
+ description={t('settings.tracing-panel.description')}
170
+ >
171
+ <IconButton
172
+ icon='ph--arrow-square-out--regular'
173
+ iconOnly
174
+ label={t('settings.tracing-panel.label')}
175
+ onClick={handleOpenTracingPanel}
176
+ />
177
+ </SettingsForm.Item>
178
+ <SettingsForm.Item
179
+ title={t('settings.download-diagnostics.label')}
180
+ description={t('settings.download-diagnostics.description')}
181
+ >
182
+ <IconButton
183
+ icon='ph--download-simple--regular'
184
+ iconOnly
185
+ label={t('settings.download-diagnostics.label')}
186
+ onClick={handleDownload}
187
+ />
188
+ </SettingsForm.Item>
189
+ <SettingsForm.Item
190
+ title={t('settings.download-logs.label')}
191
+ description={t('settings.download-logs.description')}
192
+ >
193
+ <IconButton
194
+ icon='ph--download-simple--regular'
195
+ iconOnly
196
+ label={t('settings.download-logs.label')}
197
+ onClick={handleDownloadLogs}
198
+ />
199
+ </SettingsForm.Item>
200
+ <SettingsForm.Item title={t('settings.repair.label')} description={t('settings.repair.description')}>
201
+ <IconButton
202
+ icon='ph--first-aid-kit--regular'
203
+ iconOnly
204
+ label={t('settings.repair.label')}
205
+ onClick={handleRepair}
206
+ />
207
+ </SettingsForm.Item>
208
+
209
+ {/* TODO(burdon): Move to layout? */}
210
+ {toast && (
211
+ <Toast.Root>
212
+ <Toast.Body>
213
+ <Toast.Title>
214
+ <Icon icon='ph--gift--duotone' classNames='inline mr-1' />
215
+ <span>{toast.title}</span>
216
+ </Toast.Title>
217
+ {toast.description && <Toast.Description>{toast.description}</Toast.Description>}
218
+ </Toast.Body>
219
+ </Toast.Root>
220
+ )}
221
+
222
+ <SettingsForm.Item
223
+ title={t('settings.choose-storage-adaptor.label')}
224
+ description={t('settings.choose-storage-adaptor.description')}
225
+ >
226
+ <Select.Root
227
+ disabled={!onSettingsChange}
228
+ value={
229
+ Object.entries(StorageAdapters).find(
230
+ ([_name, value]) => value === storageConfig?.runtime?.client?.storage?.dataStore,
231
+ )?.[0]
232
+ }
233
+ onValueChange={handleStorageAdapterChange}
234
+ >
235
+ <Select.TriggerButton disabled={!onSettingsChange} placeholder={t('settings.data-store.label')} />
236
+ <Select.Portal>
237
+ <Select.Content>
238
+ <Select.Viewport>
239
+ {Object.keys(StorageAdapters).map((key) => (
240
+ <Select.Option key={key} value={key}>
241
+ {t(`settings.storage-adaptor.${key}.label`)}
242
+ </Select.Option>
243
+ ))}
244
+ </Select.Viewport>
245
+ <Select.Arrow />
246
+ </Select.Content>
247
+ </Select.Portal>
248
+ </Select.Root>
249
+ </SettingsForm.Item>
250
+ </SettingsForm.Section>
251
+ </SettingsForm.Viewport>
252
+ );
253
+ };
254
+
255
+ const updateConfig = (config: ConfigProto, setConfig: (newConfig: ConfigProto) => void, path: string[], value: any) => {
256
+ const storageConfigCopy = JSON.parse(JSON.stringify(config ?? {}));
257
+ setDeep(storageConfigCopy, path, value);
258
+ setConfig(storageConfigCopy);
259
+ queueMicrotask(async () => {
260
+ await SaveConfig(storageConfigCopy);
261
+ });
262
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export { DebugSettings as default } from './DebugSettings';
@@ -4,23 +4,23 @@
4
4
 
5
5
  import type * as Schema from 'effect/Schema';
6
6
 
7
- import { addressToA1Notation } from '@dxos/compute';
7
+ import { addressToA1Notation } from '@dxos/compute-hyperformula';
8
8
  import { ComputeGraph, ComputeGraphModel, DEFAULT_OUTPUT, NODE_INPUT, NODE_OUTPUT } from '@dxos/conductor';
9
9
  import { DXN, Filter, Key, type Type } from '@dxos/echo';
10
10
  import { View } from '@dxos/echo';
11
- import { type OperationInvoker } from '@dxos/operation';
12
- import { Markdown } from '@dxos/plugin-markdown/types';
13
- import { Sheet } from '@dxos/plugin-sheet/types';
14
- import { Diagram } from '@dxos/plugin-sketch/types';
15
- import { SpaceOperation } from '@dxos/plugin-space/types';
16
- import { faker } from '@dxos/random';
11
+ import { OperationInvoker } from '@dxos/operation';
12
+ import { Markdown } from '@dxos/plugin-markdown';
13
+ import { Sheet } from '@dxos/plugin-sheet';
14
+ import { Sketch } from '@dxos/plugin-sketch';
15
+ import { SpaceOperation } from '@dxos/plugin-space';
16
+ import { random } from '@dxos/random';
17
17
  import { type Client } from '@dxos/react-client';
18
18
  import { type Space } from '@dxos/react-client/echo';
19
19
  import { getTypenameFromQuery } from '@dxos/schema';
20
20
  import { type ValueGenerator, createAsyncGenerator } from '@dxos/schema/testing';
21
21
  import { range } from '@dxos/util';
22
22
 
23
- const generator: ValueGenerator = faker as any;
23
+ const generator: ValueGenerator = random as any;
24
24
 
25
25
  const findViewByTypename = async (views: View.View[], typename: string) => {
26
26
  return views.find((view) => getTypenameFromQuery(view.query.ast) === typename);
@@ -42,8 +42,6 @@ export const createGenerator = <S extends Type.AnyObj>(
42
42
  const staticSchema = client?.graph.schemaRegistry.query({ typename }).runSync()[0];
43
43
  if (!view && !staticSchema) {
44
44
  await invokePromise(SpaceOperation.AddSchema, { db: space.db, schema, show: false });
45
- } else if (!view && staticSchema) {
46
- await invokePromise(SpaceOperation.UseStaticSchema, { db: space.db, typename, show: false });
47
45
  }
48
46
 
49
47
  // Create objects.
@@ -59,8 +57,8 @@ export const staticGenerators = new Map<string, ObjectGenerator<any>>([
59
57
  const objects = range(n).map(() => {
60
58
  return space.db.add(
61
59
  Markdown.make({
62
- name: faker.commerce.productName(),
63
- content: faker.lorem.sentences(5),
60
+ name: random.commerce.productName(),
61
+ content: random.lorem.sentences(5),
64
62
  }),
65
63
  );
66
64
  });
@@ -70,10 +68,10 @@ export const staticGenerators = new Map<string, ObjectGenerator<any>>([
70
68
  },
71
69
  ],
72
70
  [
73
- Diagram.Diagram.typename,
71
+ Sketch.Sketch.typename,
74
72
  async (space, n, cb) => {
75
73
  const objects = range(n).map(() => {
76
- const obj = space.db.add(Diagram.make({ name: faker.commerce.productName() }));
74
+ const obj = space.db.add(Sketch.make({ name: random.commerce.productName() }));
77
75
  return obj;
78
76
  });
79
77
 
@@ -109,7 +107,7 @@ export const staticGenerators = new Map<string, ObjectGenerator<any>>([
109
107
  // TODO(burdon): Set formatting for columns.
110
108
  return space.db.add(
111
109
  Sheet.make({
112
- name: faker.commerce.productName(),
110
+ name: random.commerce.productName(),
113
111
  cells,
114
112
  }),
115
113
  );
@@ -15,7 +15,7 @@ import {
15
15
  } from '@antv/layout';
16
16
  import { type Editor, type SerializedStore, type TLRecord, createBindingId, createShapeId } from '@tldraw/tldraw';
17
17
 
18
- import { faker } from '@dxos/random';
18
+ import { random } from '@dxos/random';
19
19
  import { isTruthy, range } from '@dxos/util';
20
20
 
21
21
  // TODO(burdon): Graph layout:
@@ -32,10 +32,10 @@ import { isTruthy, range } from '@dxos/util';
32
32
  // TODO(burdon): Factor out.
33
33
  // TODO(burdon): Map ECHO to Graph.
34
34
  export const generateGraph = (): Graph<PlainObject, PlainObject> => {
35
- const nodes = range(faker.number.int({ min: 8, max: 32 })).map(() => ({
36
- id: faker.string.uuid(),
35
+ const nodes = range(random.number.int({ min: 8, max: 32 })).map(() => ({
36
+ id: random.string.uuid(),
37
37
  data: {
38
- label: faker.lorem
38
+ label: random.lorem
39
39
  .words(2)
40
40
  .split(' ')
41
41
  .map((word) => word.charAt(0).toUpperCase())
@@ -46,7 +46,7 @@ export const generateGraph = (): Graph<PlainObject, PlainObject> => {
46
46
  const unlinked = new Set(nodes.map((node) => node.id));
47
47
  const pop = () => {
48
48
  if (unlinked.size) {
49
- const id = faker.helpers.arrayElement(Array.from(unlinked));
49
+ const id = random.helpers.arrayElement(Array.from(unlinked));
50
50
  unlinked.delete(id);
51
51
  return id;
52
52
  }
@@ -54,12 +54,12 @@ export const generateGraph = (): Graph<PlainObject, PlainObject> => {
54
54
 
55
55
  const edges: Edge<PlainObject>[] = [];
56
56
  const link = (source: string, target: string) => {
57
- edges.push({ id: faker.string.uuid(), source, target, data: {} });
57
+ edges.push({ id: random.string.uuid(), source, target, data: {} });
58
58
  };
59
59
 
60
60
  const branching = 3;
61
61
  const traverse = (source: string) => {
62
- const targets = range(faker.number.int({ min: 1, max: branching }))
62
+ const targets = range(random.number.int({ min: 1, max: branching }))
63
63
  .map(() => {
64
64
  const target = pop();
65
65
  if (target) {
@@ -106,7 +106,7 @@ export const drawGraph = async (
106
106
  preventOverlap: true,
107
107
  };
108
108
 
109
- const layoutType = faker.helpers.arrayElement(['d3force', 'grid', 'radial']);
109
+ const layoutType = random.helpers.arrayElement(['d3force', 'grid', 'radial']);
110
110
  let layout: Layout<any>;
111
111
  switch (layoutType) {
112
112
  case 'd3force': {
@@ -4,15 +4,14 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { AgentFunctions, EntityExtractionFunctions, ResearchBlueprint } from '@dxos/assistant-toolkit';
8
- import { Prompt } from '@dxos/blueprints';
7
+ import { AgentPrompt, WebSearchBlueprint } from '@dxos/assistant-toolkit';
8
+ import { Routine, Trigger, Operation } from '@dxos/compute';
9
9
  import { type ComputeGraphModel, NODE_INPUT } from '@dxos/conductor';
10
10
  import { DXN, Feed, Filter, JsonSchema, Key, Obj, Query, type QueryAST, Ref, Tag } from '@dxos/echo';
11
- import { Trigger, serializeFunction } from '@dxos/functions';
12
11
  import { invariant } from '@dxos/invariant';
13
- import { GmailFunctions } from '@dxos/plugin-inbox';
14
- import { Mailbox } from '@dxos/plugin-inbox/types';
15
- import { Markdown } from '@dxos/plugin-markdown/types';
12
+ import { InboxOperation } from '@dxos/plugin-inbox';
13
+ import { Mailbox } from '@dxos/plugin-inbox';
14
+ import { Markdown } from '@dxos/plugin-markdown';
16
15
  import { type Space } from '@dxos/react-client/echo';
17
16
  import {
18
17
  type ComputeShape,
@@ -20,9 +19,9 @@ import {
20
19
  createChat,
21
20
  createComputeGraph,
22
21
  createConstant,
22
+ createFeed,
23
23
  createFunction,
24
24
  createGpt,
25
- createQueue,
26
25
  createRandom,
27
26
  createSurface,
28
27
  createTemplate,
@@ -73,8 +72,8 @@ export const generator = () => ({
73
72
 
74
73
  const tag = space.db.add(Tag.make({ label: 'Investor' }));
75
74
  const tagDxn = Obj.getDXN(tag).toString();
76
- Obj.change(doc, (d) => {
77
- Obj.getMeta(d).tags = [tagDxn];
75
+ Obj.update(doc, (doc) => {
76
+ Obj.getMeta(doc).tags = [tagDxn];
78
77
  });
79
78
 
80
79
  // space.db.add(
@@ -116,10 +115,12 @@ export const generator = () => ({
116
115
  [
117
116
  PresetName.ORG_RESEARCH_PROJECT,
118
117
  async (space, n, cb) => {
119
- const feeds = await space.db.query(Filter.type(Feed.Feed)).run();
120
- const mailbox = feeds.find((feed) => feed.kind === Mailbox.kind);
121
- invariant(mailbox, 'Mailbox feed not found');
122
- const queueDxn = Feed.getQueueDxn(mailbox)?.toString();
118
+ const mailboxes = await space.db.query(Filter.type(Mailbox.Mailbox)).run();
119
+ const mailbox = mailboxes[0];
120
+ invariant(mailbox, 'Mailbox not found');
121
+ const mailboxFeed = await mailbox.feed?.tryLoad();
122
+ invariant(mailboxFeed, 'Mailbox missing feed reference');
123
+ const queueDxn = Feed.getQueueDxn(mailboxFeed)?.toString();
123
124
  invariant(queueDxn, 'Mailbox feed missing queue DXN key');
124
125
  const tag = await space.db.query(Filter.type(Tag.Tag, { label: 'Investor' })).first();
125
126
  const tagDxn = Obj.getDXN(tag).toString();
@@ -132,34 +133,16 @@ export const generator = () => ({
132
133
  space.db.add(
133
134
  Trigger.make({
134
135
  enabled: true,
135
- spec: {
136
- kind: 'timer',
137
- cron: '* * * * *', // Every minute.
138
- },
139
- function: Ref.make(serializeFunction(GmailFunctions.Sync)),
136
+ spec: Trigger.specTimer('* * * * *'), // Every minute.
137
+ function: Ref.make(Operation.serialize(InboxOperation.GoogleMailSync)),
140
138
  input: {
141
139
  mailbox: Ref.make(mailbox),
142
140
  },
143
141
  }),
144
142
  );
145
143
 
146
- space.db.add(
147
- Trigger.make({
148
- enabled: true,
149
- // TODO(wittjosiah): Queue trigger doesn't support matching query of the column.
150
- spec: {
151
- kind: 'queue',
152
- queue: queueDxn,
153
- },
154
- function: Ref.make(serializeFunction(EntityExtractionFunctions.Extract)),
155
- input: {
156
- source: '{{event.item}}',
157
- },
158
- }),
159
- );
160
-
161
144
  const researchPrompt = space.db.add(
162
- Prompt.make({
145
+ Routine.make({
163
146
  name: 'Research',
164
147
  description: 'Research organization',
165
148
  input: Schema.Struct({
@@ -174,20 +157,15 @@ export const generator = () => ({
174
157
  Create a research note for it at the end.
175
158
  NOTE: Do mocked reseach (set mockSearch to true).
176
159
  `,
177
- blueprints: [Ref.make(ResearchBlueprint.make())],
160
+ blueprints: [Ref.make(WebSearchBlueprint.make())],
178
161
  }),
179
162
  );
180
163
 
181
164
  space.db.add(
182
165
  Trigger.make({
183
166
  enabled: true,
184
- spec: {
185
- kind: 'subscription',
186
- query: {
187
- ast: organizationsQuery.ast,
188
- },
189
- },
190
- function: Ref.make(serializeFunction(AgentFunctions.Prompt)),
167
+ spec: Trigger.specSubscription(organizationsQuery),
168
+ function: Ref.make(Operation.serialize(AgentPrompt)),
191
169
  input: {
192
170
  prompt: Ref.make(researchPrompt),
193
171
  input: '{{event.subject}}',
@@ -313,7 +291,7 @@ export const generator = () => ({
313
291
  'subscription',
314
292
  (triggerSpec) =>
315
293
  (triggerSpec.query = {
316
- ast: Query.select(Filter.typename('dxos.org/type/Chess')).ast as Obj.Mutable<QueryAST.Query>,
294
+ ast: Query.select(Filter.typename('org.dxos.type.chess')).ast as Obj.Mutable<QueryAST.Query>,
317
295
  }),
318
296
  'type',
319
297
  );
@@ -615,7 +593,7 @@ export const generator = () => ({
615
593
  );
616
594
  const converter = canvasModel.createNode(createFunction(position({ x: 0, y: 0 })));
617
595
  const view = canvasModel.createNode(createText(position({ x: 12, y: 0 })));
618
- const queue = canvasModel.createNode(createQueue(position({ x: 0, y: 12 })));
596
+ const queue = canvasModel.createNode(createFeed(position({ x: 0, y: 12 })));
619
597
 
620
598
  builder
621
599
  .createEdge({
@@ -760,8 +738,8 @@ const createQueueSinkPreset = <SpecType extends Trigger.Kind>(
760
738
  functionTrigger = triggerShape.functionTrigger!.target!;
761
739
  const triggerSpec = functionTrigger.spec;
762
740
  invariant(triggerSpec && triggerSpec.kind === triggerKind, 'No trigger spec.');
763
- Obj.change(functionTrigger, (ft) => {
764
- initSpec(ft.spec as any);
741
+ Obj.update(functionTrigger, (functionTrigger) => {
742
+ initSpec(functionTrigger.spec as any);
765
743
  });
766
744
  });
767
745
 
@@ -801,7 +779,7 @@ const setupQueue = (
801
779
  }),
802
780
  );
803
781
  const queue = canvasModel.createNode(
804
- createQueue(
782
+ createFeed(
805
783
  args?.queuePosition ? rawPosition(args.queuePosition) : position({ x: -3, y: 3, width: 14, height: 10 }),
806
784
  ),
807
785
  );
@@ -812,9 +790,9 @@ const setupQueue = (
812
790
  const attachTrigger = (functionTrigger: Trigger.Trigger | undefined, computeModel: ComputeGraphModel) => {
813
791
  invariant(functionTrigger);
814
792
  const inputNode = computeModel.nodes.find((node) => node.type === NODE_INPUT)!;
815
- Obj.change(functionTrigger, (t) => {
816
- t.function = Ref.make(computeModel.root);
817
- t.inputNodeId = inputNode.id;
793
+ Obj.update(functionTrigger, (functionTrigger) => {
794
+ functionTrigger.function = Ref.make(computeModel.root);
795
+ functionTrigger.inputNodeId = inputNode.id;
818
796
  });
819
797
  };
820
798
 
@@ -2,5 +2,9 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export const DebugSettings: ComponentType<any> = lazy(() => import('./DebugSettings'));
8
+
5
9
  export * from './SchemaTable';
6
10
  export * from './SpaceGenerator';
@@ -2,12 +2,13 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React, { type FC } from 'react';
5
+ import React from 'react';
6
6
 
7
7
  import { Tree } from '@dxos/devtools';
8
8
  import { Graph } from '@dxos/plugin-graph';
9
9
 
10
10
  export type DebugGraphProps = { graph: Graph.Graph; root: string };
11
- export const DebugGraph: FC<DebugGraphProps> = ({ graph, root }) => {
11
+
12
+ export const DebugGraph = ({ graph, root }: DebugGraphProps) => {
12
13
  return <Tree data={Graph.toJSON(graph, root)} />;
13
14
  };
@@ -2,6 +2,4 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { DebugGraph } from './DebugGraph';
6
-
7
- export default DebugGraph;
5
+ export { DebugGraph as default } from './DebugGraph';