@dxos/plugin-devtools 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 (144) hide show
  1. package/PLUGIN.mdl +144 -57
  2. package/dist/lib/Devtools.mjs +9 -1
  3. package/dist/lib/Devtools.mjs.map +1 -1
  4. package/dist/lib/capabilities.browser.mjs +45 -0
  5. package/dist/lib/capabilities.browser.mjs.map +1 -0
  6. package/dist/lib/capabilities.mjs +9 -7
  7. package/dist/lib/capabilities.mjs.map +1 -1
  8. package/dist/lib/capabilities.node.mjs +7 -3
  9. package/dist/lib/capabilities.node.mjs.map +1 -1
  10. package/dist/lib/capabilities.tauri.mjs +45 -0
  11. package/dist/lib/capabilities.tauri.mjs.map +1 -0
  12. package/dist/lib/capabilities.workerd.mjs +2 -2
  13. package/dist/lib/capabilities.workerd.mjs.map +1 -1
  14. package/dist/lib/{chunk-CliPanel.mjs → chunk-CliArticle.mjs} +28 -24
  15. package/dist/lib/chunk-CliArticle.mjs.map +1 -0
  16. package/dist/lib/chunk-DebugGraph.mjs +12 -8
  17. package/dist/lib/chunk-DebugGraph.mjs.map +1 -1
  18. package/dist/lib/chunk-DevtoolsCards.mjs +108 -0
  19. package/dist/lib/chunk-DevtoolsCards.mjs.map +1 -0
  20. package/dist/lib/chunk-DevtoolsOverviewContainer.mjs +59 -22
  21. package/dist/lib/chunk-DevtoolsOverviewContainer.mjs.map +1 -1
  22. package/dist/lib/chunk-GithubPanel.mjs +13 -10
  23. package/dist/lib/chunk-GithubPanel.mjs.map +1 -1
  24. package/dist/lib/chunk-PLUGIN.mjs +6 -0
  25. package/dist/lib/chunk-PLUGIN.mjs.map +1 -0
  26. package/dist/lib/{chunk-RegistryPanel.mjs → chunk-RegistryArticle.mjs} +26 -25
  27. package/dist/lib/chunk-RegistryArticle.mjs.map +1 -0
  28. package/dist/lib/chunk-ToolsExplorerContainer.mjs +7 -3
  29. package/dist/lib/chunk-ToolsExplorerContainer.mjs.map +1 -1
  30. package/dist/lib/chunk-app-graph-builder.mjs +323 -312
  31. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
  32. package/dist/lib/chunk-react-context.mjs +1 -1
  33. package/dist/lib/chunk-react-context.mjs.map +1 -1
  34. package/dist/lib/chunk-react-surface.mjs +244 -88
  35. package/dist/lib/chunk-react-surface.mjs.map +1 -1
  36. package/dist/lib/containers.mjs +3 -3
  37. package/dist/lib/containers.mjs.map +1 -1
  38. package/dist/lib/index.mjs +0 -1
  39. package/dist/lib/meta.mjs +2 -2
  40. package/dist/lib/meta.mjs.map +1 -1
  41. package/dist/lib/translations.mjs +55 -49
  42. package/dist/lib/translations.mjs.map +1 -1
  43. package/dist/types/src/capabilities/DevtoolsCards.d.ts +28 -0
  44. package/dist/types/src/capabilities/DevtoolsCards.d.ts.map +1 -0
  45. package/dist/types/src/capabilities/DevtoolsSurfaces.d.ts +19 -6
  46. package/dist/types/src/capabilities/DevtoolsSurfaces.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/app-graph-builder.d.ts +19 -0
  48. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  49. package/dist/types/src/capabilities/app-graph-builder.test.d.ts +2 -0
  50. package/dist/types/src/capabilities/app-graph-builder.test.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/gen/browser.d.ts +8 -0
  52. package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
  53. package/dist/types/src/capabilities/gen/tauri.d.ts +8 -0
  54. package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
  55. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  56. package/dist/types/src/containers/CliArticle/CliArticle.d.ts +8 -0
  57. package/dist/types/src/containers/CliArticle/CliArticle.d.ts.map +1 -0
  58. package/dist/types/src/containers/{CliPanel/CliPanel.stories.d.ts → CliArticle/CliArticle.stories.d.ts} +33 -5
  59. package/dist/types/src/containers/CliArticle/CliArticle.stories.d.ts.map +1 -0
  60. package/dist/types/src/containers/CliArticle/index.d.ts +2 -0
  61. package/dist/types/src/containers/CliArticle/index.d.ts.map +1 -0
  62. package/dist/types/src/containers/{CliPanel → CliArticle}/useCliApp.d.ts +1 -1
  63. package/dist/types/src/containers/CliArticle/useCliApp.d.ts.map +1 -0
  64. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +2 -1
  65. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +1 -1
  66. package/dist/types/src/containers/DebugGraph/index.d.ts +1 -1
  67. package/dist/types/src/containers/DebugGraph/index.d.ts.map +1 -1
  68. package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts.map +1 -1
  69. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +1 -1
  70. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +1 -1
  71. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts.map +1 -1
  72. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts +30 -2
  73. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts.map +1 -1
  74. package/dist/types/src/containers/GithubPanel/index.d.ts +1 -1
  75. package/dist/types/src/containers/GithubPanel/index.d.ts.map +1 -1
  76. package/dist/types/src/containers/RegistryArticle/RegistryArticle.d.ts +8 -0
  77. package/dist/types/src/containers/RegistryArticle/RegistryArticle.d.ts.map +1 -0
  78. package/dist/types/src/containers/RegistryArticle/index.d.ts +2 -0
  79. package/dist/types/src/containers/RegistryArticle/index.d.ts.map +1 -0
  80. package/dist/types/src/containers/ToolsExplorerContainer/ToolsExplorerContainer.d.ts +3 -1
  81. package/dist/types/src/containers/ToolsExplorerContainer/ToolsExplorerContainer.d.ts.map +1 -1
  82. package/dist/types/src/containers/ToolsExplorerContainer/index.d.ts +1 -1
  83. package/dist/types/src/containers/ToolsExplorerContainer/index.d.ts.map +1 -1
  84. package/dist/types/src/containers/index.d.ts +2 -2
  85. package/dist/types/src/containers/index.d.ts.map +1 -1
  86. package/dist/types/src/index.d.ts +1 -2
  87. package/dist/types/src/index.d.ts.map +1 -1
  88. package/dist/types/src/translations.d.ts +30 -2
  89. package/dist/types/src/translations.d.ts.map +1 -1
  90. package/dist/types/src/types/Devtools.d.ts +6 -0
  91. package/dist/types/src/types/Devtools.d.ts.map +1 -1
  92. package/dist/types/src/types/index.d.ts +2 -2
  93. package/dist/types/src/types/index.d.ts.map +1 -1
  94. package/dist/types/tsconfig.tsbuildinfo +1 -1
  95. package/dx.config.ts +2 -2
  96. package/package.json +43 -39
  97. package/src/capabilities/DevtoolsCards.tsx +140 -0
  98. package/src/capabilities/DevtoolsSurfaces.tsx +32 -38
  99. package/src/capabilities/app-graph-builder.test.ts +75 -0
  100. package/src/capabilities/app-graph-builder.ts +324 -313
  101. package/src/capabilities/gen/browser.ts +61 -0
  102. package/src/capabilities/gen/node.ts +4 -4
  103. package/src/capabilities/gen/tauri.ts +61 -0
  104. package/src/capabilities/gen/workerd.ts +2 -2
  105. package/src/capabilities/index.ts +7 -7
  106. package/src/capabilities/react-context.tsx +1 -1
  107. package/src/capabilities/react-surface.ts +222 -79
  108. package/src/containers/{CliPanel/CliPanel.stories.tsx → CliArticle/CliArticle.stories.tsx} +9 -10
  109. package/src/containers/{CliPanel/CliPanel.tsx → CliArticle/CliArticle.tsx} +7 -7
  110. package/src/containers/CliArticle/index.ts +5 -0
  111. package/src/containers/{CliPanel → CliArticle}/useCliApp.ts +17 -12
  112. package/src/containers/DebugGraph/DebugGraph.tsx +7 -6
  113. package/src/containers/DebugGraph/index.ts +1 -1
  114. package/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx +72 -32
  115. package/src/containers/DevtoolsOverviewContainer/index.ts +1 -1
  116. package/src/containers/GithubPanel/GithubComponent.stories.tsx +2 -2
  117. package/src/containers/GithubPanel/GithubComponent.tsx +14 -11
  118. package/src/containers/GithubPanel/GithubPanel.tsx +2 -2
  119. package/src/containers/GithubPanel/index.ts +1 -1
  120. package/src/containers/{RegistryPanel/RegistryPanel.tsx → RegistryArticle/RegistryArticle.tsx} +11 -10
  121. package/src/containers/RegistryArticle/index.ts +5 -0
  122. package/src/containers/ToolsExplorerContainer/ToolsExplorerContainer.tsx +10 -3
  123. package/src/containers/ToolsExplorerContainer/index.ts +1 -1
  124. package/src/containers/index.ts +6 -6
  125. package/src/index.ts +1 -2
  126. package/src/meta.ts +1 -1
  127. package/src/plugin.test.ts +2 -2
  128. package/src/translations.ts +7 -3
  129. package/src/types/Devtools.ts +10 -0
  130. package/src/types/index.ts +2 -2
  131. package/dist/lib/chunk-CliPanel.mjs.map +0 -1
  132. package/dist/lib/chunk-RegistryPanel.mjs.map +0 -1
  133. package/dist/types/src/containers/CliPanel/CliPanel.d.ts +0 -6
  134. package/dist/types/src/containers/CliPanel/CliPanel.d.ts.map +0 -1
  135. package/dist/types/src/containers/CliPanel/CliPanel.stories.d.ts.map +0 -1
  136. package/dist/types/src/containers/CliPanel/index.d.ts +0 -2
  137. package/dist/types/src/containers/CliPanel/index.d.ts.map +0 -1
  138. package/dist/types/src/containers/CliPanel/useCliApp.d.ts.map +0 -1
  139. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts +0 -6
  140. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts.map +0 -1
  141. package/dist/types/src/containers/RegistryPanel/index.d.ts +0 -2
  142. package/dist/types/src/containers/RegistryPanel/index.d.ts.map +0 -1
  143. package/src/containers/CliPanel/index.ts +0 -5
  144. package/src/containers/RegistryPanel/index.ts +0 -5
@@ -0,0 +1,6 @@
1
+ //#region PLUGIN.mdl?raw
2
+ var PLUGIN_default = "---\nid: org.dxos.plugin.devtools\nname: DevtoolsPlugin\nversion: 0.1.0\n---\n\nDeveloper inspector plugin for `DXOS` Composer — structured devtools panels for Client/HALO/ECHO/Mesh/EDGE subsystems, an app-graph inspector, and a tools explorer. The tree attaches to the hidden `root/debug` app-graph category (`AppNodeMatcher.whenDebugGroup`) and is reached only through the floating debug panel that `@dxos/plugin-debug` renders from the status bar — never the main navtree, the deck, or a URL. Debugging utilities (object generation, wireframe overlays, per-object inspection, stats) live in the sibling `@dxos/plugin-debug`.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `scenario` | `org.dxos.mdl.scenario@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n\n## Types\n\n```mdl\ntype Settings\n fields:\n wireframe?: boolean # overlay every article/section surface with a labelled border\n traceAll?: boolean # enable verbose operation tracing across all plugins\n```\n\n```mdl\ntype DebugPluginOptions\n fields:\n logStore?: IdbLogStore # shared persistent log store for capturing and downloading logs\n```\n\n```mdl\ntype DebugContextType\n fields:\n running: boolean\n start(cb: TimerCallback, options: TimerOptions): void\n stop(): void\n```\n\n## Components\n\n```mdl\ncomponent DebugSettings\n desc: Settings panel rendered in the plugin-settings article slot; controls wireframe and traceAll toggles and exposes log download.\n props:\n settings: Settings\n logStore?: IdbLogStore\n actions:\n updateSettings(patch: Partial<Settings>)\n downloadLogs()\n```\n\n```mdl\ncomponent DebugStatus\n desc: Status-indicator surface shown in the main toolbar; reflects the generator timer running state.\n state:\n running: boolean\n```\n\n```mdl\ncomponent DevtoolsOverviewContainer\n desc: |\n The \"Stats\" deck companion: polls the client's stats once (`useStats`) and renders `StatsPanel`\n (`@dxos/devtools`) — a toolbar with refresh and live toggle over a scrolling stack of cards —\n with one `AppSurface.DevtoolsOverview` surface as its children, passing\n `DevtoolsCardData { stats, surfaceProfilerStats, onClearSurfaceProfiler }`. Every card is a\n surface on that role ordered by `position`: memory, network, EDGE, performance, swarm\n announcements, surfaces (profiler), database, replicator, messages, queries, sync, frame rate\n (0–12), then plugin-debug's compartment cards (20) and other contributors (e.g.\n plugin-calls). A card is a `StatCard` (`@dxos/devtools`): a `Card.Header` with an icon,\n title, figure and one control, over compact `Card.Row`s whose leading gutter carries a status\n icon and whose trailing gutter carries a control.\n layout: |\n ┌───────────────────────────────┐\n │ Stats ↻ ▶ │\n ├───────────────────────────────┤\n │ ┌ ▣ Memory ──────────────────┐│\n │ │ Used heap 42.1 MB ││\n │ │ ⚠ Used of available 46% ││\n │ └────────────────────────────┘│\n │ ┌ ☁ EDGE healthy ⋮ ┐│\n │ │ ✓ Websocket connected ││\n │ └────────────────────────────┘│\n │ … │\n └───────────────────────────────┘\n```\n\n```mdl\ncomponent DebugObjectPanel\n desc: Companion panel for any ECHO object that shows raw field values, type info, and DXN.\n props:\n companionTo: string # DXN of the object being inspected\n```\n\n```mdl\ncomponent DebugSpaceObjectsPanel\n desc: Deck-companion panel listing all objects in the active space with their type, ID, and field count.\n props:\n space: Space\n```\n\n```mdl\ncomponent DebugGraph\n desc: Visual representation of the Composer app-graph as a collapsible JSON tree.\n props:\n graph: Graph.Graph\n root: string # node ID used as the traversal root\n```\n\n```mdl\ncomponent SpaceGenerator\n desc: Article view for generating synthetic ECHO objects into a space; controls count, type mix, and relation density.\n props:\n space: Space\n actions:\n generateObjects(count: number, types: string[])\n clear()\n emits:\n onCreateObjects(objects: Obj.Unknown[])\n```\n\n```mdl\ncomponent Wireframe\n desc: Transparent overlay that wraps any article or section surface and renders a labelled border for layout debugging.\n props:\n label: string # \"role:name\" descriptor shown in the corner badge\n object: Obj.Unknown\n classNames?: string\n```\n\n```mdl\ncomponent SchemaTable\n desc: Tabular display of all registered ECHO schemas with typename, fields, and version.\n```\n\n```mdl\ncomponent GithubPanel\n desc: Developer panel linking to open GitHub issues and CI run status for the current build.\n```\n```\n\n## Components (Devtools Panels)\n\nThe following components are thin wrappers around `@dxos/devtools` panel components, each bound to a specific `Devtools.*` node:\n\n| Component | Devtools node | Displays |\n|------------------------|----------------------------|-----------------------------------------|\n| ConfigArticle | Client.Config | Vault config JSON viewer |\n| StorageArticle | Client.Storage | Local storage browser |\n| LoggingArticle | Client.Logs | Live log stream; download via logStore |\n| DiagnosticsArticle | Client.Diagnostics | Client health / metric charts |\n| IdentityArticle | Halo.Identity | Local identity key + device list |\n| DeviceListArticle | Halo.Devices | All devices paired with this identity |\n| KeyringArticle | Halo.Keyring | Raw keyring entries |\n| CredentialsArticle | Halo.Credentials | Credentials held in the active space |\n| SpaceListArticle | Echo.Spaces | All spaces with state + select action |\n| SpaceInfoArticle | Echo.Space | Selected space feeds / pipelines |\n| FeedsArticle | Echo.Feeds | Feed entries for the active space |\n| ObjectsArticle | Echo.Objects | All objects in the active space |\n| SchemaArticle | Echo.Schema | Schemas registered in the active space |\n| AutomergeArticle | Echo.Automerge | Automerge document internals |\n| QueuesArticle | Echo.Queues | Pending queue items |\n| MembersArticle | Echo.Members | Space members with last-seen |\n| MetadataArticle | Echo.Metadata | Space/feed metadata blobs |\n| SignalArticle | Mesh.Signal | Signal-server connection state |\n| SwarmArticle | Mesh.Swarm | Active swarm peers |\n| NetworkArticle | Mesh.Network | Full network topology for active space |\n| EdgeDashboardArticle | Edge.Dashboard | EDGE node health / worker stats |\n| WorkflowArticle | Edge.Workflows | Workflow definitions in active space |\n| InvocationTraceContainer | Edge.Traces | Invocation trace timeline from feed |\n| TestingArticle | Edge.Testing | Integration test harness for EDGE |\n| ToolsExplorer | ToolsExplorer | MCP-backed tools explorer |\n\n## Operations\n\nNo first-party operations are defined by DebugPlugin. The plugin invokes `SpaceOperation.AddObject`, `SpaceOperation.Migrate`, `LayoutOperation.Open`, and `ScriptOperation.CreateScript` from other plugins via `useOperationInvoker` inside its surfaces.\n\n## Features\n\n```mdl\nfeat F-1: Devtools Graph Node\n\n req F-1.1:\n when: DevtoolsPlugin is loaded\n then: a \"DevTools\" branch (`root/debug/devtools`) appears under the hidden `root/debug` category, listed in the floating debug panel's sidebar after Console and Logs\n\n req F-1.2: The DevTools branch contains sub-trees for Client, HALO, ECHO, MESH, and EDGE categories, plus App Graph, SDK Explorer, and CLI pages.\n req F-1.3: An app-graph sub-node renders DebugGraph rooted at the graph root.\n req F-1.4: A tools-explorer sub-node renders ToolsExplorer connected to the MCP introspect service.\n req F-1.5: No devtools node declares a URL binding; selecting one renders its article in the panel and leaves `window.location` unchanged.\n req F-1.6: A space-scoped inspector resolves the active workspace's space at render time; no space travels in node data.\n```\n\n```mdl\nfeat F-2: Object Debug Companion\n\n req F-2.1:\n when: any ECHO object is open in the deck\n then: a \"Debug\" companion tab is injected at the last position\n\n req F-2.2: DebugObjectPanel shows raw object fields, DXN, and typename for the companion target.\n```\n\n```mdl\nfeat F-3: Space Object Explorer\n\n req F-3.1:\n when: user opens the \"Space Objects\" deck companion\n then: DebugSpaceObjectsPanel lists all ECHO objects in the active space\n\n req F-3.2: List updates reactively as objects are added or removed.\n```\n\n```mdl\nfeat F-4: Devtools Overview Companion\n\n req F-4.1:\n when: user opens the \"Stats\" deck companion\n then: DevtoolsOverviewContainer renders the card stack, one card per `AppSurface.DevtoolsOverview` contribution\n\n req F-4.2: Every devtools page is an article — `Panel.Root role` with an optional toolbar over its content — registered on its `Devtools.*` id from `react-surface.ts`; `@dxos/devtools` exports them as `*Article` from `containers/panels`.\n```\n\n```mdl\nfeat F-5: Space Data Generator\n\n req F-5.1:\n when: user selects Debug → Generate objects in the debug panel\n then: SpaceGenerator is rendered as the panel's article, bound to the active workspace's space\n\n req F-5.2:\n when: user triggers object generation\n then: synthetic ECHO objects are created via op:SpaceOperation.AddObject in the active collection\n\n req F-5.3: DebugStatus indicator in the toolbar shows a running state while generation is active.\n```\n\n```mdl\nfeat F-6: Wireframe Overlay\n\n req F-6.1:\n when: settings.wireframe is true\n then: Wireframe wraps every article and section surface with a labelled border\n\n req F-6.2:\n when: settings.wireframe is false or unset\n then: no overlay is injected; the Wireframe surface filter returns false immediately\n```\n\n```mdl\nfeat F-7: Log Capture and Download\n\n req F-7.1:\n when: logStore is provided in DebugPluginOptions\n then: LoggingArticle can stream and display captured log entries\n\n req F-7.2:\n when: user clicks download in DebugSettings\n then: captured logs are serialised and offered as a file download via the file uploader capability\n```\n\n```mdl\nfeat F-8: Global Dev Utilities\n\n req F-8.1:\n when: DebugPlugin activates\n then: globalThis.composer.changeStorageVersionInMetadata is registered for manual storage-migration testing\n\n req F-8.2: The function destroys the client, rewrites the storage version metadata, and reloads the page.\n```\n\n## Acceptance\n\n```mdl\nscenario T-1: Devtools tree appears in the debug panel\n given: Composer loaded with DevtoolsPlugin and DebugPlugin enabled\n when: user opens the debug panel from the status bar\n then:\n - the sidebar lists Console, Logs, DevTools, Debug\n - expanding DevTools shows App Graph, SDK Explorer, CLI, Client, HALO, ECHO, MESH, EDGE\n - the main navtree's SYSTEM group shows only Database\n```\n\n```mdl\nscenario T-2: Debug companion on ECHO object\n given: a Document is open in the deck\n when: user clicks the \"Debug\" companion tab\n then:\n - DebugObjectPanel renders with the object's DXN and field map\n```\n\n```mdl\nscenario T-3: Wireframe overlay toggle\n given: DebugPlugin settings panel is open\n when: user enables the wireframe toggle\n then:\n - every article and section surface shows a labelled border\n when: user disables the wireframe toggle\n then:\n - borders are removed immediately\n```\n\n```mdl\nscenario T-4: Space object generation\n given: a space with an empty collection is active\n when: user opens Debug → Generate objects in the debug panel and generates 10 objects\n then:\n - 10 new objects appear in the active collection\n - DebugStatus shows \"running\" while generation is in progress\n```\n\n```mdl\nscenario T-5: Log download\n given: logStore is configured and some log entries have been captured\n when: user clicks \"Download Logs\" in DebugSettings\n then:\n - a file download is triggered containing the serialised log entries\n```\n\n---\n\n## QA\n\nExecutable tests. Each step carries a human instruction (`do`) and, where the step maps to an\ninvocable operation, an agent binding (`invoke`). Report failures by test and step number.\n\nplugin-devtools defines no first-party operations (see \"Operations\" above), so most of its\njourneys are navigation and settings toggles with no `invoke`. It is a dev-only default: on in\n`isDev` builds, off otherwise (see `packages/apps/composer-app/src/plugin-defs.tsx`).\n\n```mdl\ntest QA-1: Open the Devtools node and inspect an object\n desc: The core devtools round-trip — navigate to the Devtools tree and open the Debug companion on an object.\n actors: both\n covers: [F-1.1, F-1.2, F-2.1, F-2.2, T-1, T-2]\n status: unverified\n given:\n - an identity exists\n - space: a space is open\n - plugin-devtools is enabled (dev-only default; see above)\n - doc1: a Document already exists in the space\n steps:\n - name: Open the DevTools tree in the debug panel\n do: Click the status-bar debug button (terminal icon), then expand \"DevTools\" in the panel's sidebar and open Client → Config.\n expect: the sidebar shows Client, HALO, ECHO, MESH, and EDGE sub-trees and the Config JSON renders in the panel; `window.location` is unchanged\n note: |\n NO `invoke` — devtools nodes have no URL binding and never open in the deck, so\n `appToolkit.open` does not reach them. Human-only step; an agent run reports it unverified.\n - name: Open the Debug companion on an object\n do: Click \"$given.doc1\" in the navtree, then select the \"Debug\" companion tab.\n invoke: org.dxos.operation.appToolkit.updateCompanion { open: true, variant: \"debug\" }\n expect: DebugObjectPanel renders the object's DXN, typename, and raw field map\n after:\n - name: Close the companion\n do: Click the companion toggle again.\n invoke: org.dxos.operation.appToolkit.updateCompanion { open: false }\n expect: the companion pane closes\n```\n\n```mdl\ntest QA-2: Generate synthetic objects into a collection\n desc: |\n The write path behind the Space Data Generator — the agent binding invokes the shared\n space.addObject operation directly rather than driving the SpaceGenerator surface, so this\n exercises F-5.2 (object creation) only, not F-5.1 (the surface rendering).\n actors: agent\n covers: [F-5.2, T-4]\n status: unverified\n given:\n - an identity exists\n - space: a space is open\n - collection: a collection in that space, empty of synthetic objects\n - plugin-devtools is enabled (dev-only default; see above)\n - no Person named \"QA Devtools Object\" exists — ABORT rather than reusing one this test did\n not create\n steps:\n - name: Generate one object\n do: (agent-only — invokes space.addObject directly, bypassing the SpaceGenerator surface)\n invoke: org.dxos.operation.space.addObject { object: { \"@type\": \"org.dxos.type.person\", fullName: \"QA Devtools Object\" }, target: $given.collection }\n capture: created\n expect: one new Person named \"QA Devtools Object\" appears in the active collection\n assert: return !!$created.object\n after:\n - name: Delete the generated object\n do: Right-click \"QA Devtools Object\" in the navtree and choose Delete.\n invoke: org.dxos.operation.space.removeObjects { objects: [$created.object], target: $given.collection }\n expect: the row leaves the navtree\n```\n\n---\n\n## Appendix: Extension Definitions\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap\n literals?: UnionList\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self\n```\n\n```mdl\next scenario\n uri: org.dxos.mdl.scenario@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap\n state?: FieldMap\n slots?: FieldMap\n actions?: ActionMap\n emits?: EventMap\n layout?: CodeBlock\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap\n output?: TypeExpr\n errors?: ErrorMap\n effects?: EffectList\n requires?: ServiceList\n note?: Prose\n```\n";
3
+ //#endregion
4
+ export { PLUGIN_default as t };
5
+
6
+ //# sourceMappingURL=chunk-PLUGIN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-PLUGIN.mjs","names":[],"sources":[],"mappings":""}
@@ -3,11 +3,12 @@ import { JsonView, Placeholder, Searchbar } from "@dxos/devtools";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Entity, Format, Obj, Type } from "@dxos/echo";
5
5
  import { useClient } from "@dxos/react-client";
6
- import { Panel, Toolbar } from "@dxos/react-ui";
6
+ import * as Panel from "@dxos/react-ui/Panel";
7
7
  import * as Operation from "@dxos/compute/Operation";
8
8
  import { DynamicTable } from "@dxos/react-ui-table";
9
+ import * as Toolbar from "@dxos/react-ui/Toolbar";
9
10
  import { mx } from "@dxos/ui-theme";
10
- //#region src/containers/RegistryPanel/RegistryPanel.tsx
11
+ //#region src/containers/RegistryArticle/RegistryArticle.tsx
11
12
  var textFilter = (text) => {
12
13
  if (!text) return () => true;
13
14
  const matcher = new RegExp(text, "i");
@@ -51,7 +52,7 @@ var toDetailJson = (entity) => {
51
52
  typename: Entity.getTypename(entity)
52
53
  };
53
54
  };
54
- var RegistryPanel = () => {
55
+ var RegistryArticle = ({ role }) => {
55
56
  const client = useClient();
56
57
  const [entities, setEntities] = useState([]);
57
58
  const [filter, setFilter] = useState("");
@@ -95,30 +96,30 @@ var RegistryPanel = () => {
95
96
  enabled: true,
96
97
  mode: "single"
97
98
  } }), []);
98
- return /* @__PURE__ */ jsxs(Panel.Root, { children: [/* @__PURE__ */ jsx(Panel.Toolbar, {
99
- asChild: true,
100
- children: /* @__PURE__ */ jsx(Toolbar.Root, { children: /* @__PURE__ */ jsx(Searchbar, {
99
+ return /* @__PURE__ */ jsxs(Panel.Root, {
100
+ role,
101
+ children: [/* @__PURE__ */ jsx(Panel.Header, { children: /* @__PURE__ */ jsx(Toolbar.Root, { children: /* @__PURE__ */ jsx(Searchbar, {
101
102
  placeholder: "Filter...",
102
103
  onChange: setFilter
103
- }) })
104
- }), /* @__PURE__ */ jsx(Panel.Content, { children: /* @__PURE__ */ jsxs("div", {
105
- className: mx("h-full grid grid-cols-[2fr_1fr] overflow-hidden"),
106
- children: [/* @__PURE__ */ jsx("div", {
107
- className: mx("flex flex-col min-h-0 overflow-hidden"),
108
- children: /* @__PURE__ */ jsx(DynamicTable, {
109
- properties,
110
- rows,
111
- features,
112
- onRowClick: handleRowClicked
113
- })
114
- }), /* @__PURE__ */ jsx("div", {
115
- className: mx("min-h-0 h-full overflow-auto border-s border-separator text-sm"),
116
- children: detailJson ? /* @__PURE__ */ jsx(JsonView, { data: detailJson }) : /* @__PURE__ */ jsx(Placeholder, { label: "Details" })
117
- })]
118
- }) })] });
104
+ }) }) }), /* @__PURE__ */ jsx(Panel.Body, { children: /* @__PURE__ */ jsxs("div", {
105
+ className: mx("h-full grid grid-cols-[2fr_1fr] overflow-hidden"),
106
+ children: [/* @__PURE__ */ jsx("div", {
107
+ className: mx("flex flex-col dx-grow overflow-hidden"),
108
+ children: /* @__PURE__ */ jsx(DynamicTable, {
109
+ properties,
110
+ rows,
111
+ features,
112
+ onRowClick: handleRowClicked
113
+ })
114
+ }), /* @__PURE__ */ jsx("div", {
115
+ className: mx("h-full overflow-auto border-s border-separator text-sm"),
116
+ children: detailJson ? /* @__PURE__ */ jsx(JsonView, { data: detailJson }) : /* @__PURE__ */ jsx(Placeholder, { label: "Details" })
117
+ })]
118
+ }) })]
119
+ });
119
120
  };
120
- RegistryPanel.displayName = "RegistryPanel";
121
+ RegistryArticle.displayName = "RegistryArticle";
121
122
  //#endregion
122
- export { RegistryPanel, RegistryPanel as default };
123
+ export { RegistryArticle, RegistryArticle as default };
123
124
 
124
- //# sourceMappingURL=chunk-RegistryPanel.mjs.map
125
+ //# sourceMappingURL=chunk-RegistryArticle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-RegistryArticle.mjs","names":[],"sources":["../../src/containers/RegistryArticle/RegistryArticle.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport { JsonView, Placeholder, Searchbar } from '@dxos/devtools';\nimport { Entity, Format, Obj, Type } from '@dxos/echo';\nimport { useClient } from '@dxos/react-client';\nimport { DynamicTable, type TableFeatures } from '@dxos/react-ui-table';\nimport * as Panel from '@dxos/react-ui/Panel';\nimport * as Toolbar from '@dxos/react-ui/Toolbar';\nimport { mx } from '@dxos/ui-theme';\n\ntype RegistryRow = {\n id: string;\n kind: string;\n label: string;\n _entity: Entity.Unknown;\n};\n\nconst textFilter = (text?: string) => {\n if (!text) {\n return () => true;\n }\n\n const matcher = new RegExp(text, 'i');\n return (entity: Entity.Unknown) => {\n const typename = Entity.getTypename(entity) ?? '';\n const metaKey = Obj.isObject(entity) ? (Obj.getMeta(entity).key ?? '') : '';\n const uri = Type.isType(entity) ? (Type.getURI(entity)?.toString() ?? '') : '';\n const operationKey =\n Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)\n ? (Operation.getKey(entity) ?? '')\n : '';\n const name = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? entity.name : '';\n return [typename, metaKey, uri, operationKey, name, getEntityId(entity)].some((value) => value.match(matcher));\n };\n};\n\nconst getEntityId = (entity: Entity.Unknown): string => {\n if (entity.id) {\n return entity.id;\n }\n if (Type.isType(entity)) {\n return Type.getURI(entity)?.toString() ?? Type.getTypename(entity) ?? 'unknown-type';\n }\n return Entity.getTypename(entity) ?? 'unknown';\n};\n\nconst getKind = (entity: Entity.Unknown): string => {\n if (Type.isType(entity)) {\n return 'type';\n }\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return 'operation';\n }\n return 'other';\n};\n\nconst getLabel = (entity: Entity.Unknown): string => {\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return entity.name || Operation.getKey(entity) || getEntityId(entity);\n }\n if (Type.isType(entity)) {\n return Type.getTypename(entity) ?? getEntityId(entity);\n }\n return getEntityId(entity);\n};\n\nconst toDetailJson = (entity: Entity.Unknown): object => {\n if (Type.isType(entity)) {\n return {\n id: getEntityId(entity),\n typename: Type.getTypename(entity),\n uri: Type.getURI(entity)?.toString(),\n version: Type.getVersion(entity),\n jsonSchema: entity.jsonSchema,\n };\n }\n if (Obj.isObject(entity)) {\n return Obj.toJSON(entity);\n }\n return { id: getEntityId(entity), typename: Entity.getTypename(entity) };\n};\n\nexport const RegistryArticle = ({ role }: { role?: string }) => {\n const client = useClient();\n const [entities, setEntities] = useState<Entity.Unknown[]>([]);\n const [filter, setFilter] = useState('');\n const [selected, setSelected] = useState<Entity.Unknown>();\n\n useEffect(() => {\n const registry = client.graph.registry;\n const refresh = () => setEntities([...registry.list()]);\n refresh();\n return registry.changed.on(refresh);\n }, [client]);\n\n const properties = useMemo(\n () => [\n { name: 'kind', format: Format.TypeFormat.String, size: 100 },\n { name: 'label', format: Format.TypeFormat.String },\n { name: 'id', format: Format.TypeFormat.String, size: 280 },\n ],\n [],\n );\n\n const rows = useMemo((): RegistryRow[] => {\n return entities\n .filter(textFilter(filter))\n .map((entity) => ({\n id: getEntityId(entity),\n kind: getKind(entity),\n label: getLabel(entity),\n _entity: entity,\n }))\n .toSorted((left, right) => left.label.localeCompare(right.label));\n }, [entities, filter]);\n\n const handleRowClicked = useCallback((row: RegistryRow | undefined) => {\n if (!row?._entity) {\n return;\n }\n setSelected(row._entity);\n }, []);\n\n const detailJson = useMemo(() => (selected ? toDetailJson(selected) : undefined), [selected]);\n\n const features: Partial<TableFeatures> = useMemo(() => ({ selection: { enabled: true, mode: 'single' } }), []);\n\n return (\n <Panel.Root role={role}>\n <Panel.Header>\n <Toolbar.Root>\n <Searchbar placeholder='Filter...' onChange={setFilter} />\n </Toolbar.Root>\n </Panel.Header>\n <Panel.Body>\n <div className={mx('h-full grid grid-cols-[2fr_1fr] overflow-hidden')}>\n <div className={mx('flex flex-col dx-grow overflow-hidden')}>\n <DynamicTable properties={properties} rows={rows} features={features} onRowClick={handleRowClicked} />\n </div>\n <div className={mx('h-full overflow-auto border-s border-separator text-sm')}>\n {detailJson ? <JsonView data={detailJson} /> : <Placeholder label='Details' />}\n </div>\n </div>\n </Panel.Body>\n </Panel.Root>\n );\n};\n\nRegistryArticle.displayName = 'RegistryArticle';\n"],"mappings":"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"}
@@ -1,15 +1,19 @@
1
1
  import "react";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { useEdgeServiceEndpoint } from "@dxos/react-client";
4
+ import * as Panel from "@dxos/react-ui/Panel";
4
5
  import { EdgeServiceName } from "@dxos/config";
5
6
  import { ToolsExplorer } from "@dxos/react-ui-introspect";
6
7
  //#region src/containers/ToolsExplorerContainer/ToolsExplorerContainer.tsx
7
8
  /**
8
9
  * Binds the tools explorer to the introspect endpoint from config; the explorer renders its
9
- * unconfigured state when `runtime.services.edgeServices` has no `introspect` entry.
10
+ * unconfigured state when neither `runtime.services.edge.url` nor an `introspect` override is set.
10
11
  */
11
- var ToolsExplorerContainer = () => {
12
- return /* @__PURE__ */ jsx(ToolsExplorer, { serverUrl: useEdgeServiceEndpoint(EdgeServiceName.Introspect) });
12
+ var ToolsExplorerContainer = ({ role }) => {
13
+ return /* @__PURE__ */ jsx(Panel.Root, {
14
+ role,
15
+ children: /* @__PURE__ */ jsx(Panel.Body, { children: /* @__PURE__ */ jsx(ToolsExplorer, { serverUrl: useEdgeServiceEndpoint(EdgeServiceName.Introspect) }) })
16
+ });
13
17
  };
14
18
  ToolsExplorerContainer.displayName = "ToolsExplorerContainer";
15
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-ToolsExplorerContainer.mjs","names":[],"sources":["../../src/containers/ToolsExplorerContainer/ToolsExplorerContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { EdgeServiceName } from '@dxos/config';\nimport { useEdgeServiceEndpoint } from '@dxos/react-client';\nimport { ToolsExplorer } from '@dxos/react-ui-introspect';\n\n/**\n * Binds the tools explorer to the introspect endpoint from config; the explorer renders its\n * unconfigured state when `runtime.services.edgeServices` has no `introspect` entry.\n */\nexport const ToolsExplorerContainer = () => {\n return <ToolsExplorer serverUrl={useEdgeServiceEndpoint(EdgeServiceName.Introspect)} />;\n};\n\nToolsExplorerContainer.displayName = 'ToolsExplorerContainer';\n"],"mappings":";;;;;;;;;;AAcA,IAAa,+BAA+B;CAC1C,OAAO,oBAAC,eAAD,EAAe,WAAW,uBAAuB,gBAAgB,UAAU,EAAI,CAAA;AACxF;AAEA,uBAAuB,cAAc"}
1
+ {"version":3,"file":"chunk-ToolsExplorerContainer.mjs","names":[],"sources":["../../src/containers/ToolsExplorerContainer/ToolsExplorerContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { EdgeServiceName } from '@dxos/config';\nimport { useEdgeServiceEndpoint } from '@dxos/react-client';\nimport { ToolsExplorer } from '@dxos/react-ui-introspect';\nimport * as Panel from '@dxos/react-ui/Panel';\n\n/**\n * Binds the tools explorer to the introspect endpoint from config; the explorer renders its\n * unconfigured state when neither `runtime.services.edge.url` nor an `introspect` override is set.\n */\nexport const ToolsExplorerContainer = ({ role }: { role?: string }) => {\n return (\n <Panel.Root role={role}>\n <Panel.Body>\n <ToolsExplorer serverUrl={useEdgeServiceEndpoint(EdgeServiceName.Introspect)} />\n </Panel.Body>\n </Panel.Root>\n );\n};\n\nToolsExplorerContainer.displayName = 'ToolsExplorerContainer';\n"],"mappings":";;;;;;;;;;;AAeA,IAAa,0BAA0B,EAAE,WAA8B;CACrE,OACE,oBAAC,MAAM,MAAP;EAAkB;EAChB,UAAA,oBAAC,MAAM,MAAP,EAAA,UACE,oBAAC,eAAD,EAAe,WAAW,uBAAuB,gBAAgB,UAAU,EAAI,CAAA,EACrE,CAAA;CACF,CAAA;AAEhB;AAEA,uBAAuB,cAAc"}