feat(ui): каждая вкладка chat — независимая LLM-сессия
Some checks failed
CI / test (pull_request) Failing after 1m20s
CI / build-and-package (amd64, linux) (pull_request) Failing after 1m2s
CI / build-and-package (amd64, windows) (pull_request) Successful in 36s

- 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 (фабрики/хелперы)
This commit is contained in:
ki.sagidullin
2026-08-21 10:33:05 +05:00
parent de21ec9f31
commit 9420b276e9
6 changed files with 356 additions and 64 deletions

View File

@@ -21,7 +21,7 @@ var FS embed.FS
//
// Держим в курсе: если добавить файл в каталог, он автоматически попадёт
// в FS, но для детерминированной распаковки список лучше дополнять здесь.
var Names = []string{"analyst", "dev", "reviewer"}
var Names = []string{"analyst", "dev", "reviewer", "chat"}
// WriteTo распаковывает всех встроенных агентов в каталог dir/agents
// (создаёт его). Файлы перезаписываются — встроенная копия всегда актуальна.
@@ -37,4 +37,4 @@ func WriteTo(dir string) error {
}
}
return nil
}
}

17
internal/agents/chat.md Normal file
View File

@@ -0,0 +1,17 @@
---
name: chat
description: Свободный чат с Ratatoskr — прямой диалог с LLM без задачи и JSON-вердиктов
mode: primary
---
Ты — полезный ассистент в диалоговом режиме. Пользователь пишет тебе произвольные
сообщения; отвечай на них прямо и по делу, на русском языке, естественно.
Особенности:
1. Отвечай на вопросы пользователя, помогай с задачами разработки, поясняй код.
2. Не оборачивай ответ в JSON и не возвращай структурированные вердикты — это
свободный диалог, не конвейер задач Ratatoskr.
3. Если тебе не хватает контекста — задай уточняющий вопрос в обычном тексте.
4. Пиши кратко и по существу, если пользователь не просит развёрнуто.
Просто продолжай диалог.