@dxos/plugin-debug 0.8.4-main.7996785055 → 0.8.4-main.8baae0fced

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 (217) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/{browser/DebugGraph-7HXJ2PS2.mjs → neutral/DebugGraph-G4FWS57E.mjs} +4 -5
  4. package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs.map +7 -0
  5. package/dist/lib/neutral/DebugObjectPanel-UJ63CV25.mjs +59 -0
  6. package/dist/lib/neutral/DebugObjectPanel-UJ63CV25.mjs.map +7 -0
  7. package/dist/lib/neutral/DebugPlugin.mjs +47 -0
  8. package/dist/lib/neutral/DebugPlugin.mjs.map +7 -0
  9. package/dist/lib/neutral/DebugPlugin.node.mjs +18 -0
  10. package/dist/lib/neutral/DebugPlugin.node.mjs.map +7 -0
  11. package/dist/lib/neutral/DebugPlugin.workerd.mjs +12 -0
  12. package/dist/lib/neutral/DebugPlugin.workerd.mjs.map +7 -0
  13. package/dist/lib/neutral/DebugSettings-Z3XADRNK.mjs +224 -0
  14. package/dist/lib/neutral/DebugSettings-Z3XADRNK.mjs.map +7 -0
  15. package/dist/lib/{browser/DebugSpaceObjectsPanel-SIK72DXV.mjs → neutral/DebugSpaceObjectsPanel-NISULU6U.mjs} +9 -20
  16. package/dist/lib/neutral/DebugSpaceObjectsPanel-NISULU6U.mjs.map +7 -0
  17. package/dist/lib/{browser/DebugStatus-FWF3YFBA.mjs → neutral/DebugStatus-YB3KFP7G.mjs} +5 -8
  18. package/dist/lib/neutral/DebugStatus-YB3KFP7G.mjs.map +7 -0
  19. package/dist/lib/{browser/DevtoolsOverviewContainer-TBTTPXVF.mjs → neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs} +4 -5
  20. package/dist/lib/neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs.map +7 -0
  21. package/dist/lib/neutral/GithubPanel-DAIR6QSZ.mjs +177 -0
  22. package/dist/lib/neutral/GithubPanel-DAIR6QSZ.mjs.map +7 -0
  23. package/dist/lib/neutral/SpaceGenerator-UBYB4NPD.mjs +143 -0
  24. package/dist/lib/neutral/SpaceGenerator-UBYB4NPD.mjs.map +7 -0
  25. package/dist/lib/{browser/Wireframe-KAGOKEFW.mjs → neutral/Wireframe-7SNRUKET.mjs} +8 -9
  26. package/dist/lib/neutral/Wireframe-7SNRUKET.mjs.map +7 -0
  27. package/dist/lib/{browser/app-graph-builder-FBLOEOH5.mjs → neutral/app-graph-builder-OIC65GEP.mjs} +169 -186
  28. package/dist/lib/neutral/app-graph-builder-OIC65GEP.mjs.map +7 -0
  29. package/dist/lib/neutral/capabilities/index.mjs +15 -0
  30. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  32. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  33. package/dist/lib/{browser/chunk-Q37TZWW5.mjs → neutral/chunk-NFIOTQRZ.mjs} +21 -10
  34. package/dist/lib/neutral/chunk-NFIOTQRZ.mjs.map +7 -0
  35. package/dist/lib/{browser/chunk-ZOM2FBHQ.mjs → neutral/chunk-SWW2QL66.mjs} +5 -1
  36. package/dist/lib/neutral/chunk-SWW2QL66.mjs.map +7 -0
  37. package/dist/lib/{browser/SpaceGenerator-UUQS6TYY.mjs → neutral/components/index.mjs} +61 -264
  38. package/dist/lib/neutral/components/index.mjs.map +7 -0
  39. package/dist/lib/neutral/containers/index.mjs +23 -0
  40. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  41. package/dist/lib/neutral/index.mjs +18 -0
  42. package/dist/lib/neutral/index.mjs.map +7 -0
  43. package/dist/lib/neutral/meta.json +1 -0
  44. package/dist/lib/neutral/meta.mjs +8 -0
  45. package/dist/lib/neutral/meta.mjs.map +7 -0
  46. package/dist/lib/neutral/plugin.mjs +12 -0
  47. package/dist/lib/neutral/plugin.mjs.map +7 -0
  48. package/dist/lib/{browser/react-context-KBHXEMRS.mjs → neutral/react-context-MUZ3KVLU.mjs} +4 -5
  49. package/dist/lib/neutral/react-context-MUZ3KVLU.mjs.map +7 -0
  50. package/dist/lib/{browser/react-surface-HYT4HKZX.mjs → neutral/react-surface-UP747GQ7.mjs} +148 -157
  51. package/dist/lib/neutral/react-surface-UP747GQ7.mjs.map +7 -0
  52. package/dist/lib/{browser/settings-XXFUM3QJ.mjs → neutral/settings-MPM6YUP4.mjs} +7 -11
  53. package/dist/lib/neutral/settings-MPM6YUP4.mjs.map +7 -0
  54. package/dist/lib/neutral/translations.mjs +89 -0
  55. package/dist/lib/neutral/translations.mjs.map +7 -0
  56. package/dist/lib/neutral/types/index.mjs +14 -0
  57. package/dist/lib/neutral/types/index.mjs.map +7 -0
  58. package/dist/types/src/DebugPlugin.d.ts +2 -5
  59. package/dist/types/src/DebugPlugin.d.ts.map +1 -1
  60. package/dist/types/src/DebugPlugin.node.d.ts +5 -0
  61. package/dist/types/src/DebugPlugin.node.d.ts.map +1 -0
  62. package/dist/types/src/DebugPlugin.test.d.ts +2 -0
  63. package/dist/types/src/DebugPlugin.test.d.ts.map +1 -0
  64. package/dist/types/src/DebugPlugin.workerd.d.ts +5 -0
  65. package/dist/types/src/DebugPlugin.workerd.d.ts.map +1 -0
  66. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/index.d.ts +11 -4
  68. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/react-context.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +2 -2
  71. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/{settings/settings.d.ts → settings.d.ts} +2 -1
  73. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  74. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts +11 -0
  75. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts.map +1 -0
  76. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts +104 -0
  77. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts.map +1 -0
  78. package/dist/types/src/components/DebugSettings/index.d.ts +2 -0
  79. package/dist/types/src/components/DebugSettings/index.d.ts.map +1 -0
  80. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
  81. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +2 -2
  82. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
  83. package/dist/types/src/components/SpaceGenerator/draw-util.d.ts.map +1 -1
  84. package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
  85. package/dist/types/src/components/index.d.ts +2 -0
  86. package/dist/types/src/components/index.d.ts.map +1 -1
  87. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +2 -2
  88. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +1 -1
  89. package/dist/types/src/containers/DebugGraph/index.d.ts +1 -2
  90. package/dist/types/src/containers/DebugGraph/index.d.ts.map +1 -1
  91. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +3 -4
  92. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
  93. package/dist/types/src/containers/DebugObjectPanel/index.d.ts +1 -2
  94. package/dist/types/src/containers/DebugObjectPanel/index.d.ts.map +1 -1
  95. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +3 -1
  96. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
  97. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts +1 -2
  98. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts.map +1 -1
  99. package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -1
  100. package/dist/types/src/containers/DebugStatus/index.d.ts +1 -2
  101. package/dist/types/src/containers/DebugStatus/index.d.ts.map +1 -1
  102. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +1 -2
  103. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +1 -1
  104. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts +15 -0
  105. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts.map +1 -0
  106. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts +104 -0
  107. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts.map +1 -0
  108. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts +3 -0
  109. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts.map +1 -0
  110. package/dist/types/src/containers/GithubPanel/index.d.ts +2 -0
  111. package/dist/types/src/containers/GithubPanel/index.d.ts.map +1 -0
  112. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts +1 -5
  113. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
  114. package/dist/types/src/containers/SpaceGenerator/index.d.ts +1 -2
  115. package/dist/types/src/containers/SpaceGenerator/index.d.ts.map +1 -1
  116. package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
  117. package/dist/types/src/containers/Wireframe/index.d.ts +1 -2
  118. package/dist/types/src/containers/Wireframe/index.d.ts.map +1 -1
  119. package/dist/types/src/containers/index.d.ts +1 -1
  120. package/dist/types/src/containers/index.d.ts.map +1 -1
  121. package/dist/types/src/index.d.ts +1 -1
  122. package/dist/types/src/index.d.ts.map +1 -1
  123. package/dist/types/src/meta.d.ts.map +1 -1
  124. package/dist/types/src/plugin.d.ts +4 -0
  125. package/dist/types/src/plugin.d.ts.map +1 -0
  126. package/dist/types/src/translations.d.ts +85 -61
  127. package/dist/types/src/translations.d.ts.map +1 -1
  128. package/dist/types/src/types/Settings.d.ts +8 -0
  129. package/dist/types/src/types/Settings.d.ts.map +1 -0
  130. package/dist/types/src/{types.d.ts → types/index.d.ts} +10 -9
  131. package/dist/types/src/types/index.d.ts.map +1 -0
  132. package/dist/types/tsconfig.tsbuildinfo +1 -1
  133. package/package.json +116 -63
  134. package/src/DebugPlugin.node.ts +18 -0
  135. package/src/DebugPlugin.test.ts +29 -0
  136. package/src/DebugPlugin.tsx +9 -11
  137. package/src/DebugPlugin.workerd.ts +12 -0
  138. package/src/capabilities/{app-graph-builder/app-graph-builder.ts → app-graph-builder.ts} +139 -153
  139. package/src/capabilities/index.ts +6 -4
  140. package/src/capabilities/{react-context/react-context.tsx → react-context.tsx} +1 -1
  141. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +163 -139
  142. package/src/capabilities/{settings/settings.ts → settings.ts} +4 -4
  143. package/src/components/DebugSettings/DebugSettings.stories.tsx +36 -0
  144. package/src/components/DebugSettings/DebugSettings.tsx +262 -0
  145. package/src/components/DebugSettings/index.ts +5 -0
  146. package/src/components/SpaceGenerator/ObjectGenerator.tsx +13 -14
  147. package/src/components/SpaceGenerator/draw-util.ts +8 -8
  148. package/src/components/SpaceGenerator/presets.ts +27 -52
  149. package/src/components/index.ts +4 -0
  150. package/src/containers/DebugGraph/DebugGraph.tsx +3 -2
  151. package/src/containers/DebugGraph/index.ts +1 -3
  152. package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +44 -15
  153. package/src/containers/DebugObjectPanel/index.ts +1 -3
  154. package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +9 -17
  155. package/src/containers/DebugSpaceObjectsPanel/index.ts +1 -3
  156. package/src/containers/DebugStatus/DebugStatus.tsx +1 -3
  157. package/src/containers/DebugStatus/index.ts +1 -3
  158. package/src/containers/DevtoolsOverviewContainer/index.ts +1 -3
  159. package/src/containers/GithubPanel/GithubComponent.stories.tsx +38 -0
  160. package/src/containers/GithubPanel/GithubComponent.tsx +192 -0
  161. package/src/containers/GithubPanel/GithubPanel.tsx +17 -0
  162. package/src/containers/GithubPanel/index.ts +5 -0
  163. package/src/containers/SpaceGenerator/SpaceGenerator.tsx +16 -20
  164. package/src/containers/SpaceGenerator/index.ts +1 -3
  165. package/src/containers/Wireframe/Wireframe.tsx +2 -6
  166. package/src/containers/Wireframe/index.ts +1 -3
  167. package/src/containers/index.ts +1 -1
  168. package/src/index.ts +1 -1
  169. package/src/meta.ts +2 -0
  170. package/src/plugin.ts +10 -0
  171. package/src/translations.ts +81 -60
  172. package/src/types/Settings.ts +16 -0
  173. package/src/{types.ts → types/index.ts} +14 -12
  174. package/dist/lib/browser/DebugGraph-7HXJ2PS2.mjs.map +0 -7
  175. package/dist/lib/browser/DebugObjectPanel-KXVFOGU6.mjs +0 -35
  176. package/dist/lib/browser/DebugObjectPanel-KXVFOGU6.mjs.map +0 -7
  177. package/dist/lib/browser/DebugSettings-DQXOXF6A.mjs +0 -183
  178. package/dist/lib/browser/DebugSettings-DQXOXF6A.mjs.map +0 -7
  179. package/dist/lib/browser/DebugSpaceObjectsPanel-SIK72DXV.mjs.map +0 -7
  180. package/dist/lib/browser/DebugStatus-FWF3YFBA.mjs.map +0 -7
  181. package/dist/lib/browser/DevtoolsOverviewContainer-TBTTPXVF.mjs.map +0 -7
  182. package/dist/lib/browser/SpaceGenerator-UUQS6TYY.mjs.map +0 -7
  183. package/dist/lib/browser/Wireframe-KAGOKEFW.mjs.map +0 -7
  184. package/dist/lib/browser/app-graph-builder-FBLOEOH5.mjs.map +0 -7
  185. package/dist/lib/browser/chunk-Q37TZWW5.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-ZOM2FBHQ.mjs.map +0 -7
  187. package/dist/lib/browser/index.mjs +0 -132
  188. package/dist/lib/browser/index.mjs.map +0 -7
  189. package/dist/lib/browser/meta.json +0 -1
  190. package/dist/lib/browser/react-context-KBHXEMRS.mjs.map +0 -7
  191. package/dist/lib/browser/react-surface-HYT4HKZX.mjs.map +0 -7
  192. package/dist/lib/browser/settings-XXFUM3QJ.mjs.map +0 -7
  193. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  194. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  195. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  196. package/dist/types/src/capabilities/react-context/index.d.ts +0 -7
  197. package/dist/types/src/capabilities/react-context/index.d.ts.map +0 -1
  198. package/dist/types/src/capabilities/react-context/react-context.d.ts.map +0 -1
  199. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -5
  200. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  201. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  202. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  203. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  204. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  205. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +0 -10
  206. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +0 -1
  207. package/dist/types/src/containers/DebugSettings/index.d.ts +0 -3
  208. package/dist/types/src/containers/DebugSettings/index.d.ts.map +0 -1
  209. package/dist/types/src/types.d.ts.map +0 -1
  210. package/src/capabilities/app-graph-builder/index.ts +0 -7
  211. package/src/capabilities/react-context/index.ts +0 -7
  212. package/src/capabilities/react-surface/index.ts +0 -7
  213. package/src/capabilities/settings/index.ts +0 -7
  214. package/src/containers/DebugSettings/DebugSettings.tsx +0 -206
  215. package/src/containers/DebugSettings/index.ts +0 -7
  216. /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
  217. /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,22 @@
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
- import { DXN, Filter, Key, type Type } from '@dxos/echo';
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 { Sketch } from '@dxos/plugin-sketch/types';
15
- import { SpaceOperation } from '@dxos/plugin-space/operations';
16
- import { faker } from '@dxos/random';
9
+ import { DXN, Filter, Key, type Type, View } from '@dxos/echo';
10
+ import { OperationInvoker } from '@dxos/operation';
11
+ import { Markdown } from '@dxos/plugin-markdown';
12
+ import { Sheet } from '@dxos/plugin-sheet';
13
+ import { Sketch } from '@dxos/plugin-sketch';
14
+ import { SpaceOperation } from '@dxos/plugin-space';
15
+ import { random } from '@dxos/random';
17
16
  import { type Client } from '@dxos/react-client';
18
17
  import { type Space } from '@dxos/react-client/echo';
19
18
  import { getTypenameFromQuery } from '@dxos/schema';
20
19
  import { type ValueGenerator, createAsyncGenerator } from '@dxos/schema/testing';
21
20
  import { range } from '@dxos/util';
22
21
 
23
- const generator: ValueGenerator = faker as any;
22
+ const generator: ValueGenerator = random as any;
24
23
 
25
24
  const findViewByTypename = async (views: View.View[], typename: string) => {
26
25
  return views.find((view) => getTypenameFromQuery(view.query.ast) === typename);
@@ -57,8 +56,8 @@ export const staticGenerators = new Map<string, ObjectGenerator<any>>([
57
56
  const objects = range(n).map(() => {
58
57
  return space.db.add(
59
58
  Markdown.make({
60
- name: faker.commerce.productName(),
61
- content: faker.lorem.sentences(5),
59
+ name: random.commerce.productName(),
60
+ content: random.lorem.sentences(5),
62
61
  }),
63
62
  );
64
63
  });
@@ -71,7 +70,7 @@ export const staticGenerators = new Map<string, ObjectGenerator<any>>([
71
70
  Sketch.Sketch.typename,
72
71
  async (space, n, cb) => {
73
72
  const objects = range(n).map(() => {
74
- const obj = space.db.add(Sketch.make({ name: faker.commerce.productName() }));
73
+ const obj = space.db.add(Sketch.make({ name: random.commerce.productName() }));
75
74
  return obj;
76
75
  });
77
76
 
@@ -107,7 +106,7 @@ export const staticGenerators = new Map<string, ObjectGenerator<any>>([
107
106
  // TODO(burdon): Set formatting for columns.
108
107
  return space.db.add(
109
108
  Sheet.make({
110
- name: faker.commerce.productName(),
109
+ name: random.commerce.productName(),
111
110
  cells,
112
111
  }),
113
112
  );
@@ -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,16 +4,14 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { AgentPrompt, EntityExtraction, 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 } from '@dxos/functions';
12
11
  import { invariant } from '@dxos/invariant';
13
- import { Operation } from '@dxos/operation';
14
12
  import { InboxOperation } from '@dxos/plugin-inbox';
15
- import { Mailbox } from '@dxos/plugin-inbox/types';
16
- import { Markdown } from '@dxos/plugin-markdown/types';
13
+ import { Mailbox } from '@dxos/plugin-inbox';
14
+ import { Markdown } from '@dxos/plugin-markdown';
17
15
  import { type Space } from '@dxos/react-client/echo';
18
16
  import {
19
17
  type ComputeShape,
@@ -21,9 +19,9 @@ import {
21
19
  createChat,
22
20
  createComputeGraph,
23
21
  createConstant,
22
+ createFeed,
24
23
  createFunction,
25
24
  createGpt,
26
- createQueue,
27
25
  createRandom,
28
26
  createSurface,
29
27
  createTemplate,
@@ -73,9 +71,9 @@ export const generator = () => ({
73
71
  );
74
72
 
75
73
  const tag = space.db.add(Tag.make({ label: 'Investor' }));
76
- const tagDxn = Obj.getDXN(tag).toString();
77
- Obj.change(doc, (obj) => {
78
- Obj.getMeta(obj).tags = [tagDxn];
74
+ const tagDXN = Obj.getDXN(tag).toString();
75
+ Obj.update(doc, (doc) => {
76
+ Obj.getMeta(doc).tags = [tagDXN];
79
77
  });
80
78
 
81
79
  // space.db.add(
@@ -87,7 +85,7 @@ export const generator = () => ({
87
85
  // );
88
86
 
89
87
  space.db.add(
90
- Obj.make(Person.Person, { [Obj.Meta]: { tags: [tagDxn] }, fullName: 'Rich', organization: Ref.make(org) }),
88
+ Obj.make(Person.Person, { [Obj.Meta]: { tags: [tagDXN] }, fullName: 'Rich', organization: Ref.make(org) }),
91
89
  );
92
90
  space.db.add(
93
91
  Obj.make(Person.Person, {
@@ -122,23 +120,20 @@ export const generator = () => ({
122
120
  invariant(mailbox, 'Mailbox not found');
123
121
  const mailboxFeed = await mailbox.feed?.tryLoad();
124
122
  invariant(mailboxFeed, 'Mailbox missing feed reference');
125
- const queueDxn = Feed.getQueueDxn(mailboxFeed)?.toString();
126
- invariant(queueDxn, 'Mailbox feed missing queue DXN key');
123
+ const feedDXN = Feed.getQueueDxn(mailboxFeed)?.toString();
124
+ invariant(feedDXN, 'Mailbox feed missing DXN');
127
125
  const tag = await space.db.query(Filter.type(Tag.Tag, { label: 'Investor' })).first();
128
- const tagDxn = Obj.getDXN(tag).toString();
126
+ const tagDXN = Obj.getDXN(tag).toString();
129
127
 
130
128
  const objects = range(n, () => {
131
- const contactsQuery = Query.select(Filter.type(Person.Person)).select(Filter.tag(tagDxn));
132
- const organizationsQuery = Query.select(Filter.type(Organization.Organization)).select(Filter.tag(tagDxn));
133
- const notesQuery = Query.select(Filter.type(Markdown.Document)).select(Filter.tag(tagDxn));
129
+ const contactsQuery = Query.select(Filter.type(Person.Person)).select(Filter.tag(tagDXN));
130
+ const organizationsQuery = Query.select(Filter.type(Organization.Organization)).select(Filter.tag(tagDXN));
131
+ const notesQuery = Query.select(Filter.type(Markdown.Document)).select(Filter.tag(tagDXN));
134
132
 
135
133
  space.db.add(
136
134
  Trigger.make({
137
135
  enabled: true,
138
- spec: {
139
- kind: 'timer',
140
- cron: '* * * * *', // Every minute.
141
- },
136
+ spec: Trigger.specTimer('* * * * *'), // Every minute.
142
137
  function: Ref.make(Operation.serialize(InboxOperation.GoogleMailSync)),
143
138
  input: {
144
139
  mailbox: Ref.make(mailbox),
@@ -146,23 +141,8 @@ export const generator = () => ({
146
141
  }),
147
142
  );
148
143
 
149
- space.db.add(
150
- Trigger.make({
151
- enabled: true,
152
- // TODO(wittjosiah): Queue trigger doesn't support matching query of the column.
153
- spec: {
154
- kind: 'queue',
155
- queue: queueDxn,
156
- },
157
- function: Ref.make(Operation.serialize(EntityExtraction)),
158
- input: {
159
- source: '{{event.item}}',
160
- },
161
- }),
162
- );
163
-
164
144
  const researchPrompt = space.db.add(
165
- Prompt.make({
145
+ Routine.make({
166
146
  name: 'Research',
167
147
  description: 'Research organization',
168
148
  input: Schema.Struct({
@@ -177,19 +157,14 @@ export const generator = () => ({
177
157
  Create a research note for it at the end.
178
158
  NOTE: Do mocked reseach (set mockSearch to true).
179
159
  `,
180
- blueprints: [Ref.make(ResearchBlueprint.make())],
160
+ blueprints: [Ref.make(WebSearchBlueprint.make())],
181
161
  }),
182
162
  );
183
163
 
184
164
  space.db.add(
185
165
  Trigger.make({
186
166
  enabled: true,
187
- spec: {
188
- kind: 'subscription',
189
- query: {
190
- ast: organizationsQuery.ast,
191
- },
192
- },
167
+ spec: Trigger.specSubscription(organizationsQuery),
193
168
  function: Ref.make(Operation.serialize(AgentPrompt)),
194
169
  input: {
195
170
  prompt: Ref.make(researchPrompt),
@@ -204,7 +179,7 @@ export const generator = () => ({
204
179
  properties: { labels: Filter.contains('investor') },
205
180
  }),
206
181
  ).from({
207
- queues: [queueDxn],
182
+ feeds: [feedDXN],
208
183
  }),
209
184
  jsonSchema: JsonSchema.toJsonSchema(Message.Message),
210
185
  });
@@ -618,7 +593,7 @@ export const generator = () => ({
618
593
  );
619
594
  const converter = canvasModel.createNode(createFunction(position({ x: 0, y: 0 })));
620
595
  const view = canvasModel.createNode(createText(position({ x: 12, y: 0 })));
621
- const queue = canvasModel.createNode(createQueue(position({ x: 0, y: 12 })));
596
+ const queue = canvasModel.createNode(createFeed(position({ x: 0, y: 12 })));
622
597
 
623
598
  builder
624
599
  .createEdge({
@@ -763,8 +738,8 @@ const createQueueSinkPreset = <SpecType extends Trigger.Kind>(
763
738
  functionTrigger = triggerShape.functionTrigger!.target!;
764
739
  const triggerSpec = functionTrigger.spec;
765
740
  invariant(triggerSpec && triggerSpec.kind === triggerKind, 'No trigger spec.');
766
- Obj.change(functionTrigger, (ft) => {
767
- initSpec(ft.spec as any);
741
+ Obj.update(functionTrigger, (functionTrigger) => {
742
+ initSpec(functionTrigger.spec as any);
768
743
  });
769
744
  });
770
745
 
@@ -804,7 +779,7 @@ const setupQueue = (
804
779
  }),
805
780
  );
806
781
  const queue = canvasModel.createNode(
807
- createQueue(
782
+ createFeed(
808
783
  args?.queuePosition ? rawPosition(args.queuePosition) : position({ x: -3, y: 3, width: 14, height: 10 }),
809
784
  ),
810
785
  );
@@ -815,9 +790,9 @@ const setupQueue = (
815
790
  const attachTrigger = (functionTrigger: Trigger.Trigger | undefined, computeModel: ComputeGraphModel) => {
816
791
  invariant(functionTrigger);
817
792
  const inputNode = computeModel.nodes.find((node) => node.type === NODE_INPUT)!;
818
- Obj.change(functionTrigger, (obj) => {
819
- obj.function = Ref.make(computeModel.root);
820
- obj.inputNodeId = inputNode.id;
793
+ Obj.update(functionTrigger, (functionTrigger) => {
794
+ functionTrigger.function = Ref.make(computeModel.root);
795
+ functionTrigger.inputNodeId = inputNode.id;
821
796
  });
822
797
  };
823
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';