Spaces:
Sleeping
Sleeping
File size: 2,828 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 | import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { apiClient } from '@/api/client';
import type { MemoryState, MemoryEntry, MemoryLayer } from '@/types';
export function useMemory(episodeId: string | undefined) {
return useQuery({
queryKey: ['episode', episodeId, 'memory'],
queryFn: () => (episodeId ? apiClient.getMemory(episodeId) : null),
enabled: !!episodeId,
refetchInterval: 2000,
});
}
export function useQueryMemory(episodeId: string | undefined) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({
query,
layer,
limit,
}: {
query: string;
layer?: MemoryLayer;
limit?: number;
}) =>
episodeId
? apiClient.queryMemory(episodeId, query, layer, limit)
: Promise.reject(new Error('No episode')),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ['episode', episodeId, 'memory'],
});
},
});
}
export function useAddMemory(episodeId: string | undefined) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (entry: Omit<MemoryEntry, 'id' | 'timestamp'>) =>
episodeId
? apiClient.addMemory(episodeId, entry)
: Promise.reject(new Error('No episode')),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ['episode', episodeId, 'memory'],
});
},
});
}
export function useClearMemory(episodeId: string | undefined) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (layer?: MemoryLayer) =>
episodeId
? apiClient.clearMemory(episodeId, layer)
: Promise.reject(new Error('No episode')),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ['episode', episodeId, 'memory'],
});
},
});
}
export function getMemoryLayerColor(layer: MemoryLayer): string {
switch (layer) {
case 'short_term':
return 'text-yellow-400';
case 'working':
return 'text-blue-400';
case 'long_term':
return 'text-purple-400';
case 'shared':
return 'text-green-400';
default:
return 'text-dark-400';
}
}
export function getMemoryLayerBadge(layer: MemoryLayer): string {
switch (layer) {
case 'short_term':
return 'badge-warning';
case 'working':
return 'badge-info';
case 'long_term':
return 'badge-neutral';
case 'shared':
return 'badge-success';
default:
return 'badge-neutral';
}
}
export function formatMemorySize(bytes: number): string {
if (bytes < 1024) return `${bytes} B`;
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
}
export type { MemoryState, MemoryEntry, MemoryLayer };
|