import type { StateCreator } from "zustand"; import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import { createSelectors } from "./helpers"; import type { ActiveTool } from "../hooks/useTools"; import type { AgentLifecycle } from "../services/agent/agent-run-model"; import type AutonomousAgent from "../services/agent/autonomous-agent"; interface AgentSlice { agent: AutonomousAgent | null; lifecycle: AgentLifecycle; setLifecycle: (AgentLifecycle) => void; summarized: boolean; setSummarized: (boolean) => void; isAgentThinking: boolean; setIsAgentThinking: (isThinking: boolean) => void; setAgent: (newAgent: AutonomousAgent | null) => void; } const initialAgentState = { agent: null, lifecycle: "offline" as const, summarized: false, isAgentThinking: false, isAgentPaused: undefined, }; interface ToolsSlice { tools: Omit[]; setTools: (tools: ActiveTool[]) => void; } const resetters: (() => void)[] = []; const createAgentSlice: StateCreator = (set, get) => { resetters.push(() => set(initialAgentState)); return { ...initialAgentState, setLifecycle: (lifecycle: AgentLifecycle) => { set(() => ({ lifecycle: lifecycle, })); }, setSummarized: (summarized: boolean) => { set(() => ({ summarized: summarized, })); }, setIsAgentThinking: (isThinking: boolean) => { set(() => ({ isAgentThinking: isThinking, })); }, setAgent: (newAgent) => { set(() => ({ agent: newAgent, })); if (get().agent === null) { resetters.forEach((resetter) => resetter()); } }, }; }; const createToolsSlice: StateCreator = (set) => { return { tools: [], setTools: (tools) => { set(() => ({ tools: tools, })); }, }; }; export const useAgentStore = createSelectors( create()( persist( (...a) => ({ ...createAgentSlice(...a), ...createToolsSlice(...a), }), { name: "agent-storage-v2", storage: createJSONStorage(() => localStorage), partialize: (state) => ({ tools: state.tools, }), } ) ) ); export const resetAllAgentSlices = () => resetters.forEach((resetter) => resetter());