import type { FetchAgentHistoryEntry, FetchAgentsEntry } from "@server/client/daemon-client"; import { type Agent, useSessionStore } from "@/stores/session-store"; import { derivePendingPermissionKey, normalizeAgentSnapshot } from "@/utils/agent-snapshots"; import { resolveProjectPlacement } from "@/utils/project-placement"; type AgentDirectoryFetchEntry = FetchAgentsEntry | FetchAgentHistoryEntry; interface PendingPermissionEntry { key: string; agentId: string; request: Agent["pendingPermissions"][number]; } export function buildAgentDirectoryState(input: { serverId: string; entries: AgentDirectoryFetchEntry[]; }): { agents: Map; pendingPermissions: Map; } { const agents = new Map(); const pendingPermissions = new Map(); for (const entry of input.entries) { const normalized = normalizeAgentSnapshot(entry.agent, input.serverId); const projectPlacement = resolveProjectPlacement({ projectPlacement: entry.project, cwd: normalized.cwd, }); const agent: Agent = { ...normalized, projectPlacement, }; agents.set(agent.id, agent); for (const request of agent.pendingPermissions) { const key = derivePendingPermissionKey(agent.id, request); pendingPermissions.set(key, { key, agentId: agent.id, request }); } } return { agents, pendingPermissions }; } export function replaceFetchedAgentDirectory(input: { serverId: string; entries: FetchAgentsEntry[]; }): { agents: Map } { const { agents: fetchedAgents, pendingPermissions } = buildAgentDirectoryState(input); const store = useSessionStore.getState(); store.setAgents(input.serverId, fetchedAgents); store.setAgentDetails(input.serverId, (prev) => { let next: Map | null = null; for (const agentId of fetchedAgents.keys()) { if (!prev.has(agentId)) { continue; } next ??= new Map(prev); next.delete(agentId); } return next ?? prev; }); const lastActivityByAgentId = new Map(); for (const agent of fetchedAgents.values()) { lastActivityByAgentId.set(agent.id, agent.lastActivityAt); } store.setAgentLastActivityBatch(lastActivityByAgentId); store.setPendingPermissions(input.serverId, new Map(pendingPermissions)); store.setInitializingAgents(input.serverId, new Map()); store.setHasHydratedAgents(input.serverId, true); return { agents: fetchedAgents }; }