itop — the live monitor (ign top, alias ign itop)
htop for the gateway: one full-screen ratatui instrument over ONE
profile — header CPU/heap gauges with sparkline history, a
thread-state mix panel, a scriptExec diagnostics probe, and a
sortable, filterable process list of the gateway's live entities.
It is deliberately NOT a cockpit tab: htop is a single-view
instrument, and itop is the same actions layer composed for
watching, not operating.

(captured live against a dev gateway: 8.3.3, 35 modules, seeded
240-sample history, the honest Trial Expired scriptExec refusal in
the footer)
| What | Where |
|---|---|
| Header | CPU % and heap used/max gauge bars (threshold-colored), gateway identity, RUNNING state, uptime, disk fill, license incl. trial countdown |
| Threads | The execution-state mix as four bars — running / waiting / timed-waiting / blocked, share of the total; any blocked thread renders the error slot |
| History | CPU %, heap MiB, and non-heap MiB sparklines — 240-sample rings, SEEDED from the gateway's own performance history (systemPerformance/charts) so they open full, then continued from the sampled gauges |
| Table | One row per live entity: module (healthy list), designer / perspective / vision sessions, database / opc connections, tag provider — KIND/NAME/STATE/CPU/AGE/DETAIL columns, state-colored |
| Footer | Per-section errors verbatim (one failing endpoint degrades its section, never the screen), cadence/pause/staleness state, key hints |

The e probe runs one gateway-side Jython snapshot through the
deployed scriptExec route — JMX internals (thread pool mix, JVM memory
pools, class-loader counts) that NO REST endpoint exposes — and renders
the result document in a modal. A profile without the route refuses
inline (ign webdev deploy --with-script-exec first); a refused route
renders the gateway's own error verbatim, as above.
More views (click through): connections · filter applied · paused · keymap
The threads view (6) — Gateway-web-UI parity
6 enters the threads view AND fetches the live dump
(/data/api/v1/diagnostics/threads/dump/formatted + …/deadlocks,
fetched concurrently, each call degrading independently). One JVM
thread per row: NAME, verbatim java.lang.Thread STATE, CPU (the
dump's cpuUsage, threshold-colored) with the Thread ID folded in,
and the DETAIL column's monitor evidence — daemon / system / scope
markers, what the thread is waiting on, and what it holds. Threads the
JVM's own deadlock detection names carry the ⚠ in the STATE cell and
the banner in the table title.

Enter on a row opens the stack viewer: header facts, the holds/
waiting annotations, then the stack frames verbatim — scrollable
(j/k, pgup/pgdn), with the line position in the title.

The dump is ON-DEMAND, never on the sample cadence (a hundreds-of-
threads snapshot every 2 s would hammer the gateway; the web UI
fetches on click and so does itop). Re-pressing 6 re-dumps;
1 returns to the mixed view.
Keys (htop's gestures, ign's verbs):
q/Ctrl-C quit ·space/ppause sampling (the rings freeze; a manualrstill works) ·+/-sample interval 1–60 s (default 2 s — itop's own cadence, not the Dashboard'spoll_interval_secs)scycles the sort key (kind/name/state/age/cpu/detail),Sreverses ·/filters by substring across every rendered column (Esc clears) ·1–6switch the view (all / modules / sessions / connections / providers / threads) ·j/k/arrows move (pgup/pgdn page,g/Gjump) · in the threads view,6re-dumps and Enter opens the row's stack viewerx/F9 terminates the selected session (designer prune / perspective terminate / vision close) behind a Confirm modal —y≡--yes, Esc spawns nothing; non-session rows refuse honestly (modules and connections have no safe per-entity restart verb)
Behavior contract — the cockpit's, verbatim where it applies: a TTY is
required (piped stdout refuses exit 2 before alt-screen), a clean exit
prints NOTHING on stdout, resolution failures surface BEFORE the
terminal flips, themes apply ([ui].theme), and the profile is fixed
at launch — restart with --profile to retarget.