feat(ui): команды, snapshots, Fyne-окно и интеграция (--noui)
Команды (спец 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).
This commit is contained in:
46
internal/ui/commands.go
Normal file
46
internal/ui/commands.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package ui
|
||||
|
||||
import "fmt"
|
||||
|
||||
// Commands — отображение действий UI в текстовые команды канала.
|
||||
//
|
||||
// UI — это chat.Channel, поэтому все действия пользователя (кнопки, ввод)
|
||||
// превращаются в текстовые сообщения, которые уходят в Router → Core. Это
|
||||
// сохраняет единый путь команд (спец 12.2): никаких прямых вызовов Core из
|
||||
// виджетов — только текст через канал.
|
||||
type Commands struct {
|
||||
// Submit отправляет текст пользователя в канал (обычно — window.Submit).
|
||||
Submit func(text string)
|
||||
}
|
||||
|
||||
// NewCommands создаёт Commands с отправкой через fn.
|
||||
func NewCommands(fn func(text string)) *Commands {
|
||||
if fn == nil {
|
||||
fn = func(string) {}
|
||||
}
|
||||
return &Commands{Submit: fn}
|
||||
}
|
||||
|
||||
// Start — новая задача (/start).
|
||||
func (c *Commands) Start() { c.Submit("/start") }
|
||||
|
||||
// Cancel — отмена текущей задачи (/cancel).
|
||||
func (c *Commands) Cancel() { c.Submit("/cancel") }
|
||||
|
||||
// Skip — пропустить сбор, сформировать черновик (/skip).
|
||||
func (c *Commands) Skip() { c.Submit("/skip") }
|
||||
|
||||
// Retry — перезапустить задачу N (/retry N).
|
||||
func (c *Commands) Retry(id int64) { c.Submit(fmt.Sprintf("/retry %d", id)) }
|
||||
|
||||
// Status — запросить статус задачи N (/status N).
|
||||
func (c *Commands) Status(id int64) { c.Submit(fmt.Sprintf("/status %d", id)) }
|
||||
|
||||
// Continue — продолжить задачу N (/continue N).
|
||||
func (c *Commands) Continue(id int64) { c.Submit(fmt.Sprintf("/continue %d", id)) }
|
||||
|
||||
// Approve — одобрить черновик («создавай»).
|
||||
func (c *Commands) Approve() { c.Submit("создавай") }
|
||||
|
||||
// SendText — обычное сообщение пользователя (ввод в поле).
|
||||
func (c *Commands) SendText(text string) { c.Submit(text) }
|
||||
Reference in New Issue
Block a user