File size: 1,988 Bytes
c2c8c8d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import { create } from 'zustand';
import type { ChatMessage, AgentResult, Finding, AgentType } from '@glmpilot/shared';
interface AIState {
messages: ChatMessage[];
streamingMessage: string;
isStreaming: boolean;
agentResults: Partial<Record<AgentType, AgentResult>>;
agentRunning: Partial<Record<AgentType, boolean>>;
completionSuggestion: string | null;
addMessage: (message: ChatMessage) => void;
updateStreamingMessage: (content: string) => void;
finishStreaming: (finalContent: string) => void;
setAgentResult: (agent: AgentType, result: AgentResult) => void;
setAgentRunning: (agent: AgentType, running: boolean) => void;
setCompletionSuggestion: (suggestion: string | null) => void;
clearChat: () => void;
setIsStreaming: (streaming: boolean) => void;
}
export const useAIStore = create<AIState>((set) => ({
messages: [],
streamingMessage: '',
isStreaming: false,
agentResults: {},
agentRunning: {},
completionSuggestion: null,
addMessage: (message) =>
set((state) => ({ messages: [...state.messages, message] })),
updateStreamingMessage: (content) =>
set((state) => ({ streamingMessage: state.streamingMessage + content })),
finishStreaming: (finalContent) =>
set((state) => ({
messages: [...state.messages, {
id: `msg-${Date.now()}`,
role: 'assistant' as const,
content: finalContent,
timestamp: Date.now(),
}],
streamingMessage: '',
isStreaming: false,
})),
setAgentResult: (agent, result) =>
set((state) => ({
agentResults: { ...state.agentResults, [agent]: result },
})),
setAgentRunning: (agent, running) =>
set((state) => ({
agentRunning: { ...state.agentRunning, [agent]: running },
})),
setCompletionSuggestion: (suggestion) =>
set({ completionSuggestion: suggestion }),
clearChat: () => set({ messages: [], streamingMessage: '' }),
setIsStreaming: (streaming) => set({ isStreaming: streaming }),
}));
|