dia-gov's picture
Upload 569 files
cd6f98e verified
raw
history blame
2.38 kB
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<ActiveTool, "active">[];
setTools: (tools: ActiveTool[]) => void;
}
const resetters: (() => void)[] = [];
const createAgentSlice: StateCreator<AgentSlice> = (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<ToolsSlice> = (set) => {
return {
tools: [],
setTools: (tools) => {
set(() => ({
tools: tools,
}));
},
};
};
export const useAgentStore = createSelectors(
create<AgentSlice & ToolsSlice>()(
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());