agent-ecosystem/src/renderer/components/team/useTeamAgentRuntimeWatcher.ts

59 lines
1.7 KiB
TypeScript

import { useEffect } from 'react';
import { useStore } from '@renderer/store';
import { isTeamProvisioningActive, selectTeamDataForName } from '@renderer/store/slices/teamSlice';
import { useShallow } from 'zustand/react/shallow';
const TEAM_AGENT_RUNTIME_REFRESH_MS = 5_000;
interface TeamAgentRuntimeWatcherOptions {
teamName: string;
enabled: boolean;
isTeamProvisioning?: boolean;
isTeamAlive?: boolean;
}
export function useTeamAgentRuntimeWatcher({
teamName,
enabled,
isTeamProvisioning,
isTeamAlive,
}: TeamAgentRuntimeWatcherOptions): void {
const { leadActivity, storeIsTeamAlive, storeIsTeamProvisioning, fetchTeamAgentRuntime } =
useStore(
useShallow((s) => ({
leadActivity: s.leadActivityByTeam[teamName],
storeIsTeamAlive: selectTeamDataForName(s, teamName)?.isAlive,
storeIsTeamProvisioning: isTeamProvisioningActive(s, teamName),
fetchTeamAgentRuntime: s.fetchTeamAgentRuntime,
}))
);
const effectiveIsTeamAlive = isTeamAlive ?? storeIsTeamAlive;
const effectiveIsTeamProvisioning = isTeamProvisioning ?? storeIsTeamProvisioning;
useEffect(() => {
if (!enabled) return;
const shouldWatch =
effectiveIsTeamProvisioning ||
effectiveIsTeamAlive === true ||
leadActivity === 'active' ||
leadActivity === 'idle';
if (!shouldWatch) return;
void fetchTeamAgentRuntime(teamName);
const timer = window.setInterval(() => {
void fetchTeamAgentRuntime(teamName);
}, TEAM_AGENT_RUNTIME_REFRESH_MS);
return () => {
window.clearInterval(timer);
};
}, [
effectiveIsTeamAlive,
effectiveIsTeamProvisioning,
enabled,
fetchTeamAgentRuntime,
leadActivity,
teamName,
]);
}