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
7 lines
306 B
Python
7 lines
306 B
Python
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
"""Optional desktop GUI (tkinter) for Enodia Sentinel.
|
|
|
|
Follows the tray-applet boundary rules: ``model.py`` holds all testable,
|
|
GUI-free logic; only ``app.py`` may import ``tkinter``. The core agent stays
|
|
stdlib-only and fully usable without this frontend.
|
|
"""
|