Спеца 12.8-12.9: интерфейс + Nil в internal/ui/log_panel.go, Fyne-реализация
в internal/ui/desktop/log_panel.go, окно использует контракт вместо logsLbl.
Команды (спец 12.2):
- ui.Commands: действия UI → текстовые команды канала (start/cancel/skip/
retry/continue/approve/send), единый путь через chat.Channel.
- ui.Window = chat.Channel + View; NilWindow для headless/тестов.
Snapshots (спец 12.5):
- ui.Store: чтение-модель, возвращает только копии (ListTasks/GetTask/
GetHistory/GetTraces); ui.DBStore поверх storage.
Fyne-окно (internal/ui/desktop, build-tag cgo):
- список задач слева, сплиты рабочей области и панели «Логи»/«Состояние»,
ввод+кнопки команд, тёмная тема, fullscreen, сохранение layout в
Preferences, сворачивание при закрытии крестиком.
- Колбэки View через fyne.Do (спец 12.4).
Интеграция:
- app.New(..., noUI); флаг --noui; UI собирается только с cgo (ui_cgo/
ui_noui фабрики), приложение headless без него.
- Run: окно блокирует главную горутину; «Завершить» → cancel → graceful
shutdown (спец 12.6).
- go.mod: fyne.io/fyne/v2 v2.6.0 (direct).
- internal/model: единый источник статусов задачи (Status, TraceStatus,
машина переходов), без зависимости от storage.
- internal/storage: совместимый мост (type Status = model.Status,
re-export констант) — внешний код не меняется.
- internal/events: шина событий (fan-out, блокирующий Publish с гарантией
порядка), события задач/трейсов, отдельная логовая шина + LogWriter,
Publisher/NilPublisher для внедрения в Core/Worker.
- docs/ui-spec.md: спецификация десктопного UI (Fyne).