The developer inspector

The developer inspector attaches Chrome DevTools to a running DataMind Oda app, so you can debug its host process and its connected browser clients from one DevTools window. It is development tooling for a checkout, not part of the everyday app, and it listens on this computer only.

For running, approving, stopping and removing dynamic packages, see Dynamic packages.

Turn the inspector on

The inspector joins one run through an overlay file; nothing is installed into your profile.

  1. Build the project if you have not already: pnpm run build. The overlay loads the inspector from the build output.
  2. Start the web mode with the overlay: oda --profile web --patch ./packages/experimental/inspector/cordis.patch.yml
  3. Open the devtools:// address the app logs once the inspector listens. Chrome DevTools attaches to the run and opens on the Elements panel.

From a source checkout, pnpm run demo:inspector starts the same web mode with a source overlay instead of the built one.

What it serves

Once it listens, the inspector serves these addresses on one local port:

AddressWhat it answers
/json, /json/listThe DevTools discovery documents.
/json/versionThe version document for the protocol.
/devtools/page/<id>The target socket DevTools attaches to.
/ingestThe socket a browser client connects to.

A browser client joins as a source over the ingest socket, keeps its buffered observations across reconnects, and sends them in bounded frames and queues.

What you can inspect

Defaults you can change

These are the inspector's fields, with their defaults. Set a field in the inspector's entry in your overlay when a default does not fit the run:

FieldDefaultMeaning
host127.0.0.1The bind address; only a loopback address is accepted.
port9230The first port tried; a busy port steps up to the next free one, and 0 asks the operating system to assign one.
clientOriginsemptyExtra browser origins accepted by the ingest endpoint, given exactly; loopback origins are always accepted.
captureFetchonRecord the host's fetch calls after the inspector starts.
maxRequestBodyBytes8 MiBThe request-body prefix kept for each request.
maxResponseBodyBytes32 MiBThe response-body prefix kept for each request.
maxBodyChunkBytes48 KiBRaw bytes carried in one body record.
maxJournalBytes256 MiBTotal body bytes the inspector keeps.
maxRetainedRequests2000Active and completed requests kept.
maxSourceFrameBytes128 KiBThe largest encoded source frame.
startupTimeoutMs10 sHow long the start waits for the inspector to be ready.
stopTimeoutMs5 sThe window for a graceful shutdown before it is ended.
clientReconnectBaseMs250 msThe starting client reconnect backoff.
clientReconnectMaxMs5 sThe largest client reconnect backoff.
clientRuntimeTimeoutMs30 sDeadline for one runtime or sources command sent to a client.
queryTimeoutMs10 sDeadline for one non-DevTools query.

Keep it safe

Messages you may see

Limits worth knowing

Questions, answered

Why can I not set breakpoints in a browser client?

Client debugging is not supported. A client offers console entries, evaluation and read-only sources; breakpoint, step and call-frame requests are refused, and pause and resume control the host only.

Which requests does the Network panel miss?

The capture covers the host's fetch calls only. Direct low-level HTTP client calls and fetch references the app kept before the inspector started are not observed, and a client page's own requests are not captured.

What port does the inspector use?

9230 by default. A busy port steps up to the next free one, and 0 asks the operating system to assign one; set port in the overlay to start somewhere else.

Do captures contain credentials?

Yes. Fetch capture records headers, bodies and query values without redaction, so credentials, cookies and payloads can appear. Treat captures as sensitive and keep the inspector on this computer.

Is it safe to leave the inspector running?

Treat it as full access to the app while it runs: anything attached can run code in the host and its clients, the DevTools socket has no token, and loopback binding is its only access control. Stop the run when you are done.

Can I read the tree without a DevTools session?

Yes. The tree read needs no session and no other domain enabled, so it can come from a script or a plugin as well as from the DevTools window.

What happens to a client when it disconnects?

Its console context and live object handles are destroyed at once, and its tree stays as the last snapshot until it reconnects and sends a new one. The inspector keeps up to eight disconnected trees.

Why is a captured body truncated?

The body limits keep a prefix of each request and response and mark the rest truncated. Raise maxRequestBodyBytes or maxResponseBodyBytes in the overlay if you need more.

Does the inspector change what the model sees?

No. It observes runtime activity without changing model requests.