chat.ts (2372B)
1 export interface AttachmentInfo { 2 id: string; 3 filename: string; 4 content_type: string; 5 size_bytes?: number; 6 created_at: number; 7 } 8 9 export interface ToolCall { 10 id: string; 11 name: string; 12 args: string; 13 result: string | null; 14 status: "pending" | "running" | "complete" | "error"; 15 } 16 17 export interface Message { 18 id: string; 19 role: "user" | "assistant" | "system"; 20 content: string; 21 toolCalls: ToolCall[]; 22 timestamp: number; 23 model?: string; 24 forkId?: string; 25 originalContent?: string; 26 attachments?: AttachmentInfo[]; 27 } 28 29 interface ChatState { 30 messages: Message[]; 31 streaming: boolean; 32 thinkingSessionId: string | null; 33 addMessage: (message: Message) => void; 34 updateMessageContent: (id: string, content: string) => void; 35 addToolCall: (messageId: string, toolCall: ToolCall) => void; 36 updateToolCall: ( 37 messageId: string, 38 toolCallId: string, 39 update: Partial<ToolCall>, 40 ) => void; 41 setStreaming: (streaming: boolean) => void; 42 setThinkingSessionId: (sessionId: string | null) => void; 43 clearMessages: () => void; 44 setMessages: (messages: Message[]) => void; 45 } 46 47 import { create } from "zustand"; 48 49 export const useChatStore = create<ChatState>((set) => ({ 50 messages: [], 51 streaming: false, 52 thinkingSessionId: null, 53 54 addMessage: (message) => 55 set((state) => ({ messages: [...state.messages, message] })), 56 57 updateMessageContent: (id, content) => 58 set((state) => ({ 59 messages: state.messages.map((m) => 60 m.id === id ? { ...m, content } : m, 61 ), 62 })), 63 64 addToolCall: (messageId, toolCall) => 65 set((state) => ({ 66 messages: state.messages.map((m) => 67 m.id === messageId 68 ? { ...m, toolCalls: [...m.toolCalls, toolCall] } 69 : m, 70 ), 71 })), 72 73 updateToolCall: (messageId, toolCallId, update) => 74 set((state) => ({ 75 messages: state.messages.map((m) => 76 m.id === messageId 77 ? { 78 ...m, 79 toolCalls: m.toolCalls.map((tc) => 80 tc.id === toolCallId ? { ...tc, ...update } : tc, 81 ), 82 } 83 : m, 84 ), 85 })), 86 87 setStreaming: (streaming) => set({ streaming }), 88 setThinkingSessionId: (sessionId) => set({ thinkingSessionId: sessionId }), 89 90 clearMessages: () => set({ messages: [], thinkingSessionId: null }), 91 92 setMessages: (messages) => set({ messages }), 93 }));