Команды (спец 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).
65 lines
2.3 KiB
Go
65 lines
2.3 KiB
Go
// Command ratatoskr — оркестратор конвейера Ratatoskr (единый бинарь).
|
||
//
|
||
// Запуск: ratatoskr [-config config.yaml]
|
||
// config.yaml ищется в CWD, по умолчанию — env/дефолты.
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"flag"
|
||
"fmt"
|
||
"log"
|
||
"os"
|
||
|
||
"github.com/kamelion/ratatoskr-go/internal/app"
|
||
)
|
||
|
||
// version — версия бинаря, вшивается при сборке:
|
||
// go build -ldflags "-X main.version=<commit-sha7>"
|
||
// Локальная сборка без ldflags оставляет "dev".
|
||
var version = "dev"
|
||
|
||
// updateToken — токен read:package для авто-обновления, вшивается при сборке:
|
||
// go build -ldflags "-X main.updateToken=<token>"
|
||
// Без ldflags — пустой; тогда используется update.token из конфига (если задан).
|
||
var updateToken = ""
|
||
|
||
func main() {
|
||
cfg := flag.String("config", "", "путь к config.yaml (по умолчанию — CWD/config.yaml)")
|
||
versionFlag := flag.Bool("version", false, "показать версию и выйти")
|
||
noUI := flag.Bool("noui", false, "работать без графического окна (headless)")
|
||
flag.Parse()
|
||
|
||
if *versionFlag {
|
||
fmt.Println("ratatoskr-go " + version)
|
||
return
|
||
}
|
||
|
||
a, err := app.New(*cfg, version, updateToken, *noUI)
|
||
if err != nil {
|
||
log.Fatalf("app init: %v", err)
|
||
}
|
||
defer func() {
|
||
if a.Store != nil {
|
||
a.Store.Close()
|
||
}
|
||
}()
|
||
|
||
// Применить отложенный свап обновления (из предыдущего /update на Windows
|
||
// или отложенной замены), если есть .new рядом с бинарём. До старта подсистем.
|
||
if a.Updater != nil {
|
||
if err := a.Updater.ApplyPendingSwap(); err != nil {
|
||
log.Printf("ratatoskr: apply-pending-swap: %v", err)
|
||
}
|
||
}
|
||
|
||
// Строка с номером версии при старте: семантическая версия (app.Version)
|
||
// + build-идентификатор (main.version, вшитый ldflag'ом) для диагностики.
|
||
log.Printf("ratatoskr: запущен (version %s, build %s)", app.Version, version)
|
||
if err := a.Run(context.Background()); err != nil {
|
||
log.Fatalf("app run: %v", err)
|
||
}
|
||
log.Print("ratatoskr: остановлен")
|
||
os.Exit(0)
|
||
}
|