feat(gui): add optional tkinter and Qt6 desktop dashboards

Add two optional windowed frontends over the same local state the TUI and
web console read: `enodia-sentinel gui` (stdlib tkinter) and
`enodia-sentinel gui-qt` (PySide6, new `[qt]` extra).

Both share `gui/model.py`, a GUI-free presentation model over
`tui.collect_model`, so every formatter is unit-testable without a display
server. Only `app.py` and `qt_app.py` import GUI libraries, enforced by
import-guard tests mirroring the tray applet's boundary.

Tabs cover status, alerts, incidents, posture, integrity, response plans,
and the event tail, plus daemon-control buttons via systemctl. Response
plans are display-only; the GUIs never execute containment commands. Core
runtime dependencies stay empty.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JX86xeoBJVBb16qHkDf53K
This commit is contained in:
Luna 2026-07-22 04:33:49 -07:00
parent 9e3575461b
commit 457c7604ba
No known key found for this signature in database
15 changed files with 1270 additions and 0 deletions

View file

@ -289,6 +289,42 @@ enodia-sentinel completion bash > ~/.local/share/bash-completion/completions/eno
enodia-sentinel completion zsh > ~/.zfunc/_enodia-sentinel
```
### Desktop GUI (optional)
A windowed desktop dashboard is available using only the stdlib `tkinter`
module (your distro may package it separately, e.g. `python-tk` or
`python-tkinter`). It is an optional frontend — the daemon and core agent
remain stdlib-only.
```bash
enodia-sentinel gui
# or, when installed from pyproject metadata:
enodia-sentinel-gui
```
The GUI reuses the same local state as the TUI and web console and adds
daemon-control buttons: start, stop, restart, quick check, open dashboard, and
periodic refresh. Tabs cover status, alerts, incidents, posture findings,
integrity/watchdog state, dry-run response plans, and the event tail. Response
plans are read-only; the GUI never executes containment commands.
### Qt desktop GUI (optional)
A richer Qt6 desktop dashboard is available with the `[qt]` optional extra
(`PySide6`). It reuses the same data model as the tkinter GUI but adds a
modern native look, resizable table columns, a response-plan detail pane, and
threaded background refresh.
```bash
pip install 'enodia-sentinel[qt]'
enodia-sentinel gui-qt
# or:
enodia-sentinel-gui-qt
```
Like the tray applet and tkinter GUI, this is an optional frontend and does
not change the core agent's zero-dependency design.
### Desktop tray (optional)
A lightweight system-tray applet is available for desktop installs. It is an