"use client"; import { useState } from "react"; import { Button } from "@/components/ui/Button"; import { SensitivityBadge } from "@/components/ui/StatusBadge"; import { describeError } from "@/lib/utils/error"; import { MEMORY_SOURCE_LABEL, MEMORY_TYPE_LABEL } from "@/lib/constants/labels"; import { memoryApi } from "@/lib/api"; import { formatDateTime, formatPercent } from "@/lib/utils/format"; import { cn } from "@/lib/utils/cn"; import type { CreateMemoryRequest, Memory } from "@/types/api"; import { MemoryEditor } from "./MemoryEditor"; /** 单条记忆卡片(设计稿 memory-preview.html §mem-card) * 类型色标(.mem-type)、置信度/重要性进度条(.meta-bar .fill)、 * 敏感度徽章、证据来源(.mem-foot)*/ export function MemoryCard({ memory, characterId, onChanged, onError, }: { memory: Memory; characterId?: string; onChanged: (kind: "update" | "delete", payload: Memory | string) => void; onError: (message: string) => void; }) { const [editing, setEditing] = useState(false); const [confirming, setConfirming] = useState(false); const [busy, setBusy] = useState(false); const handleUpdate = async (body: CreateMemoryRequest) => { setBusy(true); try { const updated = await memoryApi.updateMemory(memory.id, body); onChanged("update", updated); setEditing(false); } catch (err) { onError(describeError(err)); } finally { setBusy(false); } }; const handleDelete = async () => { setBusy(true); try { await memoryApi.deleteMemory(memory.id); onChanged("delete", memory.id); } catch (err) { onError(describeError(err)); setConfirming(false); } finally { setBusy(false); } }; if (editing) { return ( setEditing(false)} /> ); } const sensClass = memory.sensitivity === "high" ? "high-sens" : ""; return (
{/* 标题行(设计稿 .mem-head) */}
{memory.title || "无标题记忆"} {MEMORY_TYPE_LABEL[memory.type] ?? memory.type}
{/* 记忆内容(设计稿 .mem-content) */}

{memory.content}

{/* 元数据行:置信度 + 重要性进度条(设计稿 .mem-meta) */}
置信 {formatPercent(memory.confidence)} 重要 {formatPercent(memory.importance)}
{/* 脚注(设计稿 .mem-foot) */}
来源:{MEMORY_SOURCE_LABEL[memory.source] ?? memory.source} {formatDateTime(memory.updated_at ?? memory.created_at)} {memory.evidence_ids && memory.evidence_ids.length > 0 && ( 证据·{memory.evidence_ids.length} 条 )}
{/* 删除确认 */} {confirming && (
删除后此记忆将不再注入对话上下文,确认删除?
)}
); }