Sidebar grouping, auto-refreshing connections and cursors, Roles in the nav
Summary: Sidebar grouping, auto-refreshing connections and cursors, Roles in the nav (v0.5.1b16).
The /connections and /cursors admin pages have always been live-data views — they read currentOp and render the connection / cursor list each time the page is requested — but they didn't refresh. The dashboard polls 1 Hz over a WebSocket; these two felt stale next to it. v0.5.1b16 extracts each table's tbody into an HTMX partial (partials/connections_rows.html, partials/cursors_rows.html) and lets the tbody itself swap every 5 s via hx-trigger="every 5s" hx-get="/connections/_rows". The page chrome and column headers stay fixed; only the rows refresh.
The /connections page also gains a (disabled) Actions column with a tooltip explaining that connection-kill is deferred until SecantusDB grows killOp — purely a layout-symmetry fix so the page mirrors the shape of /cursors, but the tooltip points the curious at the right backlog entry.
The sidebar gets two structural fixes. A Roles entry now lives directly under Users with a sub-nav indent (it was reachable only via the breadcrumb on /users, and roles.html was setting active="users" so the wrong sidebar item highlighted while you were on the page). A second visual separator above Change stream marks the boundary between per-target data pages (Server / Dashboard / Query / Insert / Databases / Users / Roles) and operational-state pages (Change stream / Connections / Cursors / Profiler / Maintenance / Logs / Backup), mirroring the existing separator below Server.
A separate fix: 15 *_via_mongosh cross-driver smoke tests are now grouped into a single xdist worker. Mongosh launches a full Node-based shell, and under heavy parallel load the PBKDF2 work inside SCRAM-SHA-256 auth could blow past mongosh's connect timeout. The Node and Java smoke tests already had per-toolchain groups for shared install state; mongosh has none of that, but the heavyweight-shell-under-CPU-contention pattern is the same. Tagged with @pytest.mark.xdist_group(name="mongosh_smokes") so they serialize.