Files
hermes-os/lib/hooks.ts
T
Hermes 517583d1c4 MVP: Pulse, Memory, History modules
- Mobile-first PWA with dark glassmorphic theme
- Pulse: status card, recent sessions, memory snapshot
- Memory: view/edit agent + user memory with usage bars
- History: session list, platform filter, search, session replay
- TanStack Query hooks for all Hermes WebAPI endpoints
- Bottom tab navigation, safe-area support
2026-04-09 20:41:13 -05:00

105 lines
2.4 KiB
TypeScript

"use client";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import * as api from "./api";
// Sessions
export function useSessions(limit = 20, source?: string) {
return useQuery({
queryKey: ["sessions", limit, source],
queryFn: () => api.fetchSessions(limit, 0, source),
});
}
export function useSession(id: string) {
return useQuery({
queryKey: ["session", id],
queryFn: () => api.fetchSession(id),
enabled: !!id,
});
}
export function useMessages(sessionId: string) {
return useQuery({
queryKey: ["messages", sessionId],
queryFn: () => api.fetchMessages(sessionId),
enabled: !!sessionId,
});
}
export function useSessionSearch(query: string) {
return useQuery({
queryKey: ["search", query],
queryFn: () => api.searchSessions(query),
enabled: query.length >= 2,
});
}
// Memory
export function useMemory() {
return useQuery({
queryKey: ["memory"],
queryFn: api.fetchMemory,
});
}
export function useAddMemory() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ target, content }: { target: string; content: string }) =>
api.addMemory(target, content),
onSuccess: () => qc.invalidateQueries({ queryKey: ["memory"] }),
});
}
export function usePatchMemory() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ target, old_text, content }: { target: string; old_text: string; content: string }) =>
api.patchMemory(target, old_text, content),
onSuccess: () => qc.invalidateQueries({ queryKey: ["memory"] }),
});
}
export function useDeleteMemory() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ target, old_text }: { target: string; old_text: string }) =>
api.deleteMemory(target, old_text),
onSuccess: () => qc.invalidateQueries({ queryKey: ["memory"] }),
});
}
// Skills
export function useSkills(category?: string) {
return useQuery({
queryKey: ["skills", category],
queryFn: () => api.fetchSkills(category),
});
}
export function useSkill(name: string) {
return useQuery({
queryKey: ["skill", name],
queryFn: () => api.fetchSkill(name),
enabled: !!name,
});
}
// Config
export function useConfig() {
return useQuery({
queryKey: ["config"],
queryFn: api.fetchConfig,
});
}
// Health
export function useHealth() {
return useQuery({
queryKey: ["health"],
queryFn: api.fetchHealth,
refetchInterval: 30_000,
});
}