export type MessageRole = "user" | "assistant" | "system"; export type MessageSegmentType = | "text" | "tool-invocation" | "tool-result" | "reasoning"; export type ToolStatus = "pending" | "running" | "completed" | "error"; export type StreamingStatus = "idle" | "thinking" | "streaming" | "completing"; export interface MessageSegment { readonly id: string; readonly type: MessageSegmentType; readonly content: string; readonly toolName?: string; readonly toolArgs?: Record; readonly toolStatus?: ToolStatus; readonly toolOutput?: string; readonly toolResult?: string; readonly toolError?: string; readonly startTime?: number; readonly endTime?: number; readonly consoleOutput?: string[]; readonly expanded?: boolean; readonly streaming?: boolean; } export interface ChatMessage { readonly id: string; readonly role: MessageRole; readonly content: string; readonly timestamp: number; readonly streaming?: boolean; readonly reasoning?: string; readonly showReasoning?: boolean; readonly segments?: ReadonlyArray; } export interface ChatState { readonly messages: ReadonlyArray; readonly connected: boolean; readonly processing: boolean; readonly error: string | null; readonly streamingContent: string; readonly streamingStatus: StreamingStatus; readonly thinkingStartTime: number | null; } export function createMessage( role: MessageRole, content: string, id?: string, ): ChatMessage { return { id: id || `${role}_${Date.now()}`, role, content, timestamp: Date.now(), streaming: false, }; } export function createSegment( type: MessageSegmentType, content: string = "", id?: string, ): MessageSegment { return { id: id || `seg_${Date.now()}`, type, content, streaming: type === "text", startTime: Date.now(), }; } export function createInitialChatState(): ChatState { return { messages: [], connected: false, processing: false, error: null, streamingContent: "", streamingStatus: "idle", thinkingStartTime: null, }; }