// 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) {}