- ui.Session (UserID/Address/Title/BoundTask) + фабрики NewFreeSession/NewTaskSession и префикс ui://sess-* - свободная вкладка без задачи: свой UserID, диалог с LLM в памяти (agent=chat, resume по sessionID) - /start в свободной вкладке создаёт задачу с ChatID == UserID вкладки -> вкладка становится task-сессией - desktop окно: container.AppTabs с вкладками, кнопка «Новый чат», маршрутизация Send/Ask/истории по Address вкладки - app.FreeChat: in-memory связка uid -> opencode sessionID; роутинг свободного чата в handleIncoming - агент chat.md + регистрация 'chat' в agents.Names - тесты: session_test.go (фабрики/хелперы)
41 lines
1.7 KiB
Go
41 lines
1.7 KiB
Go
// Package agents — встроенные агенты opencode (analyst, dev, ...).
|
||
//
|
||
// Агенты зашиты в бинарь через go:embed и распаковываются при запуске
|
||
// в каталог OPENCODE_CONFIG_DIR (по умолчанию ./agents рядом с бинарём),
|
||
// чтобы opencode находил их независимо от того, где запущен ratatoskr.
|
||
//
|
||
// opencode сканирует OPENCODE_CONFIG_DIR как каталог .opencode: агенты
|
||
// ищутся в поддиректории agents/ (мн.ч.), а не в корне. Поэтому распаковка
|
||
// идёт в <dir>/agents/*.md.
|
||
package agents
|
||
|
||
import (
|
||
"embed"
|
||
"path/filepath"
|
||
)
|
||
|
||
//go:embed *.md
|
||
var FS embed.FS
|
||
|
||
// Names — имена распаковываемых агентов (файлы *.md, без .md).
|
||
//
|
||
// Держим в курсе: если добавить файл в каталог, он автоматически попадёт
|
||
// в FS, но для детерминированной распаковки список лучше дополнять здесь.
|
||
var Names = []string{"analyst", "dev", "reviewer", "chat"}
|
||
|
||
// WriteTo распаковывает всех встроенных агентов в каталог dir/agents
|
||
// (создаёт его). Файлы перезаписываются — встроенная копия всегда актуальна.
|
||
func WriteTo(dir string) error {
|
||
agentsDir := filepath.Join(dir, "agents")
|
||
for _, name := range Names {
|
||
data, err := FS.ReadFile(name + ".md")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if err := writeFile(agentsDir, name+".md", data); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|