Команды (спец 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).
41 lines
2.1 KiB
Go
41 lines
2.1 KiB
Go
// Package ui — контроллер и представления десктопного интерфейса (Fyne).
|
||
//
|
||
// Слой обмена с ядром: однонаправленный поток (спец 12.2–12.5).
|
||
// - Core мутирует состояние; UI только читает снимки и реагирует на события.
|
||
// - Действия UI = команды (CreateTask/ApproveTask/...), которые зовут Core.
|
||
// - Подписчик шины (Controller) получает события и перекладывает их в View
|
||
// (реализация Fyne) через fyne.Do — никаких прямых вызовов Fyne из core.
|
||
package ui
|
||
|
||
import (
|
||
"github.com/kamelion/ratatoskr-go/internal/events"
|
||
)
|
||
|
||
// View — интерфейс, который реализует Fyne-слой окна.
|
||
//
|
||
// Методы вызываются из горутины Controller (горутина Hub-подписчика), поэтому
|
||
// реализация обязана перекладывать работу на поток Fyne через fyne.Do /
|
||
// fyne.DoAndWait, либо использовать thread-safe структуры (binding).
|
||
type View interface {
|
||
OnTaskCreated(e events.TaskCreated)
|
||
OnTaskUpdated(e events.TaskUpdated)
|
||
OnTaskDeleted(e events.TaskDeleted)
|
||
OnTaskStatusChanged(e events.TaskStatusChanged)
|
||
OnHistoryAppended(e events.HistoryAppended)
|
||
OnTraceAppended(e events.TraceAppended)
|
||
OnAgentActivity(e events.AgentActivity)
|
||
OnLog(e events.LogLine)
|
||
}
|
||
|
||
// NilView — no-op реализация View для headless-режима и тестов.
|
||
type NilView struct{}
|
||
|
||
func (NilView) OnTaskCreated(events.TaskCreated) {}
|
||
func (NilView) OnTaskUpdated(events.TaskUpdated) {}
|
||
func (NilView) OnTaskDeleted(events.TaskDeleted) {}
|
||
func (NilView) OnTaskStatusChanged(events.TaskStatusChanged) {}
|
||
func (NilView) OnHistoryAppended(events.HistoryAppended) {}
|
||
func (NilView) OnTraceAppended(events.TraceAppended) {}
|
||
func (NilView) OnAgentActivity(events.AgentActivity) {}
|
||
func (NilView) OnLog(events.LogLine) {}
|