@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.
- package/dist/lib/{browser/DebugGraph-7HXJ2PS2.mjs → neutral/DebugGraph-G4FWS57E.mjs} +4 -5
- package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs.map +7 -0
- package/dist/lib/neutral/DebugObjectPanel-UJ63CV25.mjs +59 -0
- package/dist/lib/neutral/DebugObjectPanel-UJ63CV25.mjs.map +7 -0
- package/dist/lib/neutral/DebugPlugin.mjs +47 -0
- package/dist/lib/neutral/DebugPlugin.mjs.map +7 -0
- package/dist/lib/neutral/DebugPlugin.node.mjs +18 -0
- package/dist/lib/neutral/DebugPlugin.node.mjs.map +7 -0
- package/dist/lib/neutral/DebugSettings-Z3XADRNK.mjs +224 -0
- package/dist/lib/neutral/DebugSettings-Z3XADRNK.mjs.map +7 -0
- package/dist/lib/{browser/DebugSpaceObjectsPanel-7NRPLWZ4.mjs → neutral/DebugSpaceObjectsPanel-NISULU6U.mjs} +10 -26
- package/dist/lib/neutral/DebugSpaceObjectsPanel-NISULU6U.mjs.map +7 -0
- package/dist/lib/{browser/DebugStatus-COQGH37G.mjs → neutral/DebugStatus-YB3KFP7G.mjs} +35 -39
- package/dist/lib/neutral/DebugStatus-YB3KFP7G.mjs.map +7 -0
- package/dist/lib/{browser/DevtoolsOverviewContainer-C75NFVER.mjs → neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs} +9 -6
- package/dist/lib/neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs.map +7 -0
- package/dist/lib/neutral/SpaceGenerator-UBYB4NPD.mjs +143 -0
- package/dist/lib/neutral/SpaceGenerator-UBYB4NPD.mjs.map +7 -0
- package/dist/lib/{browser/Wireframe-KAGOKEFW.mjs → neutral/Wireframe-7SNRUKET.mjs} +8 -9
- package/dist/lib/neutral/Wireframe-7SNRUKET.mjs.map +7 -0
- package/dist/lib/{browser/app-graph-builder-LGUQNXHD.mjs → neutral/app-graph-builder-YPYHL2K5.mjs} +210 -258
- package/dist/lib/neutral/app-graph-builder-YPYHL2K5.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +15 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/{browser/chunk-A5H5GRV6.mjs → neutral/chunk-3OGPOE7H.mjs} +2 -2
- package/dist/lib/{browser/chunk-A5H5GRV6.mjs.map → neutral/chunk-3OGPOE7H.mjs.map} +3 -3
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/{browser/chunk-4UFQXPP7.mjs → neutral/chunk-NFIOTQRZ.mjs} +23 -12
- package/dist/lib/neutral/chunk-NFIOTQRZ.mjs.map +7 -0
- package/dist/lib/{browser/SpaceGenerator-SWSGJEEL.mjs → neutral/components/index.mjs} +60 -253
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +21 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +18 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +8 -0
- package/dist/lib/neutral/meta.mjs.map +7 -0
- package/dist/lib/neutral/plugin.mjs +12 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/{browser/react-context-I3USIAF6.mjs → neutral/react-context-MUZ3KVLU.mjs} +6 -6
- package/dist/lib/neutral/react-context-MUZ3KVLU.mjs.map +7 -0
- package/dist/lib/{browser/react-surface-BTVNKKVQ.mjs → neutral/react-surface-NH2H63KW.mjs} +153 -176
- package/dist/lib/neutral/react-surface-NH2H63KW.mjs.map +7 -0
- package/dist/lib/{browser/settings-SLTQJJNF.mjs → neutral/settings-MPM6YUP4.mjs} +7 -11
- package/dist/lib/neutral/settings-MPM6YUP4.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +83 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +14 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/types/src/DebugPlugin.d.ts +2 -5
- package/dist/types/src/DebugPlugin.d.ts.map +1 -1
- package/dist/types/src/DebugPlugin.node.d.ts +5 -0
- package/dist/types/src/DebugPlugin.node.d.ts.map +1 -0
- package/dist/types/src/DebugPlugin.test.d.ts +2 -0
- package/dist/types/src/DebugPlugin.test.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +11 -4
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-context.d.ts.map +1 -0
- package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/{settings/settings.d.ts → settings.d.ts} +2 -1
- package/dist/types/src/capabilities/settings.d.ts.map +1 -0
- package/dist/types/src/components/DebugSettings/DebugSettings.d.ts +11 -0
- package/dist/types/src/components/DebugSettings/DebugSettings.d.ts.map +1 -0
- package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts +99 -0
- package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts.map +1 -0
- package/dist/types/src/components/DebugSettings/index.d.ts +2 -0
- package/dist/types/src/components/DebugSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +2 -2
- package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/draw-util.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +2 -2
- package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +1 -1
- package/dist/types/src/containers/DebugGraph/index.d.ts +1 -2
- package/dist/types/src/containers/DebugGraph/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +3 -4
- package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
- package/dist/types/src/containers/DebugObjectPanel/index.d.ts +1 -2
- package/dist/types/src/containers/DebugObjectPanel/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +3 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts +1 -2
- package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -1
- package/dist/types/src/containers/DebugStatus/index.d.ts +1 -2
- package/dist/types/src/containers/DebugStatus/index.d.ts.map +1 -1
- package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts.map +1 -1
- package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +1 -2
- package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts +3 -1
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceGenerator/index.d.ts +1 -2
- package/dist/types/src/containers/SpaceGenerator/index.d.ts.map +1 -1
- package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
- package/dist/types/src/containers/Wireframe/index.d.ts +1 -2
- package/dist/types/src/containers/Wireframe/index.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +0 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +80 -61
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Settings.d.ts +8 -0
- package/dist/types/src/types/Settings.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +69 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +115 -64
- package/src/DebugPlugin.node.ts +18 -0
- package/src/DebugPlugin.test.ts +29 -0
- package/src/DebugPlugin.tsx +9 -11
- package/src/capabilities/app-graph-builder.ts +405 -0
- package/src/capabilities/index.ts +6 -4
- package/src/capabilities/{react-context/react-context.tsx → react-context.tsx} +7 -2
- package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +169 -158
- package/src/capabilities/{settings/settings.ts → settings.ts} +4 -4
- package/src/components/DebugSettings/DebugSettings.stories.tsx +36 -0
- package/src/components/DebugSettings/DebugSettings.tsx +262 -0
- package/src/components/DebugSettings/index.ts +5 -0
- package/src/components/SpaceGenerator/ObjectGenerator.tsx +13 -15
- package/src/components/SpaceGenerator/draw-util.ts +8 -8
- package/src/components/SpaceGenerator/presets.ts +28 -50
- package/src/components/index.ts +4 -0
- package/src/containers/DebugGraph/DebugGraph.tsx +3 -2
- package/src/containers/DebugGraph/index.ts +1 -3
- package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +47 -16
- package/src/containers/DebugObjectPanel/index.ts +1 -3
- package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +10 -23
- package/src/containers/DebugSpaceObjectsPanel/index.ts +1 -3
- package/src/containers/DebugStatus/DebugStatus.tsx +41 -19
- package/src/containers/DebugStatus/index.ts +1 -3
- package/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx +8 -1
- package/src/containers/DevtoolsOverviewContainer/index.ts +1 -3
- package/src/containers/SpaceGenerator/SpaceGenerator.tsx +102 -103
- package/src/containers/SpaceGenerator/index.ts +1 -3
- package/src/containers/Wireframe/Wireframe.tsx +2 -6
- package/src/containers/Wireframe/index.ts +1 -3
- package/src/containers/index.ts +0 -1
- package/src/index.ts +1 -1
- package/src/meta.ts +1 -1
- package/src/plugin.ts +10 -0
- package/src/translations.ts +75 -60
- package/src/types/Settings.ts +16 -0
- package/src/{types.ts → types/index.ts} +15 -14
- package/dist/lib/browser/DebugGraph-7HXJ2PS2.mjs.map +0 -7
- package/dist/lib/browser/DebugObjectPanel-3TCDNUNW.mjs +0 -33
- package/dist/lib/browser/DebugObjectPanel-3TCDNUNW.mjs.map +0 -7
- package/dist/lib/browser/DebugSettings-JZMIUDYB.mjs +0 -174
- package/dist/lib/browser/DebugSettings-JZMIUDYB.mjs.map +0 -7
- package/dist/lib/browser/DebugSpaceObjectsPanel-7NRPLWZ4.mjs.map +0 -7
- package/dist/lib/browser/DebugStatus-COQGH37G.mjs.map +0 -7
- package/dist/lib/browser/DevtoolsOverviewContainer-C75NFVER.mjs.map +0 -7
- package/dist/lib/browser/SpaceGenerator-SWSGJEEL.mjs.map +0 -7
- package/dist/lib/browser/Wireframe-KAGOKEFW.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-LGUQNXHD.mjs.map +0 -7
- package/dist/lib/browser/chunk-4UFQXPP7.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -132
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/react-context-I3USIAF6.mjs.map +0 -7
- package/dist/lib/browser/react-surface-BTVNKKVQ.mjs.map +0 -7
- package/dist/lib/browser/settings-SLTQJJNF.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-context/index.d.ts +0 -7
- package/dist/types/src/capabilities/react-context/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-context/react-context.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +0 -5
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings/index.d.ts +0 -3
- package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
- package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +0 -10
- package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +0 -1
- package/dist/types/src/containers/DebugSettings/index.d.ts +0 -3
- package/dist/types/src/containers/DebugSettings/index.d.ts.map +0 -1
- package/dist/types/src/types.d.ts +0 -68
- package/dist/types/src/types.d.ts.map +0 -1
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +0 -441
- package/src/capabilities/app-graph-builder/index.ts +0 -7
- package/src/capabilities/react-context/index.ts +0 -7
- package/src/capabilities/react-surface/index.ts +0 -7
- package/src/capabilities/settings/index.ts +0 -7
- package/src/containers/DebugSettings/DebugSettings.tsx +0 -201
- package/src/containers/DebugSettings/index.ts +0 -7
- /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
- /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
|
+
};
|
|
@@ -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 {
|
|
12
|
-
import { Markdown } from '@dxos/plugin-markdown
|
|
13
|
-
import { Sheet } from '@dxos/plugin-sheet
|
|
14
|
-
import {
|
|
15
|
-
import { SpaceOperation } from '@dxos/plugin-space
|
|
16
|
-
import {
|
|
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 =
|
|
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:
|
|
63
|
-
content:
|
|
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
|
-
|
|
71
|
+
Sketch.Sketch.typename,
|
|
74
72
|
async (space, n, cb) => {
|
|
75
73
|
const objects = range(n).map(() => {
|
|
76
|
-
const obj = space.db.add(
|
|
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:
|
|
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 {
|
|
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(
|
|
36
|
-
id:
|
|
35
|
+
const nodes = range(random.number.int({ min: 8, max: 32 })).map(() => ({
|
|
36
|
+
id: random.string.uuid(),
|
|
37
37
|
data: {
|
|
38
|
-
label:
|
|
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 =
|
|
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:
|
|
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(
|
|
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 =
|
|
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 {
|
|
8
|
-
import {
|
|
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 {
|
|
14
|
-
import { Mailbox } from '@dxos/plugin-inbox
|
|
15
|
-
import { Markdown } from '@dxos/plugin-markdown
|
|
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.
|
|
77
|
-
Obj.getMeta(
|
|
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
|
|
120
|
-
const mailbox =
|
|
121
|
-
invariant(mailbox, 'Mailbox
|
|
122
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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(
|
|
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.
|
|
764
|
-
initSpec(
|
|
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
|
-
|
|
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.
|
|
816
|
-
|
|
817
|
-
|
|
793
|
+
Obj.update(functionTrigger, (functionTrigger) => {
|
|
794
|
+
functionTrigger.function = Ref.make(computeModel.root);
|
|
795
|
+
functionTrigger.inputNodeId = inputNode.id;
|
|
818
796
|
});
|
|
819
797
|
};
|
|
820
798
|
|
package/src/components/index.ts
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import 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
|
-
|
|
11
|
+
|
|
12
|
+
export const DebugGraph = ({ graph, root }: DebugGraphProps) => {
|
|
12
13
|
return <Tree data={Graph.toJSON(graph, root)} />;
|
|
13
14
|
};
|