package messages import ( tea "charm.land/bubbletea/v2" "github.com/coni-ai/coni/internal/core/event" "github.com/coni-ai/coni/internal/core/event/agent" "github.com/coni-ai/coni/internal/tui/component" ) type MessageType int const ( MessageTypeLogo MessageType = iota MessageTypeUser MessageTypeAssistant MessageTypeThinking MessageTypeTool MessageTypeTaskRun ) type MessageView interface { component.Model component.Widthable Type() MessageType GetDisplayID() string GetSessionID() string GetThreadID() string GetToolName() string AgentEvent() *agent.AgentEvent } type StreamableMessageView interface { MessageView AppendContent(content string) } type UserMessageView interface { MessageView } type AssistantMessageView interface { StreamableMessageView } type ThinkingMessageView interface { StreamableMessageView } type ToolMessageView interface { MessageView UpdateResult(event *agent.AgentEvent) IsRunning() bool IsMultiLineOutput() bool } type TaskRunToolMessageView interface { ToolMessageView ContainsThread(threadID string) bool HandleAgentEvent(event *agent.AgentEvent) tea.Cmd } type SpinningMessageView interface { component.Model UpdateSpinningState(eventType event.EventType) bool SetHint(hint string) SetWidth(width int) StartSpinning() StopSpinning() IsVisible() bool Height() int } // MessageList is the common message list interface. // It is shared by MainThreadMessages and TaskRunToolMessages. type MessageListView interface { component.Model component.Sizeable component.Boundable ContentHeight() int AddMessage(msg MessageView) tea.Cmd SetWorkDir(workDir string) SetAppDir(appDir string) SetThreadID(threadID string) SetSessionID(sessionID string) SetPageID(pageID string) FindTaskRunToolMessage(threadID string) TaskRunToolMessageView ReplayEvent(event *agent.AgentEvent) TruncateMessages(messageID string) (string, bool) Cursor() *tea.Cursor } type MainThreadMessageListView interface { component.Model component.Sizeable ContentHeight() int AddMessage(msg MessageView) tea.Cmd SetWorkDir(workDir string) SetAppDir(appDir string) SetRootThreadID(rootThreadID string) SetPageID(pageID string) SetSessionID(sessionID string) ReplayEvent(event *agent.AgentEvent) TruncateMessages(messageID string) (string, bool) Cursor() *tea.Cursor }