refactor(ui): вынести панель «Диалог» (ChatPanel) из монолита окна

Спеца 12.12: интерфейс + Nil + FormatRole в internal/ui/chat_panel.go,
Fyne-реализация в internal/ui/desktop/chat_panel.go (транскрипт + композитор).
Окно как chat.Channel рендерит Send/Ask/историю через Append; state_panel
не трогаем.
This commit is contained in:
ki.sagidullin
2026-08-20 23:48:54 +05:00
parent 4c44956d3e
commit 5c93642cf8
5 changed files with 180 additions and 50 deletions

View File

@@ -204,6 +204,22 @@
- Диалог и «Состояние» — отдельные панели (chat_panel, state_panel), здесь
не участвуют; окно оркестрирует загрузку всех панелей по выбору задачи.
### 12.12. Контракт виджета «Диалог» (ChatPanel)
Диалог — транскрипт общения с выбранной задачей + композитор (поле ввода и
кнопки команд).
- Транскрипт:
- `SetTranscript(text)` — полный рендер истории выбранной задачи;
- `Append(text)` — добавить строку; при превышении лимита старые строки
отбрасываются (буфер ограничен);
- `Clear()` — очистить при недоступной задаче.
- Композитор: поле ввода + кнопки команд, подключённые к `ui.Commands` через
`SetCommands(c)` (ввод → `SendText`, кнопки → Start/Approve/Skip/Cancel).
- Доставка: окно (как chat.Channel) рендерит `Send`/`Ask`/историю через
`Append`; строка роли = pure `FormatRole(role)` (👤/🤖).
- Обновление — на потоке Fyne; вызывающий уже внутри `fyne.Do`.
---
## Открытые пункты (TODO)