Spaces:
Sleeping
Sleeping
File size: 3,232 Bytes
0cfd364 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { apiClient } from '@/api/client';
import type { Episode, ResetRequest, StepRequest, Action } from '@/types';
export function useCurrentEpisode() {
return useQuery({
queryKey: ['episode', 'current'],
queryFn: () => apiClient.getCurrentEpisode(),
refetchInterval: 2000,
});
}
export function useEpisode(episodeId: string | undefined) {
return useQuery({
queryKey: ['episode', episodeId],
queryFn: () => (episodeId ? apiClient.getEpisode(episodeId) : null),
enabled: !!episodeId,
refetchInterval: 1000,
});
}
export function useResetEpisode() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (params: ResetRequest) => apiClient.resetEpisode(params),
onSuccess: (episode) => {
queryClient.setQueryData(['episode', 'current'], episode);
queryClient.setQueryData(['episode', episode.id], episode);
queryClient.invalidateQueries({ queryKey: ['episode'] });
},
});
}
export function useStepEpisode(episodeId: string | undefined) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (step: StepRequest) =>
episodeId
? apiClient.stepEpisode(episodeId, step)
: Promise.reject(new Error('No episode')),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['episode', episodeId] });
queryClient.invalidateQueries({ queryKey: ['episode', 'current'] });
},
});
}
export function useTerminateEpisode() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (episodeId: string) => apiClient.terminateEpisode(episodeId),
onSuccess: (_, episodeId) => {
queryClient.invalidateQueries({ queryKey: ['episode', episodeId] });
queryClient.invalidateQueries({ queryKey: ['episode', 'current'] });
},
});
}
export function useEpisodeActions(episodeId: string | undefined) {
return useQuery({
queryKey: ['episode', episodeId, 'actions'],
queryFn: () => (episodeId ? apiClient.getActions(episodeId) : []),
enabled: !!episodeId,
refetchInterval: 1000,
});
}
export function useEpisodeRewards(episodeId: string | undefined) {
return useQuery({
queryKey: ['episode', episodeId, 'rewards'],
queryFn: () => (episodeId ? apiClient.getRewards(episodeId) : []),
enabled: !!episodeId,
refetchInterval: 1000,
});
}
export function useEpisodeStats() {
return useQuery({
queryKey: ['stats'],
queryFn: () => apiClient.getStats(),
refetchInterval: 5000,
});
}
export function useEpisodeState(episodeId: string | undefined) {
return useQuery({
queryKey: ['episode', episodeId, 'state'],
queryFn: () => (episodeId ? apiClient.getState(episodeId) : null),
enabled: !!episodeId,
refetchInterval: 500,
});
}
// Helper to create a quick action
export function createAction(
type: Action['type'],
agentId: string,
options: Partial<Omit<Action, 'type' | 'agentId' | 'timestamp'>> = {}
): StepRequest {
return {
action: {
type,
agentId,
confidence: 1.0,
...options,
},
agentId,
};
}
export type { Episode, ResetRequest, StepRequest };
|