@dxos/plugin-debug 0.9.1-staging.ee54ba693a → 0.11.0

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 (236) hide show
  1. package/PLUGIN.mdl +12 -325
  2. package/README.md +4 -14
  3. package/dist/lib/DebugPlugin.mjs +29 -0
  4. package/dist/lib/DebugPlugin.mjs.map +1 -0
  5. package/dist/lib/DebugPlugin.node.mjs +10 -0
  6. package/dist/lib/DebugPlugin.node.mjs.map +1 -0
  7. package/dist/lib/DebugPlugin.workerd.mjs +8 -0
  8. package/dist/lib/DebugPlugin.workerd.mjs.map +1 -0
  9. package/dist/lib/capabilities.mjs +11 -0
  10. package/dist/lib/capabilities.mjs.map +1 -0
  11. package/dist/lib/chunk-DebugObjectPanel.mjs +58 -0
  12. package/dist/lib/chunk-DebugObjectPanel.mjs.map +1 -0
  13. package/dist/lib/chunk-DebugSettings.mjs +237 -0
  14. package/dist/lib/chunk-DebugSettings.mjs.map +1 -0
  15. package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs +39 -0
  16. package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs.map +1 -0
  17. package/dist/lib/chunk-DebugStatus.mjs +117 -0
  18. package/dist/lib/chunk-DebugStatus.mjs.map +1 -0
  19. package/dist/lib/chunk-LogStatus.mjs +44 -0
  20. package/dist/lib/chunk-LogStatus.mjs.map +1 -0
  21. package/dist/lib/chunk-SpaceGenerator.mjs +208 -0
  22. package/dist/lib/chunk-SpaceGenerator.mjs.map +1 -0
  23. package/dist/lib/chunk-StatsPanel.mjs +58 -0
  24. package/dist/lib/chunk-StatsPanel.mjs.map +1 -0
  25. package/dist/lib/chunk-Wireframe.mjs +60 -0
  26. package/dist/lib/chunk-Wireframe.mjs.map +1 -0
  27. package/dist/lib/chunk-app-graph-builder.mjs +76 -0
  28. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  29. package/dist/lib/chunk-log-recording.mjs +17 -0
  30. package/dist/lib/chunk-log-recording.mjs.map +1 -0
  31. package/dist/lib/chunk-meta.mjs +36 -0
  32. package/dist/lib/chunk-meta.mjs.map +1 -0
  33. package/dist/lib/chunk-react-surface.mjs +193 -0
  34. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  35. package/dist/lib/chunk-settings.mjs +23 -0
  36. package/dist/lib/chunk-settings.mjs.map +1 -0
  37. package/dist/lib/chunk-stats-panel.mjs +56 -0
  38. package/dist/lib/chunk-stats-panel.mjs.map +1 -0
  39. package/dist/lib/chunk-types.mjs +60 -0
  40. package/dist/lib/chunk-types.mjs.map +1 -0
  41. package/dist/lib/components.mjs +763 -0
  42. package/dist/lib/components.mjs.map +1 -0
  43. package/dist/lib/containers.mjs +14 -0
  44. package/dist/lib/containers.mjs.map +1 -0
  45. package/dist/lib/index.mjs +3 -0
  46. package/dist/lib/meta.mjs +2 -0
  47. package/dist/lib/plugin.mjs +8 -0
  48. package/dist/lib/plugin.mjs.map +1 -0
  49. package/dist/lib/translations.mjs +38 -0
  50. package/dist/lib/translations.mjs.map +1 -0
  51. package/dist/lib/types.mjs +2 -0
  52. package/dist/types/src/DebugPlugin.d.ts.map +1 -1
  53. package/dist/types/src/capabilities/DebugSurfaces.d.ts +25 -0
  54. package/dist/types/src/capabilities/DebugSurfaces.d.ts.map +1 -0
  55. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  56. package/dist/types/src/capabilities/index.d.ts +4 -1
  57. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  58. package/dist/types/src/capabilities/log-recording.d.ts +10 -0
  59. package/dist/types/src/capabilities/log-recording.d.ts.map +1 -0
  60. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  61. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  62. package/dist/types/src/capabilities/settings.d.ts +1 -1
  63. package/dist/types/src/capabilities/stats-panel.d.ts +16 -0
  64. package/dist/types/src/capabilities/stats-panel.d.ts.map +1 -0
  65. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts +4 -3
  66. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
  67. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
  68. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +4 -1
  69. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
  70. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +4 -1
  71. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +1 -1
  72. package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts +30 -58
  73. package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts.map +1 -1
  74. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +4 -1
  75. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
  76. package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts +4 -1
  77. package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -1
  78. package/dist/types/src/containers/LogStatus/LogStatus.d.ts +6 -0
  79. package/dist/types/src/containers/LogStatus/LogStatus.d.ts.map +1 -0
  80. package/dist/types/src/containers/LogStatus/index.d.ts +2 -0
  81. package/dist/types/src/containers/LogStatus/index.d.ts.map +1 -0
  82. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts +1 -1
  83. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
  84. package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts +6 -0
  85. package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts.map +1 -0
  86. package/dist/types/src/containers/StatsPanel/index.d.ts +2 -0
  87. package/dist/types/src/containers/StatsPanel/index.d.ts.map +1 -0
  88. package/dist/types/src/containers/Wireframe/Wireframe.d.ts +4 -1
  89. package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
  90. package/dist/types/src/containers/index.d.ts +4 -6
  91. package/dist/types/src/containers/index.d.ts.map +1 -1
  92. package/dist/types/src/translations.d.ts +26 -57
  93. package/dist/types/src/translations.d.ts.map +1 -1
  94. package/dist/types/src/types/DebugNodes.d.ts +7 -0
  95. package/dist/types/src/types/DebugNodes.d.ts.map +1 -0
  96. package/dist/types/src/types/DebugSurface.d.ts +8 -0
  97. package/dist/types/src/types/DebugSurface.d.ts.map +1 -0
  98. package/dist/types/src/types/debug.d.ts +3 -1
  99. package/dist/types/src/types/debug.d.ts.map +1 -1
  100. package/dist/types/src/types/index.d.ts +2 -2
  101. package/dist/types/src/types/index.d.ts.map +1 -1
  102. package/dist/types/tsconfig.tsbuildinfo +1 -1
  103. package/dx.config.ts +8 -13
  104. package/package.json +61 -63
  105. package/src/DebugPlugin.node.ts +1 -1
  106. package/src/DebugPlugin.tsx +10 -27
  107. package/src/DebugPlugin.workerd.ts +1 -1
  108. package/src/capabilities/DebugSurfaces.tsx +146 -0
  109. package/src/capabilities/app-graph-builder.ts +39 -373
  110. package/src/capabilities/index.ts +3 -2
  111. package/src/capabilities/log-recording.ts +20 -0
  112. package/src/capabilities/react-surface.ts +123 -0
  113. package/src/capabilities/stats-panel.ts +74 -0
  114. package/src/components/SchemaTable/SchemaTable.tsx +6 -5
  115. package/src/components/SpaceGenerator/ObjectGenerator.tsx +9 -3
  116. package/src/components/SpaceGenerator/presets.ts +2 -2
  117. package/src/components/index.ts +1 -1
  118. package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +20 -20
  119. package/src/containers/DebugSettings/DebugSettings.tsx +4 -3
  120. package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +4 -2
  121. package/src/containers/DebugStatus/DebugStatus.tsx +2 -0
  122. package/src/containers/LogStatus/LogStatus.tsx +51 -0
  123. package/src/containers/LogStatus/index.ts +5 -0
  124. package/src/containers/SpaceGenerator/SpaceGenerator.tsx +108 -10
  125. package/src/containers/StatsPanel/StatsPanel.tsx +74 -0
  126. package/src/containers/StatsPanel/index.ts +5 -0
  127. package/src/containers/Wireframe/Wireframe.tsx +2 -0
  128. package/src/containers/index.ts +9 -7
  129. package/src/index.ts +1 -1
  130. package/src/meta.ts +1 -1
  131. package/src/plugin.ts +1 -1
  132. package/src/translations.ts +8 -52
  133. package/src/types/DebugNodes.ts +18 -0
  134. package/src/types/DebugSurface.ts +16 -0
  135. package/src/types/debug.ts +3 -1
  136. package/src/types/index.ts +3 -3
  137. package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs +0 -15
  138. package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs.map +0 -7
  139. package/dist/lib/neutral/DebugObjectPanel-QSGQJ3LM.mjs +0 -61
  140. package/dist/lib/neutral/DebugObjectPanel-QSGQJ3LM.mjs.map +0 -7
  141. package/dist/lib/neutral/DebugPlugin.mjs +0 -59
  142. package/dist/lib/neutral/DebugPlugin.mjs.map +0 -7
  143. package/dist/lib/neutral/DebugPlugin.node.mjs +0 -18
  144. package/dist/lib/neutral/DebugPlugin.node.mjs.map +0 -7
  145. package/dist/lib/neutral/DebugPlugin.workerd.mjs +0 -12
  146. package/dist/lib/neutral/DebugPlugin.workerd.mjs.map +0 -7
  147. package/dist/lib/neutral/DebugSettings-Q3WUL6YQ.mjs +0 -229
  148. package/dist/lib/neutral/DebugSettings-Q3WUL6YQ.mjs.map +0 -7
  149. package/dist/lib/neutral/DebugSpaceObjectsPanel-AXFZWEIM.mjs +0 -36
  150. package/dist/lib/neutral/DebugSpaceObjectsPanel-AXFZWEIM.mjs.map +0 -7
  151. package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs +0 -122
  152. package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs.map +0 -7
  153. package/dist/lib/neutral/DevtoolsOverviewContainer-DWQHTK7D.mjs +0 -24
  154. package/dist/lib/neutral/DevtoolsOverviewContainer-DWQHTK7D.mjs.map +0 -7
  155. package/dist/lib/neutral/GithubPanel-4CSJRVKE.mjs +0 -177
  156. package/dist/lib/neutral/GithubPanel-4CSJRVKE.mjs.map +0 -7
  157. package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs +0 -161
  158. package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs.map +0 -7
  159. package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs +0 -146
  160. package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs.map +0 -7
  161. package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs +0 -52
  162. package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs.map +0 -7
  163. package/dist/lib/neutral/app-graph-builder-UKG4WVYK.mjs +0 -619
  164. package/dist/lib/neutral/app-graph-builder-UKG4WVYK.mjs.map +0 -7
  165. package/dist/lib/neutral/capabilities/index.mjs +0 -15
  166. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  167. package/dist/lib/neutral/chunk-72QXLYMI.mjs +0 -118
  168. package/dist/lib/neutral/chunk-72QXLYMI.mjs.map +0 -7
  169. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  170. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  171. package/dist/lib/neutral/chunk-R5C4CKOF.mjs +0 -54
  172. package/dist/lib/neutral/chunk-R5C4CKOF.mjs.map +0 -7
  173. package/dist/lib/neutral/components/index.mjs +0 -961
  174. package/dist/lib/neutral/components/index.mjs.map +0 -7
  175. package/dist/lib/neutral/containers/index.mjs +0 -27
  176. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  177. package/dist/lib/neutral/index.mjs +0 -20
  178. package/dist/lib/neutral/index.mjs.map +0 -7
  179. package/dist/lib/neutral/meta.json +0 -1
  180. package/dist/lib/neutral/meta.mjs +0 -8
  181. package/dist/lib/neutral/meta.mjs.map +0 -7
  182. package/dist/lib/neutral/plugin.mjs +0 -12
  183. package/dist/lib/neutral/plugin.mjs.map +0 -7
  184. package/dist/lib/neutral/react-context-UJURDOO6.mjs +0 -17
  185. package/dist/lib/neutral/react-context-UJURDOO6.mjs.map +0 -7
  186. package/dist/lib/neutral/react-surface-URESE7J4.mjs +0 -484
  187. package/dist/lib/neutral/react-surface-URESE7J4.mjs.map +0 -7
  188. package/dist/lib/neutral/settings-5I2674B6.mjs +0 -28
  189. package/dist/lib/neutral/settings-5I2674B6.mjs.map +0 -7
  190. package/dist/lib/neutral/translations.mjs +0 -91
  191. package/dist/lib/neutral/translations.mjs.map +0 -7
  192. package/dist/lib/neutral/types/index.mjs +0 -16
  193. package/dist/lib/neutral/types/index.mjs.map +0 -7
  194. package/dist/types/src/DebugPlugin.test.d.ts +0 -2
  195. package/dist/types/src/DebugPlugin.test.d.ts.map +0 -1
  196. package/dist/types/src/capabilities/react-context.d.ts +0 -5
  197. package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
  198. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +0 -8
  199. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +0 -1
  200. package/dist/types/src/containers/DebugGraph/index.d.ts +0 -2
  201. package/dist/types/src/containers/DebugGraph/index.d.ts.map +0 -1
  202. package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts +0 -3
  203. package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts.map +0 -1
  204. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +0 -2
  205. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +0 -1
  206. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts +0 -15
  207. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts.map +0 -1
  208. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts +0 -106
  209. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts.map +0 -1
  210. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts +0 -3
  211. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts.map +0 -1
  212. package/dist/types/src/containers/GithubPanel/index.d.ts +0 -2
  213. package/dist/types/src/containers/GithubPanel/index.d.ts.map +0 -1
  214. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts +0 -3
  215. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts.map +0 -1
  216. package/dist/types/src/containers/RegistryPanel/index.d.ts +0 -2
  217. package/dist/types/src/containers/RegistryPanel/index.d.ts.map +0 -1
  218. package/dist/types/src/types/Devtools.d.ts +0 -57
  219. package/dist/types/src/types/Devtools.d.ts.map +0 -1
  220. package/dist/types/src/types/surface.d.ts +0 -4
  221. package/dist/types/src/types/surface.d.ts.map +0 -1
  222. package/src/DebugPlugin.test.ts +0 -29
  223. package/src/capabilities/react-context.tsx +0 -25
  224. package/src/capabilities/react-surface.tsx +0 -504
  225. package/src/containers/DebugGraph/DebugGraph.tsx +0 -14
  226. package/src/containers/DebugGraph/index.ts +0 -5
  227. package/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx +0 -27
  228. package/src/containers/DevtoolsOverviewContainer/index.ts +0 -5
  229. package/src/containers/GithubPanel/GithubComponent.stories.tsx +0 -38
  230. package/src/containers/GithubPanel/GithubComponent.tsx +0 -192
  231. package/src/containers/GithubPanel/GithubPanel.tsx +0 -17
  232. package/src/containers/GithubPanel/index.ts +0 -5
  233. package/src/containers/RegistryPanel/RegistryPanel.tsx +0 -150
  234. package/src/containers/RegistryPanel/index.ts +0 -5
  235. package/src/types/Devtools.ts +0 -73
  236. package/src/types/surface.ts +0 -10
@@ -0,0 +1,237 @@
1
+ import { setDeep } from "@dxos/util";
2
+ import { useCallback, useEffect, useMemo, useState } from "react";
3
+ import { meta } from "#meta";
4
+ import { AppSpace } from "@dxos/app-toolkit";
5
+ import { IconButton, Input, Select, Toast, useFileDownload, useTranslation } from "@dxos/react-ui";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { Settings } from "#types";
8
+ import { useClient } from "@dxos/react-client";
9
+ import { SaveConfig, Storage, defs } from "@dxos/config";
10
+ import { log } from "@dxos/log";
11
+ import { MANUAL_LOG_EXPORT_MAX_BYTES } from "@dxos/log-store-idb";
12
+ import { Form } from "@dxos/react-ui-form";
13
+ import { TRACE_ALL_KEY } from "@dxos/tracing";
14
+ //#region src/containers/DebugSettings/DebugSettings.tsx
15
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-debug/src/containers/DebugSettings/DebugSettings.tsx";
16
+ var StorageAdapters = {
17
+ opfs: defs.Runtime.Client.Storage.StorageDriver.WEBFS,
18
+ idb: defs.Runtime.Client.Storage.StorageDriver.IDB
19
+ };
20
+ var DebugSettings = ({ settings, onSettingsChange, logStore, onUpload }) => {
21
+ const { t } = useTranslation(meta.profile.key);
22
+ const [toast, setToast] = useState();
23
+ const download = useFileDownload();
24
+ const [storageConfig, setStorageConfig] = useState({});
25
+ const client = useClient();
26
+ useEffect(() => {
27
+ Storage().then((config) => setStorageConfig(config));
28
+ }, []);
29
+ const handleToast = useCallback((toast) => {
30
+ setToast(toast);
31
+ const timer = setTimeout(() => setToast(void 0), 5e3);
32
+ return () => clearTimeout(timer);
33
+ }, [setToast]);
34
+ const handleDownload = useCallback(async () => {
35
+ const data = await client.diagnostics();
36
+ const file = new Blob([JSON.stringify(data, void 0, 2)], { type: "text/plain" });
37
+ const fileName = `composer-${(/* @__PURE__ */ new Date()).toISOString().replace(/\W/g, "-")}.json`;
38
+ download(file, fileName);
39
+ if (onUpload) {
40
+ const personalSpace = AppSpace.getPersonalSpace(client);
41
+ if (!personalSpace) {
42
+ log.error("no personal space available for upload", void 0, {
43
+ "~LogMeta": "~LogMeta",
44
+ F: __dxlog_file,
45
+ L: 70,
46
+ S: void 0
47
+ });
48
+ return;
49
+ }
50
+ const info = await onUpload(personalSpace.db, new File([file], fileName));
51
+ if (!info) {
52
+ log.error("diagnostics failed to upload to IPFS", void 0, {
53
+ "~LogMeta": "~LogMeta",
54
+ F: __dxlog_file,
55
+ L: 75,
56
+ S: void 0
57
+ });
58
+ return;
59
+ }
60
+ handleToast({
61
+ title: t("settings.uploaded.message"),
62
+ description: t("settings.uploaded.description")
63
+ });
64
+ const url = client.config.values.runtime.services.ipfs.gateway + "/" + info.cid;
65
+ navigator.clipboard.writeText(url);
66
+ handleToast({
67
+ title: t("settings.uploaded.message"),
68
+ description: t("settings.uploaded.description")
69
+ });
70
+ log.info("diagnostics", { url }, {
71
+ "~LogMeta": "~LogMeta",
72
+ F: __dxlog_file,
73
+ L: 90,
74
+ S: void 0
75
+ });
76
+ }
77
+ }, [
78
+ client,
79
+ download,
80
+ handleToast,
81
+ onUpload,
82
+ t
83
+ ]);
84
+ const handleDownloadLogs = useCallback(async () => {
85
+ const file = await logStore.exportBlob({ maxSize: MANUAL_LOG_EXPORT_MAX_BYTES });
86
+ const fileName = `composer-logs-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace(/:/g, "-")}.ndjson`;
87
+ download(file, fileName);
88
+ }, [download, logStore]);
89
+ const handleRepair = useCallback(async () => {
90
+ try {
91
+ const info = await client.repair();
92
+ setStorageConfig(await Storage());
93
+ handleToast({
94
+ title: t("settings.repair-success.message"),
95
+ description: JSON.stringify(info, void 0, 2)
96
+ });
97
+ } catch (err) {
98
+ handleToast({
99
+ title: t("settings.repair-failed.message"),
100
+ description: err.message
101
+ });
102
+ }
103
+ }, [
104
+ client,
105
+ handleToast,
106
+ t
107
+ ]);
108
+ const handleWireframeChange = useCallback((checked) => onSettingsChange?.((s) => ({
109
+ ...s,
110
+ wireframe: !!checked
111
+ })), [onSettingsChange]);
112
+ const traceAll = useMemo(() => settings.traceAll ?? (typeof localStorage !== "undefined" && localStorage.getItem(TRACE_ALL_KEY) === "true"), [settings.traceAll]);
113
+ const handleTraceAllChange = useCallback((checked) => {
114
+ const value = !!checked;
115
+ localStorage.setItem(TRACE_ALL_KEY, String(value));
116
+ onSettingsChange?.((s) => ({
117
+ ...s,
118
+ traceAll: value
119
+ }));
120
+ }, [onSettingsChange]);
121
+ const handleOpenTracingPanel = useCallback(() => {
122
+ window.open("about:blank", "_blank");
123
+ }, []);
124
+ const handleStorageAdapterChange = useCallback((value) => {
125
+ if (confirm(t("settings.storage-adapter.changed-alert.message"))) updateConfig(storageConfig, setStorageConfig, [
126
+ "runtime",
127
+ "client",
128
+ "storage",
129
+ "dataStore"
130
+ ], StorageAdapters[value]);
131
+ }, [storageConfig, t]);
132
+ return /* @__PURE__ */ jsx(Form.Root, {
133
+ schema: Settings.Settings,
134
+ values: settings,
135
+ variant: "settings",
136
+ readonly: !onSettingsChange,
137
+ children: /* @__PURE__ */ jsx(Form.Viewport, {
138
+ scroll: true,
139
+ children: /* @__PURE__ */ jsx(Form.Content, { children: /* @__PURE__ */ jsxs(Form.Section, {
140
+ title: meta.profile.name ?? meta.profile.key,
141
+ children: [
142
+ /* @__PURE__ */ jsx(Form.Row, {
143
+ label: t("settings.wireframe.label"),
144
+ description: t("settings.wireframe.description"),
145
+ children: /* @__PURE__ */ jsx(Input.Root, { children: /* @__PURE__ */ jsx(Input.Switch, {
146
+ disabled: !onSettingsChange,
147
+ checked: settings.wireframe,
148
+ onCheckedChange: handleWireframeChange
149
+ }) })
150
+ }),
151
+ /* @__PURE__ */ jsx(Form.Row, {
152
+ label: t("settings.trace-all.label"),
153
+ description: t("settings.trace-all.description"),
154
+ children: /* @__PURE__ */ jsx(Input.Root, { children: /* @__PURE__ */ jsx(Input.Switch, {
155
+ disabled: !onSettingsChange,
156
+ checked: traceAll,
157
+ onCheckedChange: handleTraceAllChange
158
+ }) })
159
+ }),
160
+ /* @__PURE__ */ jsx(Form.Row, {
161
+ label: t("settings.tracing-panel.label"),
162
+ description: t("settings.tracing-panel.description"),
163
+ children: /* @__PURE__ */ jsx(IconButton, {
164
+ icon: "ph--arrow-square-out--regular",
165
+ iconOnly: true,
166
+ label: t("settings.tracing-panel.label"),
167
+ onClick: handleOpenTracingPanel
168
+ })
169
+ }),
170
+ /* @__PURE__ */ jsx(Form.Row, {
171
+ label: t("settings.download-diagnostics.label"),
172
+ description: t("settings.download-diagnostics.description"),
173
+ children: /* @__PURE__ */ jsx(IconButton, {
174
+ icon: "ph--download-simple--regular",
175
+ iconOnly: true,
176
+ label: t("settings.download-diagnostics.label"),
177
+ onClick: handleDownload
178
+ })
179
+ }),
180
+ /* @__PURE__ */ jsx(Form.Row, {
181
+ label: t("settings.download-logs.label"),
182
+ description: t("settings.download-logs.description"),
183
+ children: /* @__PURE__ */ jsx(IconButton, {
184
+ icon: "ph--download-simple--regular",
185
+ iconOnly: true,
186
+ label: t("settings.download-logs.label"),
187
+ onClick: handleDownloadLogs
188
+ })
189
+ }),
190
+ /* @__PURE__ */ jsx(Form.Row, {
191
+ label: t("settings.repair.label"),
192
+ description: t("settings.repair.description"),
193
+ children: /* @__PURE__ */ jsx(IconButton, {
194
+ icon: "ph--first-aid-kit--regular",
195
+ iconOnly: true,
196
+ label: t("settings.repair.label"),
197
+ onClick: handleRepair
198
+ })
199
+ }),
200
+ toast && /* @__PURE__ */ jsxs(Toast.Root, { children: [/* @__PURE__ */ jsx(Toast.Title, {
201
+ icon: "ph--gift--duotone",
202
+ children: /* @__PURE__ */ jsx("span", { children: toast.title })
203
+ }), toast.description && /* @__PURE__ */ jsx(Toast.Description, { children: toast.description })] }),
204
+ /* @__PURE__ */ jsx(Form.Row, {
205
+ label: t("settings.choose-storage-adaptor.label"),
206
+ description: t("settings.choose-storage-adaptor.description"),
207
+ children: /* @__PURE__ */ jsxs(Select.Root, {
208
+ disabled: !onSettingsChange,
209
+ value: Object.entries(StorageAdapters).find(([_name, value]) => value === storageConfig?.runtime?.client?.storage?.dataStore)?.[0],
210
+ onValueChange: handleStorageAdapterChange,
211
+ children: [/* @__PURE__ */ jsx(Select.TriggerButton, {
212
+ disabled: !onSettingsChange,
213
+ placeholder: t("settings.data-store.label")
214
+ }), /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsxs(Select.Content, { children: [/* @__PURE__ */ jsx(Select.Viewport, { children: Object.keys(StorageAdapters).map((key) => /* @__PURE__ */ jsx(Select.Option, {
215
+ value: key,
216
+ children: t(`settings.storage-adaptor.${key}.label`)
217
+ }, key)) }), /* @__PURE__ */ jsx(Select.Arrow, {})] }) })]
218
+ })
219
+ })
220
+ ]
221
+ }) })
222
+ })
223
+ });
224
+ };
225
+ var updateConfig = (config, setConfig, path, value) => {
226
+ const storageConfigCopy = JSON.parse(JSON.stringify(config ?? {}));
227
+ setDeep(storageConfigCopy, path, value);
228
+ setConfig(storageConfigCopy);
229
+ queueMicrotask(async () => {
230
+ await SaveConfig(storageConfigCopy);
231
+ });
232
+ };
233
+ DebugSettings.displayName = "DebugSettings";
234
+ //#endregion
235
+ export { DebugSettings as default };
236
+
237
+ //# sourceMappingURL=chunk-DebugSettings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-DebugSettings.mjs","names":[],"sources":["../../src/containers/DebugSettings/DebugSettings.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { AppCapabilities, AppSpace } from '@dxos/app-toolkit';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { type ConfigProto, SaveConfig, Storage, defs } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { type IdbLogStore, MANUAL_LOG_EXPORT_MAX_BYTES } from '@dxos/log-store-idb';\nimport { useClient } from '@dxos/react-client';\nimport { IconButton, Input, Select, Toast, useFileDownload, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { TRACE_ALL_KEY } from '@dxos/tracing';\nimport { setDeep } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { Settings } from '#types';\n\ntype Toast = {\n title: string;\n description?: string;\n};\n\nconst StorageAdapters = {\n opfs: defs.Runtime.Client.Storage.StorageDriver.WEBFS,\n idb: defs.Runtime.Client.Storage.StorageDriver.IDB,\n} as const;\n\nexport type DebugSettingsProps = AppSurface.SettingsProps<\n Settings.Settings,\n {\n logStore: IdbLogStore;\n onUpload?: AppCapabilities.FileUploader;\n }\n>;\n\nexport const DebugSettings = ({ settings, onSettingsChange, logStore, onUpload }: DebugSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n const [toast, setToast] = useState<Toast>();\n const download = useFileDownload();\n const [storageConfig, setStorageConfig] = useState<ConfigProto>({});\n const client = useClient();\n\n useEffect(() => {\n void Storage().then((config) => setStorageConfig(config));\n }, []);\n\n const handleToast = useCallback(\n (toast: Toast) => {\n setToast(toast);\n const timer = setTimeout(() => setToast(undefined), 5_000);\n return () => clearTimeout(timer);\n },\n [setToast],\n );\n\n const handleDownload = useCallback(async () => {\n const data = await client.diagnostics();\n const file = new Blob([JSON.stringify(data, undefined, 2)], {\n type: 'text/plain',\n });\n const fileName = `composer-${new Date().toISOString().replace(/\\W/g, '-')}.json`;\n download(file, fileName);\n\n if (onUpload) {\n const personalSpace = AppSpace.getPersonalSpace(client);\n if (!personalSpace) {\n log.error('no personal space available for upload');\n return;\n }\n const info = await onUpload(personalSpace.db, new File([file], fileName));\n if (!info) {\n log.error('diagnostics failed to upload to IPFS');\n return;\n }\n handleToast({\n title: t('settings.uploaded.message'),\n description: t('settings.uploaded.description'),\n });\n\n // TODO(nf): move to IpfsPlugin?\n const url = client.config.values.runtime!.services!.ipfs!.gateway + '/' + info.cid;\n void navigator.clipboard.writeText(url);\n handleToast({\n title: t('settings.uploaded.message'),\n description: t('settings.uploaded.description'),\n });\n log.info('diagnostics', { url });\n }\n }, [client, download, handleToast, onUpload, t]);\n\n const handleDownloadLogs = useCallback(async () => {\n const file = await logStore.exportBlob({ maxSize: MANUAL_LOG_EXPORT_MAX_BYTES });\n const fileName = `composer-logs-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.ndjson`;\n download(file, fileName);\n }, [download, logStore]);\n\n const handleRepair = useCallback(async () => {\n try {\n const info = await client.repair();\n setStorageConfig(await Storage());\n handleToast({\n title: t('settings.repair-success.message'),\n description: JSON.stringify(info, undefined, 2),\n });\n } catch (err: any) {\n handleToast({\n title: t('settings.repair-failed.message'),\n description: err.message,\n });\n }\n }, [client, handleToast, t]);\n\n const handleWireframeChange = useCallback(\n (checked: boolean) => onSettingsChange?.((s) => ({ ...s, wireframe: !!checked })),\n [onSettingsChange],\n );\n\n const traceAll = useMemo(\n () => settings.traceAll ?? (typeof localStorage !== 'undefined' && localStorage.getItem(TRACE_ALL_KEY) === 'true'),\n [settings.traceAll],\n );\n\n const handleTraceAllChange = useCallback(\n (checked: boolean) => {\n const value = !!checked;\n localStorage.setItem(TRACE_ALL_KEY, String(value));\n onSettingsChange?.((s) => ({ ...s, traceAll: value }));\n },\n [onSettingsChange],\n );\n\n const handleOpenTracingPanel = useCallback(() => {\n window.open('about:blank', '_blank');\n }, []);\n\n const handleStorageAdapterChange = useCallback(\n (value: string) => {\n if (confirm(t('settings.storage-adapter.changed-alert.message'))) {\n updateConfig(\n storageConfig,\n setStorageConfig,\n ['runtime', 'client', 'storage', 'dataStore'],\n StorageAdapters[value as keyof typeof StorageAdapters],\n );\n }\n },\n [storageConfig, t],\n );\n\n return (\n <Form.Root schema={Settings.Settings} values={settings} variant='settings' readonly={!onSettingsChange}>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n <Form.Row label={t('settings.wireframe.label')} description={t('settings.wireframe.description')}>\n <Input.Root>\n <Input.Switch\n disabled={!onSettingsChange}\n checked={settings.wireframe}\n onCheckedChange={handleWireframeChange}\n />\n </Input.Root>\n </Form.Row>\n <Form.Row label={t('settings.trace-all.label')} description={t('settings.trace-all.description')}>\n <Input.Root>\n <Input.Switch disabled={!onSettingsChange} checked={traceAll} onCheckedChange={handleTraceAllChange} />\n </Input.Root>\n </Form.Row>\n <Form.Row label={t('settings.tracing-panel.label')} description={t('settings.tracing-panel.description')}>\n <IconButton\n icon='ph--arrow-square-out--regular'\n iconOnly\n label={t('settings.tracing-panel.label')}\n onClick={handleOpenTracingPanel}\n />\n </Form.Row>\n <Form.Row\n label={t('settings.download-diagnostics.label')}\n description={t('settings.download-diagnostics.description')}\n >\n <IconButton\n icon='ph--download-simple--regular'\n iconOnly\n label={t('settings.download-diagnostics.label')}\n onClick={handleDownload}\n />\n </Form.Row>\n <Form.Row label={t('settings.download-logs.label')} description={t('settings.download-logs.description')}>\n <IconButton\n icon='ph--download-simple--regular'\n iconOnly\n label={t('settings.download-logs.label')}\n onClick={handleDownloadLogs}\n />\n </Form.Row>\n <Form.Row label={t('settings.repair.label')} description={t('settings.repair.description')}>\n <IconButton\n icon='ph--first-aid-kit--regular'\n iconOnly\n label={t('settings.repair.label')}\n onClick={handleRepair}\n />\n </Form.Row>\n\n {/* TODO(burdon): Move to layout? */}\n {toast && (\n <Toast.Root>\n <Toast.Title icon='ph--gift--duotone'>\n <span>{toast.title}</span>\n </Toast.Title>\n {toast.description && <Toast.Description>{toast.description}</Toast.Description>}\n </Toast.Root>\n )}\n\n <Form.Row\n label={t('settings.choose-storage-adaptor.label')}\n description={t('settings.choose-storage-adaptor.description')}\n >\n <Select.Root\n disabled={!onSettingsChange}\n value={\n Object.entries(StorageAdapters).find(\n ([_name, value]) => value === storageConfig?.runtime?.client?.storage?.dataStore,\n )?.[0]\n }\n onValueChange={handleStorageAdapterChange}\n >\n <Select.TriggerButton disabled={!onSettingsChange} placeholder={t('settings.data-store.label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {Object.keys(StorageAdapters).map((key) => (\n <Select.Option key={key} value={key}>\n {t(`settings.storage-adaptor.${key}.label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Form.Row>\n </Form.Section>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nconst updateConfig = (config: ConfigProto, setConfig: (newConfig: ConfigProto) => void, path: string[], value: any) => {\n const storageConfigCopy = JSON.parse(JSON.stringify(config ?? {}));\n setDeep(storageConfigCopy, path, value);\n setConfig(storageConfigCopy);\n queueMicrotask(async () => {\n await SaveConfig(storageConfigCopy);\n });\n};\n\nDebugSettings.displayName = 'DebugSettings';\n"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { useState } from "react";
2
+ import { Clipboard, Grid, Input, Panel, ScrollArea, Toolbar } from "@dxos/react-ui";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Filter, Query } from "@dxos/echo";
5
+ import { ObjectsTree } from "@dxos/devtools";
6
+ import { useQuery } from "@dxos/echo-react";
7
+ import { JsonHighlighter } from "@dxos/react-ui-syntax-highlighter";
8
+ //#region src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx
9
+ var DebugSpaceObjectsPanel = ({ space, onOpen, canOpen }) => {
10
+ const [selectedId, setSelectedId] = useState(null);
11
+ const [selectedObject] = useQuery(space.db, selectedId ? Query.select(Filter.id(selectedId)) : Query.select(Filter.nothing()));
12
+ return /* @__PURE__ */ jsx(Clipboard.Provider, { children: /* @__PURE__ */ jsxs(Panel.Root, { children: [/* @__PURE__ */ jsx(Panel.Toolbar, {
13
+ asChild: true,
14
+ children: /* @__PURE__ */ jsx(Toolbar.Root, { children: /* @__PURE__ */ jsx(Input.Root, { children: /* @__PURE__ */ jsx(Input.TextInput, {
15
+ disabled: true,
16
+ placeholder: "Search..."
17
+ }) }) })
18
+ }), /* @__PURE__ */ jsx(Panel.Content, {
19
+ asChild: true,
20
+ children: /* @__PURE__ */ jsxs(Grid, {
21
+ rows: 2,
22
+ classNames: "divide-y divide-subdued-separator",
23
+ children: [/* @__PURE__ */ jsx(ScrollArea.Root, { children: /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(ObjectsTree, {
24
+ db: space.db,
25
+ onSelect: (entity) => setSelectedId(entity.id),
26
+ onOpen,
27
+ canOpen
28
+ }) }) }), selectedObject && /* @__PURE__ */ jsx(JsonHighlighter, {
29
+ classNames: "p-1",
30
+ data: selectedObject
31
+ })]
32
+ })
33
+ })] }) });
34
+ };
35
+ DebugSpaceObjectsPanel.displayName = "DebugSpaceObjectsPanel";
36
+ //#endregion
37
+ export { DebugSpaceObjectsPanel as default };
38
+
39
+ //# sourceMappingURL=chunk-DebugSpaceObjectsPanel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-DebugSpaceObjectsPanel.mjs","names":[],"sources":["../../src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { ObjectsTree } from '@dxos/devtools';\nimport { type Entity, Filter, Obj, Query } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { type EntityId } from '@dxos/keys';\nimport { Clipboard, Grid, Input, Panel, ScrollArea, Toolbar } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\n\nexport type DebugSpaceObjectsPanelProps = AppSurface.SpaceArticleProps & {\n onOpen?: (object: Obj.Unknown) => void;\n canOpen?: (entity: Entity.Snapshot) => boolean;\n};\n\nexport const DebugSpaceObjectsPanel = ({ space, onOpen, canOpen }: DebugSpaceObjectsPanelProps) => {\n const [selectedId, setSelectedId] = useState<EntityId | null>(null);\n const [selectedObject] = useQuery(\n space.db,\n selectedId ? Query.select(Filter.id(selectedId)) : Query.select(Filter.nothing()),\n );\n\n return (\n <Clipboard.Provider>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <Input.Root>\n <Input.TextInput disabled placeholder='Search...' />\n </Input.Root>\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Grid rows={2} classNames='divide-y divide-subdued-separator'>\n <ScrollArea.Root>\n <ScrollArea.Viewport>\n <ObjectsTree\n db={space.db}\n onSelect={(entity) => setSelectedId(entity.id)}\n onOpen={onOpen}\n canOpen={canOpen}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n {selectedObject && <JsonHighlighter classNames='p-1' data={selectedObject} />}\n </Grid>\n </Panel.Content>\n </Panel.Root>\n </Clipboard.Provider>\n );\n};\n\nDebugSpaceObjectsPanel.displayName = 'DebugSpaceObjectsPanel';\n"],"mappings":";;;;;;;;AAmBA,IAAa,0BAA0B,EAAE,OAAO,QAAQ,cAA2C;CACjG,MAAM,CAAC,YAAY,iBAAiB,SAA0B,IAAI;CAClE,MAAM,CAAC,kBAAkB,SACvB,MAAM,IACN,aAAa,MAAM,OAAO,OAAO,GAAG,UAAU,CAAC,IAAI,MAAM,OAAO,OAAO,QAAQ,CAAC,CAClF;CAEA,OACE,oBAAC,UAAU,UAAX,EAAA,UACE,qBAAC,MAAM,MAAP,EAAA,UAAA,CACE,oBAAC,MAAM,SAAP;EAAe,SAAA;YACb,oBAAC,QAAQ,MAAT,EAAA,UACE,oBAAC,MAAM,MAAP,EAAA,UACE,oBAAC,MAAM,WAAP;GAAiB,UAAA;GAAS,aAAY;EAAa,CAAA,EACzC,CAAA,EACA,CAAA;CACD,CAAA,GACf,oBAAC,MAAM,SAAP;EAAe,SAAA;YACb,qBAAC,MAAD;GAAM,MAAM;GAAG,YAAW;aAA1B,CACE,oBAAC,WAAW,MAAZ,EAAA,UACE,oBAAC,WAAW,UAAZ,EAAA,UACE,oBAAC,aAAD;IACE,IAAI,MAAM;IACV,WAAW,WAAW,cAAc,OAAO,EAAE;IACrC;IACC;GACV,CAAA,EACkB,CAAA,EACN,CAAA,GAChB,kBAAkB,oBAAC,iBAAD;IAAiB,YAAW;IAAM,MAAM;GAAiB,CAAA,CACxE;;CACO,CAAA,CACL,EAAA,CAAA,EACM,CAAA;AAExB;AAEA,uBAAuB,cAAc"}
@@ -0,0 +1,117 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { IconButton } from "@dxos/react-ui";
3
+ import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
4
+ import "@dxos/async";
5
+ import { StatusBar } from "@dxos/plugin-status-bar/components";
6
+ import { ConnectionState } from "@dxos/protocols/proto/dxos/client/services";
7
+ import { useNetworkStatus } from "@dxos/react-client/mesh";
8
+ //#region src/containers/DebugStatus/DebugStatus.tsx
9
+ var styles = {
10
+ success: "text-sky-300 dark:text-green-700",
11
+ warning: "text-orange-300 dark:text-orange-600",
12
+ error: "text-red-300 dark:text-red-600"
13
+ };
14
+ /**
15
+ * Global error handler.
16
+ */
17
+ var ErrorIndicator = () => {
18
+ const [, forceUpdate] = useState({});
19
+ const errorRef = useRef(null);
20
+ useEffect(() => {
21
+ const errorListener = (event) => {
22
+ const error = event.error ?? event.reason;
23
+ if (errorRef.current !== error) {
24
+ errorRef.current = error;
25
+ forceUpdate({});
26
+ }
27
+ };
28
+ window.addEventListener("error", errorListener);
29
+ window.addEventListener("unhandledrejection", errorListener);
30
+ return () => {
31
+ window.removeEventListener("error", errorListener);
32
+ window.removeEventListener("unhandledrejection", errorListener);
33
+ };
34
+ }, []);
35
+ const handleReset = () => {
36
+ errorRef.current = null;
37
+ forceUpdate({});
38
+ };
39
+ if (errorRef.current) return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
40
+ variant: "ghost",
41
+ icon: "ph--warning-circle--duotone",
42
+ iconOnly: true,
43
+ label: errorRef.current.message,
44
+ classNames: styles.error,
45
+ onClick: handleReset
46
+ }) });
47
+ else return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
48
+ variant: "ghost",
49
+ icon: "ph--check--regular",
50
+ iconOnly: true,
51
+ label: "No errors."
52
+ }) });
53
+ };
54
+ /**
55
+ * Swarm connection handler.
56
+ */
57
+ var SwarmIndicator = () => {
58
+ const [state, setState] = useState(0);
59
+ const { swarm } = useNetworkStatus();
60
+ useEffect(() => {
61
+ setState(swarm === ConnectionState.ONLINE ? 0 : 1);
62
+ }, [swarm]);
63
+ if (state === 0) return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
64
+ variant: "ghost",
65
+ icon: "ph--lightning--regular",
66
+ iconOnly: true,
67
+ label: "Connected to swarm."
68
+ }) });
69
+ else return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
70
+ variant: "ghost",
71
+ icon: "ph--lightning-slash--regular",
72
+ iconOnly: true,
73
+ label: "Disconnected from swarm.",
74
+ classNames: styles.warning
75
+ }) });
76
+ };
77
+ /**
78
+ * Data saving indicator.
79
+ */
80
+ var SavingIndicator = () => {
81
+ const [state, _setState] = useState(0);
82
+ switch (state) {
83
+ case 2: return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
84
+ variant: "ghost",
85
+ icon: "ph--circle--duotone",
86
+ iconOnly: true,
87
+ label: "Edit not saved.",
88
+ classNames: styles.warning
89
+ }) });
90
+ case 1: return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
91
+ variant: "ghost",
92
+ icon: "ph--circle--duotone",
93
+ iconOnly: true,
94
+ label: "Saving...",
95
+ classNames: styles.success
96
+ }) });
97
+ default: return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
98
+ variant: "ghost",
99
+ icon: "ph--circle--duotone",
100
+ iconOnly: true,
101
+ label: "Modified indicator."
102
+ }) });
103
+ }
104
+ };
105
+ var indicators = [
106
+ SavingIndicator,
107
+ SwarmIndicator,
108
+ ErrorIndicator
109
+ ];
110
+ var DebugStatus = () => {
111
+ return /* @__PURE__ */ jsx(Fragment$1, { children: indicators.map((Indicator) => /* @__PURE__ */ jsx(Indicator, {}, Indicator.name)) });
112
+ };
113
+ DebugStatus.displayName = "DebugStatus";
114
+ //#endregion
115
+ export { DebugStatus as default };
116
+
117
+ //# sourceMappingURL=chunk-DebugStatus.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-DebugStatus.mjs","names":[],"sources":["../../src/containers/DebugStatus/DebugStatus.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { TimeoutError } from '@dxos/async';\nimport { StatusBar } from '@dxos/plugin-status-bar/components';\nimport { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport { IconButton } from '@dxos/react-ui';\n\nconst styles = {\n success: 'text-sky-300 dark:text-green-700',\n warning: 'text-orange-300 dark:text-orange-600',\n error: 'text-red-300 dark:text-red-600',\n};\n\n// TODO(burdon): Move out of debug plugin.\n// TODO(burdon): Make pluggable (move indicators to relevant plugins).\n// TODO(burdon): Vault heartbeat indicator (global scope)?\n\n/**\n * Ensure light doesn't flicker immediately after start.\n */\n// TODO(burdon): Move to @dxos/async (debounce?)\nconst _timer = (cb: (err?: Error) => void, options?: { min?: number; max?: number }) => {\n const min = options?.min ?? 500;\n let start: number;\n let pending: NodeJS.Timeout;\n let timeout: NodeJS.Timeout;\n return {\n start: () => {\n start = Date.now();\n clearTimeout(pending);\n if (options?.max) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n cb(new TimeoutError(options.max));\n }, options.max);\n }\n },\n stop: () => {\n clearTimeout(timeout);\n const delta = Date.now() - start;\n if (delta < min) {\n pending = setTimeout(() => {\n cb();\n }, min - delta);\n }\n },\n };\n};\n\n/**\n * Global error handler.\n */\n// TODO(burdon): Integrate with Sentry?\nconst ErrorIndicator = () => {\n const [, forceUpdate] = useState({});\n const errorRef = useRef<Error>(null);\n useEffect(() => {\n const errorListener = (event: any) => {\n const error: Error = event.error ?? event.reason;\n if (errorRef.current !== error) {\n errorRef.current = error;\n forceUpdate({});\n }\n };\n\n // TODO(burdon): Register globally?\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event\n window.addEventListener('error', errorListener);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event\n window.addEventListener('unhandledrejection', errorListener);\n\n return () => {\n window.removeEventListener('error', errorListener);\n window.removeEventListener('unhandledrejection', errorListener);\n };\n }, []);\n\n const handleReset = () => {\n errorRef.current = null;\n forceUpdate({});\n };\n\n if (errorRef.current) {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--warning-circle--duotone'\n iconOnly\n label={errorRef.current.message}\n classNames={styles.error}\n onClick={handleReset}\n />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--check--regular' iconOnly label='No errors.' />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Swarm connection handler.\n */\nconst SwarmIndicator = () => {\n const [state, setState] = useState(0);\n const { swarm } = useNetworkStatus();\n useEffect(() => {\n setState(swarm === ConnectionState.ONLINE ? 0 : 1);\n }, [swarm]);\n\n if (state === 0) {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--lightning--regular' iconOnly label='Connected to swarm.' />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--lightning-slash--regular'\n iconOnly\n label='Disconnected from swarm.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Data saving indicator.\n */\n// TODO(burdon): Merge with SaveStatus.\nconst SavingIndicator = () => {\n const [state, _setState] = useState(0);\n // TODO(dmaretskyi): Fix this when we have save status for automerge.\n // useEffect(() => {\n // if (!space) {\n // return;\n // }\n // const { start, stop } = timer(() => setState(0), { min: 250 });\n // return space.db.pendingBatch.on(({ duration, error }) => {\n // if (error) {\n // setState(2);\n // stop();\n // } else if (duration === undefined) {\n // setState(1);\n // start();\n // } else {\n // stop();\n // }\n // });\n // }, [space]);\n\n switch (state) {\n case 2:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Edit not saved.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n case 1:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Saving...'\n classNames={styles.success}\n />\n </StatusBar.Item>\n );\n case 0:\n default:\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--circle--duotone' iconOnly label='Modified indicator.' />\n </StatusBar.Item>\n );\n }\n};\n\nconst indicators = [SavingIndicator, SwarmIndicator, ErrorIndicator];\n\nexport const DebugStatus = () => {\n return (\n <>\n {indicators.map((Indicator) => (\n <Indicator key={Indicator.name} />\n ))}\n </>\n );\n};\n\nDebugStatus.displayName = 'DebugStatus';\n"],"mappings":";;;;;;;;AAYA,IAAM,SAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;AACT;;;;AA0CA,IAAM,uBAAuB;CAC3B,MAAM,GAAG,eAAe,SAAS,CAAC,CAAC;CACnC,MAAM,WAAW,OAAc,IAAI;CACnC,gBAAgB;EACd,MAAM,iBAAiB,UAAe;GACpC,MAAM,QAAe,MAAM,SAAS,MAAM;GAC1C,IAAI,SAAS,YAAY,OAAO;IAC9B,SAAS,UAAU;IACnB,YAAY,CAAC,CAAC;GAChB;EACF;EAIA,OAAO,iBAAiB,SAAS,aAAa;EAG9C,OAAO,iBAAiB,sBAAsB,aAAa;EAE3D,aAAa;GACX,OAAO,oBAAoB,SAAS,aAAa;GACjD,OAAO,oBAAoB,sBAAsB,aAAa;EAChE;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB;EACxB,SAAS,UAAU;EACnB,YAAY,CAAC,CAAC;CAChB;CAEA,IAAI,SAAS,SACX,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EACE,SAAQ;EACR,MAAK;EACL,UAAA;EACA,OAAO,SAAS,QAAQ;EACxB,YAAY,OAAO;EACnB,SAAS;CACV,CAAA,EACa,CAAA;MAGlB,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EAAY,SAAQ;EAAQ,MAAK;EAAqB,UAAA;EAAS,OAAM;CAAc,CAAA,EACrE,CAAA;AAGtB;;;;AAKA,IAAM,uBAAuB;CAC3B,MAAM,CAAC,OAAO,YAAY,SAAS,CAAC;CACpC,MAAM,EAAE,UAAU,iBAAiB;CACnC,gBAAgB;EACd,SAAS,UAAU,gBAAgB,SAAS,IAAI,CAAC;CACnD,GAAG,CAAC,KAAK,CAAC;CAEV,IAAI,UAAU,GACZ,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EAAY,SAAQ;EAAQ,MAAK;EAAyB,UAAA;EAAS,OAAM;CAAuB,CAAA,EAClF,CAAA;MAGlB,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EACE,SAAQ;EACR,MAAK;EACL,UAAA;EACA,OAAM;EACN,YAAY,OAAO;CACpB,CAAA,EACa,CAAA;AAGtB;;;;AAMA,IAAM,wBAAwB;CAC5B,MAAM,CAAC,OAAO,aAAa,SAAS,CAAC;CAoBrC,QAAQ,OAAR;EACE,KAAK,GACH,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;GACE,SAAQ;GACR,MAAK;GACL,UAAA;GACA,OAAM;GACN,YAAY,OAAO;EACpB,CAAA,EACa,CAAA;EAEpB,KAAK,GACH,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;GACE,SAAQ;GACR,MAAK;GACL,UAAA;GACA,OAAM;GACN,YAAY,OAAO;EACpB,CAAA,EACa,CAAA;EAGpB,SACE,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;GAAY,SAAQ;GAAQ,MAAK;GAAsB,UAAA;GAAS,OAAM;EAAuB,CAAA,EAC/E,CAAA;CAEtB;AACF;AAEA,IAAM,aAAa;CAAC;CAAiB;CAAgB;AAAc;AAEnE,IAAa,oBAAoB;CAC/B,OACE,oBAAA,YAAA,EAAA,UACG,WAAW,KAAK,cACf,oBAAC,WAAD,CAAiC,GAAjB,UAAU,IAAO,CAClC,EACD,CAAA;AAEN;AAEA,YAAY,cAAc"}
@@ -0,0 +1,44 @@
1
+ import "react";
2
+ import { meta } from "#meta";
3
+ import { IconButton, Panel, Popover, useTranslation } from "@dxos/react-ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Logger } from "@dxos/react-ui-debug";
6
+ import { StatusBar } from "@dxos/plugin-status-bar/components";
7
+ //#region src/containers/LogStatus/LogStatus.tsx
8
+ /** Status-bar button that opens the log panel in a popover for a quick glance. */
9
+ var LogStatus = () => {
10
+ const { t } = useTranslation(meta.profile.key);
11
+ return /* @__PURE__ */ jsxs(Popover.Root, { children: [/* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(Popover.Trigger, {
12
+ asChild: true,
13
+ children: /* @__PURE__ */ jsx(IconButton, {
14
+ variant: "ghost",
15
+ icon: "ph--list-magnifying-glass--regular",
16
+ iconOnly: true,
17
+ label: t("open-logs.label")
18
+ })
19
+ }) }), /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(Popover.Content, {
20
+ side: "top",
21
+ children: [/* @__PURE__ */ jsx(Popover.Viewport, {
22
+ classNames: "w-[40rem] h-[24rem]",
23
+ children: /* @__PURE__ */ jsx(Logger.Root, { children: /* @__PURE__ */ jsxs(Panel.Root, { children: [
24
+ /* @__PURE__ */ jsx(Panel.Toolbar, {
25
+ asChild: true,
26
+ children: /* @__PURE__ */ jsx(Logger.Toolbar, {})
27
+ }),
28
+ /* @__PURE__ */ jsx(Panel.Content, {
29
+ asChild: true,
30
+ children: /* @__PURE__ */ jsx(Logger.Content, { children: /* @__PURE__ */ jsx(Logger.List, {}) })
31
+ }),
32
+ /* @__PURE__ */ jsx(Panel.Statusbar, {
33
+ asChild: true,
34
+ children: /* @__PURE__ */ jsx(Logger.Filter, {})
35
+ })
36
+ ] }) })
37
+ }), /* @__PURE__ */ jsx(Popover.Arrow, {})]
38
+ }) })] });
39
+ };
40
+ LogStatus.displayName = "LogStatus";
41
+ //#endregion
42
+ export { LogStatus };
43
+
44
+ //# sourceMappingURL=chunk-LogStatus.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-LogStatus.mjs","names":[],"sources":["../../src/containers/LogStatus/LogStatus.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { StatusBar } from '@dxos/plugin-status-bar/components';\nimport { IconButton, Panel, Popover, useTranslation } from '@dxos/react-ui';\nimport { Logger } from '@dxos/react-ui-debug';\n\nimport { meta } from '#meta';\n\n/** Status-bar button that opens the log panel in a popover for a quick glance. */\nexport const LogStatus = () => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <Popover.Root>\n {/* IconButton is the direct trigger child so the trigger ref/handlers/ARIA attach to the button, not the container. */}\n <StatusBar.Item>\n <Popover.Trigger asChild>\n <IconButton variant='ghost' icon='ph--list-magnifying-glass--regular' iconOnly label={t('open-logs.label')} />\n </Popover.Trigger>\n </StatusBar.Item>\n <Popover.Portal>\n <Popover.Content side='top'>\n <Popover.Viewport classNames='w-[40rem] h-[24rem]'>\n <Logger.Root>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Logger.Toolbar />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Logger.Content>\n <Logger.List />\n </Logger.Content>\n </Panel.Content>\n <Panel.Statusbar asChild>\n <Logger.Filter />\n </Panel.Statusbar>\n </Panel.Root>\n </Logger.Root>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n\nLogStatus.displayName = 'LogStatus';\n"],"mappings":";;;;;;;;AAaA,IAAa,kBAAkB;CAC7B,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAE7C,OACE,qBAAC,QAAQ,MAAT,EAAA,UAAA,CAEE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,QAAQ,SAAT;EAAiB,SAAA;YACf,oBAAC,YAAD;GAAY,SAAQ;GAAQ,MAAK;GAAqC,UAAA;GAAS,OAAO,EAAE,iBAAiB;EAAI,CAAA;CAC9F,CAAA,EACH,CAAA,GAChB,oBAAC,QAAQ,QAAT,EAAA,UACE,qBAAC,QAAQ,SAAT;EAAiB,MAAK;YAAtB,CACE,oBAAC,QAAQ,UAAT;GAAkB,YAAW;aAC3B,oBAAC,OAAO,MAAR,EAAA,UACE,qBAAC,MAAM,MAAP,EAAA,UAAA;IACE,oBAAC,MAAM,SAAP;KAAe,SAAA;eACb,oBAAC,OAAO,SAAR,CAAiB,CAAA;IACJ,CAAA;IACf,oBAAC,MAAM,SAAP;KAAe,SAAA;eACb,oBAAC,OAAO,SAAR,EAAA,UACE,oBAAC,OAAO,MAAR,CAAc,CAAA,EACA,CAAA;IACH,CAAA;IACf,oBAAC,MAAM,WAAP;KAAiB,SAAA;eACf,oBAAC,OAAO,QAAR,CAAgB,CAAA;IACD,CAAA;GACP,EAAA,CAAA,EACD,CAAA;EACG,CAAA,GAClB,oBAAC,QAAQ,OAAT,CAAgB,CAAA,CACD;IACH,CAAA,CACJ,EAAA,CAAA;AAElB;AAEA,UAAU,cAAc"}