Context
Issues #89, #120, #121, #122, #123, #124, #125 are all merged (see commits d7714b6, d924e75, 2bd772c, 8255bdd, 11f2b5d, f0c410a, 71e5be6, plus 49d18ca consolidation and 334c2e9 for #140 polish). The console works end-to-end:
- Real PTY on the host (Linux + macOS)
- ConPTY backend for Windows
nsenter host-exec for containerized agents on Linux
- SSH bridge fallback for restricted containers
- NDJSON session recording (opt-in)
- Per-box
console_enabled toggle (gate)
- Dashboard UI with multi-session tabs, drawer/dock/popout layouts, font slider, status dots
- WS TLS pinning, idle timeout, audit log
Closing the per-phase tickets in favor of this one consolidated issue tracking what's left.
Remaining items
A. Quality-of-life (small, ship together)
B. Recording playback UI
C. Container / future-Docker plumbing
D. Hardening / nice-to-haves
Branching plan
One PR per work cluster. Per repo convention (and per Dave's stated preference: "fewer, larger PRs over many small split PRs"), bundle by cluster, not by checkbox:
- Cluster 1: Quality-of-life (A) — bracketed paste + paste confirm + search-in-buffer + global shortcut + rename tab. One PR.
- Cluster 2: Recording playback (B) — one PR for browse + replay; retention can land separately or together depending on scope.
- Cluster 3: Container exec (C) — lands alongside the Docker gear work.
- Cluster 4: Hardening (D) — opportunistic; doc updates batched together, Windows runAs only on operator request.
Cluster 1 first.
Closing the supplanted issues
This issue supersedes:
- #89 (umbrella — code merged across the phase tickets)
- #120, #121, #122, #123, #124, #125 (phase 1b → 3 — all merged)
Those will be closed with a back-pointer to this issue.
🤖 Generated with Claude Code
Context
Issues #89, #120, #121, #122, #123, #124, #125 are all merged (see commits
d7714b6,d924e75,2bd772c,8255bdd,11f2b5d,f0c410a,71e5be6, plus49d18caconsolidation and334c2e9for #140 polish). The console works end-to-end:nsenterhost-exec for containerized agents on Linuxconsole_enabledtoggle (gate)Closing the per-phase tickets in favor of this one consolidated issue tracking what's left.
Remaining items
A. Quality-of-life (small, ship together)
term.attachCustomKeyEventHandler+term.onDatafilter.Ctrl-F/Cmd-F). Vendorxterm-addon-searchand wire to a small toolbar input. Replaces the browser's broken find-on-page behavior inside the terminal.Ctrl-Shift-`). Today the only paths are the bx-grid Tools icon and the command paletteConsole: <box>entries. A direct shortcut that defaults to the currentbox_idcookie would be faster for active operators.B. Recording playback UI
<dataDir>/console-sessions/*.ndjsonper agent, surfaced under a newConsolegear or a "Recordings" subpage of an existing gear.logrotate.C. Container / future-Docker plumbing
kind: 'container'descriptor — adding the route + URL builder is mostly straightforward once the Docker gear lands. Out-of-band: figure out the security model (which users can exec, audit logging, whether to requirePrivileged: falsecontainers, etc.).D. Hardening / nice-to-haves
HAPROXY_AGENT_CONSOLE_SHELLbut ignoresrunAs(the POSIXsyscall.Credential{Uid:...}path has no direct ConPTY analog). Implement viaSTARTUPINFOEX + LogonUserif any operator asks. (No demand today.)pwsh.exetoday; could detect WSL and offerwsl.exeas the default shell.Branching plan
One PR per work cluster. Per repo convention (and per Dave's stated preference: "fewer, larger PRs over many small split PRs"), bundle by cluster, not by checkbox:
Cluster 1 first.
Closing the supplanted issues
This issue supersedes:
Those will be closed with a back-pointer to this issue.
🤖 Generated with Claude Code