/ app / src / hooks / useAgents.ts
useAgents.ts
  1  import { useState, useEffect, useCallback } from 'react';
  2  import { AgentService } from '../services/agents';
  3  import type { AgentInfo, SpecializedAgent, AgentStatus } from '../types/agents';
  4  
  5  /**
  6   * Hook for managing agent list
  7   */
  8  export function useAgents() {
  9    const [agents, setAgents] = useState<AgentInfo[]>([]);
 10    const [loading, setLoading] = useState(true);
 11    const [error, setError] = useState<string | null>(null);
 12  
 13    const loadAgents = useCallback(async () => {
 14      try {
 15        setLoading(true);
 16        setError(null);
 17        const agentList = await AgentService.listAgents();
 18        setAgents(agentList);
 19      } catch (err) {
 20        setError(err instanceof Error ? err.message : 'Failed to load agents');
 21      } finally {
 22        setLoading(false);
 23      }
 24    }, []);
 25  
 26    useEffect(() => {
 27      loadAgents();
 28    }, [loadAgents]);
 29  
 30    return { agents, loading, error, reload: loadAgents };
 31  }
 32  
 33  /**
 34   * Hook for managing a specific agent
 35   */
 36  export function useAgent(agentName: string | null) {
 37    const [agent, setAgent] = useState<SpecializedAgent | null>(null);
 38    const [loading, setLoading] = useState(false);
 39    const [error, setError] = useState<string | null>(null);
 40  
 41    const loadAgent = useCallback(async () => {
 42      if (!agentName) {
 43        setAgent(null);
 44        return;
 45      }
 46  
 47      try {
 48        setLoading(true);
 49        setError(null);
 50        const agentDetails = await AgentService.getAgentDetails(agentName);
 51        setAgent(agentDetails);
 52      } catch (err) {
 53        setError(err instanceof Error ? err.message : 'Failed to load agent');
 54      } finally {
 55        setLoading(false);
 56      }
 57    }, [agentName]);
 58  
 59    useEffect(() => {
 60      loadAgent();
 61    }, [loadAgent]);
 62  
 63    return { agent, loading, error, reload: loadAgent };
 64  }
 65  
 66  /**
 67   * Hook for invoking agents
 68   */
 69  export function useAgentInvocation() {
 70    const [loading, setLoading] = useState(false);
 71    const [error, setError] = useState<string | null>(null);
 72    const [result, setResult] = useState<string | null>(null);
 73  
 74    const invoke = useCallback(async (agentName: string, task: string) => {
 75      try {
 76        setLoading(true);
 77        setError(null);
 78        const response = await AgentService.invokeAgent(agentName, task);
 79        setResult(response);
 80        return response;
 81      } catch (err) {
 82        const errorMsg = err instanceof Error ? err.message : 'Failed to invoke agent';
 83        setError(errorMsg);
 84        throw err;
 85      } finally {
 86        setLoading(false);
 87      }
 88    }, []);
 89  
 90    return { invoke, loading, error, result };
 91  }
 92  
 93  /**
 94   * Hook for agent status
 95   */
 96  export function useAgentStatus(agentName: string | null) {
 97    const [status, setStatus] = useState<AgentStatus | null>(null);
 98    const [loading, setLoading] = useState(false);
 99    const [error, setError] = useState<string | null>(null);
100  
101    const loadStatus = useCallback(async () => {
102      if (!agentName) {
103        setStatus(null);
104        return;
105      }
106  
107      try {
108        setLoading(true);
109        setError(null);
110        const agentStatus = await AgentService.getAgentStatus(agentName);
111        setStatus(agentStatus);
112      } catch (err) {
113        setError(err instanceof Error ? err.message : 'Failed to load agent status');
114      } finally {
115        setLoading(false);
116      }
117    }, [agentName]);
118  
119    useEffect(() => {
120      loadStatus();
121    }, [loadStatus]);
122  
123    return { status, loading, error, reload: loadStatus };
124  }
125  
126  /**
127   * Hook for orchestrating tasks across multiple agents
128   */
129  export function useOrchestration() {
130    const [loading, setLoading] = useState(false);
131    const [error, setError] = useState<string | null>(null);
132    const [result, setResult] = useState<string | null>(null);
133  
134    const orchestrate = useCallback(async (task: string, agents: string[]) => {
135      try {
136        setLoading(true);
137        setError(null);
138        const response = await AgentService.orchestrateTask(task, agents);
139        setResult(response);
140        return response;
141      } catch (err) {
142        const errorMsg = err instanceof Error ? err.message : 'Failed to orchestrate task';
143        setError(errorMsg);
144        throw err;
145      } finally {
146        setLoading(false);
147      }
148    }, []);
149  
150    return { orchestrate, loading, error, result };
151  }