package ui // ChatPanel — панель «Диалог» (спец 12.12): транскрипт диалога выбранной // задачи + композитор (поле ввода и кнопки команд). // // Транскрипт — буфер ограниченного размера; при превышении лимита старые // строки отбрасываются. Композитор подключается к ui.Commands через // SetCommands. Обновление — на потоке Fyne; вызывающий уже внутри fyne.Do. type ChatPanel interface { // SetTranscript заменяет содержимое диалога полным рендером. SetTranscript(text string) // Append добавляет строку в диалог (буфер ограничен). Append(text string) // Clear очищает диалог (задача недоступна/не выбрана). Clear() // SetCommands подключает команды к композитору (ввод + кнопки). SetCommands(c *Commands) } // NilChatPanel — no-op реализация ChatPanel для headless-режима и тестов. type NilChatPanel struct{} // NewNilChatPanel создаёт NilChatPanel. func NewNilChatPanel() *NilChatPanel { return &NilChatPanel{} } func (NilChatPanel) SetTranscript(string) {} func (NilChatPanel) Append(string) {} func (NilChatPanel) Clear() {} func (NilChatPanel) SetCommands(*Commands) {} // FormatRole — строка роли в диалоге (pure-функция, спец 12.12). func FormatRole(role string) string { switch role { case "user": return "👤 " default: return "🤖 " } }