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
This commit is contained in:
+104
@@ -0,0 +1,104 @@
|
||||
"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,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user