@dxos/plugin-debug 0.8.4-main.c4373fc → 0.8.4-main.d9fc60f731

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 (244) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +373 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs +15 -0
  5. package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs.map +7 -0
  6. package/dist/lib/neutral/DebugObjectPanel-OS65NC4M.mjs +59 -0
  7. package/dist/lib/neutral/DebugObjectPanel-OS65NC4M.mjs.map +7 -0
  8. package/dist/lib/neutral/DebugPlugin.mjs +59 -0
  9. package/dist/lib/neutral/DebugPlugin.mjs.map +7 -0
  10. package/dist/lib/neutral/DebugPlugin.node.mjs +18 -0
  11. package/dist/lib/neutral/DebugPlugin.node.mjs.map +7 -0
  12. package/dist/lib/neutral/DebugPlugin.workerd.mjs +12 -0
  13. package/dist/lib/neutral/DebugPlugin.workerd.mjs.map +7 -0
  14. package/dist/lib/neutral/DebugSettings-RKYNQIKH.mjs +223 -0
  15. package/dist/lib/neutral/DebugSettings-RKYNQIKH.mjs.map +7 -0
  16. package/dist/lib/neutral/DebugSpaceObjectsPanel-BHOCFWDJ.mjs +34 -0
  17. package/dist/lib/neutral/DebugSpaceObjectsPanel-BHOCFWDJ.mjs.map +7 -0
  18. package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs +122 -0
  19. package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs.map +7 -0
  20. package/dist/lib/neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs +23 -0
  21. package/dist/lib/neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs.map +7 -0
  22. package/dist/lib/neutral/GithubPanel-QJKDJRVQ.mjs +177 -0
  23. package/dist/lib/neutral/GithubPanel-QJKDJRVQ.mjs.map +7 -0
  24. package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs +161 -0
  25. package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs.map +7 -0
  26. package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs +146 -0
  27. package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs.map +7 -0
  28. package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs +52 -0
  29. package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs.map +7 -0
  30. package/dist/lib/neutral/app-graph-builder-XYLTBYKN.mjs +612 -0
  31. package/dist/lib/neutral/app-graph-builder-XYLTBYKN.mjs.map +7 -0
  32. package/dist/lib/neutral/capabilities/index.mjs +15 -0
  33. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-HOV6MV5B.mjs +43 -0
  35. package/dist/lib/neutral/chunk-HOV6MV5B.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  37. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  38. package/dist/lib/{browser/chunk-SRV2AIGJ.mjs → neutral/chunk-UAAGABXZ.mjs} +31 -9
  39. package/dist/lib/neutral/chunk-UAAGABXZ.mjs.map +7 -0
  40. package/dist/lib/{browser/SpaceGenerator-54FUIZIH.mjs → neutral/components/index.mjs} +343 -530
  41. package/dist/lib/neutral/components/index.mjs.map +7 -0
  42. package/dist/lib/neutral/containers/index.mjs +25 -0
  43. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  44. package/dist/lib/neutral/index.mjs +18 -0
  45. package/dist/lib/neutral/index.mjs.map +7 -0
  46. package/dist/lib/neutral/meta.json +1 -0
  47. package/dist/lib/neutral/meta.mjs +8 -0
  48. package/dist/lib/neutral/meta.mjs.map +7 -0
  49. package/dist/lib/neutral/plugin.mjs +12 -0
  50. package/dist/lib/neutral/plugin.mjs.map +7 -0
  51. package/dist/lib/neutral/react-context-MUZ3KVLU.mjs +17 -0
  52. package/dist/lib/neutral/react-context-MUZ3KVLU.mjs.map +7 -0
  53. package/dist/lib/neutral/react-surface-3MDMZGCA.mjs +425 -0
  54. package/dist/lib/neutral/react-surface-3MDMZGCA.mjs.map +7 -0
  55. package/dist/lib/neutral/settings-MPM6YUP4.mjs +28 -0
  56. package/dist/lib/neutral/settings-MPM6YUP4.mjs.map +7 -0
  57. package/dist/lib/neutral/translations.mjs +91 -0
  58. package/dist/lib/neutral/translations.mjs.map +7 -0
  59. package/dist/lib/neutral/types/index.mjs +14 -0
  60. package/dist/lib/neutral/types/index.mjs.map +7 -0
  61. package/dist/types/src/DebugPlugin.d.ts +4 -1
  62. package/dist/types/src/DebugPlugin.d.ts.map +1 -1
  63. package/dist/types/src/DebugPlugin.node.d.ts +5 -0
  64. package/dist/types/src/DebugPlugin.node.d.ts.map +1 -0
  65. package/dist/types/src/DebugPlugin.test.d.ts +2 -0
  66. package/dist/types/src/DebugPlugin.test.d.ts.map +1 -0
  67. package/dist/types/src/DebugPlugin.workerd.d.ts +5 -0
  68. package/dist/types/src/DebugPlugin.workerd.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  70. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/index.d.ts +8 -5
  72. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/react-context.d.ts +4 -2
  74. package/dist/types/src/capabilities/react-context.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/react-surface.d.ts +7 -2
  76. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/settings.d.ts +5 -2
  78. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  79. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts +11 -0
  80. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts.map +1 -0
  81. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts +106 -0
  82. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/DebugSettings/index.d.ts +2 -0
  84. package/dist/types/src/components/DebugSettings/index.d.ts.map +1 -0
  85. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -0
  86. package/dist/types/src/components/SchemaTable/index.d.ts +2 -0
  87. package/dist/types/src/components/SchemaTable/index.d.ts.map +1 -0
  88. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +4 -5
  89. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
  90. package/dist/types/src/components/SpaceGenerator/draw-util.d.ts.map +1 -1
  91. package/dist/types/src/components/SpaceGenerator/index.d.ts +2 -2
  92. package/dist/types/src/components/SpaceGenerator/index.d.ts.map +1 -1
  93. package/dist/types/src/components/SpaceGenerator/presets.d.ts +2 -5
  94. package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
  95. package/dist/types/src/components/index.d.ts +4 -10
  96. package/dist/types/src/components/index.d.ts.map +1 -1
  97. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +8 -0
  98. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +1 -0
  99. package/dist/types/src/containers/DebugGraph/index.d.ts +2 -0
  100. package/dist/types/src/containers/DebugGraph/index.d.ts.map +1 -0
  101. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +6 -0
  102. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -0
  103. package/dist/types/src/containers/DebugObjectPanel/index.d.ts +2 -0
  104. package/dist/types/src/containers/DebugObjectPanel/index.d.ts.map +1 -0
  105. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +5 -0
  106. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -0
  107. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts +2 -0
  108. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts.map +1 -0
  109. package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -0
  110. package/dist/types/src/containers/DebugStatus/index.d.ts +2 -0
  111. package/dist/types/src/containers/DebugStatus/index.d.ts.map +1 -0
  112. package/dist/types/src/{components → containers/DevtoolsOverviewContainer}/DevtoolsOverviewContainer.d.ts +0 -1
  113. package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts.map +1 -0
  114. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +2 -0
  115. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +1 -0
  116. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts +15 -0
  117. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts.map +1 -0
  118. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts +106 -0
  119. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts.map +1 -0
  120. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts +3 -0
  121. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts.map +1 -0
  122. package/dist/types/src/containers/GithubPanel/index.d.ts +2 -0
  123. package/dist/types/src/containers/GithubPanel/index.d.ts.map +1 -0
  124. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts +3 -0
  125. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts.map +1 -0
  126. package/dist/types/src/containers/RegistryPanel/index.d.ts +2 -0
  127. package/dist/types/src/containers/RegistryPanel/index.d.ts.map +1 -0
  128. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts +11 -0
  129. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -0
  130. package/dist/types/src/containers/SpaceGenerator/index.d.ts +2 -0
  131. package/dist/types/src/containers/SpaceGenerator/index.d.ts.map +1 -0
  132. package/dist/types/src/{components → containers/Wireframe}/Wireframe.d.ts +2 -2
  133. package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -0
  134. package/dist/types/src/containers/Wireframe/index.d.ts +2 -0
  135. package/dist/types/src/containers/Wireframe/index.d.ts.map +1 -0
  136. package/dist/types/src/containers/index.d.ts +11 -0
  137. package/dist/types/src/containers/index.d.ts.map +1 -0
  138. package/dist/types/src/index.d.ts +1 -1
  139. package/dist/types/src/index.d.ts.map +1 -1
  140. package/dist/types/src/meta.d.ts +2 -2
  141. package/dist/types/src/meta.d.ts.map +1 -1
  142. package/dist/types/src/plugin.d.ts +4 -0
  143. package/dist/types/src/plugin.d.ts.map +1 -0
  144. package/dist/types/src/translations.d.ts +87 -59
  145. package/dist/types/src/translations.d.ts.map +1 -1
  146. package/dist/types/src/types/Settings.d.ts +8 -0
  147. package/dist/types/src/types/Settings.d.ts.map +1 -0
  148. package/dist/types/src/types/index.d.ts +70 -0
  149. package/dist/types/src/types/index.d.ts.map +1 -0
  150. package/dist/types/tsconfig.tsbuildinfo +1 -1
  151. package/package.json +125 -78
  152. package/src/DebugPlugin.node.ts +18 -0
  153. package/src/DebugPlugin.test.ts +29 -0
  154. package/src/DebugPlugin.tsx +34 -34
  155. package/src/DebugPlugin.workerd.ts +12 -0
  156. package/src/capabilities/app-graph-builder.ts +390 -388
  157. package/src/capabilities/index.ts +5 -5
  158. package/src/capabilities/react-context.tsx +16 -7
  159. package/src/capabilities/react-surface.tsx +386 -339
  160. package/src/capabilities/settings.ts +24 -12
  161. package/src/components/DebugSettings/DebugSettings.stories.tsx +36 -0
  162. package/src/components/DebugSettings/DebugSettings.tsx +259 -0
  163. package/src/components/DebugSettings/index.ts +5 -0
  164. package/src/components/SchemaTable/index.ts +5 -0
  165. package/src/components/SpaceGenerator/ObjectGenerator.tsx +38 -44
  166. package/src/components/SpaceGenerator/draw-util.ts +8 -8
  167. package/src/components/SpaceGenerator/index.ts +2 -3
  168. package/src/components/SpaceGenerator/presets.ts +245 -151
  169. package/src/components/index.ts +4 -8
  170. package/src/containers/DebugGraph/DebugGraph.tsx +14 -0
  171. package/src/containers/DebugGraph/index.ts +5 -0
  172. package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +76 -0
  173. package/src/containers/DebugObjectPanel/index.ts +5 -0
  174. package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +47 -0
  175. package/src/containers/DebugSpaceObjectsPanel/index.ts +5 -0
  176. package/src/{components → containers/DebugStatus}/DebugStatus.tsx +42 -19
  177. package/src/containers/DebugStatus/index.ts +5 -0
  178. package/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx +25 -0
  179. package/src/containers/DevtoolsOverviewContainer/index.ts +5 -0
  180. package/src/containers/GithubPanel/GithubComponent.stories.tsx +38 -0
  181. package/src/containers/GithubPanel/GithubComponent.tsx +192 -0
  182. package/src/containers/GithubPanel/GithubPanel.tsx +17 -0
  183. package/src/containers/GithubPanel/index.ts +5 -0
  184. package/src/containers/RegistryPanel/RegistryPanel.tsx +150 -0
  185. package/src/containers/RegistryPanel/index.ts +5 -0
  186. package/src/containers/SpaceGenerator/SpaceGenerator.tsx +127 -0
  187. package/src/containers/SpaceGenerator/index.ts +5 -0
  188. package/src/{components → containers/Wireframe}/Wireframe.tsx +7 -12
  189. package/src/containers/Wireframe/index.ts +5 -0
  190. package/src/containers/index.ts +15 -0
  191. package/src/index.ts +1 -1
  192. package/src/meta.ts +29 -6
  193. package/src/plugin.ts +10 -0
  194. package/src/translations.ts +83 -58
  195. package/src/types/Settings.ts +16 -0
  196. package/src/{types.ts → types/index.ts} +21 -11
  197. package/src/vite-env.d.ts +10 -0
  198. package/dist/lib/browser/DebugGraph-EDOH6R2G.mjs +0 -20
  199. package/dist/lib/browser/DebugGraph-EDOH6R2G.mjs.map +0 -7
  200. package/dist/lib/browser/DevtoolsOverviewContainer-EPD6EWT5.mjs +0 -25
  201. package/dist/lib/browser/DevtoolsOverviewContainer-EPD6EWT5.mjs.map +0 -7
  202. package/dist/lib/browser/SpaceGenerator-54FUIZIH.mjs.map +0 -7
  203. package/dist/lib/browser/app-graph-builder-I4IHBKKN.mjs +0 -588
  204. package/dist/lib/browser/app-graph-builder-I4IHBKKN.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-SRV2AIGJ.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-SVCKCXCL.mjs +0 -16
  207. package/dist/lib/browser/chunk-SVCKCXCL.mjs.map +0 -7
  208. package/dist/lib/browser/index.mjs +0 -131
  209. package/dist/lib/browser/index.mjs.map +0 -7
  210. package/dist/lib/browser/meta.json +0 -1
  211. package/dist/lib/browser/react-context-QLZE7VSQ.mjs +0 -16
  212. package/dist/lib/browser/react-context-QLZE7VSQ.mjs.map +0 -7
  213. package/dist/lib/browser/react-surface-BTWJ2I3F.mjs +0 -772
  214. package/dist/lib/browser/react-surface-BTWJ2I3F.mjs.map +0 -7
  215. package/dist/lib/browser/settings-EBVICEEW.mjs +0 -22
  216. package/dist/lib/browser/settings-EBVICEEW.mjs.map +0 -7
  217. package/dist/types/src/components/Container.d.ts +0 -5
  218. package/dist/types/src/components/Container.d.ts.map +0 -1
  219. package/dist/types/src/components/DebugGraph.d.ts +0 -8
  220. package/dist/types/src/components/DebugGraph.d.ts.map +0 -1
  221. package/dist/types/src/components/DebugObjectPanel.d.ts +0 -7
  222. package/dist/types/src/components/DebugObjectPanel.d.ts.map +0 -1
  223. package/dist/types/src/components/DebugSettings.d.ts +0 -6
  224. package/dist/types/src/components/DebugSettings.d.ts.map +0 -1
  225. package/dist/types/src/components/DebugStatus.d.ts.map +0 -1
  226. package/dist/types/src/components/DevtoolsOverviewContainer.d.ts.map +0 -1
  227. package/dist/types/src/components/SpaceGenerator/SchemaTable.d.ts.map +0 -1
  228. package/dist/types/src/components/SpaceGenerator/SpaceGenerator.d.ts +0 -9
  229. package/dist/types/src/components/SpaceGenerator/SpaceGenerator.d.ts.map +0 -1
  230. package/dist/types/src/components/SpaceGenerator/SpaceGenerator.stories.d.ts +0 -15
  231. package/dist/types/src/components/SpaceGenerator/SpaceGenerator.stories.d.ts.map +0 -1
  232. package/dist/types/src/components/Wireframe.d.ts.map +0 -1
  233. package/dist/types/src/types.d.ts +0 -63
  234. package/dist/types/src/types.d.ts.map +0 -1
  235. package/src/components/Container.tsx +0 -15
  236. package/src/components/DebugGraph.tsx +0 -14
  237. package/src/components/DebugObjectPanel.tsx +0 -33
  238. package/src/components/DebugSettings.tsx +0 -159
  239. package/src/components/DevtoolsOverviewContainer.tsx +0 -20
  240. package/src/components/SpaceGenerator/SpaceGenerator.stories.tsx +0 -52
  241. package/src/components/SpaceGenerator/SpaceGenerator.tsx +0 -122
  242. /package/dist/types/src/components/{SpaceGenerator → SchemaTable}/SchemaTable.d.ts +0 -0
  243. /package/dist/types/src/{components → containers/DebugStatus}/DebugStatus.d.ts +0 -0
  244. /package/src/components/{SpaceGenerator → SchemaTable}/SchemaTable.tsx +0 -0
@@ -0,0 +1,150 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+ import { JsonView, PanelContainer, Placeholder, Searchbar } from '@dxos/devtools';
9
+ import { Entity, Format, Obj, Type } from '@dxos/echo';
10
+ import { useClient } from '@dxos/react-client';
11
+ import { Toolbar } from '@dxos/react-ui';
12
+ import { DynamicTable, type TableFeatures } from '@dxos/react-ui-table';
13
+ import { mx } from '@dxos/ui-theme';
14
+
15
+ type RegistryRow = {
16
+ id: string;
17
+ kind: string;
18
+ label: string;
19
+ _entity: Entity.Unknown;
20
+ };
21
+
22
+ const textFilter = (text?: string) => {
23
+ if (!text) {
24
+ return () => true;
25
+ }
26
+
27
+ const matcher = new RegExp(text, 'i');
28
+ return (entity: Entity.Unknown) => {
29
+ const typename = Entity.getTypename(entity) ?? '';
30
+ const metaKey = Obj.isObject(entity) ? (Obj.getMeta(entity).key ?? '') : '';
31
+ const uri = Type.isType(entity) ? (Type.getURI(entity)?.toString() ?? '') : '';
32
+ const operationKey =
33
+ Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)
34
+ ? (Operation.getKey(entity) ?? '')
35
+ : '';
36
+ const name = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? entity.name : '';
37
+ return [typename, metaKey, uri, operationKey, name, getEntityId(entity)].some((value) => value.match(matcher));
38
+ };
39
+ };
40
+
41
+ const getEntityId = (entity: Entity.Unknown): string => {
42
+ if (entity.id) {
43
+ return entity.id;
44
+ }
45
+ if (Type.isType(entity)) {
46
+ return Type.getURI(entity)?.toString() ?? Type.getTypename(entity) ?? 'unknown-type';
47
+ }
48
+ return Entity.getTypename(entity) ?? 'unknown';
49
+ };
50
+
51
+ const getKind = (entity: Entity.Unknown): string => {
52
+ if (Type.isType(entity)) {
53
+ return 'type';
54
+ }
55
+ if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {
56
+ return 'operation';
57
+ }
58
+ return 'other';
59
+ };
60
+
61
+ const getLabel = (entity: Entity.Unknown): string => {
62
+ if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {
63
+ return entity.name || Operation.getKey(entity) || getEntityId(entity);
64
+ }
65
+ if (Type.isType(entity)) {
66
+ return Type.getTypename(entity) ?? getEntityId(entity);
67
+ }
68
+ return getEntityId(entity);
69
+ };
70
+
71
+ const toDetailJson = (entity: Entity.Unknown): object => {
72
+ if (Type.isType(entity)) {
73
+ return {
74
+ id: getEntityId(entity),
75
+ typename: Type.getTypename(entity),
76
+ uri: Type.getURI(entity)?.toString(),
77
+ version: Type.getVersion(entity),
78
+ jsonSchema: entity.jsonSchema,
79
+ };
80
+ }
81
+ if (Obj.isObject(entity)) {
82
+ return Obj.toJSON(entity);
83
+ }
84
+ return { id: getEntityId(entity), typename: Entity.getTypename(entity) };
85
+ };
86
+
87
+ export const RegistryPanel = () => {
88
+ const client = useClient();
89
+ const [entities, setEntities] = useState<Entity.Unknown[]>([]);
90
+ const [filter, setFilter] = useState('');
91
+ const [selected, setSelected] = useState<Entity.Unknown>();
92
+
93
+ useEffect(() => {
94
+ const registry = client.graph.registry;
95
+ const refresh = () => setEntities([...registry.list()]);
96
+ refresh();
97
+ return registry.changed.on(refresh);
98
+ }, [client]);
99
+
100
+ const properties = useMemo(
101
+ () => [
102
+ { name: 'kind', format: Format.TypeFormat.String, size: 100 },
103
+ { name: 'label', format: Format.TypeFormat.String },
104
+ { name: 'id', format: Format.TypeFormat.String, size: 280 },
105
+ ],
106
+ [],
107
+ );
108
+
109
+ const rows = useMemo((): RegistryRow[] => {
110
+ return entities
111
+ .filter(textFilter(filter))
112
+ .map((entity) => ({
113
+ id: getEntityId(entity),
114
+ kind: getKind(entity),
115
+ label: getLabel(entity),
116
+ _entity: entity,
117
+ }))
118
+ .toSorted((left, right) => left.label.localeCompare(right.label));
119
+ }, [entities, filter]);
120
+
121
+ const handleRowClicked = useCallback((row: RegistryRow | undefined) => {
122
+ if (!row?._entity) {
123
+ return;
124
+ }
125
+ setSelected(row._entity);
126
+ }, []);
127
+
128
+ const detailJson = useMemo(() => (selected ? toDetailJson(selected) : undefined), [selected]);
129
+
130
+ const features: Partial<TableFeatures> = useMemo(() => ({ selection: { enabled: true, mode: 'single' } }), []);
131
+
132
+ return (
133
+ <PanelContainer
134
+ toolbar={
135
+ <Toolbar.Root>
136
+ <Searchbar placeholder='Filter...' onChange={setFilter} />
137
+ </Toolbar.Root>
138
+ }
139
+ >
140
+ <div className={mx('h-full grid grid-cols-[2fr_1fr] overflow-hidden')}>
141
+ <div className={mx('flex flex-col min-h-0 overflow-hidden')}>
142
+ <DynamicTable properties={properties} rows={rows} features={features} onRowClick={handleRowClicked} />
143
+ </div>
144
+ <div className={mx('min-h-0 h-full overflow-auto border-s border-separator text-sm')}>
145
+ {detailJson ? <JsonView data={detailJson} /> : <Placeholder label='Details' />}
146
+ </div>
147
+ </div>
148
+ </PanelContainer>
149
+ );
150
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export { RegistryPanel as default, RegistryPanel } from './RegistryPanel';
@@ -0,0 +1,127 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useMemo, useState } from 'react';
6
+
7
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
8
+ import { ComputeGraph } from '@dxos/conductor';
9
+ import { Filter, Obj, Type } from '@dxos/echo';
10
+ import { Markdown } from '@dxos/plugin-markdown';
11
+ import { Sheet } from '@dxos/plugin-sheet';
12
+ import { Sketch } from '@dxos/plugin-sketch';
13
+ import { useClient } from '@dxos/react-client';
14
+ import { type Space } from '@dxos/react-client/echo';
15
+ import { IconButton, Input, Panel, ScrollArea, Toolbar, useAsyncEffect } from '@dxos/react-ui';
16
+ import { composable, composableProps } from '@dxos/react-ui';
17
+ import { Organization, Person, Task } from '@dxos/types';
18
+ import { sortKeys } from '@dxos/util';
19
+
20
+ import { type ObjectGenerator, SchemaTable, createGenerator, generator, staticGenerators } from '#components';
21
+
22
+ // TODO(burdon): Make extensible.
23
+ const staticTypes = [Markdown.Document, Sketch.Sketch, Sheet.Sheet, ComputeGraph];
24
+ const recordTypes: Type.AnyObj[] = [Organization.Organization, Person.Person, Task.Task];
25
+
26
+ export type SpaceGeneratorProps = {
27
+ space: Space;
28
+ onCreateObjects?: (objects: Obj.Unknown[]) => void;
29
+ };
30
+
31
+ export const SpaceGenerator = composable<HTMLDivElement, SpaceGeneratorProps>(
32
+ ({ space, onCreateObjects, children, ...props }, forwardedRef) => {
33
+ const { invokePromise } = useOperationInvoker();
34
+ const client = useClient();
35
+ const [count, setCount] = useState(1);
36
+ const [info, setInfo] = useState<any>({});
37
+ const presets = useMemo(() => generator(), []);
38
+
39
+ // Register types.
40
+ useAsyncEffect(async () => {
41
+ await client.addTypes([...staticTypes, ...recordTypes, ...presets.schemas]);
42
+ }, [client, presets]);
43
+
44
+ // Create type generators.
45
+ const typeMap = useMemo(() => {
46
+ const recordGenerators = new Map<string, ObjectGenerator<any>>(
47
+ recordTypes.map((type) => [Type.getTypename(type), createGenerator(client, invokePromise, type)]),
48
+ );
49
+
50
+ return new Map([...staticGenerators, ...presets.items, ...recordGenerators]);
51
+ }, [client, invokePromise, presets]);
52
+
53
+ // Query space to get info.
54
+ const updateInfo = useCallback(async () => {
55
+ const allSchema = [...space.db.graph.registry.list().filter(Type.isType)];
56
+ const echoSchema = allSchema.filter((t) => Type.isTypeKind(t));
57
+ const staticSchema = allSchema.filter((t) => !Type.isTypeKind(t));
58
+
59
+ const objects = await space.db.query(Filter.everything()).run();
60
+ const objectMap = sortKeys(
61
+ objects.reduce<Record<string, number>>((map, obj) => {
62
+ const type = Obj.getTypename(obj);
63
+ if (type) {
64
+ const count = map[type] ?? 0;
65
+ map[type] = count + 1;
66
+ }
67
+
68
+ return map;
69
+ }, {}),
70
+ );
71
+
72
+ setInfo({
73
+ schema: {
74
+ static: staticSchema.length,
75
+ mutable: echoSchema.length,
76
+ },
77
+ objects: objectMap,
78
+ });
79
+ }, [space]);
80
+
81
+ useAsyncEffect(updateInfo, [updateInfo]);
82
+
83
+ const handleCreateData = useCallback(
84
+ async (typename: string) => {
85
+ const constructor = typeMap.get(typename);
86
+ if (constructor) {
87
+ // TODO(burdon): Input to specify number of objects.
88
+ await constructor(space, count, onCreateObjects);
89
+ await updateInfo();
90
+ }
91
+ },
92
+ [typeMap, count, space, onCreateObjects, updateInfo],
93
+ );
94
+
95
+ return (
96
+ <Panel.Root {...composableProps(props)} ref={forwardedRef}>
97
+ <Panel.Toolbar asChild>
98
+ <Toolbar.Root>
99
+ <IconButton icon='ph--arrow-clockwise--regular' iconOnly label='Refresh' onClick={updateInfo} />
100
+ <Toolbar.Separator />
101
+ <Input.Root>
102
+ <Input.TextInput
103
+ type='number'
104
+ placeholder='Count'
105
+ classNames='w-[4rem] text-right'
106
+ min={1}
107
+ max={100}
108
+ size={8}
109
+ value={count}
110
+ onChange={(event) => setCount(parseInt(event.target.value))}
111
+ />
112
+ </Input.Root>
113
+ </Toolbar.Root>
114
+ </Panel.Toolbar>
115
+ <Panel.Content asChild>
116
+ <ScrollArea.Root thin orientation='vertical'>
117
+ <ScrollArea.Viewport classNames='dx-document gap-4 divide-y divide-subdued-separator'>
118
+ <SchemaTable types={staticTypes} objects={info.objects} label='Static Types' onClick={handleCreateData} />
119
+ <SchemaTable types={recordTypes} objects={info.objects} label='Record Types' onClick={handleCreateData} />
120
+ <SchemaTable types={presets.types} objects={info.objects} label='Presets' onClick={handleCreateData} />
121
+ </ScrollArea.Viewport>
122
+ </ScrollArea.Root>
123
+ </Panel.Content>
124
+ </Panel.Root>
125
+ );
126
+ },
127
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { SpaceGenerator as default } from './SpaceGenerator';
@@ -5,36 +5,31 @@
5
5
  import React from 'react';
6
6
  import { useResizeDetector } from 'react-resize-detector';
7
7
 
8
- import { type Obj } from '@dxos/echo';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
8
+ import { Obj } from '@dxos/echo';
10
9
  import { type ThemedClassName } from '@dxos/react-ui';
11
10
  import { useAttentionAttributes } from '@dxos/react-ui-attention';
12
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
13
- import { mx } from '@dxos/react-ui-theme';
11
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
12
+ import { mx } from '@dxos/ui-theme';
14
13
 
15
14
  // TODO(burdon): Create generic container with wireframe mode.
16
15
  export type WireframeProps = ThemedClassName<{
16
+ object: Obj.Unknown;
17
17
  label?: string;
18
- object: Obj.Any;
19
18
  }>;
20
19
 
21
20
  // TODO(burdon): Make focusable and attendable with input.
22
21
  export const Wireframe = ({ classNames, label, object }: WireframeProps) => {
23
- const attentionAttrs = useAttentionAttributes(fullyQualifiedId(object));
22
+ const attentionAttrs = useAttentionAttributes(Obj.getURI(object));
24
23
  const { width, height, ref } = useResizeDetector();
25
24
 
26
25
  return (
27
- <div ref={ref} className={mx('relative grow min-bs-96', classNames)} {...attentionAttrs}>
26
+ <div ref={ref} className={mx('relative grow min-h-96', classNames)} {...attentionAttrs}>
28
27
  <div className='absolute inset-2 flex flex-col gap-2 overflow-hidden font-mono'>
29
28
  <div className='flex justify-between'>
30
29
  <div>{label}</div>
31
30
  <div>{`[${width}x${height}]`}</div>
32
31
  </div>
33
- {object && (
34
- <SyntaxHighlighter language='json' classNames='text-xs opacity-75 rounded'>
35
- {JSON.stringify(object, undefined, 2)}
36
- </SyntaxHighlighter>
37
- )}
32
+ {object && <JsonHighlighter data={object} classNames='text-xs opacity-75 rounded-sm' />}
38
33
  </div>
39
34
  <svg width={width} height={height} className='bg-transparent *:text-subdued'>
40
35
  <rect x={0} y={0} width={width} height={height} strokeWidth={1} fill='none' />
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { Wireframe as default } from './Wireframe';
@@ -0,0 +1,15 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export const DebugGraph: ComponentType<any> = lazy(() => import('./DebugGraph'));
8
+ export const DebugObjectPanel: ComponentType<any> = lazy(() => import('./DebugObjectPanel'));
9
+ export const DebugStatus: ComponentType<any> = lazy(() => import('./DebugStatus'));
10
+ export const DevtoolsOverviewContainer: ComponentType<any> = lazy(() => import('./DevtoolsOverviewContainer'));
11
+ export const SpaceGenerator: ComponentType<any> = lazy(() => import('./SpaceGenerator'));
12
+ export const Wireframe: ComponentType<any> = lazy(() => import('./Wireframe'));
13
+ export const DebugSpaceObjectsPanel: ComponentType<any> = lazy(() => import('./DebugSpaceObjectsPanel'));
14
+ export const GithubPanel: ComponentType<any> = lazy(() => import('./GithubPanel'));
15
+ export const RegistryPanel: ComponentType<any> = lazy(() => import('./RegistryPanel'));
package/src/index.ts CHANGED
@@ -2,5 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './DebugPlugin';
6
5
  export * from './meta';
6
+ export * from './types';
package/src/meta.ts CHANGED
@@ -2,14 +2,37 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginMeta } from '@dxos/app-framework';
5
+ import { Plugin } from '@dxos/app-framework';
6
+ import { DXN } from '@dxos/keys';
7
+ import { trim } from '@dxos/util';
6
8
 
7
- export const meta: PluginMeta = {
8
- id: 'dxos.org/plugin/debug',
9
+ export const meta = Plugin.makeMeta({
10
+ key: DXN.make('org.dxos.plugin.debug'),
9
11
  name: 'Debug',
10
- description:
11
- 'The debug plugin is useful for troubleshooting inside of Composer. You can also use the Debug plugin to create test data inside of sheets or tables or explore pre-built automations. Non-technical users will likely not spend much time here, but this plugin is invaluable for developers and technical users.',
12
+ author: 'DXOS',
13
+ spec: 'PLUGIN.mdl',
14
+ description: trim`
15
+ DebugPlugin is the developer toolkit for DXOS Composer. It adds a structured Devtools node
16
+ to the navigation graph — grouped into Client, HALO, ECHO, Mesh, and EDGE sub-sections —
17
+ exposing panel views for config, storage, logs, diagnostics, identity, devices, feeds,
18
+ objects, schemas, automerge internals, network topology, EDGE workflows, and invocation
19
+ traces, all driven by the @dxos/devtools component library.
20
+
21
+ The plugin contributes a Debug companion tab to every ECHO object in the deck so developers
22
+ can inspect raw field values and DXNs inline, and a Space Objects companion panel that lists
23
+ all objects in the active space with live reactive updates.
24
+
25
+ Test-data generation is available via a SpaceGenerator article surface: developers can
26
+ create configurable batches of synthetic ECHO objects into any space collection, with a
27
+ status indicator showing when generation is running.
28
+
29
+ Additional utilities include a wireframe overlay mode that draws labelled borders around
30
+ every article and section surface, a log-capture and download facility backed by an
31
+ IdbLogStore, a ToolsExplorer connected to the DXOS MCP introspect service, and a
32
+ globalThis helper for manual storage-version testing.
33
+ `,
12
34
  icon: 'ph--bug--regular',
13
35
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-debug',
14
36
  screenshots: ['https://dxos.network/plugin-details-debug-dark.png'],
15
- };
37
+ tags: ['labs'],
38
+ });
package/src/plugin.ts ADDED
@@ -0,0 +1,10 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Plugin } from '@dxos/app-framework';
6
+
7
+ import { meta } from './meta';
8
+
9
+ export const DebugPlugin = Plugin.lazy(meta, () => import('#plugin'));
10
+ export type { DebugPluginOptions } from '#types';
@@ -3,71 +3,96 @@
3
3
  //
4
4
 
5
5
  import { type Resource } from '@dxos/react-ui';
6
+ import { translations as introspectTranslations } from '@dxos/react-ui-introspect/translations';
6
7
 
7
- import { meta } from './meta';
8
+ import { meta } from '#meta';
8
9
 
9
10
  export const translations = [
11
+ ...introspectTranslations,
10
12
  {
11
13
  'en-US': {
12
14
  [meta.id]: {
13
- 'plugin name': 'Debug',
14
- 'settings title': 'Debug settings',
15
- 'mutation count': 'Number of mutations',
16
- 'mutation period': 'Mutation period',
17
- 'open devtools label': 'Open DevTools',
18
- 'devtools label': 'DevTools',
19
- 'devtools overview label': 'DevTools Stats',
20
- 'debug label': 'Debug',
21
- 'debug app graph label': 'App Graph',
22
- 'settings show debug panel': 'Show Debug panel.',
23
- 'settings show devtools panel': 'Show DevTools panel.',
24
- 'settings wireframe': 'Show wireframes.',
25
- 'settings repair': 'Run repair tool.',
26
- 'settings download diagnostics': 'Download diagnostics.',
27
- 'settings uploaded': 'Uploaded to IPFS',
28
- 'settings uploaded to clipboard': 'URL copied to clipboard.',
29
- 'settings repair success': 'Repair succeeded',
30
- 'settings repair failed': 'Repair failed',
31
- 'settings choose storage adaptor': 'Storage adaptor (worker reload required).',
32
- 'settings storage adaptor idb label': 'IndexedDB',
33
- 'settings storage adaptor opfs label': 'OPFS',
34
- 'settings data store label': 'Data Store',
35
- 'settings storage adapter changed alert':
15
+ 'plugin.name': 'Debug',
16
+ 'settings.title': 'Debug settings',
17
+ 'open-devtools.label': 'Open DevTools',
18
+ 'devtools.label': 'DevTools',
19
+ 'devtools-overview.label': 'Stats',
20
+ 'space-objects.label': 'Database',
21
+ 'debug.label': 'Debug',
22
+ 'generate-objects.label': 'Generate Objects',
23
+ 'debug-app-graph.label': 'App Graph',
24
+ 'debug-tools-explorer.label': 'SDK Explorer',
25
+
26
+ 'settings.wireframe.label': 'Show wireframes.',
27
+ 'settings.wireframe.description': 'Overlay wireframe outlines on UI components for debugging layout.',
28
+ 'settings.trace-all.label': 'Trace all requests (100% sampling).',
29
+ 'settings.trace-all.description':
30
+ 'Override the default 30% sampling rate to capture all traces. Requires page reload to take effect.',
31
+ 'settings.tracing-panel.label': 'Open tracing panel.',
32
+ 'settings.tracing-panel.description': 'Open the tracing dashboard to inspect captured spans.',
33
+ 'settings.repair.label': 'Run repair tool.',
34
+ 'settings.repair.description': 'Attempt to detect and fix inconsistencies in local data storage.',
35
+ 'settings.download-diagnostics.label': 'Download diagnostics.',
36
+ 'settings.download-diagnostics.description':
37
+ 'Export a JSON file containing client diagnostics for troubleshooting.',
38
+ 'settings.download-logs.label': 'Download log buffer.',
39
+ 'settings.download-logs.description': 'Export the in-memory log buffer as an NDJSON file.',
40
+ 'settings.uploaded.message': 'Settings uploaded.',
41
+ 'settings.uploaded.description': 'URL copied to clipboard.',
42
+ 'settings.choose-storage-adaptor.label': 'Storage adaptor (worker reload required).',
43
+ 'settings.choose-storage-adaptor.description':
44
+ 'Select the browser storage backend. Changing this requires a worker reload and may make existing data unavailable.',
45
+ 'settings.repair-success.message': 'Repair succeeded',
46
+ 'settings.repair-failed.message': 'Repair failed',
47
+
48
+ 'settings.storage-adaptor.idb.label': 'IndexedDB',
49
+ 'settings.storage-adaptor.opfs.label': 'OPFS',
50
+ 'settings.storage-adapter.changed-alert.message':
36
51
  'Warning: Swapping the storage adapter will make your data unavailable.',
37
- 'settings space fragmentation': 'Enable AM space fragmentation',
38
- 'open debug panel label': 'Show Debug',
39
- 'client label': 'Client',
40
- 'config label': 'Config',
41
- 'storage label': 'Storage',
42
- 'logs label': 'Logs',
43
- 'diagnostics label': 'Diagnostics',
44
- 'tracing label': 'Tracing',
45
- 'halo label': 'HALO',
46
- 'identity label': 'Identity',
47
- 'devices label': 'Devices',
48
- 'keyring label': 'Keyring',
49
- 'credentials label': 'Credentials',
50
- 'echo label': 'ECHO',
51
- 'spaces label': 'Spaces',
52
- 'space label': 'Space',
53
- 'feeds label': 'Feeds',
54
- 'objects label': 'Objects',
55
- 'schema label': 'Schema',
56
- 'automerge label': 'Automerge',
57
- 'queues label': 'Queues',
58
- 'members label': 'Members',
59
- 'metadata label': 'Metadata',
60
- 'mesh label': 'MESH',
61
- 'signal label': 'Signal',
62
- 'swarm label': 'Swarm',
63
- 'network label': 'Network',
64
- 'agent label': 'Agent',
65
- 'dashboard label': 'Dashboard',
66
- 'search label': 'Search',
67
- 'edge label': 'EDGE',
68
- 'workflows label': 'Workflows',
69
- 'traces label': 'Traces',
70
- 'testing label': 'Testing',
52
+
53
+ 'settings.data-store.label': 'Data Store',
54
+
55
+ 'reset-data.label': 'Reset data (ERASES ALL DATA)',
56
+ 'open-debug-panel.label': 'Show Debug',
57
+ 'client.label': 'Client',
58
+ 'config.label': 'Config',
59
+ 'storage.label': 'Storage',
60
+ 'logs.label': 'Logs',
61
+ 'diagnostics.label': 'Diagnostics',
62
+ 'tracing.label': 'Tracing',
63
+ 'halo.label': 'HALO',
64
+ 'identity.label': 'Identity',
65
+ 'devices.label': 'Devices',
66
+ 'keyring.label': 'Keyring',
67
+ 'credentials.label': 'Credentials',
68
+ 'echo.label': 'ECHO',
69
+ 'spaces.label': 'Spaces',
70
+ 'space.label': 'Space',
71
+ 'feeds.label': 'Feeds',
72
+ 'objects.label': 'Objects',
73
+ 'schema.label': 'Schema',
74
+ 'registry.label': 'Registry',
75
+ 'automerge.label': 'Automerge',
76
+ 'queues.label': 'Queues',
77
+ 'members.label': 'Members',
78
+ 'metadata.label': 'Metadata',
79
+ 'mesh.label': 'MESH',
80
+ 'signal.label': 'Signal',
81
+ 'swarm.label': 'Swarm',
82
+ 'network.label': 'Network',
83
+ 'agent.label': 'Agent',
84
+ 'dashboard.label': 'Dashboard',
85
+ 'search.label': 'Search',
86
+ 'edge.label': 'EDGE',
87
+ 'workflows.label': 'Workflows',
88
+ 'traces.label': 'Traces',
89
+ 'testing.label': 'Testing',
90
+ // GitHub (deck-companion--github surface).
91
+ 'github-loading.message': 'Loading…',
92
+ 'github-unavailable.message': 'GitHub feed unavailable.',
93
+ 'recent-prs.label_one': '{{count}} recent PR',
94
+ 'recent-prs.label_other': '{{count}} recent PRs',
95
+ 'view-on-github.button': 'View on GitHub',
71
96
  },
72
97
  },
73
98
  },
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import * as Schema from 'effect/Schema';
8
+
9
+ export const Settings = Schema.mutable(
10
+ Schema.Struct({
11
+ wireframe: Schema.optional(Schema.Boolean),
12
+ traceAll: Schema.optional(Schema.Boolean),
13
+ }),
14
+ );
15
+
16
+ export interface Settings extends Schema.Schema.Type<typeof Settings> {}