"use client"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useState } from "react"; import { MEMORY_CATEGORIES, type MemoryCategory } from "@adventureos/shared"; type Memory = { id: string; category: string; title: string; content: string; sourceType: string; enabled: boolean; userVerified: boolean; }; type Suggestion = { id: string; category: string; title: string; content: string; confidence: string; sourceType: string; }; export function AiMemoryPanel() { const qc = useQueryClient(); const [tab, setTab] = useState<"memories" | "suggestions" | "summary" | "learning">("memories"); const [filter, setFilter] = useState(""); const [category, setCategory] = useState(""); const [newMem, setNewMem] = useState({ category: "likes" as MemoryCategory, title: "", content: "" }); const { data } = useQuery({ queryKey: ["ai-memory", filter, category], queryFn: async () => { const params = new URLSearchParams(); if (filter) params.set("q", filter); if (category) params.set("category", category); const res = await fetch(`/api/ai/memory?${params}`); return res.json(); }, }); const { data: learningData } = useQuery({ queryKey: ["ai-memory-learning"], queryFn: async () => { const res = await fetch("/api/ai/memory/learning"); return res.json(); }, }); const { data: suggestionsData } = useQuery({ queryKey: ["ai-memory-suggestions"], queryFn: async () => { const res = await fetch("/api/ai/memory/suggestions"); return res.json(); }, }); const createMem = useMutation({ mutationFn: async () => { const res = await fetch("/api/ai/memory", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(newMem), }); return res.json(); }, onSuccess: () => { qc.invalidateQueries({ queryKey: ["ai-memory"] }); setNewMem({ category: "likes", title: "", content: "" }); }, }); const saveSummary = useMutation({ mutationFn: async (summary: string) => { const res = await fetch("/api/ai/memory/summary", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ summary }), }); return res.json(); }, onSuccess: () => qc.invalidateQueries({ queryKey: ["ai-memory"] }), }); const saveLearning = useMutation({ mutationFn: async (body: Record) => { const res = await fetch("/api/ai/memory/learning", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); return res.json(); }, onSuccess: () => qc.invalidateQueries({ queryKey: ["ai-memory-learning"] }), }); const memories: Memory[] = data?.memories ?? []; const summary = data?.summary?.summary ?? ""; const suggestions: Suggestion[] = suggestionsData?.suggestions ?? []; const learning = learningData ?? {}; return (

What the AI knows about you — fully editable. Raw logs and reflections stay separate.

{(["memories", "suggestions", "summary", "learning"] as const).map((t) => ( ))}
{tab === "memories" && ( <>
setFilter(e.target.value)} />

Add memory manually

setNewMem({ ...newMem, title: e.target.value })} />