The developer inspector attaches Chrome DevTools to a running DataMind Oda app, so you can debug the app's host process and its connected browser clients from one DevTools window. It is development tooling for a checkout, not part of the everyday app: it joins one run through an overlay file and listens on this computer only.
pnpm run build. The overlay loads the inspector from the build output; Building and shipping Oda covers building and running from source.oda --profile web --patch . / packages/ experimental/ inspector/ cordis. patch. ymldevtools:/ / address the app logs once the inspector listens. Chrome DevTools attaches to the run from there.In a source checkout, pnpm run demo:inspector starts the same web mode and loads the inspector from source instead of the build output.
Nothing is installed into your profile: a run started without the overlay has no inspector, and when the run stops, the inspector goes with it.
Once it listens, the inspector serves these addresses on one local port:
| Address | What it answers |
|---|---|
/, / | The DevTools discovery documents. |
/ | The version document for the protocol. |
/ | The target socket DevTools attaches to. |
/ | The socket a browser client connects to as a source. |
fetch calls with the full URL, request and response headers, bodies, status, timing, errors and cancellation. Bodies are kept as a prefix and marked truncated at the configured limits, and an aborted request keeps the bytes captured so far.<host> for the app's host side and <clients> for its browser clients, and one <client> entry per connected client. Levels load on demand, and a disconnected client's tree stays as the last snapshot it sent; the inspector retains up to eight disconnected trees.A connected client advertises runtime, console and sources, with its sources read-only; its capability list leaves out the debugger and the heap profiler.
The inspector's fields live in its entry in the overlay you run. Set one there when a default does not fit:
| Field | Default | Meaning |
|---|---|---|
host | 127. | The bind address; only a loopback address is accepted. |
port | 9230 | The first port tried; a busy port advances upward, and 0 asks the system for one. |
clientOrigins | empty | Extra browser origins accepted by the ingest endpoint. |
captureFetch | on | Record the host's fetch calls. |
maxRequestBodyBytes | 8 MiB | Request-body prefix kept per request. |
maxResponseBodyBytes | 32 MiB | Response-body prefix kept per request. |
maxBodyChunkBytes | 48 KiB | Raw bytes carried in one body record. |
maxJournalBytes | 256 MiB | Total body bytes kept. |
maxRetainedRequests | 2000 | Requests kept. |
maxSourceFrameBytes | 128 KiB | Largest encoded source frame. |
startupTimeoutMs | 10 s | How long startup waits for readiness. |
stopTimeoutMs | 5 s | The window for a graceful stop. |
clientReconnectBaseMs | 250 ms | Starting client reconnect backoff. |
clientReconnectMaxMs | 5 s | Largest client reconnect backoff. |
clientRuntimeTimeoutMs | 30 s | Deadline for one runtime or sources command sent to a client. |
queryTimeoutMs | 10 s | Deadline for one non-DevTools query. |
The same entry holds a few further bounds: maxSourceRecordsPerFrame 128, maxQueuedRecords 2048, maxQueuedBytes 16 MiB, maxClientRuntimeObjects 10000, maxClientRuntimeProperties 2000, maxClientSourceBytes 8 MiB, maxCordisNodes 2048 and maxDisconnectedCordisTrees 8.
While the inspector runs, anything attached to its DevTools socket can run code in the host and in any connected browser client. Stop the run when you are done.
Inspector Client query socket is not connected: a query was sent while the client's socket was between connections. Wait for it to reconnect and try again.inspector: Client source is closed: the client side was already closed when it tried to update its state, as happens during teardown. Reload the page if the client should still be connected.[inspector] Client source rejected: <message>: the inspector refused a browser client as a source; the message carries the reason, and the client closes that connection and retries with backoff.inspector protocol: Worker frame exceeds <n> bytes: an incoming frame was larger than the frame limit. The connection closes and reconnects with backoff; if it repeats, raise maxSourceFrameBytes.Client source result exceeds the source-frame byte limit: a sources answer did not fit in one frame and was refused. Read fewer sources at once, or raise maxSourceFrameBytes.Yes. A plugin publishes snapshots with ctx., and a script can read the detached tree with ctx.. Neither call needs a DevTools window.
Through snapshots, never through live objects. The app's parts project validated snapshots into the worker, and DevTools works from those snapshots.
A client page's content security policy can refuse dynamic evaluation, and a client context has no DevTools command-line helpers. What a client offers is its console entries, evaluation and read-only sources.
It can. Full capture copies request and response streams, so a busy run adds memory and I/O pressure, and the retained-byte limit does not cover the buffering inside the stream copy.
Yes. Set captureFetch to off in the overlay entry. Capture is on by default.
No. The client keeps its buffered observations across a reconnect and sends them when it joins again, in bounded frames and queues. Its console entries flow only while its connection is open.
Yes. Every connected client joins as its own <client> entry, console entries merge from the host and from all of them, and evaluation goes to the client you select. A client keeps its identity across refreshes and reconnects, while a duplicated live tab gets a new one; a browser without Web Locks support cannot tell two live copies apart.
[inspector] Client source rejected: <message> mean?The inspector refused a browser client as a source, and the carried message says why. The client closes that connection and retries with backoff, from 250 ms up to 5 s by default.
It is bounded: up to maxRetainedRequests requests, 2000 by default, and maxJournalBytes of body bytes, 256 MiB by default, with each body kept as a prefix of its own caps. Raise the fields in the overlay when a run needs more.
Inspector Client query socket is not connected mean?A query reached the client while its socket was between connections, for example during a reconnect. The query is refused rather than queued, so wait for the connection and try again.