Remote Debugger Architecture
The remote debugger is a runtime inspection and control channel for Hosanna apps. It is used by the browser DevTools extension, its focused diagnostic recorders, and the MCP debugger tools.
Components
DevTools and MCP share app discovery, routing, and the runtime command protocol. Their client processes and browser/Roku host transports remain distinct.
| Component | Provided by | Purpose |
|---|---|---|
RemoteDebugClient | hosanna-ui | Handles normal DevTools commands in the running app |
MCPRemoteDebugClient | hosanna-ui | Extends the client with request IDs, MCP context, tracing, screenshots, and targeted slices |
hst debugger:start | @tantawowa/hosanna-tools | WebSocket and HTTP proxy between app, extension, and MCP |
| DevTools extension | hosanna-ui-browser-extension | Human UI for tree inspection, remote input, logs, recorders, registry, and styles |
hst mcp:start / hosanna-mcp | @tantawowa/hosanna-tools | MCP server used by AI agents and automation |
Enabling Remote Debugging
Remote debugging is controlled by build config. For local development, create an explicit profile such as build-config/profiles/local-debug.json:
{
"remoteDebug": {
"isEnabled": true,
"isStartServerByDefault": true,
"host": "localhost",
"webAppServerPort": 59151,
"deviceAppServerPort": 59152
},
"mcp": {
"isEnabled": true
}
}
Start the proxy and app with the profile:
npx hst debugger:start
npx hst run web dev browser --profile local-debug
When the app launches, BaseApp creates either RemoteDebugClient or
MCPRemoteDebugClient, registers it, and connects to the proxy. 59151 and
59152 are the configurable web/device base or legacy endpoints. Current
clients can request a per-app port from the management API, so do not assume
that every web or device app stays on one fixed WebSocket port.
Protocol Areas
The protocol covers these areas:
- Hosanna tree:
GetHsViews,GetHsViewByHid,SetHSFields - SceneGraph tree:
GetSGViews,GetSGViewById,SetSGFields - CollectionView:
GetCollectionView,GetRowsSlice, row/cell details, field updates, refresh, and diagnostic batches - Focus and navigation:
GetFocusedView,SetFocusedView,GetDebugContext,GetFocusGraph - Highlighting: hover highlight, sticky selection highlight, element selection by coordinates
- Registry: read, add, update, remove, clear
- IoC and instance pools: inspect services and pooled instances
- Events and input:
SendEvent,SendKeyEvent, simulated key events, typed text - Text-to-speech: inspect status, current item, queue, completed items, pause/resume/clear
- Tracing: handler tracing, render tracing, lifecycle tracing, render frequency, CollectionView row lifecycle
- Screenshots and reload: web screenshot, Roku screenshot through ECP, web app reload
- Logs: app logs, Roku logs, search, clear, export
Data Safety
Debugger serializers avoid directly walking arbitrary cyclic objects. Tree and state payloads use safe copying, depth controls, and targeted commands when possible. For large apps, prefer targeted commands such as GetFocusedView, GetDebugContext, GetCollectionView, GetRowsSlice, or GetHsViewByHid over repeatedly requesting the full tree.
Coordinate Inspection
Coordinate-based inspection uses app design coordinates. The simulator and mouse inspection send { x, y } to HighlightItem or HighlightItemSelect; the app uses hit testing against Hosanna bounds and CollectionView row/cell geometry to find the matching view.
Holding Shift while clicking in the simulator selects the parent of the last selected view. This is useful for moving from a leaf label/image to the containing row, cell, group, or screen.
Multi-App Debugging
The debug proxy can track multiple connected apps. Use --appName with hst debugger:start or hst dev:start to make instances easier to identify:
npx hst debugger:start --appName fanduel-hosanna
npx hst dev:start --vitePort 5170 --appName fanduel-hosanna
The DevTools app selector and MCP get_connected_apps / health output use these registrations.