diff --git a/cmd_chat/operator/web.py b/cmd_chat/operator/web.py index 98b9182..353374d 100644 --- a/cmd_chat/operator/web.py +++ b/cmd_chat/operator/web.py @@ -1,22 +1,24 @@ -"""Mobile web chat front-end for the operator bridge (`operator web`). +"""Mobile hack-house console for the operator bridge (`operator web`). -Turns a running operator daemon into a phone-friendly chat page. The daemon -already exposes the room as a local API over its AF_UNIX control socket -(`read` with long-poll, `say`, `roster`, `status`); this module is a thin, -**stdlib-only** HTTP shim in front of that socket so a browser can drive it: +A phone-friendly browser mirror of a live hack-house room. The daemon already +exposes the room as a local API over its AF_UNIX control socket; this module is +a thin, **stdlib-only** HTTP shim in front of it so a browser gets the same +things the Rust TUI shows — the shared sandbox terminal, chat, roster — mobile +optimised: - GET / the single-page chat UI (self-contained HTML/JS) - GET /api/events?since=N long-poll: proxies {"op":"read","wait":true} - POST /api/say {text} proxies {"op":"say"} - GET /api/status proxies {"op":"status"} (roster + connection) + GET / the single-page console (self-contained HTML/JS) + GET /api/status proxies {"op":"status"} (connection/roster/driver) + GET /api/events?since=N long-poll: proxies {"op":"read","wait":true} + POST /api/say {text} proxies {"op":"say"} + GET /api/screen?ansi=1 proxies {"op":"screen"} — the relayed shared PTY + POST /api/keys {tokens} proxies {"op":"keys"} — drive the shared PTY -Why this exists: on Termux the tmux `read --wait` loop is read-only — replying -means a second shell typing `operator say …`, which is painful on a touch -keyboard. A browser page gives a real input box, scrollback and live updates -with zero extra dependencies (no server stack, no JS build — just http.server). +Why this exists: on Termux the tmux `read --wait` loop is read-only and shows +none of the sandbox. A browser page gives the terminal view + a real input box ++ live updates with zero extra dependencies (no server stack, no JS build). -Binds 127.0.0.1 by default: the control socket grants room-send rights, so the -listener stays loopback-only unless you deliberately pass a routable --bind. +Binds 127.0.0.1 by default: the control socket grants room-send/drive rights, +so the listener stays loopback-only unless you pass a routable --bind. """ from __future__ import annotations @@ -41,130 +43,264 @@ _PAGE = """
no shared sandbox yet — a room member runs /sbx and /grants this operator to drive it here.
+