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 }),
}));