@dxos/plugin-debug 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264 → 0.13.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 (501) hide show
  1. package/PLUGIN.mdl +241 -3
  2. package/README.md +27 -3
  3. package/dist/lib/Debug.mjs.map +1 -1
  4. package/dist/lib/DebugNodes.mjs +21 -2
  5. package/dist/lib/DebugNodes.mjs.map +1 -1
  6. package/dist/lib/DebugOperation.mjs +166 -2
  7. package/dist/lib/DebugOperation.mjs.map +1 -1
  8. package/dist/lib/DebugPlugin.mjs.map +1 -1
  9. package/dist/lib/DebugSurface.mjs +7 -2
  10. package/dist/lib/DebugSurface.mjs.map +1 -1
  11. package/dist/lib/IncidentSpace.mjs +2 -0
  12. package/dist/lib/PipelineSpace.mjs +2 -0
  13. package/dist/lib/ReviewSpace.mjs +2 -0
  14. package/dist/lib/StockfishSpace.mjs +2 -0
  15. package/dist/lib/TidepoolSpace.mjs +2 -0
  16. package/dist/lib/WeatherSpace.mjs +2 -0
  17. package/dist/lib/WorkerSpace.mjs +2 -0
  18. package/dist/lib/capabilities.browser.mjs +71 -0
  19. package/dist/lib/capabilities.browser.mjs.map +1 -0
  20. package/dist/lib/capabilities.mjs +17 -7
  21. package/dist/lib/capabilities.mjs.map +1 -1
  22. package/dist/lib/capabilities.node.mjs +13 -3
  23. package/dist/lib/capabilities.node.mjs.map +1 -1
  24. package/dist/lib/capabilities.tauri.mjs +71 -0
  25. package/dist/lib/capabilities.tauri.mjs.map +1 -0
  26. package/dist/lib/capabilities.workerd.mjs +3 -1
  27. package/dist/lib/capabilities.workerd.mjs.map +1 -1
  28. package/dist/lib/chunk-DebugConsole.mjs +241 -0
  29. package/dist/lib/chunk-DebugConsole.mjs.map +1 -0
  30. package/dist/lib/chunk-DebugObjectPanel.mjs +12 -16
  31. package/dist/lib/chunk-DebugObjectPanel.mjs.map +1 -1
  32. package/dist/lib/chunk-DebugPanelDrawer.mjs +48 -0
  33. package/dist/lib/chunk-DebugPanelDrawer.mjs.map +1 -0
  34. package/dist/lib/chunk-DebugPanelHeader.mjs +280 -0
  35. package/dist/lib/chunk-DebugPanelHeader.mjs.map +1 -0
  36. package/dist/lib/chunk-DebugPanelStatus.mjs +127 -0
  37. package/dist/lib/chunk-DebugPanelStatus.mjs.map +1 -0
  38. package/dist/lib/chunk-DebugSettings.mjs +81 -70
  39. package/dist/lib/chunk-DebugSettings.mjs.map +1 -1
  40. package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs +21 -12
  41. package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs.map +1 -1
  42. package/dist/lib/chunk-DebugStatus.mjs +12 -12
  43. package/dist/lib/chunk-DebugStatus.mjs.map +1 -1
  44. package/dist/lib/chunk-IncidentSpace.mjs +269 -0
  45. package/dist/lib/chunk-IncidentSpace.mjs.map +1 -0
  46. package/dist/lib/chunk-LoggerPanel.mjs +18 -0
  47. package/dist/lib/chunk-LoggerPanel.mjs.map +1 -0
  48. package/dist/lib/chunk-PLUGIN.mjs +6 -0
  49. package/dist/lib/chunk-PLUGIN.mjs.map +1 -0
  50. package/dist/lib/chunk-PipelineSpace.mjs +378 -0
  51. package/dist/lib/chunk-PipelineSpace.mjs.map +1 -0
  52. package/dist/lib/chunk-ReviewSpace.mjs +356 -0
  53. package/dist/lib/chunk-ReviewSpace.mjs.map +1 -0
  54. package/dist/lib/chunk-SpaceGenerator.mjs +107 -73
  55. package/dist/lib/chunk-SpaceGenerator.mjs.map +1 -1
  56. package/dist/lib/chunk-StatsPanel.mjs +28 -35
  57. package/dist/lib/chunk-StatsPanel.mjs.map +1 -1
  58. package/dist/lib/chunk-StockfishSpace.mjs +563 -0
  59. package/dist/lib/chunk-StockfishSpace.mjs.map +1 -0
  60. package/dist/lib/chunk-TidepoolSpace.mjs +544 -0
  61. package/dist/lib/chunk-TidepoolSpace.mjs.map +1 -0
  62. package/dist/lib/chunk-WeatherSpace.mjs +206 -0
  63. package/dist/lib/chunk-WeatherSpace.mjs.map +1 -0
  64. package/dist/lib/chunk-Wireframe.mjs +6 -6
  65. package/dist/lib/chunk-Wireframe.mjs.map +1 -1
  66. package/dist/lib/chunk-WorkerSpace.mjs +177 -0
  67. package/dist/lib/chunk-WorkerSpace.mjs.map +1 -0
  68. package/dist/lib/chunk-app-graph-builder.mjs +72 -40
  69. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
  70. package/dist/lib/chunk-create-space-from-template.mjs +55 -0
  71. package/dist/lib/chunk-create-space-from-template.mjs.map +1 -0
  72. package/dist/lib/chunk-errors.mjs +13 -0
  73. package/dist/lib/chunk-errors.mjs.map +1 -0
  74. package/dist/lib/chunk-graph-retention.mjs +14 -0
  75. package/dist/lib/chunk-graph-retention.mjs.map +1 -0
  76. package/dist/lib/chunk-insert-lorem-ipsum.mjs +2 -2
  77. package/dist/lib/chunk-log-recording.mjs +29 -1
  78. package/dist/lib/chunk-log-recording.mjs.map +1 -1
  79. package/dist/lib/chunk-open-page.mjs +29 -0
  80. package/dist/lib/chunk-open-page.mjs.map +1 -0
  81. package/dist/lib/chunk-operation-handler.mjs +5 -0
  82. package/dist/lib/chunk-operation-handler.mjs.map +1 -1
  83. package/dist/lib/chunk-react-surface.mjs +73 -71
  84. package/dist/lib/chunk-react-surface.mjs.map +1 -1
  85. package/dist/lib/chunk-settings.mjs +2 -2
  86. package/dist/lib/chunk-settings.mjs.map +1 -1
  87. package/dist/lib/chunk-snapshot.mjs +170 -0
  88. package/dist/lib/chunk-snapshot.mjs.map +1 -0
  89. package/dist/lib/chunk-space-templates.mjs +21 -0
  90. package/dist/lib/chunk-space-templates.mjs.map +1 -0
  91. package/dist/lib/chunk-stats-panel.mjs +1 -1
  92. package/dist/lib/chunk-stats-panel.mjs.map +1 -1
  93. package/dist/lib/chunk-undo.mjs +17 -0
  94. package/dist/lib/chunk-undo.mjs.map +1 -0
  95. package/dist/lib/chunk-view-state.mjs +37 -0
  96. package/dist/lib/chunk-view-state.mjs.map +1 -0
  97. package/dist/lib/components.mjs +68 -28
  98. package/dist/lib/components.mjs.map +1 -1
  99. package/dist/lib/containers.mjs +5 -2
  100. package/dist/lib/containers.mjs.map +1 -1
  101. package/dist/lib/index.mjs +8 -2
  102. package/dist/lib/meta.mjs +3 -2
  103. package/dist/lib/meta.mjs.map +1 -1
  104. package/dist/lib/operations.mjs +7 -1
  105. package/dist/lib/operations.mjs.map +1 -1
  106. package/dist/lib/plugin.mjs +2 -2
  107. package/dist/lib/plugin.mjs.map +1 -1
  108. package/dist/lib/translations.mjs +13 -4
  109. package/dist/lib/translations.mjs.map +1 -1
  110. package/dist/types/scripts/build-template-archive.d.ts +2 -0
  111. package/dist/types/scripts/build-template-archive.d.ts.map +1 -0
  112. package/dist/types/src/DebugPlugin.d.ts +2 -2
  113. package/dist/types/src/DebugPlugin.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/DebugSurfaces.d.ts +4 -5
  115. package/dist/types/src/capabilities/DebugSurfaces.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/app-graph-builder.d.ts +31 -0
  117. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  118. package/dist/types/src/capabilities/app-graph-builder.test.d.ts +2 -0
  119. package/dist/types/src/capabilities/app-graph-builder.test.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/gen/browser.d.ts +14 -0
  121. package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/gen/node.d.ts +2 -0
  123. package/dist/types/src/capabilities/gen/node.d.ts.map +1 -1
  124. package/dist/types/src/capabilities/gen/tauri.d.ts +14 -0
  125. package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
  126. package/dist/types/src/capabilities/gen/workerd.d.ts +2 -0
  127. package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -1
  128. package/dist/types/src/capabilities/graph-retention.d.ts +5 -0
  129. package/dist/types/src/capabilities/graph-retention.d.ts.map +1 -0
  130. package/dist/types/src/capabilities/index.d.ts +2 -0
  131. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  132. package/dist/types/src/capabilities/log-recording.d.ts +4 -0
  133. package/dist/types/src/capabilities/log-recording.d.ts.map +1 -1
  134. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  135. package/dist/types/src/capabilities/space-templates.d.ts +14 -0
  136. package/dist/types/src/capabilities/space-templates.d.ts.map +1 -0
  137. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts +4 -3
  138. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
  139. package/dist/types/src/components/SchemaTable/index.d.ts +1 -1
  140. package/dist/types/src/components/SchemaTable/index.d.ts.map +1 -1
  141. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +2 -1
  142. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
  143. package/dist/types/src/components/SpaceGenerator/index.d.ts +2 -2
  144. package/dist/types/src/components/SpaceGenerator/index.d.ts.map +1 -1
  145. package/dist/types/src/components/SpaceGenerator/presets.d.ts +1 -1
  146. package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
  147. package/dist/types/src/components/index.d.ts +2 -2
  148. package/dist/types/src/components/index.d.ts.map +1 -1
  149. package/dist/types/src/containers/DebugConsole/DebugConsole.d.ts +12 -0
  150. package/dist/types/src/containers/DebugConsole/DebugConsole.d.ts.map +1 -0
  151. package/dist/types/src/containers/DebugConsole/DebugConsole.stories.d.ts +103 -0
  152. package/dist/types/src/containers/DebugConsole/DebugConsole.stories.d.ts.map +1 -0
  153. package/dist/types/src/containers/DebugConsole/cli.d.ts +24 -0
  154. package/dist/types/src/containers/DebugConsole/cli.d.ts.map +1 -0
  155. package/dist/types/src/containers/DebugConsole/index.d.ts +2 -0
  156. package/dist/types/src/containers/DebugConsole/index.d.ts.map +1 -0
  157. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +1 -1
  158. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
  159. package/dist/types/src/containers/DebugObjectPanel/index.d.ts +1 -1
  160. package/dist/types/src/containers/DebugObjectPanel/index.d.ts.map +1 -1
  161. package/dist/types/src/containers/DebugPanel/DebugPanel.d.ts +30 -0
  162. package/dist/types/src/containers/DebugPanel/DebugPanel.d.ts.map +1 -0
  163. package/dist/types/src/containers/DebugPanel/DebugPanel.stories.d.ts +126 -0
  164. package/dist/types/src/containers/DebugPanel/DebugPanel.stories.d.ts.map +1 -0
  165. package/dist/types/src/containers/DebugPanel/DebugPanelContext.d.ts +16 -0
  166. package/dist/types/src/containers/DebugPanel/DebugPanelContext.d.ts.map +1 -0
  167. package/dist/types/src/containers/DebugPanel/DebugPanelHeader.d.ts +14 -0
  168. package/dist/types/src/containers/DebugPanel/DebugPanelHeader.d.ts.map +1 -0
  169. package/dist/types/src/containers/DebugPanel/DebugPanelMain.d.ts +6 -0
  170. package/dist/types/src/containers/DebugPanel/DebugPanelMain.d.ts.map +1 -0
  171. package/dist/types/src/containers/DebugPanel/DebugPanelSidebar.d.ts +6 -0
  172. package/dist/types/src/containers/DebugPanel/DebugPanelSidebar.d.ts.map +1 -0
  173. package/dist/types/src/containers/DebugPanel/index.d.ts +7 -0
  174. package/dist/types/src/containers/DebugPanel/index.d.ts.map +1 -0
  175. package/dist/types/src/containers/DebugPanel/view-state.d.ts +46 -0
  176. package/dist/types/src/containers/DebugPanel/view-state.d.ts.map +1 -0
  177. package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.d.ts +10 -0
  178. package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.d.ts.map +1 -0
  179. package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.stories.d.ts +114 -0
  180. package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.stories.d.ts.map +1 -0
  181. package/dist/types/src/containers/DebugPanelDrawer/index.d.ts +2 -0
  182. package/dist/types/src/containers/DebugPanelDrawer/index.d.ts.map +1 -0
  183. package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.d.ts +11 -0
  184. package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.d.ts.map +1 -0
  185. package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.stories.d.ts +107 -0
  186. package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.stories.d.ts.map +1 -0
  187. package/dist/types/src/containers/DebugPanelStatus/index.d.ts +2 -0
  188. package/dist/types/src/containers/DebugPanelStatus/index.d.ts.map +1 -0
  189. package/dist/types/src/containers/DebugPortSettings/DebugPortSettings.d.ts.map +1 -1
  190. package/dist/types/src/containers/DebugPortSettings/DebugPortSettings.stories.d.ts +13 -4
  191. package/dist/types/src/containers/DebugPortSettings/DebugPortSettings.stories.d.ts.map +1 -1
  192. package/dist/types/src/containers/DebugPortSettings/index.d.ts +1 -1
  193. package/dist/types/src/containers/DebugPortSettings/index.d.ts.map +1 -1
  194. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +2 -2
  195. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +1 -1
  196. package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts +14 -5
  197. package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts.map +1 -1
  198. package/dist/types/src/containers/DebugSettings/index.d.ts +1 -1
  199. package/dist/types/src/containers/DebugSettings/index.d.ts.map +1 -1
  200. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +1 -1
  201. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
  202. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts +1 -1
  203. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts.map +1 -1
  204. package/dist/types/src/containers/DebugStatus/index.d.ts +1 -1
  205. package/dist/types/src/containers/DebugStatus/index.d.ts.map +1 -1
  206. package/dist/types/src/containers/LoggerPanel/LoggerPanel.d.ts +6 -0
  207. package/dist/types/src/containers/LoggerPanel/LoggerPanel.d.ts.map +1 -0
  208. package/dist/types/src/containers/LoggerPanel/LoggerPanel.stories.d.ts +107 -0
  209. package/dist/types/src/containers/LoggerPanel/LoggerPanel.stories.d.ts.map +1 -0
  210. package/dist/types/src/containers/LoggerPanel/index.d.ts +2 -0
  211. package/dist/types/src/containers/LoggerPanel/index.d.ts.map +1 -0
  212. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
  213. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.stories.d.ts +13 -4
  214. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.stories.d.ts.map +1 -1
  215. package/dist/types/src/containers/SpaceGenerator/index.d.ts +1 -1
  216. package/dist/types/src/containers/SpaceGenerator/index.d.ts.map +1 -1
  217. package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts +5 -1
  218. package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts.map +1 -1
  219. package/dist/types/src/containers/StatsPanel/index.d.ts +1 -1
  220. package/dist/types/src/containers/StatsPanel/index.d.ts.map +1 -1
  221. package/dist/types/src/containers/Wireframe/Wireframe.d.ts +2 -2
  222. package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
  223. package/dist/types/src/containers/Wireframe/index.d.ts +1 -1
  224. package/dist/types/src/containers/Wireframe/index.d.ts.map +1 -1
  225. package/dist/types/src/containers/index.d.ts +7 -1
  226. package/dist/types/src/containers/index.d.ts.map +1 -1
  227. package/dist/types/src/errors.d.ts +123 -0
  228. package/dist/types/src/errors.d.ts.map +1 -0
  229. package/dist/types/src/index.d.ts +2 -2
  230. package/dist/types/src/index.d.ts.map +1 -1
  231. package/dist/types/src/operations/DebugOperationHandlerSet.d.ts.map +1 -1
  232. package/dist/types/src/operations/create-space-from-template.d.ts +5 -0
  233. package/dist/types/src/operations/create-space-from-template.d.ts.map +1 -0
  234. package/dist/types/src/operations/errors.d.ts +33 -0
  235. package/dist/types/src/operations/errors.d.ts.map +1 -0
  236. package/dist/types/src/operations/index.d.ts +1 -1
  237. package/dist/types/src/operations/index.d.ts.map +1 -1
  238. package/dist/types/src/operations/open-page.d.ts +5 -0
  239. package/dist/types/src/operations/open-page.d.ts.map +1 -0
  240. package/dist/types/src/operations/snapshot.d.ts +5 -0
  241. package/dist/types/src/operations/snapshot.d.ts.map +1 -0
  242. package/dist/types/src/operations/snapshot.test.d.ts +2 -0
  243. package/dist/types/src/operations/snapshot.test.d.ts.map +1 -0
  244. package/dist/types/src/operations/undo.d.ts +5 -0
  245. package/dist/types/src/operations/undo.d.ts.map +1 -0
  246. package/dist/types/src/operations/undo.test.d.ts +2 -0
  247. package/dist/types/src/operations/undo.test.d.ts.map +1 -0
  248. package/dist/types/src/plugin.d.ts.map +1 -1
  249. package/dist/types/src/samples/crm/PipelineSpace.d.ts +21 -0
  250. package/dist/types/src/samples/crm/PipelineSpace.d.ts.map +1 -0
  251. package/dist/types/src/samples/crm/PipelineSpace.test.d.ts +2 -0
  252. package/dist/types/src/samples/crm/PipelineSpace.test.d.ts.map +1 -0
  253. package/dist/types/src/samples/crm/accounts.d.ts +55 -0
  254. package/dist/types/src/samples/crm/accounts.d.ts.map +1 -0
  255. package/dist/types/src/samples/crm/inbox.d.ts +14 -0
  256. package/dist/types/src/samples/crm/inbox.d.ts.map +1 -0
  257. package/dist/types/src/samples/crm/pipeline.d.ts +9 -0
  258. package/dist/types/src/samples/crm/pipeline.d.ts.map +1 -0
  259. package/dist/types/src/samples/crm/util.d.ts +14 -0
  260. package/dist/types/src/samples/crm/util.d.ts.map +1 -0
  261. package/dist/types/src/samples/incident/IncidentSpace.d.ts +21 -0
  262. package/dist/types/src/samples/incident/IncidentSpace.d.ts.map +1 -0
  263. package/dist/types/src/samples/incident/IncidentSpace.test.d.ts +2 -0
  264. package/dist/types/src/samples/incident/IncidentSpace.test.d.ts.map +1 -0
  265. package/dist/types/src/samples/incident/docs.d.ts +14 -0
  266. package/dist/types/src/samples/incident/docs.d.ts.map +1 -0
  267. package/dist/types/src/samples/incident/project.d.ts +16 -0
  268. package/dist/types/src/samples/incident/project.d.ts.map +1 -0
  269. package/dist/types/src/samples/incident/tasks.d.ts +9 -0
  270. package/dist/types/src/samples/incident/tasks.d.ts.map +1 -0
  271. package/dist/types/src/samples/incident/util.d.ts +32 -0
  272. package/dist/types/src/samples/incident/util.d.ts.map +1 -0
  273. package/dist/types/src/samples/index.d.ts +8 -0
  274. package/dist/types/src/samples/index.d.ts.map +1 -0
  275. package/dist/types/src/samples/review/ReviewSpace.d.ts +19 -0
  276. package/dist/types/src/samples/review/ReviewSpace.d.ts.map +1 -0
  277. package/dist/types/src/samples/review/ReviewSpace.test.d.ts +2 -0
  278. package/dist/types/src/samples/review/ReviewSpace.test.d.ts.map +1 -0
  279. package/dist/types/src/samples/review/assets.d.ts +19 -0
  280. package/dist/types/src/samples/review/assets.d.ts.map +1 -0
  281. package/dist/types/src/samples/review/util.d.ts +4 -0
  282. package/dist/types/src/samples/review/util.d.ts.map +1 -0
  283. package/dist/types/src/samples/review/work.d.ts +15 -0
  284. package/dist/types/src/samples/review/work.d.ts.map +1 -0
  285. package/dist/types/src/samples/stockfish/StockfishSpace.d.ts +27 -0
  286. package/dist/types/src/samples/stockfish/StockfishSpace.d.ts.map +1 -0
  287. package/dist/types/src/samples/stockfish/StockfishSpace.test.d.ts +2 -0
  288. package/dist/types/src/samples/stockfish/StockfishSpace.test.d.ts.map +1 -0
  289. package/dist/types/src/samples/stockfish/docs.d.ts +8 -0
  290. package/dist/types/src/samples/stockfish/docs.d.ts.map +1 -0
  291. package/dist/types/src/samples/stockfish/game.d.ts +10 -0
  292. package/dist/types/src/samples/stockfish/game.d.ts.map +1 -0
  293. package/dist/types/src/samples/stockfish/project.d.ts +31 -0
  294. package/dist/types/src/samples/stockfish/project.d.ts.map +1 -0
  295. package/dist/types/src/samples/stockfish/run.test.d.ts +2 -0
  296. package/dist/types/src/samples/stockfish/run.test.d.ts.map +1 -0
  297. package/dist/types/src/samples/stockfish/skill.d.ts +8 -0
  298. package/dist/types/src/samples/stockfish/skill.d.ts.map +1 -0
  299. package/dist/types/src/samples/stockfish/tasks.d.ts +12 -0
  300. package/dist/types/src/samples/stockfish/tasks.d.ts.map +1 -0
  301. package/dist/types/src/samples/stockfish/util.d.ts +14 -0
  302. package/dist/types/src/samples/stockfish/util.d.ts.map +1 -0
  303. package/dist/types/src/samples/tidepool/TidepoolSpace.d.ts +22 -0
  304. package/dist/types/src/samples/tidepool/TidepoolSpace.d.ts.map +1 -0
  305. package/dist/types/src/samples/tidepool/TidepoolSpace.test.d.ts +2 -0
  306. package/dist/types/src/samples/tidepool/TidepoolSpace.test.d.ts.map +1 -0
  307. package/dist/types/src/samples/tidepool/docs.d.ts +12 -0
  308. package/dist/types/src/samples/tidepool/docs.d.ts.map +1 -0
  309. package/dist/types/src/samples/tidepool/project.d.ts +20 -0
  310. package/dist/types/src/samples/tidepool/project.d.ts.map +1 -0
  311. package/dist/types/src/samples/tidepool/tasks.d.ts +14 -0
  312. package/dist/types/src/samples/tidepool/tasks.d.ts.map +1 -0
  313. package/dist/types/src/samples/tidepool/team.d.ts +9 -0
  314. package/dist/types/src/samples/tidepool/team.d.ts.map +1 -0
  315. package/dist/types/src/samples/tidepool/util.d.ts +14 -0
  316. package/dist/types/src/samples/tidepool/util.d.ts.map +1 -0
  317. package/dist/types/src/samples/weather/WeatherSpace.d.ts +21 -0
  318. package/dist/types/src/samples/weather/WeatherSpace.d.ts.map +1 -0
  319. package/dist/types/src/samples/weather/WeatherSpace.test.d.ts +2 -0
  320. package/dist/types/src/samples/weather/WeatherSpace.test.d.ts.map +1 -0
  321. package/dist/types/src/samples/weather/project.d.ts +20 -0
  322. package/dist/types/src/samples/weather/project.d.ts.map +1 -0
  323. package/dist/types/src/samples/weather/skill.d.ts +12 -0
  324. package/dist/types/src/samples/weather/skill.d.ts.map +1 -0
  325. package/dist/types/src/samples/weather/tasks.d.ts +9 -0
  326. package/dist/types/src/samples/weather/tasks.d.ts.map +1 -0
  327. package/dist/types/src/samples/weather/util.d.ts +16 -0
  328. package/dist/types/src/samples/weather/util.d.ts.map +1 -0
  329. package/dist/types/src/samples/worker/WorkerSpace.d.ts +22 -0
  330. package/dist/types/src/samples/worker/WorkerSpace.d.ts.map +1 -0
  331. package/dist/types/src/samples/worker/WorkerSpace.test.d.ts +2 -0
  332. package/dist/types/src/samples/worker/WorkerSpace.test.d.ts.map +1 -0
  333. package/dist/types/src/samples/worker/project.d.ts +18 -0
  334. package/dist/types/src/samples/worker/project.d.ts.map +1 -0
  335. package/dist/types/src/samples/worker/tasks.d.ts +9 -0
  336. package/dist/types/src/samples/worker/tasks.d.ts.map +1 -0
  337. package/dist/types/src/samples/worker/util.d.ts +14 -0
  338. package/dist/types/src/samples/worker/util.d.ts.map +1 -0
  339. package/dist/types/src/stories/SpaceTemplates.stories.d.ts +114 -0
  340. package/dist/types/src/stories/SpaceTemplates.stories.d.ts.map +1 -0
  341. package/dist/types/src/testing/index.d.ts +3 -0
  342. package/dist/types/src/testing/index.d.ts.map +1 -0
  343. package/dist/types/src/testing/stub-drawer-plugin.d.ts +8 -0
  344. package/dist/types/src/testing/stub-drawer-plugin.d.ts.map +1 -0
  345. package/dist/types/src/testing/stub-tools-plugin.d.ts +19 -0
  346. package/dist/types/src/testing/stub-tools-plugin.d.ts.map +1 -0
  347. package/dist/types/src/translations.d.ts +13 -4
  348. package/dist/types/src/translations.d.ts.map +1 -1
  349. package/dist/types/src/types/Debug.d.ts +2 -2
  350. package/dist/types/src/types/Debug.d.ts.map +1 -1
  351. package/dist/types/src/types/DebugNodes.d.ts +13 -1
  352. package/dist/types/src/types/DebugNodes.d.ts.map +1 -1
  353. package/dist/types/src/types/DebugOperation.d.ts +119 -0
  354. package/dist/types/src/types/DebugOperation.d.ts.map +1 -1
  355. package/dist/types/src/types/DebugSurface.d.ts +7 -0
  356. package/dist/types/src/types/DebugSurface.d.ts.map +1 -1
  357. package/dist/types/src/types/index.d.ts +6 -6
  358. package/dist/types/src/types/index.d.ts.map +1 -1
  359. package/dist/types/tsconfig.tsbuildinfo +1 -1
  360. package/dx.config.ts +3 -2
  361. package/package.json +129 -73
  362. package/scripts/build-template-archive.ts +65 -0
  363. package/src/DebugPlugin.ts +1 -1
  364. package/src/capabilities/DebugSurfaces.tsx +85 -71
  365. package/src/capabilities/app-graph-builder.test.ts +45 -0
  366. package/src/capabilities/app-graph-builder.ts +83 -46
  367. package/src/capabilities/gen/browser.ts +85 -0
  368. package/src/capabilities/gen/node.ts +15 -8
  369. package/src/capabilities/gen/tauri.ts +85 -0
  370. package/src/capabilities/gen/workerd.ts +11 -4
  371. package/src/capabilities/graph-retention.ts +23 -0
  372. package/src/capabilities/index.ts +18 -10
  373. package/src/capabilities/log-recording.ts +20 -1
  374. package/src/capabilities/operation-handler.ts +9 -0
  375. package/src/capabilities/react-surface.ts +33 -29
  376. package/src/capabilities/settings.ts +2 -2
  377. package/src/capabilities/space-templates.ts +25 -0
  378. package/src/capabilities/stats-panel.ts +1 -1
  379. package/src/components/SchemaTable/SchemaTable.tsx +44 -10
  380. package/src/components/SchemaTable/index.ts +1 -1
  381. package/src/components/SpaceGenerator/ObjectGenerator.tsx +22 -2
  382. package/src/components/SpaceGenerator/index.ts +2 -2
  383. package/src/components/SpaceGenerator/presets.ts +4 -4
  384. package/src/components/index.ts +2 -2
  385. package/src/containers/DebugConsole/DebugConsole.stories.tsx +29 -0
  386. package/src/containers/DebugConsole/DebugConsole.tsx +94 -0
  387. package/src/containers/DebugConsole/cli.ts +296 -0
  388. package/src/containers/DebugConsole/index.ts +5 -0
  389. package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +44 -44
  390. package/src/containers/DebugObjectPanel/index.ts +1 -1
  391. package/src/containers/DebugPanel/DebugPanel.stories.tsx +118 -0
  392. package/src/containers/DebugPanel/DebugPanel.tsx +72 -0
  393. package/src/containers/DebugPanel/DebugPanelContext.ts +33 -0
  394. package/src/containers/DebugPanel/DebugPanelHeader.tsx +54 -0
  395. package/src/containers/DebugPanel/DebugPanelMain.tsx +116 -0
  396. package/src/containers/DebugPanel/DebugPanelSidebar.tsx +123 -0
  397. package/src/containers/DebugPanel/index.ts +10 -0
  398. package/src/containers/DebugPanel/view-state.ts +60 -0
  399. package/src/containers/DebugPanelDrawer/DebugPanelDrawer.stories.tsx +92 -0
  400. package/src/containers/DebugPanelDrawer/DebugPanelDrawer.tsx +72 -0
  401. package/src/containers/DebugPanelDrawer/index.ts +5 -0
  402. package/src/containers/DebugPanelStatus/DebugPanelStatus.stories.tsx +119 -0
  403. package/src/containers/DebugPanelStatus/DebugPanelStatus.tsx +167 -0
  404. package/src/containers/DebugPanelStatus/index.ts +5 -0
  405. package/src/containers/DebugPortSettings/DebugPortSettings.stories.tsx +2 -2
  406. package/src/containers/DebugPortSettings/DebugPortSettings.tsx +33 -40
  407. package/src/containers/DebugPortSettings/index.ts +1 -1
  408. package/src/containers/DebugSettings/DebugSettings.stories.tsx +1 -1
  409. package/src/containers/DebugSettings/DebugSettings.tsx +71 -64
  410. package/src/containers/DebugSettings/index.ts +1 -1
  411. package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +39 -28
  412. package/src/containers/DebugSpaceObjectsPanel/index.ts +1 -1
  413. package/src/containers/DebugStatus/DebugStatus.tsx +10 -10
  414. package/src/containers/DebugStatus/index.ts +1 -1
  415. package/src/containers/LoggerPanel/LoggerPanel.stories.tsx +62 -0
  416. package/src/containers/LoggerPanel/LoggerPanel.tsx +28 -0
  417. package/src/containers/LoggerPanel/index.ts +5 -0
  418. package/src/containers/SpaceGenerator/SpaceGenerator.stories.tsx +8 -8
  419. package/src/containers/SpaceGenerator/SpaceGenerator.tsx +102 -73
  420. package/src/containers/SpaceGenerator/index.ts +1 -1
  421. package/src/containers/StatsPanel/StatsPanel.tsx +32 -31
  422. package/src/containers/StatsPanel/index.ts +1 -1
  423. package/src/containers/Wireframe/Wireframe.tsx +8 -7
  424. package/src/containers/Wireframe/index.ts +1 -1
  425. package/src/containers/index.ts +22 -9
  426. package/src/errors.ts +23 -0
  427. package/src/index.ts +2 -2
  428. package/src/meta.ts +1 -1
  429. package/src/operations/DebugOperationHandlerSet.ts +5 -1
  430. package/src/operations/create-space-from-template.ts +57 -0
  431. package/src/operations/errors.ts +8 -0
  432. package/src/operations/index.ts +1 -1
  433. package/src/operations/open-page.ts +51 -0
  434. package/src/operations/snapshot.test.ts +57 -0
  435. package/src/operations/snapshot.ts +243 -0
  436. package/src/operations/undo.test.ts +19 -0
  437. package/src/operations/undo.ts +28 -0
  438. package/src/plugin.tsx +4 -0
  439. package/src/samples/crm/PipelineSpace.test.ts +55 -0
  440. package/src/samples/crm/PipelineSpace.ts +52 -0
  441. package/src/samples/crm/accounts.ts +153 -0
  442. package/src/samples/crm/inbox.ts +158 -0
  443. package/src/samples/crm/pipeline.ts +70 -0
  444. package/src/samples/crm/util.ts +18 -0
  445. package/src/samples/incident/IncidentSpace.test.ts +68 -0
  446. package/src/samples/incident/IncidentSpace.ts +61 -0
  447. package/src/samples/incident/docs.ts +111 -0
  448. package/src/samples/incident/project.ts +61 -0
  449. package/src/samples/incident/tasks.ts +101 -0
  450. package/src/samples/incident/util.ts +24 -0
  451. package/src/samples/index.ts +11 -0
  452. package/src/samples/review/ReviewSpace.test.ts +89 -0
  453. package/src/samples/review/ReviewSpace.ts +47 -0
  454. package/src/samples/review/assets.ts +123 -0
  455. package/src/samples/review/util.ts +10 -0
  456. package/src/samples/review/work.ts +249 -0
  457. package/src/samples/stockfish/StockfishSpace.test.ts +129 -0
  458. package/src/samples/stockfish/StockfishSpace.ts +70 -0
  459. package/src/samples/stockfish/docs.ts +65 -0
  460. package/src/samples/stockfish/game.ts +47 -0
  461. package/src/samples/stockfish/project.ts +87 -0
  462. package/src/samples/stockfish/run.test.ts +193 -0
  463. package/src/samples/stockfish/skill.ts +154 -0
  464. package/src/samples/stockfish/tasks.ts +306 -0
  465. package/src/samples/stockfish/util.ts +17 -0
  466. package/src/samples/tidepool/TidepoolSpace.test.ts +61 -0
  467. package/src/samples/tidepool/TidepoolSpace.ts +65 -0
  468. package/src/samples/tidepool/docs.ts +140 -0
  469. package/src/samples/tidepool/project.ts +57 -0
  470. package/src/samples/tidepool/tasks.ts +252 -0
  471. package/src/samples/tidepool/team.ts +87 -0
  472. package/src/samples/tidepool/util.ts +18 -0
  473. package/src/samples/weather/WeatherSpace.test.ts +93 -0
  474. package/src/samples/weather/WeatherSpace.ts +59 -0
  475. package/src/samples/weather/project.ts +76 -0
  476. package/src/samples/weather/skill.ts +45 -0
  477. package/src/samples/weather/tasks.ts +98 -0
  478. package/src/samples/weather/util.ts +21 -0
  479. package/src/samples/worker/WorkerSpace.test.ts +102 -0
  480. package/src/samples/worker/WorkerSpace.ts +56 -0
  481. package/src/samples/worker/project.ts +72 -0
  482. package/src/samples/worker/tasks.ts +119 -0
  483. package/src/samples/worker/util.ts +17 -0
  484. package/src/stories/SpaceTemplates.stories.tsx +105 -0
  485. package/src/testing/index.ts +6 -0
  486. package/src/testing/stub-drawer-plugin.ts +65 -0
  487. package/src/testing/stub-tools-plugin.tsx +95 -0
  488. package/src/translations.ts +15 -6
  489. package/src/types/Debug.ts +2 -2
  490. package/src/types/DebugNodes.ts +21 -1
  491. package/src/types/DebugOperation.ts +206 -0
  492. package/src/types/DebugSurface.ts +7 -0
  493. package/src/types/index.ts +6 -6
  494. package/dist/lib/chunk-LogStatus.mjs +0 -44
  495. package/dist/lib/chunk-LogStatus.mjs.map +0 -1
  496. package/dist/types/src/containers/LogStatus/LogStatus.d.ts +0 -6
  497. package/dist/types/src/containers/LogStatus/LogStatus.d.ts.map +0 -1
  498. package/dist/types/src/containers/LogStatus/index.d.ts +0 -2
  499. package/dist/types/src/containers/LogStatus/index.d.ts.map +0 -1
  500. package/src/containers/LogStatus/LogStatus.tsx +0 -51
  501. package/src/containers/LogStatus/index.ts +0 -5
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import * as Button from '@dxos/react-ui/Button';
8
+ import * as Hooks from '@dxos/react-ui/Hooks';
9
+
10
+ import { meta } from '#meta';
11
+
12
+ import { type DebugPanelMode } from './view-state.ts';
13
+
14
+ export type DebugPanelHeaderProps = Pick<Button.RootProps, 'size'> & {
15
+ mode: DebugPanelMode;
16
+ onModeChange: (mode: DebugPanelMode) => void;
17
+ /** Omitted where the host brings its own close (the floating window's `CloseTrigger`). */
18
+ onClose?: () => void;
19
+ };
20
+
21
+ /**
22
+ * The title-bar controls both hosts share: the dock/float switch, and a close for a host without one
23
+ * of its own. The button says what it does next, so the icon flips with the mode.
24
+ */
25
+ export const DebugPanelHeader = ({ mode, onModeChange, onClose, size }: DebugPanelHeaderProps) => {
26
+ const { t } = Hooks.useTranslation(meta.profile.key);
27
+ const floating = mode === 'floating';
28
+ return (
29
+ <>
30
+ <Button.Root
31
+ variant='ghost'
32
+ size={size}
33
+ iconOnly
34
+ icon={floating ? 'ph--arrow-square-in--regular' : 'ph--arrow-square-out--regular'}
35
+ label={floating ? t('dock-panel.label') : t('float-panel.label')}
36
+ data-testid='debugPanel.mode'
37
+ onClick={() => onModeChange(floating ? 'docked' : 'floating')}
38
+ />
39
+ {onClose && (
40
+ <Button.Root
41
+ variant='ghost'
42
+ size={size}
43
+ iconOnly
44
+ icon='ph--x--regular'
45
+ label={t('close-panel.label')}
46
+ data-testid='debugPanel.close'
47
+ onClick={onClose}
48
+ />
49
+ )}
50
+ </>
51
+ );
52
+ };
53
+
54
+ DebugPanelHeader.displayName = 'DebugPanelHeader';
@@ -0,0 +1,116 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
+ import * as Surface from '@dxos/app-framework/Surface';
8
+ import * as AppGraph from '@dxos/app-graph/AppGraph';
9
+ import * as ToolkitHooks from '@dxos/app-toolkit/Hooks';
10
+ import * as GraphHooks from '@dxos/plugin-graph/Hooks';
11
+ import * as Hooks from '@dxos/react-ui/Hooks';
12
+ import * as Status from '@dxos/react-ui/Status';
13
+
14
+ import { meta } from '#meta';
15
+ import { DebugNodes, DebugSurface } from '#types';
16
+
17
+ import { useDebugPanelContext } from './DebugPanelContext.ts';
18
+
19
+ /** Pages that stay mounted once visited: their buffers are the point of the tool. */
20
+ const KEEP_MOUNTED: ReadonlySet<unknown> = new Set([DebugNodes.Console, DebugNodes.Logs]);
21
+
22
+ /**
23
+ * The selected page. The console and log viewer stay mounted (hidden) once visited so they keep
24
+ * their buffers while another tool is shown; every other page mounts only while selected.
25
+ */
26
+ export const DebugPanelMain = () => {
27
+ const { t } = Hooks.useTranslation(meta.profile.key);
28
+ const { contextId, nodeId, select } = useDebugPanelContext();
29
+ const { graph } = ToolkitHooks.useAppGraph();
30
+ const handleNavigate = useCallback(
31
+ (target: string) => {
32
+ AppGraph.expandPath(graph, target);
33
+ select(target);
34
+ },
35
+ [graph, select],
36
+ );
37
+ const node = GraphHooks.useNode(graph, nodeId);
38
+ const keepMounted = node !== undefined && KEEP_MOUNTED.has(node.data);
39
+ const [visited, setVisited] = useState<string[]>([]);
40
+ useEffect(() => {
41
+ if (nodeId && keepMounted) {
42
+ // Guarded in the updater: StrictMode runs the effect twice on mount, and two appends would mount the page twice.
43
+ setVisited((prev) => (prev.includes(nodeId) ? prev : [...prev, nodeId]));
44
+ }
45
+ }, [nodeId, keepMounted]);
46
+
47
+ if (!nodeId) {
48
+ return <Status.Empty>{t('debug-panel.empty.label')}</Status.Empty>;
49
+ }
50
+
51
+ // Appended in the same render it is selected (the effect only catches up), so the keyed page is
52
+ // never first mounted as the transient one and then remounted.
53
+ const mounted = keepMounted && !visited.includes(nodeId) ? [...visited, nodeId] : visited;
54
+
55
+ return (
56
+ <>
57
+ {mounted.map((id) => (
58
+ <DebugPanelPage
59
+ key={id}
60
+ graph={graph}
61
+ contextId={contextId}
62
+ nodeId={id}
63
+ hidden={id !== nodeId}
64
+ onNavigate={handleNavigate}
65
+ />
66
+ ))}
67
+ {!mounted.includes(nodeId) && (
68
+ <DebugPanelPage
69
+ key={nodeId}
70
+ graph={graph}
71
+ contextId={contextId}
72
+ nodeId={nodeId}
73
+ hidden={false}
74
+ onNavigate={handleNavigate}
75
+ />
76
+ )}
77
+ </>
78
+ );
79
+ };
80
+
81
+ DebugPanelMain.displayName = 'DebugPanel.Main';
82
+
83
+ type DebugPanelPageProps = {
84
+ graph: AppGraph.ReadableGraph;
85
+ contextId: string;
86
+ nodeId: string;
87
+ hidden: boolean;
88
+ onNavigate: (nodeId: string) => void;
89
+ };
90
+
91
+ /** One tool's article surface; the `div` is its show/hide element, not layout. */
92
+ const DebugPanelPage = ({ graph, contextId, nodeId, hidden, onNavigate }: DebugPanelPageProps) => {
93
+ const { t } = Hooks.useTranslation(meta.profile.key);
94
+ const node = GraphHooks.useNode(graph, nodeId);
95
+ const data = useMemo<DebugSurface.PageData | undefined>(
96
+ () =>
97
+ node && {
98
+ attendableId: `${contextId}/${nodeId}`,
99
+ nodeId,
100
+ subject: node.data,
101
+ properties: node.properties,
102
+ onNavigate,
103
+ },
104
+ [node, contextId, nodeId, onNavigate],
105
+ );
106
+ if (!data) {
107
+ // A persisted id that no longer resolves (a plugin disabled) shows the empty state rather than nothing.
108
+ return hidden ? null : <Status.Empty>{t('debug-panel.empty.label')}</Status.Empty>;
109
+ }
110
+
111
+ return (
112
+ <div role='none' className='dx-expand' hidden={hidden}>
113
+ <Surface.Surface type={DebugSurface.Page} data={data} limit={1} />
114
+ </div>
115
+ );
116
+ };
@@ -0,0 +1,123 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Atom from 'effect/reactivity/Atom';
6
+ import React, { useCallback, useEffect, useMemo, useRef } from 'react';
7
+
8
+ import * as AppGraph from '@dxos/app-graph/AppGraph';
9
+ import type * as AppGraphNode from '@dxos/app-graph/AppGraphNode';
10
+ import * as ToolkitHooks from '@dxos/app-toolkit/Hooks';
11
+ import * as GraphHooks from '@dxos/plugin-graph/Hooks';
12
+ import { useManager } from '@dxos/react-ui-attention';
13
+ import { Path, Tree, type TreeSelectEvent } from '@dxos/react-ui-list';
14
+ import * as Hooks from '@dxos/react-ui/Hooks';
15
+
16
+ import { meta } from '#meta';
17
+ import { DebugNodes } from '#types';
18
+
19
+ import { useDebugPanelContext } from './DebugPanelContext.ts';
20
+ import { debugPanelAspect } from './view-state.ts';
21
+
22
+ const ROOT_PATH = [DebugNodes.DEBUG_ROOT_ID];
23
+
24
+ /** The node and every ancestor under the debug root, so each level's connector runs. */
25
+ const lineage = (nodeId: string): string[] => {
26
+ const segments = nodeId.split('/');
27
+ return segments
28
+ .map((_, index) => segments.slice(0, index + 1).join('/'))
29
+ .filter((id) => id.startsWith(DebugNodes.DEBUG_ROOT_ID));
30
+ };
31
+
32
+ /** Page ids the panel persisted before the pages lived under the Debug node. */
33
+ const LEGACY_PAGE_IDS: Record<string, string> = {
34
+ [`${DebugNodes.DEBUG_ROOT_ID}/${DebugNodes.nodeId(DebugNodes.Console)}`]: DebugNodes.CONSOLE_NODE_ID,
35
+ [`${DebugNodes.DEBUG_ROOT_ID}/${DebugNodes.nodeId(DebugNodes.Logs)}`]: DebugNodes.LOGS_NODE_ID,
36
+ };
37
+
38
+ /** The tree over the hidden `root/debug` category: every developer tool, selected here and shown in `Main`. */
39
+ export const DebugPanelSidebar = () => {
40
+ const { t } = Hooks.useTranslation(meta.profile.key);
41
+ const { contextId, nodeId, open, select, setOpen } = useDebugPanelContext();
42
+ const { graph } = ToolkitHooks.useAppGraph();
43
+ const manager = useManager();
44
+ // The model reads state through atoms, and the manager's atom for this context is that state.
45
+ const stateAtom = useMemo(() => manager.atom(debugPanelAspect, contextId), [manager, contextId]);
46
+ const state = useMemo(
47
+ () => ({
48
+ itemOpen: (path: string[]) =>
49
+ Atom.make((get) => get(stateAtom).open.includes(Path.create(...path))).pipe(Atom.keepAlive),
50
+ itemCurrent: (path: string[]) =>
51
+ Atom.make((get) => get(stateAtom).nodeId === path[path.length - 1]).pipe(Atom.keepAlive),
52
+ }),
53
+ [stateAtom],
54
+ );
55
+ const model = GraphHooks.useGraphTreeModel(DebugNodes.DEBUG_ROOT_ID, state);
56
+
57
+ // Persisted state names nodes whose children come from connectors that only run on expansion, so
58
+ // without this an open branch restores empty and a nested selection restores to a blank page. A
59
+ // pristine panel opens on the console, as it did when the console was its first tab. The latest
60
+ // state is read through a ref so the restore runs once per context, not on every change.
61
+ const latestRef = useRef({ open, nodeId });
62
+ latestRef.current = { open, nodeId };
63
+ useEffect(() => {
64
+ AppGraph.expandSync(graph, DebugNodes.DEBUG_ROOT_ID, 'child');
65
+ const { open, nodeId } = latestRef.current;
66
+ if (!nodeId && open.length === 0) {
67
+ setOpen(Path.create(DebugNodes.DEBUG_ROOT_ID, contextId, DebugNodes.DEBUG_NODE_ID), true);
68
+ select(DebugNodes.CONSOLE_NODE_ID);
69
+ }
70
+ // The console and logs pages moved under the Debug node; a selection persisted at their old
71
+ // top-level ids is carried to the new ones.
72
+ const legacy = nodeId ? LEGACY_PAGE_IDS[nodeId] : undefined;
73
+ if (legacy) {
74
+ select(legacy);
75
+ }
76
+ for (const key of open) {
77
+ AppGraph.expandSync(graph, Path.last(key), 'child');
78
+ }
79
+ for (const id of lineage(legacy ?? nodeId ?? DebugNodes.CONSOLE_NODE_ID)) {
80
+ AppGraph.expandSync(graph, id, 'child');
81
+ }
82
+ }, [graph, contextId, select, setOpen]);
83
+
84
+ const handleOpenChange = useCallback(
85
+ ({ item, path, open }: { item: AppGraphNode.Node; path: string[]; open: boolean }) => {
86
+ setOpen(Path.create(...path), open);
87
+ AppGraph.expandSync(graph, item.id, 'child');
88
+ },
89
+ [graph, setOpen],
90
+ );
91
+
92
+ const handleSelect = useCallback(
93
+ ({ item, path }: TreeSelectEvent<AppGraphNode.Node>) => {
94
+ if (item.data === null) {
95
+ // A branch has no page: selecting it toggles it.
96
+ const key = Path.create(...path);
97
+ setOpen(key, !open.includes(key));
98
+ AppGraph.expandSync(graph, item.id, 'child');
99
+ return;
100
+ }
101
+ select(item.id);
102
+ AppGraph.expandSync(graph, item.id, 'child');
103
+ },
104
+ [graph, open, select, setOpen],
105
+ );
106
+
107
+ return (
108
+ <Tree.Root
109
+ id={contextId}
110
+ rootId={DebugNodes.DEBUG_ROOT_ID}
111
+ path={ROOT_PATH}
112
+ model={model}
113
+ size='sm'
114
+ onOpenChange={handleOpenChange}
115
+ onSelect={handleSelect}
116
+ >
117
+ <Tree.Label srOnly>{t('debug-panel.tree.label')}</Tree.Label>
118
+ <Tree.Content />
119
+ </Tree.Root>
120
+ );
121
+ };
122
+
123
+ DebugPanelSidebar.displayName = 'DebugPanel.Sidebar';
@@ -0,0 +1,10 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './DebugPanel.tsx';
6
+ export * from './DebugPanelContext.ts';
7
+ export * from './DebugPanelHeader.tsx';
8
+ export * from './DebugPanelMain.tsx';
9
+ export * from './DebugPanelSidebar.tsx';
10
+ export * from './view-state.ts';
@@ -0,0 +1,60 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Schema from 'effect/Schema';
7
+
8
+ import { ViewState } from '@dxos/react-ui-attention/types';
9
+
10
+ // Kept out of `DebugPanel.tsx`: react-refresh only fast-refreshes a module whose exports are all
11
+ // components, so a non-component export beside them forces a full page reload on every edit.
12
+
13
+ const Point = Schema.Struct({ x: Schema.Number, y: Schema.Number });
14
+
15
+ const Size = Schema.Struct({ width: Schema.Number, height: Schema.Number });
16
+
17
+ const Mode = Schema.Literals(['floating', 'docked']);
18
+
19
+ const DebugPanelViewStateSchema = Schema.Struct({
20
+ nodeId: Schema.optional(Schema.String),
21
+ mode: Schema.optional(Mode),
22
+ // Defaulted rather than required so a value persisted by the tab-based panel still decodes and
23
+ // keeps its position and size.
24
+ open: Schema.Array(Schema.String).pipe(Schema.withDecodingDefault(Effect.succeed([]))),
25
+ position: Schema.optional(Point),
26
+ size: Schema.optional(Size),
27
+ });
28
+
29
+ export type DebugPanelMode = Schema.Schema.Type<typeof Mode>;
30
+
31
+ export type DebugPanelViewState = {
32
+ /** Qualified id of the selected page; absent until something is chosen. */
33
+ readonly nodeId?: string;
34
+ /** Docked in the deck's drawer or floating over the app; absent means docked. */
35
+ readonly mode?: DebugPanelMode;
36
+ /** Joined paths (`Path.create`) of the expanded branches. */
37
+ readonly open: readonly string[];
38
+ /** Where the floating panel was last left; absent until it has been dragged. */
39
+ readonly position?: Schema.Schema.Type<typeof Point>;
40
+ /** The size the floating panel was last resized to; absent until it has been. */
41
+ readonly size?: Schema.Schema.Type<typeof Size>;
42
+ };
43
+
44
+ /** The panel is a singleton in the status rail, so one context serves it. */
45
+ export const DEBUG_PANEL_CONTEXT = 'debug-panel';
46
+
47
+ /**
48
+ * Selection, expansion, mode, position and size, persisted (localStorage) so a debugging session survives
49
+ * the reloads it provokes; requires a `ViewStateProvider` ancestor to persist (degrades to the
50
+ * defaults without one).
51
+ */
52
+ export const debugPanelAspect = ViewState.define<
53
+ DebugPanelViewState,
54
+ Schema.Codec.Encoded<typeof DebugPanelViewStateSchema>
55
+ >({
56
+ key: 'debug-panel',
57
+ backend: 'local',
58
+ schema: DebugPanelViewStateSchema,
59
+ defaultValue: () => ({ open: [] }),
60
+ });
@@ -0,0 +1,92 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+ import { expect, userEvent, waitFor, within } from 'storybook/test';
8
+
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
+ import * as CorePlugins from '@dxos/plugin-testing/CorePlugins';
11
+ import * as Main from '@dxos/react-ui/Main';
12
+ import { withTheme } from '@dxos/react-ui/testing';
13
+
14
+ import { translations } from '#translations';
15
+
16
+ import * as DebugPlugin from '../../DebugPlugin.ts';
17
+ import { StubDrawerPlugin, StubToolsPlugin, setDrawerState, useDrawerState } from '../../testing/index.ts';
18
+ import { type DebugPanelViewState, debugPanelAspect } from '../DebugPanel/index.ts';
19
+ import { DebugPanelDrawer, type DebugPanelDrawerProps } from './DebugPanelDrawer.tsx';
20
+
21
+ /** The deck's frame with the drawer open, as `DeckContent` hosts the surface. */
22
+ const Render = (props: DebugPanelDrawerProps) => {
23
+ const state = useDrawerState();
24
+ return (
25
+ <Main.Root drawerState={state} onDrawerStateChange={setDrawerState}>
26
+ <Main.Content classNames='p-4'>Main</Main.Content>
27
+ <Main.Drawer label='Drawer'>
28
+ <DebugPanelDrawer {...props} />
29
+ </Main.Drawer>
30
+ </Main.Root>
31
+ );
32
+ };
33
+
34
+ const meta = {
35
+ title: 'plugins/plugin-debug/containers/DebugPanelDrawer',
36
+ component: DebugPanelDrawer,
37
+ render: Render,
38
+ // The attention core plugin provides the view state the selection and mode persist through; the
39
+ // debug plugin contributes the console and log pages and their articles; the stubs add a branch
40
+ // and the drawer's layout handler.
41
+ decorators: [
42
+ withPluginManager({ plugins: [...CorePlugins.make(), DebugPlugin.make(), StubToolsPlugin(), StubDrawerPlugin()] }),
43
+ withTheme(),
44
+ ],
45
+ parameters: { translations, layout: 'fullscreen' },
46
+ } satisfies Meta<typeof DebugPanelDrawer>;
47
+
48
+ export default meta;
49
+
50
+ type Story = StoryObj<typeof meta>;
51
+
52
+ /** Its own context, so exercising the story does not decide which tool the app's drawer opens on. */
53
+ export const Default: Story = {
54
+ args: { contextId: 'debug-panel-drawer-story' },
55
+ };
56
+
57
+ const FLOAT_CONTEXT = 'debug-panel-drawer-story-float';
58
+
59
+ const readViewState = (): DebugPanelViewState | undefined => {
60
+ const raw = localStorage.getItem(`dxos:view-state:${debugPanelAspect.key}:${FLOAT_CONTEXT}`);
61
+ return raw ? JSON.parse(raw) : undefined;
62
+ };
63
+
64
+ /**
65
+ * Console by default, then Logs, then the float control: the drawer closes and the persisted mode
66
+ * records the switch — the part the floating host reads to take over.
67
+ */
68
+ export const Float: Story = {
69
+ args: { contextId: FLOAT_CONTEXT },
70
+ loaders: [
71
+ () => {
72
+ localStorage.removeItem(`dxos:view-state:${debugPanelAspect.key}:${FLOAT_CONTEXT}`);
73
+ setDrawerState('open');
74
+ },
75
+ ],
76
+ play: async ({ canvasElement }) => {
77
+ const canvas = within(canvasElement);
78
+ const drawer = await canvas.findByRole('region', { name: 'Drawer' }, { timeout: 10_000 });
79
+ const tree = await within(drawer).findByRole('tree', {}, { timeout: 10_000 });
80
+ const terminal = await within(drawer).findByRole('textbox', {}, { timeout: 10_000 });
81
+ await expect(terminal).toBeInTheDocument();
82
+
83
+ // The terminal's input is xterm's transparent helper, so visibility is read off the page's show/hide element.
84
+ await userEvent.click(await within(tree).findByText('Logs', {}, { timeout: 10_000 }));
85
+ await expect(terminal.closest('[hidden]')).not.toBeNull();
86
+
87
+ await expect(readViewState()?.mode).toBeUndefined();
88
+ await userEvent.click(await within(drawer).findByTestId('debugPanel.mode'));
89
+ await waitFor(() => expect(readViewState()?.mode).toBe('floating'));
90
+ await waitFor(() => expect(canvas.queryByRole('region', { name: 'Drawer' })).toBeNull());
91
+ },
92
+ };
@@ -0,0 +1,72 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback } from 'react';
6
+
7
+ import * as Hooks from '@dxos/app-framework/Hooks';
8
+ import * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';
9
+ import * as UiHooks from '@dxos/react-ui/Hooks';
10
+ import * as Panel from '@dxos/react-ui/Panel';
11
+ import * as Toolbar from '@dxos/react-ui/Toolbar';
12
+
13
+ import { meta } from '#meta';
14
+
15
+ import {
16
+ DEBUG_PANEL_CONTEXT,
17
+ DebugPanel,
18
+ DebugPanelHeader,
19
+ type DebugPanelMode,
20
+ useDebugPanelContext,
21
+ } from '../DebugPanel/index.ts';
22
+
23
+ export type DebugPanelDrawerProps = {
24
+ /** Overridable so a story gets its own selection rather than the app's. */
25
+ contextId?: string;
26
+ };
27
+
28
+ /**
29
+ * The debug panel docked as the deck's bottom drawer: a title bar over the tree and the page. It
30
+ * shares the floating window's context, so floating it keeps the tool that was open.
31
+ */
32
+ export const DebugPanelDrawer = ({ contextId = DEBUG_PANEL_CONTEXT }: DebugPanelDrawerProps) => (
33
+ <DebugPanel.Root contextId={contextId}>
34
+ <DebugPanelDrawerContent />
35
+ </DebugPanel.Root>
36
+ );
37
+
38
+ DebugPanelDrawer.displayName = 'DebugPanelDrawer';
39
+
40
+ const DebugPanelDrawerContent = () => {
41
+ const { t } = UiHooks.useTranslation(meta.profile.key);
42
+ const { mode, setMode } = useDebugPanelContext();
43
+ const { invokePromise } = Hooks.useOperationInvoker();
44
+
45
+ // Floating asks the drawer to close so the window the status bar opens on the mode change does
46
+ // not stay over it; docking keeps it open.
47
+ const handleModeChange = useCallback(
48
+ (next: DebugPanelMode) => {
49
+ void invokePromise(LayoutOperation.UpdateDrawer, { state: next === 'floating' ? 'closed' : 'open' });
50
+ setMode(next);
51
+ },
52
+ [invokePromise, setMode],
53
+ );
54
+ const handleClose = useCallback(
55
+ () => void invokePromise(LayoutOperation.UpdateDrawer, { state: 'closed' }),
56
+ [invokePromise],
57
+ );
58
+
59
+ return (
60
+ <Panel.Root>
61
+ <Panel.Header>
62
+ <Toolbar.Root size='sm'>
63
+ <Toolbar.Text classNames='grow'>{t('debug-panel.title')}</Toolbar.Text>
64
+ <DebugPanelHeader mode={mode} onModeChange={handleModeChange} onClose={handleClose} />
65
+ </Toolbar.Root>
66
+ </Panel.Header>
67
+ <Panel.Body classNames='grid'>
68
+ <DebugPanel.Body />
69
+ </Panel.Body>
70
+ </Panel.Root>
71
+ );
72
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './DebugPanelDrawer.tsx';
@@ -0,0 +1,119 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import { expect, userEvent, waitFor, within } from 'storybook/test';
7
+
8
+ import { withPluginManager } from '@dxos/app-framework/testing';
9
+ import * as CorePlugins from '@dxos/plugin-testing/CorePlugins';
10
+ import {
11
+ type DebugPortController,
12
+ type DebugPortStartOptions,
13
+ type DebugPortStatus as DebugPortStatusType,
14
+ } from '@dxos/react-client/devtools';
15
+ import { withTheme } from '@dxos/react-ui/testing';
16
+
17
+ import { translations } from '#translations';
18
+
19
+ import * as DebugPlugin from '../../DebugPlugin.ts';
20
+ import { StubDrawerPlugin, StubToolsPlugin, getDrawerState, setDrawerState } from '../../testing/index.ts';
21
+ import { DEBUG_PANEL_CONTEXT, type DebugPanelViewState, debugPanelAspect } from '../DebugPanel/index.ts';
22
+ import { DebugPanelStatus } from './DebugPanelStatus.tsx';
23
+
24
+ /**
25
+ * Stand-in for the page-wide controller: the real one long-polls a loopback server and evaluates
26
+ * whatever it returns, which a story must never do.
27
+ */
28
+ const createFakeController = (initial: Partial<DebugPortStatusType> = {}): DebugPortController => {
29
+ const listeners = new Set<() => void>();
30
+ let status: DebugPortStatusType = { running: false, ...initial };
31
+
32
+ const update = (patch: Partial<DebugPortStatusType>) => {
33
+ status = { ...status, ...patch };
34
+ listeners.forEach((listener) => listener());
35
+ };
36
+
37
+ return {
38
+ getStatus: () => status,
39
+ subscribe: (listener) => {
40
+ listeners.add(listener);
41
+ return () => listeners.delete(listener);
42
+ },
43
+ start: (_options?: DebugPortStartOptions) => {
44
+ const session = crypto.randomUUID();
45
+ update({ running: true, session, origin: 'http://127.0.0.1:9321' });
46
+ return session;
47
+ },
48
+ resume: () => undefined,
49
+ stop: () => update({ running: false, session: undefined, origin: undefined }),
50
+ };
51
+ };
52
+
53
+ const meta = {
54
+ title: 'plugins/plugin-debug/containers/DebugPanelStatus',
55
+ component: DebugPanelStatus,
56
+ // The window's tree reads the app graph the debug plugin (and the stub) populate; its selection
57
+ // and placement persist through the attention core plugin's view state; the drawer stub answers
58
+ // the docked toggle in the deck's stead.
59
+ decorators: [
60
+ withPluginManager({ plugins: [...CorePlugins.make(), DebugPlugin.make(), StubToolsPlugin(), StubDrawerPlugin()] }),
61
+ withTheme(),
62
+ ],
63
+ parameters: { translations },
64
+ } satisfies Meta<typeof DebugPanelStatus>;
65
+
66
+ export default meta;
67
+
68
+ type Story = StoryObj<typeof meta>;
69
+
70
+ /** The status button reads the singleton context, so a story seeds and clears that one key. */
71
+ const VIEW_STATE_KEY = `dxos:view-state:${debugPanelAspect.key}:${DEBUG_PANEL_CONTEXT}`;
72
+
73
+ const seedViewState = (state: DebugPanelViewState | undefined) => () => {
74
+ if (state) {
75
+ localStorage.setItem(VIEW_STATE_KEY, JSON.stringify(state));
76
+ } else {
77
+ localStorage.removeItem(VIEW_STATE_KEY);
78
+ }
79
+ };
80
+
81
+ /** Docked by default: the button toggles the deck's drawer through the layout operation. */
82
+ export const Default: Story = {
83
+ args: { controller: createFakeController() },
84
+ loaders: [
85
+ () => {
86
+ seedViewState(undefined)();
87
+ setDrawerState('closed');
88
+ },
89
+ ],
90
+ play: async ({ canvasElement }) => {
91
+ const canvas = within(canvasElement);
92
+ const button = await canvas.findByRole('button', { name: 'Show debug panel' });
93
+ await expect(getDrawerState()).toBe('closed');
94
+ await userEvent.click(button);
95
+ await waitFor(() => expect(getDrawerState()).toBe('open'));
96
+ await userEvent.click(button);
97
+ await waitFor(() => expect(getDrawerState()).toBe('closed'));
98
+ await expect(within(document.body).queryByRole('dialog', { name: 'Debug' })).toBeNull();
99
+ },
100
+ };
101
+
102
+ /** Floating: the button opens the panel as a window over the app. */
103
+ export const Floating: Story = {
104
+ args: { controller: createFakeController() },
105
+ loaders: [seedViewState({ mode: 'floating', open: [] })],
106
+ play: async ({ canvasElement }) => {
107
+ const canvas = within(canvasElement);
108
+ await userEvent.click(await canvas.findByRole('button', { name: 'Show debug panel' }));
109
+ // Portaled to the body, so the window is looked up on the document.
110
+ const body = within(document.body);
111
+ const dialog = await body.findByRole('dialog', { name: 'Debug' }, { timeout: 10_000 });
112
+ await expect(dialog).toHaveAttribute('data-state', 'open');
113
+ await expect(within(dialog).getByRole('heading', { name: 'Debug' })).toBeVisible();
114
+ },
115
+ };
116
+
117
+ export const PortOpen: Story = {
118
+ args: { controller: createFakeController({ running: true, session: 'story-session' }) },
119
+ };