@kenz1117/dsh-engram 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useMemo","useRef","useState","styles","styles","useState","useRef","useCallback","useState","useCallback","styles","useState","useCallback","useRef"],"sources":["../src/client/CorridorMap.tsx","../src/client/Toast.tsx","../src/client/UiStorage.ts","../src/client/EngramPanel.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * 走廊鸟瞰图:中度版力导向 + 拖拽 + hover 邻居高亮 + 响应式 viewBox。\n *\n * 设计要点:\n * 1. 冷却调度 alpha 1.0 → 0.1(240 tick),保证收敛不抖。\n * 2. drag 节点:mousedown 抓住 → mousemove 改写 vx/vy 为 0(吸附鼠标)→ mouseup 释放。\n * 3. hover 节点:该节点 + 一跳邻居 + 关联边高亮,其他 0.15 透明。\n * 4. tooltip 显示完整铭牌(沿用 SVG <title> 标签 + 自定义 <foreignObject> HTML tooltip 增强可读性)。\n * 5. viewBox 自适应容器宽度(preserveAspectRatio=\"xMidYMid meet\"),固定 560x320 逻辑坐标。\n *\n * @module @kenz1117/dsh-engram/client/CorridorMap\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport styles from './panel.module.css'\n\ninterface CorridorNode {\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n /** 后端可选字段:完整铭牌(用于 tooltip)。 */\n readonly content?: string\n}\ninterface CorridorEdge {\n readonly id: string\n readonly from: string\n readonly to: string\n readonly type: string\n}\n\n/** 楼层色板:5 个语义色相。 */\nconst FLOOR_PALETTE: Readonly<Record<string, string>> = {\n fact: '#5b8def',\n preference: '#f0a85c',\n decision: '#9b6bd9',\n episode: '#3cb489',\n skill: '#e26b86',\n}\nconst FLOOR_LABEL: Readonly<Record<string, string>> = {\n fact: '事实层',\n preference: '偏好层',\n decision: '决策层',\n episode: '事件层',\n skill: '技能层',\n}\n\n/** 边视觉语义。dash 显式允许 undefined:exactOptionalPropertyTypes 下字面量表无需逐项删键。 */\ntype EdgeStyle = { color: string; dash?: string | undefined; width: number }\nconst EDGE_STYLE: Readonly<Record<string, EdgeStyle>> = {\n related: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n refines: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supports: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supersedes:{ color: 'rgba(91, 141, 239, 0.85)', dash: undefined, width: 1.8 },\n contradicts:{ color: 'rgba(226, 107, 134, 0.9)', dash: '4 4', width: 1.4 },\n}\n\ninterface PositionedNode extends CorridorNode {\n x: number\n y: number\n vx: number\n vy: number\n r: number\n /** 是否被用户拖拽中(拖拽时禁用 tick 力更新)。 */\n fixed: boolean\n}\n\ninterface CorridorMapProps {\n readonly scope: 'user' | 'project' | 'shared'\n readonly nodes: readonly CorridorNode[]\n readonly edges: readonly CorridorEdge[]\n readonly onSelect?: (id: string) => void\n readonly selectedId?: string\n}\n\n/** 节点半径。 */\nfunction nodeRadius(n: CorridorNode): number {\n return Math.max(4, Math.min(14, 4 + 10 * n.importance * n.confidence))\n}\n\n/** 单步力更新(带冷却 alpha)。 */\nfunction step(nodes: PositionedNode[], edges: readonly CorridorEdge[], width: number, height: number, alpha: number): void {\n const REPLUSION = 4800\n const SPRING_LEN = 64\n const SPRING_K = 0.04\n const CENTER_K = 0.003\n const FLOOR_K = 0.005\n // 排斥力:平方反比(带 alpha 冷却)。\n for (let i = 0; i < nodes.length; i += 1) {\n const a = nodes[i]!\n for (let j = i + 1; j < nodes.length; j += 1) {\n const b = nodes[j]!\n const dx = a.x - b.x\n const dy = a.y - b.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (REPLUSION * alpha) / (dist * dist)\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n }\n // 弹簧力。\n const nodeMap = new Map<string, PositionedNode>(nodes.map(n => [n.id, n]))\n for (const edge of edges) {\n const a = nodeMap.get(edge.from)\n const b = nodeMap.get(edge.to)\n if (a === undefined || b === undefined) continue\n const dx = b.x - a.x\n const dy = b.y - a.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (dist - SPRING_LEN) * SPRING_K * alpha\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n // 中心引力 + 楼层水平分簇。\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n for (const n of nodes) {\n if (n.fixed) continue\n n.vx += (width / 2 - n.x) * CENTER_K * alpha\n n.vy += (height / 2 - n.y) * CENTER_K * alpha\n const idx = kinds.indexOf(n.kind)\n if (idx >= 0) {\n const target = band * (idx + 0.5)\n n.vx += (target - n.x) * FLOOR_K * alpha\n }\n }\n // 阻尼 + 边界。\n const DAMPING = 0.82\n for (const n of nodes) {\n if (n.fixed) { n.vx = 0; n.vy = 0; continue }\n n.vx *= DAMPING\n n.vy *= DAMPING\n n.x = Math.max(20, Math.min(width - 20, n.x + n.vx))\n n.y = Math.max(20, Math.min(height - 20, n.y + n.vy))\n }\n}\n\n/** 走廊鸟瞰组件。 */\nexport function CorridorMap(props: CorridorMapProps): ReactElement {\n const { scope, nodes, edges, onSelect, selectedId } = props\n const width = 560\n const height = 320\n /** 邻居表:node id → 邻居 id 集合(含一跳)。 */\n const neighborMap = useMemo(() => {\n const map = new Map<string, Set<string>>()\n for (const n of nodes) map.set(n.id, new Set())\n for (const e of edges) {\n if (!map.has(e.from)) map.set(e.from, new Set())\n if (!map.has(e.to)) map.set(e.to, new Set())\n map.get(e.from)!.add(e.to)\n map.get(e.to)!.add(e.from)\n }\n return map\n }, [nodes, edges])\n /** 起始布局:按楼层水平均分带,垂直随机抖动。 */\n const initialNodes = useMemo<PositionedNode[]>(() => {\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n return nodes.map((n, index) => ({\n ...n,\n x: kinds.indexOf(n.kind) >= 0 ? band * (kinds.indexOf(n.kind) + 0.5) : width / 2,\n y: 30 + ((index * 47) % (height - 60)),\n vx: 0, vy: 0,\n r: nodeRadius(n),\n fixed: false,\n }))\n }, [nodes, width, height])\n const positionsRef = useRef<PositionedNode[]>(initialNodes.map(n => ({ ...n })))\n const [, forceRender] = useState(0)\n const animRef = useRef<number | null>(null)\n const tickRef = useRef(0)\n const totalTicks = 280\n // 初始化 / 重置:拷贝新布局并清零 tick。\n useEffect(() => {\n positionsRef.current = initialNodes.map(n => ({ ...n }))\n tickRef.current = 0\n forceRender(value => value + 1)\n }, [initialNodes])\n // 力导向主循环:requestAnimationFrame,alpha 1.0 → 0.1。\n useEffect(() => {\n const tick = (): void => {\n const nodesArr = positionsRef.current\n tickRef.current += 1\n const alpha = Math.max(0.1, 1 - (tickRef.current / totalTicks) * 0.9)\n step(nodesArr, edges, width, height, alpha)\n // 触发 React 重渲染(不可变快照:拷贝一次引用)。\n positionsRef.current = nodesArr.map(n => ({ ...n }))\n forceRender(value => value + 1)\n if (tickRef.current < totalTicks) animRef.current = requestAnimationFrame(tick)\n }\n animRef.current = requestAnimationFrame(tick)\n return () => { if (animRef.current !== null) cancelAnimationFrame(animRef.current) }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- tick 仅在新 nodes/edges 时重启\n }, [initialNodes, edges])\n const positions = positionsRef.current\n const posMap = useMemo(() => new Map(positions.map(p => [p.id, p])), [positions])\n const floors = useMemo(() => [...new Set(nodes.map(n => n.kind))], [nodes])\n /** hover 高亮:当前节点 id → 邻居 id 集合;null = 不高亮。 */\n const [hoverId, setHoverId] = useState<string | null>(null)\n const hoverNeighbors = useMemo(() => {\n if (hoverId === null) return null\n return neighborMap.get(hoverId) ?? new Set<string>()\n }, [hoverId, neighborMap])\n const isFaded = (nId: string): boolean => hoverId !== null && nId !== hoverId && !(hoverNeighbors?.has(nId) ?? false)\n const isEdgeHighlighted = (e: CorridorEdge): boolean => {\n if (hoverId === null) return false\n return e.from === hoverId || e.to === hoverId\n }\n /** drag:mousedown 抓住节点 → mousemove 改 vx/vy 为 0 → mouseup 释放。 */\n const svgRef = useRef<SVGSVGElement | null>(null)\n const dragIdRef = useRef<string | null>(null)\n const svgToScreen = (clientX: number, clientY: number): { x: number; y: number } | null => {\n const svg = svgRef.current\n if (svg === null) return null\n const rect = svg.getBoundingClientRect()\n // viewBox 0 0 width height,preserveAspectRatio meet → 等比缩放,逻辑坐标 = 屏幕坐标 * (width / rect.width)\n const scaleX = width / rect.width\n const scaleY = height / rect.height\n return { x: (clientX - rect.left) * scaleX, y: (clientY - rect.top) * scaleY }\n }\n const onNodeMouseDown = (event: React.MouseEvent<SVGGElement>, nodeId: string): void => {\n event.preventDefault()\n dragIdRef.current = nodeId\n const node = positionsRef.current.find(n => n.id === nodeId)\n if (node !== undefined) node.fixed = true\n }\n useEffect(() => {\n const handleMove = (event: MouseEvent): void => {\n const id = dragIdRef.current\n if (id === null) return\n const pos = svgToScreen(event.clientX, event.clientY)\n if (pos === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node === undefined) return\n node.x = Math.max(20, Math.min(width - 20, pos.x))\n node.y = Math.max(20, Math.min(height - 20, pos.y))\n node.vx = 0\n node.vy = 0\n forceRender(value => value + 1)\n }\n const handleUp = (): void => {\n const id = dragIdRef.current\n if (id === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node !== undefined) node.fixed = false\n dragIdRef.current = null\n }\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleUp)\n return () => {\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleUp)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n if (nodes.length === 0) {\n return <div className={styles.empty}>走廊空空如也,落成几间房间后这里会出现鸟瞰图。</div>\n }\n\n return (\n <div className={styles.mapWrap}>\n <svg ref={svgRef} viewBox={`0 0 ${String(width)} ${String(height)}`} className={styles.map}\n preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label=\"走廊鸟瞰图\" key={scope}>\n {/* 楼层背景带(斑马纹区隔)。scope 切换通过父 svg key 重挂载触发 fade-in。 */}\n {floors.map((kind, idx) => {\n const band = width / Math.max(floors.length, 1)\n return <rect key={kind} x={band * idx} y={0} width={band} height={height} fill={idx % 2 === 0 ? 'rgba(127,127,127,0.04)' : 'transparent'} />\n })}\n {/* 楼层标签条顶部。 */}\n {floors.map((kind, idx) => {\n const band = width / Math.max(floors.length, 1)\n return (\n <text key={`${kind}-label`} x={band * (idx + 0.5)} y={14} textAnchor=\"middle\"\n fill=\"rgba(127,127,127,0.7)\" fontSize=\"10\" fontFamily=\"ui-sans-serif, system-ui\">\n {FLOOR_LABEL[kind] ?? kind}\n </text>\n )\n })}\n {/* 走廊边:高亮时画弹簧弧线(quadratic 曲线 + 垂直凸起 6px),其他边保持直线。\n 用 stagger-delay 让边按 from 节点索引依次淡入,强化「地图刷新」感。 */}\n {edges.map((edge, idx) => {\n const a = posMap.get(edge.from)\n const b = posMap.get(edge.to)\n if (a === undefined || b === undefined) return null\n const style = EDGE_STYLE[edge.type] ?? EDGE_STYLE.related!\n const highlighted = isEdgeHighlighted(edge)\n const faded = hoverId !== null && !highlighted\n if (highlighted) {\n // 垂直中点偏移:构造弹簧视觉。\n const mx = (a.x + b.x) / 2\n const my = (a.y + b.y) / 2\n const dx = b.x - a.x\n const dy = b.y - a.y\n const length = Math.sqrt(dx * dx + dy * dy) || 1\n const offsetX = (-dy / length) * 6\n const offsetY = (dx / length) * 6\n return (\n <path key={edge.id} d={`M ${String(a.x)} ${String(a.y)} Q ${String(mx + offsetX)} ${String(my + offsetY)} ${String(b.x)} ${String(b.y)}`}\n fill=\"none\" stroke={style.color}\n strokeWidth={style.width + 1.2} strokeDasharray={style.dash}\n style={{ transition: 'stroke-width 200ms ease, d 240ms ease' }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </path>\n )\n }\n return (\n <line key={edge.id} x1={a.x} y1={a.y} x2={b.x} y2={b.y}\n stroke={style.color} strokeWidth={style.width}\n strokeDasharray={style.dash} opacity={faded ? 0.1 : 1}\n className={styles.edgeFade}\n style={{ transition: 'opacity 200ms ease, stroke-width 200ms ease', animationDelay: `${String(Math.min(idx, 24) * 24)}ms` }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </line>\n )\n })}\n {/* 房间节点。 */}\n {positions.map((n, index) => {\n const color = FLOOR_PALETTE[n.kind] ?? '#7d8590'\n const isSelected = selectedId === n.id\n const isHovered = hoverId === n.id\n const faded = isFaded(n.id)\n return (\n <g key={n.id} className={styles.node} transform={`translate(${String(n.x)} ${String(n.y)})`}\n style={{ cursor: dragIdRef.current === n.id ? 'grabbing' : 'grab', opacity: faded ? 0.15 : 1, transition: 'opacity 200ms ease', animationDelay: `${String(Math.min(index, 24) * 24)}ms` }}\n onMouseEnter={() => { setHoverId(n.id) }}\n onMouseLeave={() => { setHoverId(prev => prev === n.id ? null : prev) }}\n onMouseDown={event => onNodeMouseDown(event, n.id)}\n onClick={() => onSelect?.(n.id)}>\n {/* hover 时画一圈柔光外晕。 */}\n {(isHovered || isSelected) && (\n <circle r={String(n.r + 6)} fill={color} fillOpacity={0.18} />\n )}\n <circle r={String(n.r)} fill={color} fillOpacity={n.status === 'active' ? 0.88 : 0.42}\n stroke={isSelected ? 'var(--dsw-alias-brand-primary)' : isHovered ? color : 'rgba(255,255,255,0.9)'}\n strokeWidth={isSelected ? 2 : isHovered ? 1.5 : 1}\n style={{ transition: 'stroke 160ms ease, stroke-width 160ms ease' }}>\n <title>{`${n.title}(${n.kind}/${n.status})`}</title>\n </circle>\n {isSelected && <circle r={String(n.r + 4)} fill=\"none\" stroke={color} strokeOpacity={0.4} strokeWidth={1} />}\n </g>\n )\n })}\n {/* hover tooltip:HTML 浮层,显示完整铭牌(用 SVG <text> 简易渲染)。 */}\n {hoverId !== null && (() => {\n const node = posMap.get(hoverId)\n if (node === undefined) return null\n const tx = Math.min(width - 180, Math.max(8, node.x + 14))\n const ty = Math.min(height - 60, Math.max(28, node.y - 16))\n const fullContent = (node.content ?? node.title).slice(0, 120)\n return (\n <g className={styles.tooltip} transform={`translate(${String(tx)} ${String(ty)})`}>\n <rect x={0} y={0} width={176} height={48} rx={6} ry={6}\n fill=\"var(--dsw-alias-bg-base)\" stroke=\"var(--dsw-alias-border-l2)\" strokeWidth={1} opacity={0.96} />\n <text x={8} y={16} fill=\"var(--dsw-alias-label-primary)\" fontSize=\"11\" fontWeight={600}\n fontFamily=\"ui-sans-serif, system-ui\">{FLOOR_LABEL[node.kind] ?? node.kind}</text>\n <text x={8} y={32} fill=\"var(--dsw-alias-label-secondary)\" fontSize=\"10\"\n fontFamily=\"ui-sans-serif, system-ui\">{`${fullContent}${(node.content ?? node.title).length > 120 ? '…' : ''}`}</text>\n </g>\n )\n })()}\n </svg>\n <div className={styles.legend}>\n {floors.map(kind => (\n <span key={kind} className={styles.legendItem}>\n <span className={styles.legendDot} style={{ background: FLOOR_PALETTE[kind] ?? '#7d8590' }} />\n {FLOOR_LABEL[kind] ?? kind}\n </span>\n ))}\n <span className={styles.legendItem}>{nodes.length} 间 · {edges.length} 条走廊</span>\n </div>\n <div className={styles.legend} style={{ marginTop: 2 }}>\n {Object.entries(EDGE_STYLE).map(([type, style]) => (\n <span key={type} className={styles.legendItem}>\n <svg width={20} height={6} aria-hidden=\"true\">\n <line x1={0} y1={3} x2={20} y2={3} stroke={style.color} strokeWidth={style.width} strokeDasharray={style.dash} />\n </svg>\n <span>{type === 'supersedes' ? '推陈出新' : type === 'contradicts' ? '互斥' : '相邻 / 支持 / 提炼'}</span>\n </span>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * 轻量 Toast:右上角叠层通知,3 秒自动消失,hover 暂停。\n * 4 种语义:info / success / error / warning(图标与配色由样式表决定,文案一律走调用方传入的字符串)。\n * confirm 不归本 hook 管——那是对话框决策,保留 window.confirm 以免破坏流程语义。\n * @module @kenz1117/dsh-engram/client/Toast\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport styles from './panel.module.css'\n\n/** Toast 语义类型。 */\nexport type ToastKind = 'info' | 'success' | 'error' | 'warning'\n\n/** 单条 Toast。 */\ninterface ToastItem {\n readonly id: number\n readonly kind: ToastKind\n readonly message: string\n readonly duration: number\n}\n\nconst DEFAULT_DURATION: Record<ToastKind, number> = {\n info: 3000,\n success: 3000,\n warning: 5000,\n error: 5000,\n}\n\n/** 顺序自增 id 源(避免 useEffect 依赖 Date.now)。 */\nlet toastIdCursor = 0\n\n/**\n * 把 toasts 数组渲染为右上角浮层。每帧返回新 ReactElement,调用方挂在面板根节点末尾。\n * hover 期间不消失(由 useToast 内部维护 timers 控制)。\n */\nfunction ToastViewport({ items, onDismiss }: {\n readonly items: readonly ToastItem[]\n readonly onDismiss: (id: number) => void\n}): React.ReactElement {\n return (\n <div className={styles.toastViewport} role=\"region\" aria-live=\"polite\" aria-label=\"notifications\">\n {items.map(toast => {\n const kindClass = toast.kind === 'success' ? styles.toastSuccess\n : toast.kind === 'error' ? styles.toastError\n : toast.kind === 'warning' ? styles.toastWarning\n : styles.toastInfo\n return (\n <div key={toast.id}\n className={`${styles.toast} ${kindClass}`}\n role={toast.kind === 'error' || toast.kind === 'warning' ? 'alert' : 'status'}>\n <span className={styles.toastBody}>{toast.message}</span>\n <button type=\"button\" className={styles.toastDismiss} aria-label=\"dismiss\"\n onClick={() => { onDismiss(toast.id) }}>×</button>\n </div>\n )\n })}\n </div>\n )\n}\n\n/** Toast hook 返回:toasts 列表 + push 函数 + 渲染节点。 */\nexport interface ToastController {\n readonly toasts: readonly ToastItem[]\n readonly push: (kind: ToastKind, message: string, duration?: number) => void\n readonly dismiss: (id: number) => void\n readonly viewport: React.ReactElement\n}\n\nexport function useToast(): ToastController {\n const [toasts, setToasts] = useState<readonly ToastItem[]>([])\n // 计时器表:id → setTimeout handle,方便 dismiss 取消。\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map())\n\n const dismiss = useCallback((id: number) => {\n setToasts(current => current.filter(toast => toast.id !== id))\n const timer = timersRef.current.get(id)\n if (timer !== undefined) {\n clearTimeout(timer)\n timersRef.current.delete(id)\n }\n }, [])\n\n const push = useCallback((kind: ToastKind, message: string, duration?: number) => {\n toastIdCursor += 1\n const id = toastIdCursor\n const ms = duration ?? DEFAULT_DURATION[kind]\n const item: ToastItem = { id, kind, message, duration: ms }\n setToasts(current => [...current, item])\n const timer = setTimeout(() => { dismiss(id) }, ms)\n timersRef.current.set(id, timer)\n }, [dismiss])\n\n useEffect(() => () => {\n for (const timer of timersRef.current.values()) clearTimeout(timer)\n timersRef.current.clear()\n }, [])\n\n const viewport = (\n <ToastViewport items={toasts} onDismiss={dismiss} />\n )\n\n return { toasts, push, dismiss, viewport }\n}","/**\n * UI 偏好持久化 hook:把任意 React state 同步到 localStorage,统一包名空间 dsh-engram.ui.*,\n * 隐私模式或存储失败时回退到默认值;非法值也降级默认。\n * 设计:包名空间 + key 后缀,避免与宿主/其它插件冲突。\n * @module @kenz1117/dsh-engram/client/UiStorage\n */\n\nimport { useCallback, useEffect, useState } from 'react'\n\n/** 命名空间:所有 key 都加此前缀。 */\nconst NAMESPACE = 'dsh-engram.ui'\n\n/** 防御性读:localStorage 抛错(隐私模式 / 禁用)返回 undefined。 */\nfunction safeGet(key: string): string | undefined {\n try { return window.localStorage.getItem(key) ?? undefined } catch { return undefined }\n}\n\n/** 防御性写:失败静默(UI 状态本身不依赖写回成功)。 */\nfunction safeSet(key: string, value: string): void {\n try { window.localStorage.setItem(key, value) } catch { /* 静默 */ }\n}\n\n/** 类型守卫:判断 raw 是否为合法值集合中的某一项。 */\nfunction isValid<T>(raw: string | undefined, allow: readonly T[]): raw is string & T {\n if (raw === undefined) return false\n return (allow as readonly unknown[]).includes(raw)\n}\n\n/**\n * 持久化 state:与 useState 同语义,初值惰性从 localStorage 读取,变更时同步写回。\n * @param suffix - localStorage key 后缀(不含包名空间)。\n * @param fallback - 默认值(首次进入或读取失败时使用)。\n * @param allow - 合法值白名单;同时用于入参校验与持久化校验。\n */\nexport function usePersistedState<T extends string>(\n suffix: string,\n fallback: T,\n allow: readonly T[],\n): [T, (next: T) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<T>(() => {\n const raw = safeGet(key)\n return isValid<T>(raw, allow) ? raw : fallback\n })\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: T) => { setValue(next) }, [])\n return [value, update]\n}\n\n/** 任意字符串持久化:无 allow 白名单,q 这种自由输入适用。 */\nexport function usePersistedString(\n suffix: string,\n fallback: string,\n): [string, (next: string) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<string>(() => safeGet(key) ?? fallback)\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: string) => { setValue(next) }, [])\n return [value, update]\n}","/**\n * 记忆库设置面板:统计卡片、过滤列表、批量操作、编辑(取代链)、遗忘/恢复、导出。\n * 数据经回环 API(/api/engram/*)读写;详情与编辑为条目下方行内展开\n * (不嵌套弹窗);文案全部走宿主 locale 词典(zh/en),语言切换自动\n * 重渲染;数据层英文枚举(status/kind/op)只在显示层映射;内容节点\n * 一律 DOM/JSX 构建(防 XSS)。\n * @module @kenz1117/dsh-engram/client/EngramPanel\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport styles from './panel.module.css'\nimport { NS, type EngramKey } from './locales.ts'\nimport { CorridorMap } from './CorridorMap.tsx'\nimport { useToast, type ToastController } from './Toast.tsx'\nimport { usePersistedState, usePersistedString } from './UiStorage.ts'\n\n/** 列表/详情用的记忆视图(宿主 /api/engram/list 的行结构)。 */\ninterface MemoryRow {\n readonly id: string\n readonly scope: 'user' | 'project' | 'shared'\n readonly kind: string\n readonly content: string\n readonly importance: number\n readonly confidence: number\n readonly status: 'active' | 'archived' | 'forgotten'\n /** 最近一次使用效果回报(engram_report 写入;未回报过缺省)。 */\n readonly outcome?: 'success' | 'failure'\n readonly createdAt: number\n readonly accessCount: number\n readonly sourceSessionId: string | null\n readonly sourceRound: number | null\n}\n\ninterface ListResult {\n readonly records: MemoryRow[]\n readonly total: number\n}\n\ninterface StatsPart {\n readonly scope: 'user' | 'project' | 'shared'\n readonly stats: {\n readonly total: number\n readonly active: number\n readonly archived: number\n readonly forgotten: number\n readonly redacted: number\n readonly signalRatio: number\n }\n}\n\n/** review API 的返回结构(详情行内展开区的数据源)。 */\ninterface ReviewView {\n readonly record: MemoryRow\n readonly supersededBy?: readonly string[]\n readonly supersedes?: readonly string[]\n readonly contradicts?: readonly string[]\n readonly related?: readonly string[]\n /** 修订历史(旧内容快照,按被取代时间倒序)。 */\n readonly revisions?: readonly { content: string; kind: string; importance: number; supersededAt: number }[]\n readonly operations?: readonly { at: number; op: string; detail: string | null }[]\n}\n\n/** 面板内部传递的翻译函数(渲染器按注册的 locale 声明合成的 t 的窄化签名)。 */\ntype T = (key: EngramKey, params?: Record<string, unknown>) => string\n\n/** kind 数据值(存储层英文枚举,编辑表单下拉的 value 保持英文)。 */\nconst KINDS = ['fact', 'preference', 'decision', 'episode', 'skill'] as const\nconst PAGE_SIZE = 20\n\n/** 数据层枚举 → 词典键映射(显示层本地化,存储值不变)。 */\nconst STATUS_KEY: Record<MemoryRow['status'], EngramKey> = {\n active: 'statusActive',\n archived: 'statusArchived',\n forgotten: 'statusForgotten',\n}\nconst KIND_KEY: Record<string, EngramKey> = {\n fact: 'kindFact',\n preference: 'kindPreference',\n decision: 'kindDecision',\n episode: 'kindEpisode',\n skill: 'kindSkill',\n}\nconst SCOPE_KEY: Record<MemoryRow['scope'], EngramKey> = {\n user: 'scopeUser',\n project: 'scopeProject',\n shared: 'scopeShared',\n}\nconst OP_KEY: Record<string, EngramKey> = {\n write: 'opWrite',\n update: 'opUpdate',\n forget: 'opForget',\n restore: 'opRestore',\n decay: 'opDecay',\n superseded: 'opSuperseded',\n 'ingest-request': 'opIngestRequest',\n 'ingest-done': 'opIngestDone',\n 'outcome-report': 'opOutcomeReport',\n 'search-rewrite-request': 'opSearchRewrite',\n 'compress-request': 'opCompressRequest',\n 'distill-request': 'opDistillRequest',\n}\nconst REL_KEY: Record<string, EngramKey> = {\n supersededBy: 'relSupersededBy',\n supersedes: 'relSupersedes',\n contradicts: 'relContradicts',\n related: 'relRelated',\n}\n/** 操作日志 detail JSON 的已知键 → 词典键(write/update/superseded 的小对象)。 */\nconst DETAIL_KEY: Record<string, EngramKey> = {\n kind: 'labelKind',\n scope: 'labelScope',\n status: 'labelStatus',\n}\n\n/** kind 数据值 → 本地化标签(未知值回退原文)。 */\nfunction kindLabel(t: T, kind: string): string {\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n}\n\n/** op 数据值 → 本地化标签(未知值回退原文)。 */\nfunction opLabel(t: T, op: string): string {\n const key = OP_KEY[op]\n return key === undefined ? op : t(key)\n}\n\n/** 操作日志 detail 的本地化:write/update/superseded 的小对象转中文键值;摄取/蒸馏请求的完整 JSON 保持原样(审计诚实性优先)。 */\nfunction formatOpDetail(t: T, op: string, detail: string | null): string {\n if (detail === null) return ''\n if (op !== 'write' && op !== 'update' && op !== 'superseded') return ` ${detail}`\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n const entries = Object.entries(parsed)\n if (entries.length === 0) return ` ${detail}`\n return ' ' + entries.map(([key, value]) => {\n const label = DETAIL_KEY[key]\n if (label === undefined) return `${key}=${String(value)}`\n if (key === 'kind' && typeof value === 'string') return `${t(label)}=${kindLabel(t, value)}`\n if (key === 'scope' && (value === 'user' || value === 'project')) return `${t(label)}=${t(SCOPE_KEY[value])}`\n return `${t(label)}=${String(value)}`\n }).join(' · ')\n } catch {\n return ` ${detail}`\n }\n}\n\n/** 来源会话展示片段:截短的会话 id + 可选轮次。 */\nfunction sourceLabel(t: T, record: Pick<MemoryRow, 'sourceSessionId' | 'sourceRound'>): string {\n if (record.sourceSessionId === null) return t('sourceExplicit')\n const id = `${record.sourceSessionId.slice(0, 16)}…`\n const withRound = record.sourceRound === null\n ? id\n : `${id} ${t('round', { n: record.sourceRound })}`\n return t('sourceSession', { id: withRound })\n}\n\nasync function api<T>(path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(`/api/engram/${path}`, init)\n const body = (await response.json()) as T & { error?: string }\n if (!response.ok) throw new Error(body.error ?? `HTTP ${String(response.status)}`)\n return body\n}\n\n/** 绝对时间(审计时间线等需要精确时刻的位置)。 */\nfunction fmtTime(ms: number): string {\n // 时间格式跟随浏览器环境语言(宿主界面语言通常与浏览器一致)。\n return new Date(ms).toLocaleString(navigator.language || 'zh-CN', { hour12: false })\n}\n\n/** 列表用的相对时间:1 分钟内「刚刚」,其后按分钟/小时/天取整。 */\nfunction relTime(t: T, ms: number): string {\n const diff = Math.max(0, Date.now() - ms)\n const minutes = Math.floor(diff / 60_000)\n if (minutes < 1) return t('timeJustNow')\n if (minutes < 60) return t('timeMinutesAgo', { n: minutes })\n const hours = Math.floor(minutes / 60)\n if (hours < 48) return t('timeHoursAgo', { n: hours })\n return t('timeDaysAgo', { n: Math.floor(hours / 24) })\n}\n\n/** 细仪表条:重要性(品牌色)与置信(成功色)共用,conf 变体换色。 */\nfunction Meter({ value, conf }: { value: number; conf?: boolean }): React.ReactElement {\n return (\n <span className={conf === true ? `${styles.meter} ${styles.conf}` : styles.meter}>\n <i style={{ width: `${String(Math.round(Math.min(1, Math.max(0, value)) * 100))}%` }} />\n </span>\n )\n}\n\n/** 关系 id 列表 → 等宽字体 chips(完整 id 放 title)。 */\nfunction RelChips({ ids }: { ids: readonly string[] }): React.ReactElement {\n return (\n <div className={styles.relChips}>\n {ids.map(id => <span key={id} className={styles.relChip} title={id}>{id.slice(0, 18)}</span>)}\n </div>\n )\n}\n\n/** 行内审计区:属性网格 + 关系 chips + 操作时间线(review API)。 */\nfunction ReviewBody({ t, recordId, scope }: {\n t: T\n recordId: string\n scope: 'user' | 'project' | 'shared'\n}): React.ReactElement {\n const [view, setView] = useState<ReviewView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<ReviewView>(`review?scope=${scope}&id=${encodeURIComponent(recordId)}`)\n .then((data) => { if (!cancelled) setView(data) })\n .catch((error: Error) => { if (!cancelled) setFailed(error.message) })\n return () => { cancelled = true }\n }, [recordId, scope, t])\n if (failed !== null) return <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>\n if (view === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n const { record } = view\n const relations = (['supersededBy', 'supersedes', 'contradicts', 'related'] as const)\n .map(key => ({ key, label: REL_KEY[key], ids: view[key] ?? [] }))\n .filter(entry => entry.ids.length > 0)\n const operations = view.operations ?? []\n return (\n <div className={styles.reviewGrid}>\n <div>\n <dl className={styles.attrGrid}>\n <dt>{t('labelContent')}</dt>\n <dd>{record.content}</dd>\n <dt>{t('labelKind')}</dt>\n <dd><span className={`${styles.pill} ${styles.kind}`}>{kindLabel(t, record.kind)}</span></dd>\n <dt>{t('labelStatus')}</dt>\n <dd><span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span></dd>\n <dt>{t('importance')}</dt>\n <dd>{record.importance.toFixed(2)}<Meter value={record.importance} /></dd>\n <dt>{t('confidence')}</dt>\n <dd>{record.confidence.toFixed(2)}<Meter value={record.confidence} conf /></dd>\n <dt>{t('detailSource')}</dt>\n <dd>{sourceLabel(t, record)}</dd>\n <dt>{t('labelCreated')}</dt>\n <dd>{fmtTime(record.createdAt)}</dd>\n </dl>\n {relations.map(({ key, label, ids }) => (\n <div key={key} className={styles.relBlock}>\n <h5>{label === undefined ? key : t(label)}</h5>\n <RelChips ids={ids} />\n </div>\n ))}\n </div>\n <div>\n {(view.revisions ?? []).length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailRevisions')}</h5>\n <ul className={styles.timeline}>\n {view.revisions!.map((rev, index) => (\n <li key={index}>\n <time>{fmtTime(rev.supersededAt)}</time>\n <b>{kindLabel(t, rev.kind)}</b>\n {' '}{rev.content}\n </li>\n ))}\n </ul>\n </div>\n )}\n {operations.length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailOperations')}</h5>\n <ul className={styles.timeline}>\n {operations.map((op, index) => (\n <li key={index}>\n <time>{fmtTime(op.at)}</time>\n <b>{opLabel(t, op.op)}</b>\n {formatOpDetail(t, op.op, op.detail)}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/** 行内编辑表单:内容/种类/重要性 → POST update(旧条目归档,取代链保留)。 */\nfunction EditForm({ t, record, onClose, onSaved, toast }: {\n t: T\n record: MemoryRow\n onClose: () => void\n onSaved: () => void\n toast: ToastController\n}): React.ReactElement {\n const [content, setContent] = useState(record.content)\n const [kind, setKind] = useState(record.kind)\n const [importance, setImportance] = useState(record.importance)\n const save = (): void => {\n api('update', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope, content, kind, importance }),\n })\n .then(onSaved)\n .catch((error: Error) => { toast.push('error', error.message) })\n }\n return (\n <div className={styles.editForm}>\n <div>\n <label className={styles.fieldLabel}>{t('labelContent')}</label>\n <textarea className={styles.input} rows={3} value={content} onChange={event => setContent(event.target.value)} />\n </div>\n <div>\n <label className={styles.fieldLabel}>{t('labelKind')}</label>\n {/* option 的 value 保持数据层英文枚举,仅显示文本本地化。 */}\n <select className={styles.input} value={kind} onChange={event => setKind(event.target.value)}>\n {KINDS.map(option => <option key={option} value={option}>{kindLabel(t, option)}</option>)}\n </select>\n </div>\n <div className={styles.fieldRow}>\n <div>\n <label className={styles.fieldLabel}>{`${t('importance')} ${importance.toFixed(2)}`}</label>\n <input type=\"range\" min={0} max={1} step={0.05} value={importance}\n onChange={event => setImportance(Number(event.target.value))} />\n </div>\n </div>\n <div className={styles.modalFoot}>\n <button type=\"button\" className={styles.button} onClick={onClose}>{t('cancel')}</button>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`} onClick={save}>{t('saveWithHint')}</button>\n </div>\n </div>\n )\n}\n\n/** search-test API 的命中行。 */\ninterface BenchHit {\n readonly id: string\n readonly score: number\n readonly via: 'fts' | 'vec' | 'both'\n readonly viaEdge?: { readonly from: string; readonly type: string }\n readonly scope: string\n readonly kind: string\n readonly content: string\n}\n\n/** search-test API 的返回结构。 */\ninterface BenchResult {\n readonly degraded: boolean\n readonly hits: readonly BenchHit[]\n}\n\n/** activity API 的行结构(两库 op_log 合并)。 */\ninterface ActivityRow {\n readonly at: number\n readonly op: string\n readonly targetId: string\n readonly detail: string | null\n readonly scope: 'user' | 'project'\n}\n\n/** 命中道 → 词典键。 */\nconst VIA_KEY: Record<BenchHit['via'], EngramKey> = { fts: 'viaFts', vec: 'viaVec', both: 'viaBoth' }\n\n/** 召回测试台:输入查询跑真实检索,展示得分、命中原委(关键词/语义/边扩展)与内容。 */\nfunction RecallBench({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [query, setQuery] = useState('')\n /** 默认随观察 scope,但用户可在 select 内手动切换 'all' / 其它;切换观察 scope 时重置。 */\n const [benchScope, setBenchScope] = useState<string>(scope)\n const [result, setResult] = useState<BenchResult | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // 观察 scope 变化时同步 benchScope(用户在 select 里改过的「all」会被覆盖——刻意保持一致性)。\n useEffect(() => { setBenchScope(scope) }, [scope])\n const run = (): void => {\n if (query.trim() === '' || busy) return\n setBusy(true)\n api<BenchResult>(`search-test?q=${encodeURIComponent(query.trim())}&scope=${benchScope}`)\n .then((data) => { setResult(data); setError(null) })\n .catch((benchError: Error) => setError(benchError.message))\n .finally(() => setBusy(false))\n }\n const hits = result?.hits ?? []\n return (\n <div>\n <div className={styles.benchBar}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('benchPlaceholder')} value={query}\n onChange={event => setQuery(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter') run() }} />\n <select className={styles.input} value={benchScope}\n onChange={event => setBenchScope(event.target.value)}>\n <option value=\"all\">{t('benchScopeAll')}</option>\n <option value=\"user\">{t('scopeUser')}</option>\n <option value=\"project\">{t('scopeProject')}</option>\n <option value=\"shared\">{t('scopeShared')}</option>\n </select>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n disabled={busy || query.trim() === ''} onClick={run}>{t('benchRun')}</button>\n </div>\n {error !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: error })}</div>}\n {result !== null && error === null && (\n <div className={styles.benchMeta}>\n <span>{t('benchHits', { n: hits.length })}</span>\n {result.degraded && <span className={styles.degradedNote}>{t('benchDegraded')}</span>}\n </div>\n )}\n <div className={styles.benchList}>\n {hits.map(hit => (\n <div key={hit.id} className={styles.benchRow}>\n <div className={styles.benchHead}>\n <span className={styles.viaChip}>{t(VIA_KEY[hit.via])}</span>\n {hit.viaEdge !== undefined && (\n <span className={styles.viaChip}\n title={`${hit.viaEdge.type} ${hit.viaEdge.from}`}>{t('viaEdgeLabel')} · {hit.viaEdge.type}</span>\n )}\n <span className={`${styles.pill} ${styles.kind}`}>{kindLabel(t, hit.kind)}</span>\n <span className={styles.benchScore}>{hit.score.toFixed(4)}</span>\n </div>\n <div className={styles.benchContent}>{hit.content}</div>\n <span className={styles.benchId} title={hit.id}>{hit.id}</span>\n </div>\n ))}\n </div>\n {result !== null && hits.length === 0 && error === null && (\n <div className={styles.benchEmpty}>{t('benchEmpty')}</div>\n )}\n </div>\n )\n}\n\n/** 活动日志 detail 的摘要:摄取/改写/压缩请求解析 JSON 字段,其余原样截断。\n 窄侧栏下文本应尽量短,长详情交给 title 悬浮展示。 */\nfunction activityDetail(t: T, detail: string | null): string {\n if (detail === null) return ''\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n if (typeof parsed.round === 'number' && typeof parsed.userText === 'string') {\n const mode = typeof parsed.mode === 'string' ? ` · ${parsed.mode}` : ''\n return `${t('round', { n: parsed.round })}${mode} · ${parsed.userText.slice(0, 48)}`\n }\n if (typeof parsed.query === 'string' && Array.isArray(parsed.queries)) {\n return `${t('benchRewrite', { n: parsed.queries.length })} · ${parsed.query.slice(0, 36)}`\n }\n if (typeof parsed.count === 'number' && Object.keys(parsed).length === 1) {\n return t('benchCompress', { n: parsed.count })\n }\n } catch {\n // 非 JSON(outcome 值等):走末尾原样截断。\n }\n return detail.length > 56 ? `${detail.slice(0, 56)}…` : detail\n}\n\n/** 最近活动:两库 op_log 合并倒序,摄取/检索改写/压缩/蒸馏/条目操作全貌可见。 */\nfunction ActivityFeed({ t }: { t: T }): React.ReactElement {\n const [rows, setRows] = useState<ActivityRow[] | null>(null)\n useEffect(() => {\n let cancelled = false\n api<{ operations: ActivityRow[] }>('activity?limit=20')\n .then((data) => { if (!cancelled) setRows(data.operations) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [])\n if (rows === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n if (rows.length === 0) return <div className={styles.expandLoading}>{t('activityEmpty')}</div>\n return (\n // activityList:管家日志限高 280px + 内部滚动,避免 20 条满载把观察页整列拉长。\n <ul className={`${styles.timeline} ${styles.activityList}`}>\n {rows.map((op, index) => (\n <li key={index}>\n <span className={styles.actTime}>{relTime(t, op.at)}</span>\n <b>{opLabel(t, op.op)}</b>\n <span className={styles.actScope}>{op.scope === 'user' ? t('scopeUser') : t('scopeProject')}</span>\n <div className={styles.actBody} title={op.detail ?? ''}>{activityDetail(t, op.detail)}</div>\n </li>\n ))}\n </ul>\n )\n}\n\n/** 入殿导航:根据当前 scope 的 active 房间给出开场邀请 + 候选房间列表;点击可展开抽屉。\n * 顶部 kind chip(全部 / fact / preference / decision / episode / skill)切换 focusKind,\n * 触发后端按该 kind 优先选前 N 间作为开场建议。 */\nfunction TourProposalCard({ t, scope, onSelect }: { t: T; scope: 'user' | 'project' | 'shared'; onSelect: (id: string) => void }): React.ReactElement {\n interface Stop { id: string; kind: string; content: string; importance: number; confidence: number }\n interface Proposal { greeting: string; activeCount: number; empty: boolean; suggestedStops: readonly Stop[] }\n const KINDS_FOCUS = ['', 'fact', 'preference', 'decision', 'episode', 'skill'] as const\n const [focusKind, setFocusKind] = usePersistedState<string>('tour.focusKind', '', KINDS_FOCUS)\n const [proposal, setProposal] = useState<Proposal | null>(null)\n useEffect(() => {\n let cancelled = false\n const path = focusKind === ''\n ? `tour-proposal?scope=${scope}`\n : `tour-proposal?scope=${scope}&focusKind=${focusKind}`\n api<Proposal>(path)\n .then((data) => { if (!cancelled) setProposal(data) })\n .catch(() => { if (!cancelled) setProposal({ greeting: t('tourProposalEmpty'), activeCount: 0, empty: true, suggestedStops: [] }) })\n return () => { cancelled = true }\n }, [t, scope, focusKind])\n const labelKind = (kind: string): string => {\n if (kind === '') return t('tourFocusAll')\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n }\n if (proposal === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.tourProposal}>\n <div className={styles.tourFocusRow} role=\"tablist\" aria-label=\"focus-kind\">\n {KINDS_FOCUS.map(kind => (\n <button key={kind || 'all'} type=\"button\" role=\"tab\"\n aria-selected={focusKind === kind}\n className={focusKind === kind ? `${styles.tourFocusChip} ${styles.tourFocusChipOn}` : styles.tourFocusChip}\n onClick={() => { setFocusKind(kind) }}>\n {labelKind(kind)}\n </button>\n ))}\n </div>\n {proposal.empty\n ? <div className={styles.expandLoading}>{t('tourProposalEmpty')}</div>\n : (\n <>\n <p className={styles.tourGreeting}>{proposal.greeting}</p>\n <ol className={styles.tourStops}>\n {proposal.suggestedStops.map((stop, index) => (\n <li key={stop.id}>\n <button type=\"button\" className={styles.tourStop} onClick={() => { onSelect(stop.id) }}>\n <span className={styles.tourStopIndex}>{index + 1}</span>\n <span className={styles.tourStopBody}>\n <span className={styles.tourStopKind}>{stop.kind}</span>\n <span className={styles.tourStopText}>{stop.content.length > 60 ? `${stop.content.slice(0, 60)}…` : stop.content}</span>\n </span>\n </button>\n </li>\n ))}\n </ol>\n <p className={styles.tourHint}>{t('tourProposalHint')}</p>\n </>\n )}\n </div>\n )\n}\n\n/** 翻新清单:扫描 active 条目,给出 merge / demote / review / split 四类建议;带手动刷新 + 写回按钮。\n * - review / split:跳到对应房间抽屉查看(无副作用)。\n * - demote:调用 engram_forget(带三问墓志铭),房间转 archived。\n * - merge:触发当前 scope 的 engram_distill(用户级闭馆整理),把多间相似房间蒸馏为一条高层规律。 */\nfunction RefurbCard({ t, scope, onSelect, onAfterAction, toast }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n onSelect: (id: string) => void\n onAfterAction: () => void\n toast: ToastController\n}): React.ReactElement {\n interface Suggestion { action: 'merge' | 'demote' | 'review' | 'split'; primaryId: string; candidates: readonly string[]; reason: string; confidence: number }\n interface RefurbReport { count: number; suggestions: readonly Suggestion[] }\n const [report, setReport] = useState<RefurbReport | null>(null)\n const [busy, setBusy] = useState(false)\n const reload = useCallback(() => {\n setBusy(true)\n api<RefurbReport>(`refurb?scope=${scope}`)\n .then((data) => { setReport(data) })\n .catch(() => { setReport({ count: 0, suggestions: [] }) })\n .finally(() => { setBusy(false) })\n }, [scope])\n useEffect(() => { reload() }, [reload])\n const labelOf = (action: Suggestion['action']): string => {\n switch (action) {\n case 'demote': return t('refurbActionDemote')\n case 'merge': return t('refurbActionMerge')\n case 'review': return t('refurbActionReview')\n case 'split': return t('refurbActionSplit')\n }\n }\n /** 执行建议:review/split 仅跳转;demote/merge 调写接口。 */\n const execute = useCallback((suggestion: Suggestion) => {\n if (suggestion.action === 'review' || suggestion.action === 'split') {\n onSelect(suggestion.primaryId)\n return\n }\n if (suggestion.action === 'demote') {\n if (!window.confirm(t('refurbConfirmDemote'))) return\n setBusy(true)\n api<{ id: string }>('forget', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n id: suggestion.primaryId,\n scope,\n reason: '翻新清单降级',\n affects: '无',\n stillUseful: '可经 engram_restore 复原',\n }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbDemoteDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n return\n }\n if (suggestion.action === 'merge') {\n const n = suggestion.candidates.length + 1\n if (n < 2) {\n toast.push('warning', t('refurbMergeEmpty'))\n return\n }\n if (!window.confirm(t('refurbConfirmMerge', { n }))) return\n setBusy(true)\n // 透传 candidates:后端 runConsolidation 仅把这些 ids 当合并种子,其它条目仅在与种子相似时被并入。\n const candidates = [suggestion.primaryId, ...suggestion.candidates]\n api<Record<string, unknown>>('consolidate', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ scope, candidates }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbMergeDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n }\n }, [reload, onSelect, onAfterAction, toast, t, scope])\n if (report === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.refurb}>\n <div className={styles.refurbHead}>\n <span className={styles.refurbCount}>{t('refurbCount', { n: report.count })}</span>\n <button type=\"button\" className={styles.button} disabled={busy} onClick={reload}>{t('refurbRun')}</button>\n </div>\n {report.count === 0\n ? <div className={styles.expandLoading}>{t('refurbEmpty')}</div>\n : (\n <ul className={styles.refurbList}>\n {report.suggestions.map((suggestion, index) => (\n <li key={`${suggestion.action}-${suggestion.primaryId}-${index}`} className={styles.refurbItem}>\n <button type=\"button\" className={styles.refurbBadge} onClick={() => { onSelect(suggestion.primaryId) }}>\n {labelOf(suggestion.action)}\n </button>\n <div className={styles.refurbReason}>{suggestion.reason}</div>\n <span className={styles.refurbConfidence}>{(suggestion.confidence * 100).toFixed(0)}%</span>\n <button type=\"button\" className={`${styles.refurbExec} ${styles.button}`} disabled={busy}\n onClick={() => { execute(suggestion) }}>{t('refurbExecute')}</button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/** 走廊鸟瞰数据拉取与节点/边状态(命中 active + archived,forgotten 默认隐藏)。 */\ninterface CorridorGraph {\n readonly nodes: ReadonlyArray<{\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n readonly content?: string\n }>\n readonly edges: ReadonlyArray<{ readonly id: string; readonly from: string; readonly to: string; readonly type: string }>\n}\n\nfunction CorridorPanel({ t, scope, onSelect }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n onSelect: (id: string) => void\n}): React.ReactElement {\n const [graph, setGraph] = useState<CorridorGraph | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<CorridorGraph>(`corridor?status=active,archived&scope=${scope}`)\n .then(data => { if (!cancelled) setGraph(data); setFailed(null) })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope])\n if (failed !== null) return <div className={styles.expandLoading}>{t('corridorFailed')}:{failed}</div>\n if (graph === null) return <div className={styles.expandLoading}>{t('corridorLoad')}</div>\n if (graph.nodes.length === 0) return <div className={styles.empty}>{t('corridorEmpty')}</div>\n return <CorridorMap scope={scope} nodes={graph.nodes} edges={graph.edges} onSelect={onSelect} />\n}\n\n/** 宫殿健康分卡:5 维 0-100 + 总分 + 每维度进度条。 */\ninterface HealthReport {\n readonly overall: number\n readonly parts: ReadonlyArray<{\n readonly scope: string\n readonly score: number\n readonly signal: number\n readonly activeRatio: number\n readonly edgeCount: number\n readonly redacted: number\n readonly archivedRatio: number\n }>\n readonly evaluatedAt: number\n}\n\nfunction HealthScoreCard({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [report, setReport] = useState<HealthReport | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<HealthReport>(`health?scope=${scope}`)\n .then(data => { if (!cancelled) setReport(data); setFailed(null) })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope])\n if (failed !== null) return <div className={styles.expandLoading}>{t('healthFailed')}:{failed}</div>\n if (report === null) return <div className={styles.expandLoading}>{t('healthLoading')}</div>\n const tone = report.overall >= 80 ? 'good' : report.overall >= 50 ? 'mid' : 'low'\n return (\n <div className={styles.health}>\n <div className={`${styles.healthScore} ${tone === 'good' ? styles.healthScoreGood : tone === 'mid' ? styles.healthScoreMid : styles.healthScoreLow}`}>\n <b>{report.overall}</b>\n <span>/ 100</span>\n </div>\n <div className={styles.healthMetrics}>\n {report.parts.map(part => (\n <div key={part.scope} className={styles.healthMetric}>\n <div className={styles.healthMetricHead}>\n <span>{part.scope === 'user' ? t('scopeUser') : part.scope === 'project' ? t('scopeProject') : t('scopeShared')}</span>\n <b>{part.score}</b>\n </div>\n <div className={styles.healthMetricBar}>\n <i style={{ width: `${String(part.score)}%` }} />\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n/** 宫殿遥测:最近 7 天 op_log 聚合(写 / 摄取 / 整理 / 闭环等计数)。 */\ninterface TelemetrySnapshot {\n readonly windowDays: number\n readonly counts: {\n readonly writes: number\n readonly forgets: number\n readonly ingestRequests: number\n readonly ingestDones: number\n readonly distillRequests: number\n readonly consolidations: number\n }\n}\n\n/**\n * 管家日报整体条:tabs 上方常驻(原 KPI 条位置),scope 跟随 Header 全局三宫格。\n * 内容分两组横排:宫殿规模(房间 / 开放 / 闭馆 / 清晰度)+ 近 7 天活动五计数;\n * 数字与标签同行(baseline 对齐),标签 nowrap,杜绝窄卡换行。\n */\nfunction TelemetryBar({ t, scope }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n}): React.ReactElement {\n const [snap, setSnap] = useState<TelemetrySnapshot | null>(null)\n const [stats, setStats] = useState<StatsPart['stats'] | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n // 宫殿规模(stats)+ 近 7 天活动(telemetry)一次并行拉齐。\n Promise.all([\n api<TelemetrySnapshot>(`telemetry?days=7&scope=${scope}`),\n api<{ parts: StatsPart[] }>('stats'),\n ])\n .then(([tele, statRes]) => {\n if (cancelled) return\n setSnap(tele)\n setStats(statRes.parts.find(part => part.scope === scope)?.stats ?? null)\n setFailed(null)\n })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope])\n if (failed !== null) return <div className={styles.expandLoading}>{t('teleFailed')}:{failed}</div>\n if (snap === null) return <div className={styles.expandLoading}>{t('teleLoading')}</div>\n const items: Array<[string, number]> = [\n [t('teleWrites'), snap.counts.writes],\n [t('teleForgets'), snap.counts.forgets],\n [t('teleIngest'), snap.counts.ingestRequests],\n [t('teleDistill'), snap.counts.distillRequests],\n [t('teleConsolidate'), snap.counts.consolidations],\n ]\n return (\n <section className={styles.panelCard}>\n <div className={styles.panelCardTitle}>\n <h4>{t('teleTitle')}</h4>\n {/* 隐私元数据:叹号图标 + 短标签 + hover/聚焦弹出长说明,挂在卡片标题右侧。 */}\n <span className={styles.telePrivacy} role=\"note\" aria-label={t('telePrivacyHint')} tabIndex={0}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"7\" y1=\"6\" x2=\"7\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\"/>\n <circle cx=\"7\" cy=\"4.2\" r=\"0.7\" fill=\"currentColor\"/>\n </svg>\n <span className={styles.telePrivacyHint}>{t('telePrivacyHint')}</span>\n <span className={styles.telePrivacyTip} role=\"tooltip\">{t('telePrivacyTip')}</span>\n </span>\n </div>\n <div className={styles.teleBar}>\n {/* 左:规模 2×2;右:近 7 天 5 格。两区等高,组标题居左上小灰字。 */}\n <div className={styles.teleCol}>\n <span className={styles.teleColLabel}>{t('teleGroupScale')}</span>\n <div className={styles.teleGrid}>\n <div className={styles.teleStat}>\n <b>{stats?.total ?? 0}</b>\n <span>{t('kpiTotal')}</span>\n </div>\n <div className={styles.teleStat}>\n <b>{stats?.active ?? 0}</b>\n <span>{t('kpiActive')}</span>\n </div>\n <div className={styles.teleStat}>\n <b>{stats?.forgotten ?? 0}</b>\n <span>{t('kpiForgotten')}</span>\n </div>\n <div className={styles.teleStat} role=\"meter\" aria-valuemin={0} aria-valuemax={100}\n aria-valuenow={Math.round((stats?.signalRatio ?? 0) * 100)} aria-label={t('kpiSignal')}>\n <b>{`${String(Math.round((stats?.signalRatio ?? 0) * 100))}%`}</b>\n <span>{t('kpiSignal')}</span>\n </div>\n </div>\n </div>\n <div className={styles.teleCol}>\n <span className={styles.teleColLabel}>{t('teleGroupRecent')}</span>\n <div className={`${styles.teleGrid} ${styles.teleGridRecent}`}>\n {items.map(([label, value]) => (\n <div key={label} className={styles.teleStat}>\n <b>{value}</b>\n <span>{label}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n </section>\n )\n}\n\n/** 导出下拉:把三种格式(Markdown / JSON / 镜像目录)合并成一个按钮 + 弹出列表。 */\nfunction ExportMenu({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [open, setOpen] = useState(false)\n const wrapRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n if (!open) return\n const handler = (event: MouseEvent): void => {\n if (wrapRef.current === null || !wrapRef.current.contains(event.target as Node)) setOpen(false)\n }\n window.addEventListener('mousedown', handler)\n return () => { window.removeEventListener('mousedown', handler) }\n }, [open])\n const options: Array<{ label: string; hint: string; href: string }> = [\n { label: t('exportMd'), hint: t('exportMdHint'), href: `/api/engram/export?scope=${scope}&format=markdown` },\n { label: t('exportJson'), hint: t('exportJsonHint'), href: `/api/engram/export?scope=${scope}&format=json` },\n { label: t('exportMirror'), hint: t('exportMirrorHint'), href: `/api/engram/mirror?scope=${scope}` },\n ]\n return (\n <div className={styles.exportWrap} ref={wrapRef}>\n <button type=\"button\" className={styles.button} aria-haspopup=\"menu\" aria-expanded={open}\n onClick={() => { setOpen(value => !value) }}>\n {t('export')}\n <span className={styles.exportCaret} aria-hidden=\"true\">▾</span>\n </button>\n {open && (\n <div className={styles.exportMenu} role=\"menu\">\n {options.map(option => (\n <a key={option.href} role=\"menuitem\" className={styles.exportItem} href={option.href}\n onClick={() => { setOpen(false) }}>\n <span className={styles.exportItemLabel}>{option.label}</span>\n <span className={styles.exportItemHint}>{option.hint}</span>\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** 设置页「记忆库」section 主组件(t 由渲染器按 locale: NS 声明合成)。 */\nexport function EngramSection({ t }: PropsLocale<typeof NS>): React.ReactElement {\n const toast = useToast()\n /** 全局 scope(持久化):Header 三宫格是唯一切换器,驱动日报条、导览管家全部卡片、陈展列表与导出。 */\n const [scope, setScope] = usePersistedState<'user' | 'project' | 'shared'>('library.scope', 'user', ['user', 'project', 'shared'])\n /** 库顶 status / kind / q 过滤器(持久化)。 */\n const [status, setStatus] = usePersistedState<string>('library.status', 'all', ['all', 'active', 'archived', 'forgotten'])\n const [kind, setKind] = usePersistedState<string>('library.kind', 'all', ['all', 'fact', 'preference', 'decision', 'episode', 'skill'])\n const [q, setQ] = usePersistedString('library.q', '')\n /** 脱敏筛选已合并到顶部 KPI 与 tag 视觉,不再作为过滤器。 */\n const [redacted] = useState('all')\n const [offset, setOffset] = useState(0)\n const [list, setList] = useState<ListResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n /** 行内展开态:互斥的唯一展开条目(review 或 edit)。 */\n const [expanded, setExpanded] = useState<{ kind: 'review' | 'edit'; record: MemoryRow } | null>(null)\n const [reloadTick, setReloadTick] = useState(0)\n /** 批量选择:条目 id 集合(scope/过滤/翻页/搜索变更时清空)。 */\n const [selected, setSelected] = useState<ReadonlySet<string>>(new Set())\n /** 批量遗忘的两段式确认。 */\n const [confirmForget, setConfirmForget] = useState(false)\n /** Tab 视图:library 列表 / observability 召回与活动。 */\n const [activeTab, setActiveTab] = useState<'library' | 'observability'>('observability')\n\n const reload = useCallback((): void => { setReloadTick(tick => tick + 1) }, [])\n\n useEffect(() => {\n let cancelled = false\n const qs = new URLSearchParams({\n scope, status, kind, redacted, limit: String(PAGE_SIZE), offset: String(offset),\n })\n if (q !== '') qs.set('q', q)\n api<ListResult>(`list?${qs.toString()}`)\n .then((data) => { if (!cancelled) { setList(data); setError(null) } })\n .catch((loadError: Error) => { if (!cancelled) setError(loadError.message) })\n return () => { cancelled = true }\n }, [scope, status, kind, redacted, q, offset, reloadTick])\n\n const act = (route: string, record: MemoryRow): void => {\n api(route, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope }),\n })\n .then(reload)\n .catch((actError: Error) => { toast.push('error', actError.message) })\n }\n\n const toggle = (expandKind: 'review' | 'edit', record: MemoryRow): void => {\n setExpanded(current => (current !== null && current.kind === expandKind && current.record.id === record.id)\n ? null\n : { kind: expandKind, record })\n }\n\n const pageRecords = list?.records ?? []\n const selectedRecords = pageRecords.filter(record => selected.has(record.id))\n const forgetable = selectedRecords.filter(record => record.status === 'active').length\n const restorable = selectedRecords.length - forgetable\n const allSelected = pageRecords.length > 0 && pageRecords.every(record => selected.has(record.id))\n\n const toggleSelect = (id: string): void => {\n setSelected(current => {\n const next = new Set(current)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n const clearSelection = (): void => { setSelected(new Set()); setConfirmForget(false) }\n\n const toggleAllPage = (): void => {\n setSelected(current => {\n const next = new Set(current)\n if (allSelected) pageRecords.forEach(record => next.delete(record.id))\n else pageRecords.forEach(record => next.add(record.id))\n return next\n })\n }\n\n /** 批量执行:逐条调单条 API(回环毫秒级),单条失败不阻塞其余;完成即刷新并清空选择。 */\n const runBatch = (mode: 'forget' | 'restore'): void => {\n const targets = mode === 'forget'\n ? selectedRecords.filter(record => record.status === 'active')\n : selectedRecords.filter(record => record.status !== 'active')\n if (targets.length === 0) return\n void Promise.allSettled(targets.map(target => api(mode, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: target.id, scope: target.scope }),\n }))).then(() => { clearSelection(); reload() })\n }\n\n const armBatchForget = (): void => {\n // 确认态保持到用户点击确认执行或清空选择,不做自动复位(3 秒窗口曾导致执行落空)。\n if (confirmForget) { runBatch('forget'); return }\n setConfirmForget(true)\n }\n\n const page = Math.floor(offset / PAGE_SIZE) + 1\n const pages = list === null ? 1 : Math.max(1, Math.ceil(list.total / PAGE_SIZE))\n /** Segmented Control 玻璃指示器位置:根据选中按钮 DOM 测量。 */\n const segRefs = useRef<Map<string, HTMLButtonElement | null>>(new Map())\n const [segIndicator, setSegIndicator] = useState<{ left: number; width: number; opacity: number }>({ left: 0, width: 0, opacity: 0 })\n const measureSeg = useCallback((): void => {\n const node = segRefs.current.get(scope)\n if (node === null || node === undefined) return\n setSegIndicator({ left: node.offsetLeft, width: node.offsetWidth, opacity: 1 })\n }, [scope])\n useEffect(() => {\n measureSeg()\n const onResize = (): void => measureSeg()\n window.addEventListener('resize', onResize)\n return () => { window.removeEventListener('resize', onResize) }\n }, [measureSeg])\n\n return (\n <div className={styles.panel}>\n {/* Header:宫殿 Logo + 标题 + 简介 + 右侧动作按钮组。 */}\n <div className={styles.header}>\n <div className={styles.headerBrand}>\n <span className={styles.headerLogo} aria-hidden=\"true\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 48 48\" fill=\"none\">\n <path d=\"M6 20 L24 7 L42 20 Z\" fill=\"currentColor\" fillOpacity=\"0.9\"/>\n <rect x=\"9\" y=\"20\" width=\"30\" height=\"18\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"/>\n <rect x=\"13\" y=\"24\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <line x1=\"16\" y1=\"24\" x2=\"16\" y2=\"30\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"13\" y1=\"27\" x2=\"19\" y2=\"27\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M21 38 L21 28 Q21 25 24 25 Q27 25 27 28 L27 38\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\"/>\n <rect x=\"29\" y=\"24\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <line x1=\"32\" y1=\"24\" x2=\"32\" y2=\"30\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"29\" y1=\"27\" x2=\"35\" y2=\"27\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n </span>\n <div className={styles.headerTitle}>\n <h2>{t('headerTitle')}</h2>\n <p>{t('headerSubtitle')}</p>\n </div>\n </div>\n <div className={styles.headerActions}>\n <div className={`${styles.segGroup} ${styles.segScope}`}>\n <span className={styles.segIndicator}\n style={{ left: `${String(segIndicator.left)}px`, width: `${String(segIndicator.width)}px`, opacity: segIndicator.opacity }} />\n {(['user', 'project', 'shared'] as const).map(option => (\n <button key={option} type=\"button\" ref={node => { segRefs.current.set(option, node) }}\n className={scope === option ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setScope(option); setOffset(0); setExpanded(null); clearSelection() }}>\n {t(SCOPE_KEY[option])}\n </button>\n ))}\n </div>\n <button type=\"button\" className={styles.button} onClick={reload}>{t('refresh')}</button>\n <ExportMenu t={t} scope={scope} />\n </div>\n </div>\n\n {/* 管家日报整体条(tabs 上方常驻):宫殿规模 + 近 7 天活动;scope 跟随 Header 全局三宫格。 */}\n <TelemetryBar t={t} scope={scope} />\n\n {/* 顶部 Tab Bar:两个标签页(导览管家 / 宫殿陈展;按\"管家先\"语义排序)。 */}\n <div className={styles.tabs} role=\"tablist\">\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'observability' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'observability'}\n onClick={() => { setActiveTab('observability') }}>\n {t('tabObservability')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'library' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'library'}\n onClick={() => { setActiveTab('library') }}>\n {t('tabLibrary')}\n <small>{t('tabLibraryCount', { n: list?.total ?? 0 })}</small>\n </button>\n </div>\n\n {activeTab === 'library' && (\n <div className={styles.tabPanel}>\n <div className={styles.filters}>\n <div className={styles.segGroup}>\n {([\n ['all', t('allStatuses')],\n ['active', t('statusActive')],\n ['archived', t('statusArchived')],\n ['forgotten', t('statusForgotten')],\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={status === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setStatus(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n <div className={styles.segGroup}>\n {([\n ['all', t('allKinds')],\n ...KINDS.map(option => [option, kindLabel(t, option)] as const),\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={kind === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setKind(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('searchPlaceholder')} value={q}\n onChange={event => { setQ(event.target.value.trim()); setOffset(0); setExpanded(null); clearSelection() }} />\n </div>\n\n {selected.size > 0 && (\n <div className={styles.batchBar}>\n <span>{t('selectedCount', { n: selected.size })}</span>\n <button type=\"button\" className={styles.button} onClick={toggleAllPage}>\n {allSelected ? t('deselectAll') : t('selectAll')}\n </button>\n <button type=\"button\" className={styles.button} disabled={restorable === 0}\n onClick={() => runBatch('restore')}>{t('batchRestore', { n: restorable })}</button>\n <button type=\"button\"\n className={confirmForget ? `${styles.button} ${styles.danger}` : styles.button}\n disabled={forgetable === 0}\n onClick={armBatchForget}>\n {confirmForget ? t('batchForgetConfirm', { n: forgetable }) : t('batchForget', { n: forgetable })}\n </button>\n <button type=\"button\" className={styles.button} onClick={clearSelection}>{t('clearSelection')}</button>\n </div>\n )}\n\n {error !== null && (\n <div className={styles.empty}>\n <b>{t('loadFailed', { msg: error })}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n {error === null && list === null && (\n <div className={styles.skeletonList}>\n {[0, 1, 2, 3].map(index => (\n <div key={index} className={styles.skeleton} style={{ animationDelay: `${String(index * 60)}ms` }}><i /><i /><i /></div>\n ))}\n </div>\n )}\n {error === null && list !== null && list.records.length === 0 && (\n <div className={styles.empty}>\n <b>{t('empty')}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n\n {(list?.records ?? []).length > 0 && (\n <div className={styles.itemList}>\n {(list?.records ?? []).map((record, index) => (\n <div key={record.id}\n className={selected.has(record.id) ? `${styles.item} ${styles.selected}` : styles.item}\n style={{ animationDelay: `${String(Math.min(index, 12) * 36)}ms` }}>\n <input type=\"checkbox\" className={styles.itemCheck} checked={selected.has(record.id)}\n aria-label={record.content.slice(0, 24)} onChange={() => toggleSelect(record.id)} />\n <div className={styles.itemBody}>\n <div className={styles.itemTags}>\n <span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span>\n <span className={`${styles.pill} ${styles.kind}`}>{kindLabel(t, record.kind)}</span>\n {record.content.includes('[REDACTED:') && (\n <span className={`${styles.pill} ${styles.redacted}`}>{t('tagRedacted')}</span>\n )}\n {record.outcome !== undefined && (\n <span className={`${styles.pill} ${record.outcome === 'success' ? styles.outcomeSuccess : styles.outcomeFailure}`}>\n {record.outcome === 'success' ? t('tagOutcomeSuccess') : t('tagOutcomeFailure')}\n </span>\n )}\n <span className={styles.pill} title={fmtTime(record.createdAt)} style={{ marginLeft: 'auto' }}>\n {t(SCOPE_KEY[record.scope])} · {relTime(t, record.createdAt)}\n </span>\n </div>\n <div className={styles.content}>{record.content}</div>\n <div className={styles.itemMeta}>\n <span><b>{t('importance')}</b> {record.importance.toFixed(2)}</span>\n <span><b>{t('confidence')}</b> {record.confidence.toFixed(2)}</span>\n <span>{t('accessCount', { n: record.accessCount })}</span>\n <span>{sourceLabel(t, record)}</span>\n </div>\n </div>\n <div className={styles.itemOps}>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('review', record) }}>{t('detail')}</button>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('edit', record) }}>{t('edit')}</button>\n {record.status === 'active'\n ? <button type=\"button\" className={styles.button}\n onClick={() => { act('forget', record) }}>{t('forget')}</button>\n : <button type=\"button\" className={styles.button}\n onClick={() => { act('restore', record) }}>{t('restore')}</button>}\n </div>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.pager}>\n <button type=\"button\" className={styles.button} disabled={offset === 0} aria-label={t('prevPage')}\n onClick={() => { setOffset(Math.max(0, offset - PAGE_SIZE)); setExpanded(null); clearSelection() }}>‹</button>\n <span>{t('pagerInfo', { page, pages, total: list?.total ?? 0 })}</span>\n <button type=\"button\" className={styles.button} disabled={list === null || offset + PAGE_SIZE >= list.total}\n aria-label={t('nextPage')}\n onClick={() => { setOffset(offset + PAGE_SIZE); setExpanded(null); clearSelection() }}>›</button>\n </div>\n </div>\n )}\n\n {activeTab === 'observability' && (\n <div className={styles.tabPanel}>\n <div className={styles.layout}>\n <div className={styles.mainCol}>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('healthTitle')}</h4>\n <HealthScoreCard t={t} scope={scope} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('sectionCorridor')}</h4>\n <CorridorPanel t={t} scope={scope} onSelect={(id) => { setExpanded({ kind: 'review', record: list?.records.find(record => record.id === id) ?? ({ id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5, status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null } as MemoryRow) }) }} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('sectionBench')}</h4>\n <RecallBench t={t} scope={scope} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('refurbTitle')}</h4>\n {/* 翻新与走廊/检索同列:动作类信息聚簇(左 = 宫殿全局 + 整改)。 */}\n <RefurbCard t={t} scope={scope} onSelect={(id) => { setExpanded({ kind: 'review', record: list?.records.find(record => record.id === id) ?? ({ id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5, status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null } as MemoryRow) }) }} onAfterAction={reload} toast={toast} />\n </section>\n </div>\n <aside className={styles.sideCol}>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('tourProposalTitle')}</h4>\n <TourProposalCard t={t} scope={scope} onSelect={(id) => { setExpanded({ kind: 'review', record: list?.records.find(record => record.id === id) ?? ({ id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5, status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null } as MemoryRow) }) }} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('sectionActivity')}</h4>\n <ActivityFeed t={t} />\n </section>\n </aside>\n </div>\n </div>\n )}\n\n {/* Drawer:行内展开升级为右滑入聚焦态,避免列表被展开压塌。 */}\n {expanded !== null && (\n <>\n <div className={styles.drawerScrim} onClick={() => { setExpanded(null) }} />\n <aside className={styles.drawer} role=\"dialog\" aria-label={t('drawerTitle')}>\n <header className={styles.drawerHead}>\n <div className={styles.drawerTitle}>\n <h3>{t('drawerTitle')}</h3>\n <span title={expanded.record.id}>\n {`#${expanded.record.id.slice(0, 8)}…`}\n </span>\n </div>\n <button type=\"button\" className={styles.drawerClose} aria-label={t('drawerClose')}\n onClick={() => { setExpanded(null) }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 2 L12 12 M12 2 L2 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\n </svg>\n </button>\n </header>\n <div className={styles.drawerBody}>\n {expanded.kind === 'review'\n ? <ReviewBody t={t} recordId={expanded.record.id} scope={expanded.record.scope} />\n : <EditForm t={t} record={expanded.record} onClose={() => { setExpanded(null) }}\n onSaved={() => { setExpanded(null); reload() }} toast={toast} />}\n </div>\n </aside>\n </>\n )}\n {/* Toast 叠层(右上角,position:fixed 脱离 panel 容器)。 */}\n {toast.viewport}\n </div>\n )\n}\n","/**\n * 「记忆库」client 词典:zh/en 键并集必须完全一致(类型化注册的编译约束)。\n * 数据层英文枚举(status/kind/op 等)只在显示层映射,存储值保持英文不变。\n * @module @kenz1117/dsh-engram/client/locales\n */\n\n/** 词典命名空间(同时用作 LocaleNamespaceMap 的声明合并键)。 */\nexport const NS = 'engram'\n\n/** 「记忆库」全部界面文案键。 */\nexport type EngramKey =\n | 'nav'\n | 'scopeUser'\n | 'scopeProject'\n | 'scopeShared'\n | 'refresh'\n | 'exportMd'\n | 'exportJson'\n | 'export'\n | 'exportMirror'\n | 'exportMdHint'\n | 'exportJsonHint'\n | 'exportMirrorHint'\n | 'allStatuses'\n | 'allKinds'\n | 'redactedAll'\n | 'redactedOnly'\n | 'redactedNone'\n | 'tagRedacted'\n | 'tagOutcomeSuccess'\n | 'tagOutcomeFailure'\n | 'searchPlaceholder'\n | 'statusActive'\n | 'statusArchived'\n | 'statusForgotten'\n | 'kindFact'\n | 'kindPreference'\n | 'kindDecision'\n | 'kindEpisode'\n | 'kindSkill'\n | 'labelContent'\n | 'labelKind'\n | 'labelStatus'\n | 'labelScope'\n | 'importance'\n | 'confidence'\n | 'accessCount'\n | 'labelCreated'\n | 'timeJustNow'\n | 'timeMinutesAgo'\n | 'timeHoursAgo'\n | 'timeDaysAgo'\n | 'sourceExplicit'\n | 'sourceSession'\n | 'round'\n | 'cardActive'\n | 'cardRedacted'\n | 'signalRatio'\n | 'detail'\n | 'edit'\n | 'forget'\n | 'restore'\n | 'empty'\n | 'loadFailed'\n | 'loading'\n | 'pagerInfo'\n | 'prevPage'\n | 'nextPage'\n | 'cancel'\n | 'saveWithHint'\n | 'detailAttributes'\n | 'detailSource'\n | 'detailRelations'\n | 'detailOperations'\n | 'headerTitle'\n | 'headerSubtitle'\n | 'tabLibrary'\n | 'tabObservability'\n | 'tabLibraryCount'\n | 'drawerClose'\n | 'drawerTitle'\n | 'kpiTotal'\n | 'kpiActive'\n | 'kpiForgotten'\n | 'kpiSignal'\n | 'emptyHint'\n | 'relSupersededBy'\n | 'relSupersedes'\n | 'relContradicts'\n | 'relRelated'\n | 'opWrite'\n | 'opUpdate'\n | 'opForget'\n | 'opRestore'\n | 'opDecay'\n | 'opSuperseded'\n | 'opIngestRequest'\n | 'opIngestDone'\n | 'opOutcomeReport'\n | 'opSearchRewrite'\n | 'opCompressRequest'\n | 'opDistillRequest'\n | 'selectAll'\n | 'deselectAll'\n | 'selectedCount'\n | 'batchForget'\n | 'batchForgetConfirm'\n | 'batchRestore'\n | 'clearSelection'\n | 'sectionBench'\n | 'sectionCorridor'\n | 'corridorEmpty'\n | 'corridorFailed'\n | 'corridorLoad'\n | 'healthTitle'\n | 'healthLoading'\n | 'healthFailed'\n | 'healthMetricSignal'\n | 'healthMetricActive'\n | 'healthMetricCorridors'\n | 'healthMetricRedaction'\n | 'healthMetricDecay'\n | 'teleTitle'\n | 'teleFailed'\n | 'teleLoading'\n | 'teleGroupScale'\n | 'teleGroupRecent'\n | 'telePrivacyHint'\n | 'telePrivacyTip'\n | 'teleWrites'\n | 'teleForgets'\n | 'teleIngest'\n | 'teleDistill'\n | 'teleConsolidate'\n | 'benchPlaceholder'\n | 'benchRun'\n | 'benchScopeAll'\n | 'benchHits'\n | 'benchDegraded'\n | 'benchEmpty'\n | 'benchNote'\n | 'viaFts'\n | 'viaVec'\n | 'viaBoth'\n | 'viaEdgeLabel'\n | 'benchRewrite'\n | 'benchCompress'\n | 'sectionActivity'\n | 'activityEmpty'\n | 'detailRevisions'\n | 'tourProposalTitle'\n | 'tourProposalEmpty'\n | 'tourProposalHint'\n | 'tourFocusAll'\n | 'refurbTitle'\n | 'refurbEmpty'\n | 'refurbRun'\n | 'refurbActionDemote'\n | 'refurbActionMerge'\n | 'refurbActionReview'\n | 'refurbActionSplit'\n | 'refurbCount'\n | 'refurbExecute'\n | 'refurbConfirmDemote'\n | 'refurbConfirmMerge'\n | 'refurbDemoteDone'\n | 'refurbMergeDone'\n | 'refurbActionFailed'\n | 'refurbMergeEmpty'\n/** 中文词典(宿主默认语言)。整页采用「记忆宫殿」语言:楼 / 房间 / 楼层 / 铭牌 / 参观 / 管家 / 走廊。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定以保证编译约束。 */\nexport const zh: Record<EngramKey, string> = {\n nav: '记忆宫殿',\n scopeUser: '私人宫殿',\n scopeProject: '项目宫殿',\n scopeShared: '共享宫殿',\n refresh: '重访',\n exportMd: '导出 MD',\n exportJson: '导出 JSON',\n export: '导出',\n exportMirror: '镜像目录',\n exportMdHint: '单文件,可直接分享',\n exportJsonHint: '结构化全文,便于程序处理',\n exportMirrorHint: '每房间一个 .md,可用 Obsidian 漫游',\n allStatuses: '全部房间',\n allKinds: '全部楼层',\n redactedAll: '全部铭牌',\n redactedOnly: '含涂改',\n redactedNone: '无涂改',\n tagRedacted: '已涂改',\n tagOutcomeSuccess: '管家验证·有效',\n tagOutcomeFailure: '管家验证·失效',\n searchPlaceholder: '在宫殿里寻找…',\n statusActive: '对外开放',\n statusArchived: '展厅陈列',\n statusForgotten: '已闭馆',\n kindFact: '事实层',\n kindPreference: '偏好层',\n kindDecision: '决策层',\n kindEpisode: '事件层',\n kindSkill: '技能层',\n labelContent: '铭牌',\n labelKind: '楼层',\n labelStatus: '房门状态',\n labelScope: '宫殿归属',\n importance: '地标亮度',\n confidence: '考据可靠度',\n accessCount: '参观 {n} 人次',\n labelCreated: '开馆时间',\n timeJustNow: '方才',\n timeMinutesAgo: '{n} 分钟前',\n timeHoursAgo: '{n} 小时前',\n timeDaysAgo: '{n} 天前',\n sourceExplicit: '管理员添置',\n sourceSession: '发掘地 {id}',\n round: '第 {n} 趟',\n cardActive: '开放 {n}',\n cardRedacted: '涂改 {n}',\n signalRatio: '走廊清晰度 {n}%',\n detail: '参观',\n edit: '修缮',\n forget: '封门',\n restore: '重开',\n empty: '宫殿暂无可陈展的房间',\n emptyHint: '试试调整楼层筛选,或新添一间',\n loadFailed: '访客受挫:{msg}',\n loading: '导览中…',\n pagerInfo: '第 {page} / {pages} 层 · 共 {total} 间',\n prevPage: '上层',\n nextPage: '下层',\n cancel: '作罢',\n saveWithHint: '修缮(旧铭牌归展厅)',\n detailAttributes: '铭牌',\n detailSource: '发掘地',\n detailRelations: '邻接走廊',\n detailOperations: '管家日志',\n relSupersededBy: '被替代',\n relSupersedes: '替代',\n relContradicts: '互斥',\n relRelated: '相邻',\n headerTitle: '记忆宫殿',\n headerSubtitle: '跨会话长期记忆宫殿',\n tabLibrary: '宫殿陈展',\n tabObservability: '导览管家',\n tabLibraryCount: '{n} 间',\n drawerClose: '归殿',\n drawerTitle: '房间铭牌',\n kpiTotal: '房间',\n kpiActive: '开放',\n kpiForgotten: '闭馆',\n kpiSignal: '清晰度',\n opWrite: '落成',\n opUpdate: '修缮',\n opForget: '封门',\n opRestore: '重开',\n opDecay: '闭门陈列',\n opSuperseded: '被替代',\n opIngestRequest: '发掘请求',\n opIngestDone: '发掘完成',\n opOutcomeReport: '管家验证',\n opSearchRewrite: '路线改写',\n opCompressRequest: '导览压缩',\n opDistillRequest: '重塑楼层',\n selectAll: '本页全选',\n deselectAll: '取消全选',\n selectedCount: '已选 {n} 间',\n batchForget: '批量封门({n})',\n batchForgetConfirm: '确认封门 {n} 间?',\n batchRestore: '批量重开({n})',\n clearSelection: '清空所选',\n sectionBench: '试走一遍',\n sectionCorridor: '走廊鸟瞰',\n corridorEmpty: '走廊空空如也,落成几间房间后这里会出现鸟瞰图。',\n corridorFailed: '走廊加载失败',\n corridorLoad: '加载走廊鸟瞰…',\n healthTitle: '宫殿健康分',\n healthLoading: '正在诊脉…',\n healthFailed: '诊脉失败',\n healthMetricSignal: '走廊清晰度',\n healthMetricActive: '对外开放率',\n healthMetricCorridors: '走廊密度',\n healthMetricRedaction: '涂改缓解',\n healthMetricDecay: '衰减覆盖',\n teleTitle: '管家日报',\n teleFailed: '遥测加载失败',\n teleLoading: '聚合管家记录中…',\n teleGroupScale: '规模',\n teleGroupRecent: '近 7 天',\n telePrivacyHint: '数据仅在本机聚合 · 不外传',\n telePrivacyTip: '所有 op_log 与遥测计数只在当前进程的 SQLite 里聚合,从未发送至任何外部服务;本机重启或卸载插件即清空。',\n teleWrites: '落成',\n teleForgets: '闭馆',\n teleIngest: '发掘',\n teleDistill: '蒸馏',\n teleConsolidate: '整理',\n benchPlaceholder: '说出要找的房间关键词或语义…',\n benchRun: '出发',\n benchScopeAll: '全部宫殿',\n benchHits: '到访 {n} 间',\n benchDegraded: '语义灯熄,仅关键词引路',\n benchEmpty: '此路不通',\n benchNote: '试走与正式导览共用同一张地图,会计入参观人次',\n viaFts: '关键词',\n viaVec: '语义',\n viaBoth: '双路',\n viaEdgeLabel: '邻接走廊',\n benchRewrite: '路线改写为 {n} 段',\n benchCompress: '铭牌压缩 {n} 条',\n sectionActivity: '管家日志',\n activityEmpty: '暂无管家活动',\n detailRevisions: '陈展沿革',\n tourProposalTitle: '入殿导航',\n tourProposalEmpty: '宫殿尚空,建议先放第一段记忆(调用 engram_save)',\n tourProposalHint: '点击房间可展开抽屉查看铭牌',\n tourFocusAll: '全部',\n refurbTitle: '翻新清单',\n refurbEmpty: '所有房间状态健康,无翻新建议',\n refurbRun: '重新扫描',\n refurbActionDemote: '降级',\n refurbActionMerge: '合并',\n refurbActionReview: '复习',\n refurbActionSplit: '拆分',\n refurbCount: '{n} 条建议',\n refurbExecute: '执行',\n refurbConfirmDemote: '确认降级此房间?执行后状态转 archived,可在统计页恢复。',\n refurbConfirmMerge: '确认合并 {n} 间相似房间?将触发 engram_distill 把多间归纳为 1 条高层规律。',\n refurbDemoteDone: '已降级',\n refurbMergeDone: '合并任务已派发',\n refurbActionFailed: '执行失败:{msg}',\n refurbMergeEmpty: '无可合并的候选条目',\n}\n\n/** 英文词典。整页采用「Memory Palace」语言:palace / room / floor / placard / tour / curator / corridor。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定。 */\nexport const en: Record<EngramKey, string> = {\n nav: 'Memory Palace',\n scopeUser: 'Private Palace',\n scopeProject: 'Project Palace',\n scopeShared: 'Shared Palace',\n refresh: 'Revisit',\n exportMd: 'Export MD',\n exportJson: 'Export JSON',\n export: 'Export',\n exportMirror: 'Mirror tree',\n exportMdHint: 'Single file, easy to share',\n exportJsonHint: 'Structured full dump for scripts',\n exportMirrorHint: 'One .md per room, roamable in Obsidian',\n allStatuses: 'All rooms',\n allKinds: 'All floors',\n redactedAll: 'All placards',\n redactedOnly: 'Redacted',\n redactedNone: 'Unredacted',\n tagRedacted: 'redacted',\n tagOutcomeSuccess: 'curator: worked',\n tagOutcomeFailure: 'curator: failed',\n searchPlaceholder: 'Wander the palace…',\n statusActive: 'open to public',\n statusArchived: 'on display',\n statusForgotten: 'closed',\n kindFact: 'Fact Floor',\n kindPreference: 'Preference Floor',\n kindDecision: 'Decision Floor',\n kindEpisode: 'Episode Floor',\n kindSkill: 'Skill Floor',\n labelContent: 'Placard',\n labelKind: 'Floor',\n labelStatus: 'Door',\n labelScope: 'Palace',\n importance: 'Beacon',\n confidence: 'Provenance',\n accessCount: '{n} visits',\n labelCreated: 'Opened',\n timeJustNow: 'just now',\n timeMinutesAgo: '{n} min ago',\n timeHoursAgo: '{n} hr ago',\n timeDaysAgo: '{n} d ago',\n sourceExplicit: 'Curator placed',\n sourceSession: 'Excavated at {id}',\n round: 'pass {n}',\n cardActive: '{n} open',\n cardRedacted: '{n} redacted',\n signalRatio: 'corridor clarity {n}%',\n detail: 'Tour',\n edit: 'Renovate',\n forget: 'Close',\n restore: 'Reopen',\n empty: 'No exhibits to display',\n emptyHint: 'Adjust the floors above, or place a new room',\n loadFailed: 'Tour halted: {msg}',\n loading: 'Guiding…',\n pagerInfo: 'Floor {page} / {pages} · {total} rooms',\n prevPage: 'Floor up',\n nextPage: 'Floor down',\n cancel: 'Cancel',\n saveWithHint: 'Renovate (archive old placard)',\n detailAttributes: 'Placard',\n detailSource: 'Excavation',\n detailRelations: 'Corridors',\n detailOperations: 'Curator log',\n relSupersededBy: 'Superseded by',\n relSupersedes: 'Supersedes',\n relContradicts: 'Contradicts',\n relRelated: 'Adjacent',\n headerTitle: 'Memory Palace',\n headerSubtitle: 'Cross-session long-term memory palace',\n tabLibrary: 'Palace',\n tabObservability: 'Tour butler',\n tabLibraryCount: '{n} rooms',\n drawerClose: 'Return',\n drawerTitle: 'Room placard',\n kpiTotal: 'Rooms',\n kpiActive: 'Open',\n kpiForgotten: 'Closed',\n kpiSignal: 'Clarity',\n opWrite: 'opened',\n opUpdate: 'renovated',\n opForget: 'closed',\n opRestore: 'reopened',\n opDecay: 'archived',\n opSuperseded: 'superseded',\n opIngestRequest: 'excavation requested',\n opIngestDone: 'excavated',\n opOutcomeReport: 'curator report',\n opSearchRewrite: 'route rewritten',\n opCompressRequest: 'placard compressed',\n opDistillRequest: 'floor remodelled',\n selectAll: 'Select all on floor',\n deselectAll: 'Deselect all',\n selectedCount: '{n} rooms',\n batchForget: 'Close selected ({n})',\n batchForgetConfirm: 'Close {n} rooms?',\n batchRestore: 'Reopen selected ({n})',\n clearSelection: 'Clear selection',\n sectionBench: 'Take a walk',\n sectionCorridor: 'Corridor overview',\n corridorEmpty: 'No rooms yet — the bird’s-eye view appears after a few rooms open.',\n corridorFailed: 'Failed to load corridor',\n corridorLoad: 'Loading corridor overview…',\n healthTitle: 'Palace health',\n healthLoading: 'Taking pulse…',\n healthFailed: 'Pulse failed',\n healthMetricSignal: 'Corridor clarity',\n healthMetricActive: 'Open ratio',\n healthMetricCorridors: 'Corridor density',\n healthMetricRedaction: 'Redaction relief',\n healthMetricDecay: 'Decay coverage',\n teleTitle: 'Curator log',\n teleFailed: 'Telemetry failed',\n teleLoading: 'Aggregating curator events…',\n teleGroupScale: 'Scale',\n teleGroupRecent: 'Last 7 days',\n telePrivacyHint: 'Local aggregation only · never transmitted',\n telePrivacyTip: 'All op_log and telemetry counters are aggregated in this process\\u2019s SQLite only; nothing is sent to any external service. Clearing the plugin or restarting the host wipes the data.',\n teleWrites: 'Opened',\n teleForgets: 'Closed',\n teleIngest: 'Excavated',\n teleDistill: 'Distilled',\n teleConsolidate: 'Consolidated',\n benchPlaceholder: 'Name a room by keyword or meaning…',\n benchRun: 'Walk',\n benchScopeAll: 'All palaces',\n benchHits: '{n} rooms found',\n benchDegraded: 'Beacon dark · keyword lane only',\n benchEmpty: 'No route found',\n benchNote: 'Walk uses the same map as the guided tour and counts as a visit',\n viaFts: 'keyword',\n viaVec: 'semantic',\n viaBoth: 'dual',\n viaEdgeLabel: 'corridor',\n benchRewrite: 'route split into {n}',\n benchCompress: 'compressed {n} overflow placards',\n sectionActivity: 'Curator log',\n activityEmpty: 'No curator activity yet',\n detailRevisions: 'Exhibit history',\n tourProposalTitle: 'Tour proposal',\n tourProposalEmpty: 'The palace is empty — place a first room via engram_save',\n tourProposalHint: 'Click a room to open its placard',\n tourFocusAll: 'All',\n refurbTitle: 'Refurb suggestions',\n refurbEmpty: 'All rooms are healthy — no suggestions',\n refurbRun: 'Re-scan',\n refurbActionDemote: 'demote',\n refurbActionMerge: 'merge',\n refurbActionReview: 'review',\n refurbActionSplit: 'split',\n refurbCount: '{n} suggestions',\n refurbExecute: 'Apply',\n refurbConfirmDemote: 'Demote this room? Status will become archived; you can reopen it later.',\n refurbConfirmMerge: 'Merge {n} similar rooms? This triggers engram_distill to fold them into one higher-level pattern.',\n refurbDemoteDone: 'Demoted',\n refurbMergeDone: 'Merge dispatched',\n refurbActionFailed: 'Action failed: {msg}',\n refurbMergeEmpty: 'No merge candidates',\n}\n","/**\n * dsh-engram client half: 注册设置页「记忆库」section。\n * 数据经回环 API(/api/engram/*)读取与操作,与 host 半的路由对齐。\n * 文案经宿主 locale 服务(zh/en 词典,语言切换由渲染器自动重渲染)。\n * @module @kenz1117/dsh-engram/client\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\n// Type-only: ctx.locale 服务声明(宿主 locale 插件的 Context merge)。\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: ctx.slots(renderer 的 SlotMap 渲染接线)。\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\n// Type-only: settings.section 槽位的 SlotMap merge(ui-settings 契约)。\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\n// Type-only: LocaleNamespaceMap 声明合并目标(t 席位的键类型检查)。\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport { EngramSection } from './EngramPanel.tsx'\nimport { NS, en, zh, type EngramKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n [NS]: EngramKey\n }\n}\n\n/** 必需服务:slots 渲染接线 + locale 词典注册。 */\nexport const inject = ['slots', 'locale']\n\n/**\n * Client plugin body: 注册 zh/en 词典与设置页「记忆库」section(order 20,\n * 排在 general/models/plugins 之后)。\n * @param ctx - client root context.\n */\nexport function apply(ctx: Context): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-engram: dictionaries')\n const t = ctx.locale.bind(NS)\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'engram',\n order: 20,\n label: () => t('nav'),\n locale: NS,\n }, EngramSection))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["useMemo","useRef","useState","styles","styles","useState","useRef","useCallback","useState","useCallback","styles","useState","useCallback","useRef"],"sources":["../src/client/CorridorMap.tsx","../src/client/Toast.tsx","../src/client/UiStorage.ts","../src/client/EngramPanel.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * 走廊鸟瞰图:中度版力导向 + 拖拽 + hover 邻居高亮 + 响应式 viewBox。\n *\n * 设计要点:\n * 1. 冷却调度 alpha 1.0 → 0.1(240 tick),保证收敛不抖。\n * 2. drag 节点:mousedown 抓住 → mousemove 改写 vx/vy 为 0(吸附鼠标)→ mouseup 释放。\n * 3. hover 节点:该节点 + 一跳邻居 + 关联边高亮,其他 0.15 透明。\n * 4. tooltip 显示完整铭牌(沿用 SVG <title> 标签 + 自定义 <foreignObject> HTML tooltip 增强可读性)。\n * 5. viewBox 自适应容器宽度(preserveAspectRatio=\"xMidYMid meet\"),固定 560x320 逻辑坐标。\n *\n * @module @kenz1117/dsh-engram/client/CorridorMap\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport styles from './panel.module.css'\n\ninterface CorridorNode {\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n /** 后端可选字段:完整铭牌(用于 tooltip)。 */\n readonly content?: string\n}\ninterface CorridorEdge {\n readonly id: string\n readonly from: string\n readonly to: string\n readonly type: string\n}\n\n/** 楼层色板:5 个语义色相。 */\nconst FLOOR_PALETTE: Readonly<Record<string, string>> = {\n fact: '#5b8def',\n preference: '#f0a85c',\n decision: '#9b6bd9',\n episode: '#3cb489',\n skill: '#e26b86',\n}\nconst FLOOR_LABEL: Readonly<Record<string, string>> = {\n fact: '事实层',\n preference: '偏好层',\n decision: '决策层',\n episode: '事件层',\n skill: '技能层',\n}\n\n/** 边视觉语义。dash 显式允许 undefined:exactOptionalPropertyTypes 下字面量表无需逐项删键。 */\ntype EdgeStyle = { color: string; dash?: string | undefined; width: number }\nconst EDGE_STYLE: Readonly<Record<string, EdgeStyle>> = {\n related: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n refines: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supports: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supersedes:{ color: 'rgba(91, 141, 239, 0.85)', dash: undefined, width: 1.8 },\n contradicts:{ color: 'rgba(226, 107, 134, 0.9)', dash: '4 4', width: 1.4 },\n}\n\ninterface PositionedNode extends CorridorNode {\n x: number\n y: number\n vx: number\n vy: number\n r: number\n /** 是否被用户拖拽中(拖拽时禁用 tick 力更新)。 */\n fixed: boolean\n}\n\ninterface CorridorMapProps {\n readonly scope: 'user' | 'project' | 'shared'\n readonly nodes: readonly CorridorNode[]\n readonly edges: readonly CorridorEdge[]\n readonly onSelect?: (id: string) => void\n readonly selectedId?: string\n}\n\n/** 节点半径。 */\nfunction nodeRadius(n: CorridorNode): number {\n return Math.max(4, Math.min(14, 4 + 10 * n.importance * n.confidence))\n}\n\n/** 单步力更新(带冷却 alpha)。 */\nfunction step(nodes: PositionedNode[], edges: readonly CorridorEdge[], width: number, height: number, alpha: number): void {\n const REPLUSION = 4800\n const SPRING_LEN = 64\n const SPRING_K = 0.04\n const CENTER_K = 0.003\n const FLOOR_K = 0.005\n // 排斥力:平方反比(带 alpha 冷却)。\n for (let i = 0; i < nodes.length; i += 1) {\n const a = nodes[i]!\n for (let j = i + 1; j < nodes.length; j += 1) {\n const b = nodes[j]!\n const dx = a.x - b.x\n const dy = a.y - b.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (REPLUSION * alpha) / (dist * dist)\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n }\n // 弹簧力。\n const nodeMap = new Map<string, PositionedNode>(nodes.map(n => [n.id, n]))\n for (const edge of edges) {\n const a = nodeMap.get(edge.from)\n const b = nodeMap.get(edge.to)\n if (a === undefined || b === undefined) continue\n const dx = b.x - a.x\n const dy = b.y - a.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (dist - SPRING_LEN) * SPRING_K * alpha\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n // 中心引力 + 楼层水平分簇。\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n for (const n of nodes) {\n if (n.fixed) continue\n n.vx += (width / 2 - n.x) * CENTER_K * alpha\n n.vy += (height / 2 - n.y) * CENTER_K * alpha\n const idx = kinds.indexOf(n.kind)\n if (idx >= 0) {\n const target = band * (idx + 0.5)\n n.vx += (target - n.x) * FLOOR_K * alpha\n }\n }\n // 阻尼 + 边界。\n const DAMPING = 0.82\n for (const n of nodes) {\n if (n.fixed) { n.vx = 0; n.vy = 0; continue }\n n.vx *= DAMPING\n n.vy *= DAMPING\n n.x = Math.max(20, Math.min(width - 20, n.x + n.vx))\n n.y = Math.max(20, Math.min(height - 20, n.y + n.vy))\n }\n}\n\n/** 走廊鸟瞰组件。 */\nexport function CorridorMap(props: CorridorMapProps): ReactElement {\n const { scope, nodes, edges, onSelect, selectedId } = props\n const width = 560\n const height = 320\n /** 邻居表:node id → 邻居 id 集合(含一跳)。 */\n const neighborMap = useMemo(() => {\n const map = new Map<string, Set<string>>()\n for (const n of nodes) map.set(n.id, new Set())\n for (const e of edges) {\n if (!map.has(e.from)) map.set(e.from, new Set())\n if (!map.has(e.to)) map.set(e.to, new Set())\n map.get(e.from)!.add(e.to)\n map.get(e.to)!.add(e.from)\n }\n return map\n }, [nodes, edges])\n /** 起始布局:按楼层水平均分带,垂直随机抖动。 */\n const initialNodes = useMemo<PositionedNode[]>(() => {\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n return nodes.map((n, index) => ({\n ...n,\n x: kinds.indexOf(n.kind) >= 0 ? band * (kinds.indexOf(n.kind) + 0.5) : width / 2,\n y: 30 + ((index * 47) % (height - 60)),\n vx: 0, vy: 0,\n r: nodeRadius(n),\n fixed: false,\n }))\n }, [nodes, width, height])\n const positionsRef = useRef<PositionedNode[]>(initialNodes.map(n => ({ ...n })))\n const [, forceRender] = useState(0)\n const animRef = useRef<number | null>(null)\n const tickRef = useRef(0)\n const totalTicks = 280\n // 初始化 / 重置:拷贝新布局并清零 tick。\n useEffect(() => {\n positionsRef.current = initialNodes.map(n => ({ ...n }))\n tickRef.current = 0\n forceRender(value => value + 1)\n }, [initialNodes])\n // 力导向主循环:requestAnimationFrame,alpha 1.0 → 0.1。\n useEffect(() => {\n const tick = (): void => {\n const nodesArr = positionsRef.current\n tickRef.current += 1\n const alpha = Math.max(0.1, 1 - (tickRef.current / totalTicks) * 0.9)\n step(nodesArr, edges, width, height, alpha)\n // 触发 React 重渲染(不可变快照:拷贝一次引用)。\n positionsRef.current = nodesArr.map(n => ({ ...n }))\n forceRender(value => value + 1)\n if (tickRef.current < totalTicks) animRef.current = requestAnimationFrame(tick)\n }\n animRef.current = requestAnimationFrame(tick)\n return () => { if (animRef.current !== null) cancelAnimationFrame(animRef.current) }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- tick 仅在新 nodes/edges 时重启\n }, [initialNodes, edges])\n const positions = positionsRef.current\n const posMap = useMemo(() => new Map(positions.map(p => [p.id, p])), [positions])\n const floors = useMemo(() => [...new Set(nodes.map(n => n.kind))], [nodes])\n /** hover 高亮:当前节点 id → 邻居 id 集合;null = 不高亮。 */\n const [hoverId, setHoverId] = useState<string | null>(null)\n const hoverNeighbors = useMemo(() => {\n if (hoverId === null) return null\n return neighborMap.get(hoverId) ?? new Set<string>()\n }, [hoverId, neighborMap])\n const isFaded = (nId: string): boolean => hoverId !== null && nId !== hoverId && !(hoverNeighbors?.has(nId) ?? false)\n const isEdgeHighlighted = (e: CorridorEdge): boolean => {\n if (hoverId === null) return false\n return e.from === hoverId || e.to === hoverId\n }\n /** drag:mousedown 抓住节点 → mousemove 改 vx/vy 为 0 → mouseup 释放。 */\n const svgRef = useRef<SVGSVGElement | null>(null)\n const dragIdRef = useRef<string | null>(null)\n const svgToScreen = (clientX: number, clientY: number): { x: number; y: number } | null => {\n const svg = svgRef.current\n if (svg === null) return null\n const rect = svg.getBoundingClientRect()\n // viewBox 0 0 width height,preserveAspectRatio meet → 等比缩放,逻辑坐标 = 屏幕坐标 * (width / rect.width)\n const scaleX = width / rect.width\n const scaleY = height / rect.height\n return { x: (clientX - rect.left) * scaleX, y: (clientY - rect.top) * scaleY }\n }\n const onNodeMouseDown = (event: React.MouseEvent<SVGGElement>, nodeId: string): void => {\n event.preventDefault()\n dragIdRef.current = nodeId\n const node = positionsRef.current.find(n => n.id === nodeId)\n if (node !== undefined) node.fixed = true\n }\n useEffect(() => {\n const handleMove = (event: MouseEvent): void => {\n const id = dragIdRef.current\n if (id === null) return\n const pos = svgToScreen(event.clientX, event.clientY)\n if (pos === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node === undefined) return\n node.x = Math.max(20, Math.min(width - 20, pos.x))\n node.y = Math.max(20, Math.min(height - 20, pos.y))\n node.vx = 0\n node.vy = 0\n forceRender(value => value + 1)\n }\n const handleUp = (): void => {\n const id = dragIdRef.current\n if (id === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node !== undefined) node.fixed = false\n dragIdRef.current = null\n }\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleUp)\n return () => {\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleUp)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n if (nodes.length === 0) {\n return <div className={styles.empty}>走廊空空如也,落成几间房间后这里会出现鸟瞰图。</div>\n }\n\n return (\n <div className={styles.mapWrap}>\n <svg ref={svgRef} viewBox={`0 0 ${String(width)} ${String(height)}`} className={styles.map}\n preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label=\"走廊鸟瞰图\" key={scope}>\n {/* 楼层背景带(斑马纹区隔)。scope 切换通过父 svg key 重挂载触发 fade-in。 */}\n {floors.map((kind, idx) => {\n const band = width / Math.max(floors.length, 1)\n return <rect key={kind} x={band * idx} y={0} width={band} height={height} fill={idx % 2 === 0 ? 'rgba(127,127,127,0.04)' : 'transparent'} />\n })}\n {/* 楼层标签条顶部。 */}\n {floors.map((kind, idx) => {\n const band = width / Math.max(floors.length, 1)\n return (\n <text key={`${kind}-label`} x={band * (idx + 0.5)} y={14} textAnchor=\"middle\"\n fill=\"rgba(127,127,127,0.7)\" fontSize=\"10\" fontFamily=\"ui-sans-serif, system-ui\">\n {FLOOR_LABEL[kind] ?? kind}\n </text>\n )\n })}\n {/* 走廊边:高亮时画弹簧弧线(quadratic 曲线 + 垂直凸起 6px),其他边保持直线。\n 用 stagger-delay 让边按 from 节点索引依次淡入,强化「地图刷新」感。 */}\n {edges.map((edge, idx) => {\n const a = posMap.get(edge.from)\n const b = posMap.get(edge.to)\n if (a === undefined || b === undefined) return null\n const style = EDGE_STYLE[edge.type] ?? EDGE_STYLE.related!\n const highlighted = isEdgeHighlighted(edge)\n const faded = hoverId !== null && !highlighted\n if (highlighted) {\n // 垂直中点偏移:构造弹簧视觉。\n const mx = (a.x + b.x) / 2\n const my = (a.y + b.y) / 2\n const dx = b.x - a.x\n const dy = b.y - a.y\n const length = Math.sqrt(dx * dx + dy * dy) || 1\n const offsetX = (-dy / length) * 6\n const offsetY = (dx / length) * 6\n return (\n <path key={edge.id} d={`M ${String(a.x)} ${String(a.y)} Q ${String(mx + offsetX)} ${String(my + offsetY)} ${String(b.x)} ${String(b.y)}`}\n fill=\"none\" stroke={style.color}\n strokeWidth={style.width + 1.2} strokeDasharray={style.dash}\n style={{ transition: 'stroke-width 200ms ease, d 240ms ease' }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </path>\n )\n }\n return (\n <line key={edge.id} x1={a.x} y1={a.y} x2={b.x} y2={b.y}\n stroke={style.color} strokeWidth={style.width}\n strokeDasharray={style.dash} opacity={faded ? 0.1 : 1}\n className={styles.edgeFade}\n style={{ transition: 'opacity 200ms ease, stroke-width 200ms ease', animationDelay: `${String(Math.min(idx, 24) * 24)}ms` }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </line>\n )\n })}\n {/* 房间节点。 */}\n {positions.map((n, index) => {\n const color = FLOOR_PALETTE[n.kind] ?? '#7d8590'\n const isSelected = selectedId === n.id\n const isHovered = hoverId === n.id\n const faded = isFaded(n.id)\n return (\n <g key={n.id} className={styles.node} transform={`translate(${String(n.x)} ${String(n.y)})`}\n style={{ cursor: dragIdRef.current === n.id ? 'grabbing' : 'grab', opacity: faded ? 0.15 : 1, transition: 'opacity 200ms ease', animationDelay: `${String(Math.min(index, 24) * 24)}ms` }}\n onMouseEnter={() => { setHoverId(n.id) }}\n onMouseLeave={() => { setHoverId(prev => prev === n.id ? null : prev) }}\n onMouseDown={event => onNodeMouseDown(event, n.id)}\n onClick={() => onSelect?.(n.id)}>\n {/* hover 时画一圈柔光外晕。 */}\n {(isHovered || isSelected) && (\n <circle r={String(n.r + 6)} fill={color} fillOpacity={0.18} />\n )}\n <circle r={String(n.r)} fill={color} fillOpacity={n.status === 'active' ? 0.88 : 0.42}\n stroke={isSelected ? 'var(--dsw-alias-brand-primary)' : isHovered ? color : 'rgba(255,255,255,0.9)'}\n strokeWidth={isSelected ? 2 : isHovered ? 1.5 : 1}\n style={{ transition: 'stroke 160ms ease, stroke-width 160ms ease' }}>\n <title>{`${n.title}(${n.kind}/${n.status})`}</title>\n </circle>\n {isSelected && <circle r={String(n.r + 4)} fill=\"none\" stroke={color} strokeOpacity={0.4} strokeWidth={1} />}\n </g>\n )\n })}\n {/* hover tooltip:HTML 浮层,显示完整铭牌(用 SVG <text> 简易渲染)。 */}\n {hoverId !== null && (() => {\n const node = posMap.get(hoverId)\n if (node === undefined) return null\n const tx = Math.min(width - 180, Math.max(8, node.x + 14))\n const ty = Math.min(height - 60, Math.max(28, node.y - 16))\n const fullContent = (node.content ?? node.title).slice(0, 120)\n return (\n <g className={styles.tooltip} transform={`translate(${String(tx)} ${String(ty)})`}>\n <rect x={0} y={0} width={176} height={48} rx={6} ry={6}\n fill=\"var(--dsw-alias-bg-base)\" stroke=\"var(--dsw-alias-border-l2)\" strokeWidth={1} opacity={0.96} />\n <text x={8} y={16} fill=\"var(--dsw-alias-label-primary)\" fontSize=\"11\" fontWeight={600}\n fontFamily=\"ui-sans-serif, system-ui\">{FLOOR_LABEL[node.kind] ?? node.kind}</text>\n <text x={8} y={32} fill=\"var(--dsw-alias-label-secondary)\" fontSize=\"10\"\n fontFamily=\"ui-sans-serif, system-ui\">{`${fullContent}${(node.content ?? node.title).length > 120 ? '…' : ''}`}</text>\n </g>\n )\n })()}\n </svg>\n <div className={styles.legend}>\n {floors.map(kind => (\n <span key={kind} className={styles.legendItem}>\n <span className={styles.legendDot} style={{ background: FLOOR_PALETTE[kind] ?? '#7d8590' }} />\n {FLOOR_LABEL[kind] ?? kind}\n </span>\n ))}\n <span className={styles.legendItem}>{nodes.length} 间 · {edges.length} 条走廊</span>\n </div>\n <div className={styles.legend} style={{ marginTop: 2 }}>\n {Object.entries(EDGE_STYLE).map(([type, style]) => (\n <span key={type} className={styles.legendItem}>\n <svg width={20} height={6} aria-hidden=\"true\">\n <line x1={0} y1={3} x2={20} y2={3} stroke={style.color} strokeWidth={style.width} strokeDasharray={style.dash} />\n </svg>\n <span>{type === 'supersedes' ? '推陈出新' : type === 'contradicts' ? '互斥' : '相邻 / 支持 / 提炼'}</span>\n </span>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * 轻量 Toast:右上角叠层通知,3 秒自动消失,hover 暂停。\n * 4 种语义:info / success / error / warning(图标与配色由样式表决定,文案一律走调用方传入的字符串)。\n * confirm 不归本 hook 管——那是对话框决策,保留 window.confirm 以免破坏流程语义。\n * @module @kenz1117/dsh-engram/client/Toast\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport styles from './panel.module.css'\n\n/** Toast 语义类型。 */\nexport type ToastKind = 'info' | 'success' | 'error' | 'warning'\n\n/** 单条 Toast。 */\ninterface ToastItem {\n readonly id: number\n readonly kind: ToastKind\n readonly message: string\n readonly duration: number\n}\n\nconst DEFAULT_DURATION: Record<ToastKind, number> = {\n info: 3000,\n success: 3000,\n warning: 5000,\n error: 5000,\n}\n\n/** 顺序自增 id 源(避免 useEffect 依赖 Date.now)。 */\nlet toastIdCursor = 0\n\n/**\n * 把 toasts 数组渲染为右上角浮层。每帧返回新 ReactElement,调用方挂在面板根节点末尾。\n * hover 期间不消失(由 useToast 内部维护 timers 控制)。\n */\nfunction ToastViewport({ items, onDismiss }: {\n readonly items: readonly ToastItem[]\n readonly onDismiss: (id: number) => void\n}): React.ReactElement {\n return (\n <div className={styles.toastViewport} role=\"region\" aria-live=\"polite\" aria-label=\"notifications\">\n {items.map(toast => {\n const kindClass = toast.kind === 'success' ? styles.toastSuccess\n : toast.kind === 'error' ? styles.toastError\n : toast.kind === 'warning' ? styles.toastWarning\n : styles.toastInfo\n return (\n <div key={toast.id}\n className={`${styles.toast} ${kindClass}`}\n role={toast.kind === 'error' || toast.kind === 'warning' ? 'alert' : 'status'}>\n <span className={styles.toastBody}>{toast.message}</span>\n <button type=\"button\" className={styles.toastDismiss} aria-label=\"dismiss\"\n onClick={() => { onDismiss(toast.id) }}>×</button>\n </div>\n )\n })}\n </div>\n )\n}\n\n/** Toast hook 返回:toasts 列表 + push 函数 + 渲染节点。 */\nexport interface ToastController {\n readonly toasts: readonly ToastItem[]\n readonly push: (kind: ToastKind, message: string, duration?: number) => void\n readonly dismiss: (id: number) => void\n readonly viewport: React.ReactElement\n}\n\nexport function useToast(): ToastController {\n const [toasts, setToasts] = useState<readonly ToastItem[]>([])\n // 计时器表:id → setTimeout handle,方便 dismiss 取消。\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map())\n\n const dismiss = useCallback((id: number) => {\n setToasts(current => current.filter(toast => toast.id !== id))\n const timer = timersRef.current.get(id)\n if (timer !== undefined) {\n clearTimeout(timer)\n timersRef.current.delete(id)\n }\n }, [])\n\n const push = useCallback((kind: ToastKind, message: string, duration?: number) => {\n toastIdCursor += 1\n const id = toastIdCursor\n const ms = duration ?? DEFAULT_DURATION[kind]\n const item: ToastItem = { id, kind, message, duration: ms }\n setToasts(current => [...current, item])\n const timer = setTimeout(() => { dismiss(id) }, ms)\n timersRef.current.set(id, timer)\n }, [dismiss])\n\n useEffect(() => () => {\n for (const timer of timersRef.current.values()) clearTimeout(timer)\n timersRef.current.clear()\n }, [])\n\n const viewport = (\n <ToastViewport items={toasts} onDismiss={dismiss} />\n )\n\n return { toasts, push, dismiss, viewport }\n}","/**\n * UI 偏好持久化 hook:把任意 React state 同步到 localStorage,统一包名空间 dsh-engram.ui.*,\n * 隐私模式或存储失败时回退到默认值;非法值也降级默认。\n * 设计:包名空间 + key 后缀,避免与宿主/其它插件冲突。\n * @module @kenz1117/dsh-engram/client/UiStorage\n */\n\nimport { useCallback, useEffect, useState } from 'react'\n\n/** 命名空间:所有 key 都加此前缀。 */\nconst NAMESPACE = 'dsh-engram.ui'\n\n/** 防御性读:localStorage 抛错(隐私模式 / 禁用)返回 undefined。 */\nfunction safeGet(key: string): string | undefined {\n try { return window.localStorage.getItem(key) ?? undefined } catch { return undefined }\n}\n\n/** 防御性写:失败静默(UI 状态本身不依赖写回成功)。 */\nfunction safeSet(key: string, value: string): void {\n try { window.localStorage.setItem(key, value) } catch { /* 静默 */ }\n}\n\n/** 类型守卫:判断 raw 是否为合法值集合中的某一项。 */\nfunction isValid<T>(raw: string | undefined, allow: readonly T[]): raw is string & T {\n if (raw === undefined) return false\n return (allow as readonly unknown[]).includes(raw)\n}\n\n/**\n * 持久化 state:与 useState 同语义,初值惰性从 localStorage 读取,变更时同步写回。\n * @param suffix - localStorage key 后缀(不含包名空间)。\n * @param fallback - 默认值(首次进入或读取失败时使用)。\n * @param allow - 合法值白名单;同时用于入参校验与持久化校验。\n */\nexport function usePersistedState<T extends string>(\n suffix: string,\n fallback: T,\n allow: readonly T[],\n): [T, (next: T) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<T>(() => {\n const raw = safeGet(key)\n return isValid<T>(raw, allow) ? raw : fallback\n })\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: T) => { setValue(next) }, [])\n return [value, update]\n}\n\n/** 任意字符串持久化:无 allow 白名单,q 这种自由输入适用。 */\nexport function usePersistedString(\n suffix: string,\n fallback: string,\n): [string, (next: string) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<string>(() => safeGet(key) ?? fallback)\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: string) => { setValue(next) }, [])\n return [value, update]\n}","/**\n * 记忆库设置面板:统计卡片、过滤列表、批量操作、编辑(取代链)、遗忘/恢复、导出。\n * 数据经回环 API(/api/engram/*)读写;详情与编辑为条目下方行内展开\n * (不嵌套弹窗);文案全部走宿主 locale 词典(zh/en),语言切换自动\n * 重渲染;数据层英文枚举(status/kind/op)只在显示层映射;内容节点\n * 一律 DOM/JSX 构建(防 XSS)。\n * @module @kenz1117/dsh-engram/client/EngramPanel\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport styles from './panel.module.css'\nimport { NS, type EngramKey } from './locales.ts'\nimport { CorridorMap } from './CorridorMap.tsx'\nimport { useToast, type ToastController } from './Toast.tsx'\nimport { usePersistedState, usePersistedString } from './UiStorage.ts'\n\n/** 列表/详情用的记忆视图(宿主 /api/engram/list 的行结构)。 */\ninterface MemoryRow {\n readonly id: string\n readonly scope: 'user' | 'project' | 'shared'\n readonly kind: string\n readonly content: string\n readonly importance: number\n readonly confidence: number\n readonly status: 'active' | 'archived' | 'forgotten'\n /** 最近一次使用效果回报(engram_report 写入;未回报过缺省)。 */\n readonly outcome?: 'success' | 'failure'\n readonly createdAt: number\n readonly accessCount: number\n readonly sourceSessionId: string | null\n readonly sourceRound: number | null\n /** 桩位(v0.7.2 起;未排桩时缺省)。 */\n readonly slot?: { readonly room: string; readonly index: number }\n}\n\ninterface ListResult {\n readonly records: MemoryRow[]\n readonly total: number\n}\n\ninterface StatsPart {\n readonly scope: 'user' | 'project' | 'shared'\n readonly stats: {\n readonly total: number\n readonly active: number\n readonly archived: number\n readonly forgotten: number\n readonly redacted: number\n readonly signalRatio: number\n }\n}\n\n/** review API 的返回结构(详情行内展开区的数据源)。 */\ninterface ReviewView {\n readonly record: MemoryRow\n readonly supersededBy?: readonly string[]\n readonly supersedes?: readonly string[]\n readonly contradicts?: readonly string[]\n readonly related?: readonly string[]\n /** 修订历史(旧内容快照,按被取代时间倒序)。 */\n readonly revisions?: readonly { content: string; kind: string; importance: number; supersededAt: number }[]\n readonly operations?: readonly { at: number; op: string; detail: string | null }[]\n}\n\n/** 面板内部传递的翻译函数(渲染器按注册的 locale 声明合成的 t 的窄化签名)。 */\ntype T = (key: EngramKey, params?: Record<string, unknown>) => string\n\n/** kind 数据值(存储层英文枚举,编辑表单下拉的 value 保持英文)。 */\nconst KINDS = ['fact', 'preference', 'decision', 'episode', 'skill'] as const\nconst PAGE_SIZE = 20\n\n/** 数据层枚举 → 词典键映射(显示层本地化,存储值不变)。 */\nconst STATUS_KEY: Record<MemoryRow['status'], EngramKey> = {\n active: 'statusActive',\n archived: 'statusArchived',\n forgotten: 'statusForgotten',\n}\nconst KIND_KEY: Record<string, EngramKey> = {\n fact: 'kindFact',\n preference: 'kindPreference',\n decision: 'kindDecision',\n episode: 'kindEpisode',\n skill: 'kindSkill',\n}\nconst SCOPE_KEY: Record<MemoryRow['scope'], EngramKey> = {\n user: 'scopeUser',\n project: 'scopeProject',\n shared: 'scopeShared',\n}\nconst OP_KEY: Record<string, EngramKey> = {\n write: 'opWrite',\n update: 'opUpdate',\n forget: 'opForget',\n restore: 'opRestore',\n decay: 'opDecay',\n superseded: 'opSuperseded',\n 'ingest-request': 'opIngestRequest',\n 'ingest-done': 'opIngestDone',\n 'outcome-report': 'opOutcomeReport',\n 'search-rewrite-request': 'opSearchRewrite',\n 'compress-request': 'opCompressRequest',\n 'distill-request': 'opDistillRequest',\n}\nconst REL_KEY: Record<string, EngramKey> = {\n supersededBy: 'relSupersededBy',\n supersedes: 'relSupersedes',\n contradicts: 'relContradicts',\n related: 'relRelated',\n}\n/** 操作日志 detail JSON 的已知键 → 词典键(write/update/superseded 的小对象)。 */\nconst DETAIL_KEY: Record<string, EngramKey> = {\n kind: 'labelKind',\n scope: 'labelScope',\n status: 'labelStatus',\n}\n\n/** kind 数据值 → 本地化标签(未知值回退原文)。 */\nfunction kindLabel(t: T, kind: string): string {\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n}\n\n/** op 数据值 → 本地化标签(未知值回退原文)。 */\nfunction opLabel(t: T, op: string): string {\n const key = OP_KEY[op]\n return key === undefined ? op : t(key)\n}\n\n/** 操作日志 detail 的本地化:write/update/superseded 的小对象转中文键值;摄取/蒸馏请求的完整 JSON 保持原样(审计诚实性优先)。 */\nfunction formatOpDetail(t: T, op: string, detail: string | null): string {\n if (detail === null) return ''\n if (op !== 'write' && op !== 'update' && op !== 'superseded') return ` ${detail}`\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n const entries = Object.entries(parsed)\n if (entries.length === 0) return ` ${detail}`\n return ' ' + entries.map(([key, value]) => {\n const label = DETAIL_KEY[key]\n if (label === undefined) return `${key}=${String(value)}`\n if (key === 'kind' && typeof value === 'string') return `${t(label)}=${kindLabel(t, value)}`\n if (key === 'scope' && (value === 'user' || value === 'project')) return `${t(label)}=${t(SCOPE_KEY[value])}`\n return `${t(label)}=${String(value)}`\n }).join(' · ')\n } catch {\n return ` ${detail}`\n }\n}\n\n/** 来源会话展示片段:截短的会话 id + 可选轮次。 */\nfunction sourceLabel(t: T, record: Pick<MemoryRow, 'sourceSessionId' | 'sourceRound'>): string {\n if (record.sourceSessionId === null) return t('sourceExplicit')\n const id = `${record.sourceSessionId.slice(0, 16)}…`\n const withRound = record.sourceRound === null\n ? id\n : `${id} ${t('round', { n: record.sourceRound })}`\n return t('sourceSession', { id: withRound })\n}\n\nasync function api<T>(path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(`/api/engram/${path}`, init)\n const body = (await response.json()) as T & { error?: string }\n if (!response.ok) throw new Error(body.error ?? `HTTP ${String(response.status)}`)\n return body\n}\n\n/** 绝对时间(审计时间线等需要精确时刻的位置)。 */\nfunction fmtTime(ms: number): string {\n // 时间格式跟随浏览器环境语言(宿主界面语言通常与浏览器一致)。\n return new Date(ms).toLocaleString(navigator.language || 'zh-CN', { hour12: false })\n}\n\n/** 列表用的相对时间:1 分钟内「刚刚」,其后按分钟/小时/天取整。 */\nfunction relTime(t: T, ms: number): string {\n const diff = Math.max(0, Date.now() - ms)\n const minutes = Math.floor(diff / 60_000)\n if (minutes < 1) return t('timeJustNow')\n if (minutes < 60) return t('timeMinutesAgo', { n: minutes })\n const hours = Math.floor(minutes / 60)\n if (hours < 48) return t('timeHoursAgo', { n: hours })\n return t('timeDaysAgo', { n: Math.floor(hours / 24) })\n}\n\n/** 细仪表条:重要性(品牌色)与置信(成功色)共用,conf 变体换色。 */\nfunction Meter({ value, conf }: { value: number; conf?: boolean }): React.ReactElement {\n return (\n <span className={conf === true ? `${styles.meter} ${styles.conf}` : styles.meter}>\n <i style={{ width: `${String(Math.round(Math.min(1, Math.max(0, value)) * 100))}%` }} />\n </span>\n )\n}\n\n/** 关系 id 列表 → 等宽字体 chips(完整 id 放 title)。 */\nfunction RelChips({ ids }: { ids: readonly string[] }): React.ReactElement {\n return (\n <div className={styles.relChips}>\n {ids.map(id => <span key={id} className={styles.relChip} title={id}>{id.slice(0, 18)}</span>)}\n </div>\n )\n}\n\n/** 行内审计区:属性网格 + 关系 chips + 操作时间线(review API)。 */\nfunction ReviewBody({ t, recordId, scope }: {\n t: T\n recordId: string\n scope: 'user' | 'project' | 'shared'\n}): React.ReactElement {\n const [view, setView] = useState<ReviewView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<ReviewView>(`review?scope=${scope}&id=${encodeURIComponent(recordId)}`)\n .then((data) => { if (!cancelled) setView(data) })\n .catch((error: Error) => { if (!cancelled) setFailed(error.message) })\n return () => { cancelled = true }\n }, [recordId, scope, t])\n if (failed !== null) return <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>\n if (view === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n const { record } = view\n const relations = (['supersededBy', 'supersedes', 'contradicts', 'related'] as const)\n .map(key => ({ key, label: REL_KEY[key], ids: view[key] ?? [] }))\n .filter(entry => entry.ids.length > 0)\n const operations = view.operations ?? []\n return (\n <div className={styles.reviewGrid}>\n <div>\n <dl className={styles.attrGrid}>\n <dt>{t('labelContent')}</dt>\n <dd>{record.content}</dd>\n <dt>{t('labelKind')}</dt>\n <dd><span className={`${styles.pill} ${styles.kind}`}>{kindLabel(t, record.kind)}</span></dd>\n <dt>{t('labelStatus')}</dt>\n <dd><span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span></dd>\n <dt>{t('importance')}</dt>\n <dd>{record.importance.toFixed(2)}<Meter value={record.importance} /></dd>\n <dt>{t('confidence')}</dt>\n <dd>{record.confidence.toFixed(2)}<Meter value={record.confidence} conf /></dd>\n <dt>{t('detailSource')}</dt>\n <dd>{sourceLabel(t, record)}</dd>\n <dt>{t('labelCreated')}</dt>\n <dd>{fmtTime(record.createdAt)}</dd>\n </dl>\n {relations.map(({ key, label, ids }) => (\n <div key={key} className={styles.relBlock}>\n <h5>{label === undefined ? key : t(label)}</h5>\n <RelChips ids={ids} />\n </div>\n ))}\n </div>\n <div>\n {(view.revisions ?? []).length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailRevisions')}</h5>\n <ul className={styles.timeline}>\n {view.revisions!.map((rev, index) => (\n <li key={index}>\n <time>{fmtTime(rev.supersededAt)}</time>\n <b>{kindLabel(t, rev.kind)}</b>\n {' '}{rev.content}\n </li>\n ))}\n </ul>\n </div>\n )}\n {operations.length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailOperations')}</h5>\n <ul className={styles.timeline}>\n {operations.map((op, index) => (\n <li key={index}>\n <time>{fmtTime(op.at)}</time>\n <b>{opLabel(t, op.op)}</b>\n {formatOpDetail(t, op.op, op.detail)}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/** 行内编辑表单:内容/种类/重要性 → POST update(旧条目归档,取代链保留)。 */\nfunction EditForm({ t, record, onClose, onSaved, toast }: {\n t: T\n record: MemoryRow\n onClose: () => void\n onSaved: () => void\n toast: ToastController\n}): React.ReactElement {\n const [content, setContent] = useState(record.content)\n const [kind, setKind] = useState(record.kind)\n const [importance, setImportance] = useState(record.importance)\n const save = (): void => {\n api('update', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope, content, kind, importance }),\n })\n .then(onSaved)\n .catch((error: Error) => { toast.push('error', error.message) })\n }\n return (\n <div className={styles.editForm}>\n <div>\n <label className={styles.fieldLabel}>{t('labelContent')}</label>\n <textarea className={styles.input} rows={3} value={content} onChange={event => setContent(event.target.value)} />\n </div>\n <div>\n <label className={styles.fieldLabel}>{t('labelKind')}</label>\n {/* option 的 value 保持数据层英文枚举,仅显示文本本地化。 */}\n <select className={styles.input} value={kind} onChange={event => setKind(event.target.value)}>\n {KINDS.map(option => <option key={option} value={option}>{kindLabel(t, option)}</option>)}\n </select>\n </div>\n <div className={styles.fieldRow}>\n <div>\n <label className={styles.fieldLabel}>{`${t('importance')} ${importance.toFixed(2)}`}</label>\n <input type=\"range\" min={0} max={1} step={0.05} value={importance}\n onChange={event => setImportance(Number(event.target.value))} />\n </div>\n </div>\n <div className={styles.modalFoot}>\n <button type=\"button\" className={styles.button} onClick={onClose}>{t('cancel')}</button>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`} onClick={save}>{t('saveWithHint')}</button>\n </div>\n </div>\n )\n}\n\n/** search-test API 的命中行。 */\ninterface BenchHit {\n readonly id: string\n readonly score: number\n readonly via: 'fts' | 'vec' | 'both'\n readonly viaEdge?: { readonly from: string; readonly type: string }\n readonly scope: string\n readonly kind: string\n readonly content: string\n}\n\n/** search-test API 的返回结构。 */\ninterface BenchResult {\n readonly degraded: boolean\n readonly hits: readonly BenchHit[]\n}\n\n/** activity API 的行结构(两库 op_log 合并)。 */\ninterface ActivityRow {\n readonly at: number\n readonly op: string\n readonly targetId: string\n readonly detail: string | null\n readonly scope: 'user' | 'project'\n}\n\n/** 命中道 → 词典键。 */\nconst VIA_KEY: Record<BenchHit['via'], EngramKey> = { fts: 'viaFts', vec: 'viaVec', both: 'viaBoth' }\n\n/** 召回测试台:输入查询跑真实检索,展示得分、命中原委(关键词/语义/边扩展)与内容。 */\nfunction RecallBench({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [query, setQuery] = useState('')\n /** 默认随观察 scope,但用户可在 select 内手动切换 'all' / 其它;切换观察 scope 时重置。 */\n const [benchScope, setBenchScope] = useState<string>(scope)\n const [result, setResult] = useState<BenchResult | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // 观察 scope 变化时同步 benchScope(用户在 select 里改过的「all」会被覆盖——刻意保持一致性)。\n useEffect(() => { setBenchScope(scope) }, [scope])\n const run = (): void => {\n if (query.trim() === '' || busy) return\n setBusy(true)\n api<BenchResult>(`search-test?q=${encodeURIComponent(query.trim())}&scope=${benchScope}`)\n .then((data) => { setResult(data); setError(null) })\n .catch((benchError: Error) => setError(benchError.message))\n .finally(() => setBusy(false))\n }\n const hits = result?.hits ?? []\n return (\n <div>\n <div className={styles.benchBar}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('benchPlaceholder')} value={query}\n onChange={event => setQuery(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter') run() }} />\n <select className={styles.input} value={benchScope}\n onChange={event => setBenchScope(event.target.value)}>\n <option value=\"all\">{t('benchScopeAll')}</option>\n <option value=\"user\">{t('scopeUser')}</option>\n <option value=\"project\">{t('scopeProject')}</option>\n <option value=\"shared\">{t('scopeShared')}</option>\n </select>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n disabled={busy || query.trim() === ''} onClick={run}>{t('benchRun')}</button>\n </div>\n {error !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: error })}</div>}\n {result !== null && error === null && (\n <div className={styles.benchMeta}>\n <span>{t('benchHits', { n: hits.length })}</span>\n {result.degraded && <span className={styles.degradedNote}>{t('benchDegraded')}</span>}\n </div>\n )}\n <div className={styles.benchList}>\n {hits.map(hit => (\n <div key={hit.id} className={styles.benchRow}>\n <div className={styles.benchHead}>\n <span className={styles.viaChip}>{t(VIA_KEY[hit.via])}</span>\n {hit.viaEdge !== undefined && (\n <span className={styles.viaChip}\n title={`${hit.viaEdge.type} ${hit.viaEdge.from}`}>{t('viaEdgeLabel')} · {hit.viaEdge.type}</span>\n )}\n <span className={`${styles.pill} ${styles.kind}`}>{kindLabel(t, hit.kind)}</span>\n <span className={styles.benchScore}>{hit.score.toFixed(4)}</span>\n </div>\n <div className={styles.benchContent}>{hit.content}</div>\n <span className={styles.benchId} title={hit.id}>{hit.id}</span>\n </div>\n ))}\n </div>\n {result !== null && hits.length === 0 && error === null && (\n <div className={styles.benchEmpty}>{t('benchEmpty')}</div>\n )}\n </div>\n )\n}\n\n/** 活动日志 detail 的摘要:摄取/改写/压缩请求解析 JSON 字段,其余原样截断。\n 窄侧栏下文本应尽量短,长详情交给 title 悬浮展示。 */\nfunction activityDetail(t: T, detail: string | null): string {\n if (detail === null) return ''\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n if (typeof parsed.round === 'number' && typeof parsed.userText === 'string') {\n const mode = typeof parsed.mode === 'string' ? ` · ${parsed.mode}` : ''\n return `${t('round', { n: parsed.round })}${mode} · ${parsed.userText.slice(0, 48)}`\n }\n if (typeof parsed.query === 'string' && Array.isArray(parsed.queries)) {\n return `${t('benchRewrite', { n: parsed.queries.length })} · ${parsed.query.slice(0, 36)}`\n }\n if (typeof parsed.count === 'number' && Object.keys(parsed).length === 1) {\n return t('benchCompress', { n: parsed.count })\n }\n } catch {\n // 非 JSON(outcome 值等):走末尾原样截断。\n }\n return detail.length > 56 ? `${detail.slice(0, 56)}…` : detail\n}\n\n/** 最近活动:两库 op_log 合并倒序,摄取/检索改写/压缩/蒸馏/条目操作全貌可见。 */\nfunction ActivityFeed({ t }: { t: T }): React.ReactElement {\n const [rows, setRows] = useState<ActivityRow[] | null>(null)\n useEffect(() => {\n let cancelled = false\n api<{ operations: ActivityRow[] }>('activity?limit=20')\n .then((data) => { if (!cancelled) setRows(data.operations) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [])\n if (rows === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n if (rows.length === 0) return <div className={styles.expandLoading}>{t('activityEmpty')}</div>\n return (\n // activityList:管家日志限高 280px + 内部滚动,避免 20 条满载把观察页整列拉长。\n <ul className={`${styles.timeline} ${styles.activityList}`}>\n {rows.map((op, index) => (\n <li key={index}>\n <span className={styles.actTime}>{relTime(t, op.at)}</span>\n <b>{opLabel(t, op.op)}</b>\n <span className={styles.actScope}>{op.scope === 'user' ? t('scopeUser') : t('scopeProject')}</span>\n <div className={styles.actBody} title={op.detail ?? ''}>{activityDetail(t, op.detail)}</div>\n </li>\n ))}\n </ul>\n )\n}\n\n/** review-due API 的行结构(只给线索:坐标/门牌/逾期天数,不给正文——检索练习的刻意设计)。 */\ninterface ReviewDueItem {\n readonly id: string\n readonly kind: string\n readonly slot?: { readonly room: string; readonly index: number }\n readonly caption: string | null\n readonly nextReviewAt: number | null\n readonly overdueDays: number\n readonly reps: number\n}\n\n/** 今日待回忆:检索练习卡片。线索先行 → 揭示正文 → 三档自评(记得/模糊/忘了 → SM-2 grade 5/3/1)推进调度。\n * onAnswered 供 Header 角标同步递减。 */\nfunction ReviewQueueCard({ t, scope, toast, onAnswered }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n toast: ToastController\n onAnswered: () => void\n}): React.ReactElement {\n const [items, setItems] = useState<ReviewDueItem[] | null>(null)\n /** 已揭示的条目正文(id → content)。 */\n const [revealed, setRevealed] = useState<Readonly<Record<string, string>>>({})\n const [busyId, setBusyId] = useState<string | null>(null)\n const reload = useCallback(() => {\n api<{ items: ReviewDueItem[] }>(`review-due?scope=${scope}`)\n .then(data => { setItems(data.items); setRevealed({}) })\n .catch((error: Error) => { toast.push('error', error.message); setItems([]) })\n }, [scope, toast])\n useEffect(() => { reload() }, [reload])\n /** 揭示:拉完整正文(复用 review 路由),用户核对回忆是否准确。 */\n const reveal = (id: string): void => {\n setBusyId(id)\n api<ReviewView>(`review?scope=${scope}&id=${encodeURIComponent(id)}`)\n .then(view => { setRevealed(current => ({ ...current, [id]: view.record.content })) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusyId(null) })\n }\n /** 自评:提交 grade 并把该条移出今日队列。 */\n const answer = (item: ReviewDueItem, grade: 1 | 3 | 5): void => {\n setBusyId(item.id)\n api<{ review: { nextReviewAt: number | null; intervalDays: number } | null }>('review-answer', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: item.id, scope, grade }),\n })\n .then(result => {\n setItems(current => current?.filter(row => row.id !== item.id) ?? null)\n const days = result.review?.intervalDays ?? 1\n toast.push('success', t('reviewScheduled', { n: days }))\n onAnswered()\n })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusyId(null) })\n }\n if (items === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n if (items.length === 0) return <div className={styles.expandLoading}>{t('reviewQueueEmpty')}</div>\n return (\n <ul className={styles.reviewQueue}>\n {items.map(item => (\n <li key={item.id} className={styles.reviewItem}>\n <div className={styles.reviewCue}>\n <span className={`${styles.pill} ${styles.kind}`}>{kindLabel(t, item.kind)}</span>\n {item.slot !== undefined && <span className={styles.reviewSlot}>{item.slot.room}#{item.slot.index}</span>}\n <span className={styles.reviewCaption}>{item.caption ?? t('reviewNoPlacard')}</span>\n <span className={styles.reviewOverdue}>\n {item.overdueDays > 0 ? t('reviewOverdue', { n: item.overdueDays }) : t('reviewDueToday')}\n </span>\n </div>\n {revealed[item.id] === undefined\n ? (\n <button type=\"button\" className={styles.button} disabled={busyId === item.id}\n onClick={() => { reveal(item.id) }}>{t('reviewReveal')}</button>\n )\n : (\n <>\n <div className={styles.reviewContent}>{revealed[item.id]}</div>\n <div className={styles.reviewGrades}>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`} disabled={busyId === item.id}\n onClick={() => { answer(item, 5) }}>{t('reviewGradeRemember')}</button>\n <button type=\"button\" className={styles.button} disabled={busyId === item.id}\n onClick={() => { answer(item, 3) }}>{t('reviewGradeVague')}</button>\n <button type=\"button\" className={styles.button} disabled={busyId === item.id}\n onClick={() => { answer(item, 1) }}>{t('reviewGradeForgot')}</button>\n </div>\n </>\n )}\n </li>\n ))}\n </ul>\n )\n}\n\n/** 入殿导航:根据当前 scope 的 active 房间给出开场邀请 + 候选房间列表;点击可展开抽屉。\n * 顶部 kind chip(全部 / fact / preference / decision / episode / skill)切换 focusKind,\n * 触发后端按该 kind 优先选前 N 间作为开场建议。 */\nfunction TourProposalCard({ t, scope, onSelect }: { t: T; scope: 'user' | 'project' | 'shared'; onSelect: (id: string) => void }): React.ReactElement {\n interface Stop { id: string; kind: string; content: string; importance: number; confidence: number }\n interface Proposal { greeting: string; activeCount: number; empty: boolean; suggestedStops: readonly Stop[] }\n const KINDS_FOCUS = ['', 'fact', 'preference', 'decision', 'episode', 'skill'] as const\n const [focusKind, setFocusKind] = usePersistedState<string>('tour.focusKind', '', KINDS_FOCUS)\n const [proposal, setProposal] = useState<Proposal | null>(null)\n useEffect(() => {\n let cancelled = false\n const path = focusKind === ''\n ? `tour-proposal?scope=${scope}`\n : `tour-proposal?scope=${scope}&focusKind=${focusKind}`\n api<Proposal>(path)\n .then((data) => { if (!cancelled) setProposal(data) })\n .catch(() => { if (!cancelled) setProposal({ greeting: t('tourProposalEmpty'), activeCount: 0, empty: true, suggestedStops: [] }) })\n return () => { cancelled = true }\n }, [t, scope, focusKind])\n const labelKind = (kind: string): string => {\n if (kind === '') return t('tourFocusAll')\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n }\n if (proposal === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.tourProposal}>\n <div className={styles.tourFocusRow} role=\"tablist\" aria-label=\"focus-kind\">\n {KINDS_FOCUS.map(kind => (\n <button key={kind || 'all'} type=\"button\" role=\"tab\"\n aria-selected={focusKind === kind}\n className={focusKind === kind ? `${styles.tourFocusChip} ${styles.tourFocusChipOn}` : styles.tourFocusChip}\n onClick={() => { setFocusKind(kind) }}>\n {labelKind(kind)}\n </button>\n ))}\n </div>\n {proposal.empty\n ? <div className={styles.expandLoading}>{t('tourProposalEmpty')}</div>\n : (\n <>\n <p className={styles.tourGreeting}>{proposal.greeting}</p>\n <ol className={styles.tourStops}>\n {proposal.suggestedStops.map((stop, index) => (\n <li key={stop.id}>\n <button type=\"button\" className={styles.tourStop} onClick={() => { onSelect(stop.id) }}>\n <span className={styles.tourStopIndex}>{index + 1}</span>\n <span className={styles.tourStopBody}>\n <span className={styles.tourStopKind}>{stop.kind}</span>\n <span className={styles.tourStopText}>{stop.content.length > 60 ? `${stop.content.slice(0, 60)}…` : stop.content}</span>\n </span>\n </button>\n </li>\n ))}\n </ol>\n <p className={styles.tourHint}>{t('tourProposalHint')}</p>\n </>\n )}\n </div>\n )\n}\n\n/** 翻新清单:扫描 active 条目,给出 merge / demote / review / split 四类建议;带手动刷新 + 写回按钮。\n * - review / split:跳到对应房间抽屉查看(无副作用)。\n * - demote:调用 engram_forget(带三问墓志铭),房间转 archived。\n * - merge:触发当前 scope 的 engram_distill(用户级闭馆整理),把多间相似房间蒸馏为一条高层规律。 */\nfunction RefurbCard({ t, scope, onSelect, onAfterAction, toast }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n onSelect: (id: string) => void\n onAfterAction: () => void\n toast: ToastController\n}): React.ReactElement {\n interface Suggestion { action: 'merge' | 'demote' | 'review' | 'split'; primaryId: string; candidates: readonly string[]; reason: string; confidence: number }\n interface RefurbReport { count: number; suggestions: readonly Suggestion[] }\n const [report, setReport] = useState<RefurbReport | null>(null)\n const [busy, setBusy] = useState(false)\n const reload = useCallback(() => {\n setBusy(true)\n api<RefurbReport>(`refurb?scope=${scope}`)\n .then((data) => { setReport(data) })\n .catch(() => { setReport({ count: 0, suggestions: [] }) })\n .finally(() => { setBusy(false) })\n }, [scope])\n useEffect(() => { reload() }, [reload])\n const labelOf = (action: Suggestion['action']): string => {\n switch (action) {\n case 'demote': return t('refurbActionDemote')\n case 'merge': return t('refurbActionMerge')\n case 'review': return t('refurbActionReview')\n case 'split': return t('refurbActionSplit')\n }\n }\n /** 执行建议:review/split 仅跳转;demote/merge 调写接口。 */\n const execute = useCallback((suggestion: Suggestion) => {\n if (suggestion.action === 'review' || suggestion.action === 'split') {\n onSelect(suggestion.primaryId)\n return\n }\n if (suggestion.action === 'demote') {\n if (!window.confirm(t('refurbConfirmDemote'))) return\n setBusy(true)\n api<{ id: string }>('forget', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n id: suggestion.primaryId,\n scope,\n reason: '翻新清单降级',\n affects: '无',\n stillUseful: '可经 engram_restore 复原',\n }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbDemoteDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n return\n }\n if (suggestion.action === 'merge') {\n const n = suggestion.candidates.length + 1\n if (n < 2) {\n toast.push('warning', t('refurbMergeEmpty'))\n return\n }\n if (!window.confirm(t('refurbConfirmMerge', { n }))) return\n setBusy(true)\n // 透传 candidates:后端 runConsolidation 仅把这些 ids 当合并种子,其它条目仅在与种子相似时被并入。\n const candidates = [suggestion.primaryId, ...suggestion.candidates]\n api<Record<string, unknown>>('consolidate', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ scope, candidates }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbMergeDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n }\n }, [reload, onSelect, onAfterAction, toast, t, scope])\n if (report === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.refurb}>\n <div className={styles.refurbHead}>\n <span className={styles.refurbCount}>{t('refurbCount', { n: report.count })}</span>\n <button type=\"button\" className={styles.button} disabled={busy} onClick={reload}>{t('refurbRun')}</button>\n </div>\n {report.count === 0\n ? <div className={styles.expandLoading}>{t('refurbEmpty')}</div>\n : (\n <ul className={styles.refurbList}>\n {report.suggestions.map((suggestion, index) => (\n <li key={`${suggestion.action}-${suggestion.primaryId}-${index}`} className={styles.refurbItem}>\n <button type=\"button\" className={styles.refurbBadge} onClick={() => { onSelect(suggestion.primaryId) }}>\n {labelOf(suggestion.action)}\n </button>\n <div className={styles.refurbReason}>{suggestion.reason}</div>\n <span className={styles.refurbConfidence}>{(suggestion.confidence * 100).toFixed(0)}%</span>\n <button type=\"button\" className={`${styles.refurbExec} ${styles.button}`} disabled={busy}\n onClick={() => { execute(suggestion) }}>{t('refurbExecute')}</button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/** 走廊鸟瞰数据拉取与节点/边状态(命中 active + archived,forgotten 默认隐藏)。 */\ninterface CorridorGraph {\n readonly nodes: ReadonlyArray<{\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n readonly content?: string\n }>\n readonly edges: ReadonlyArray<{ readonly id: string; readonly from: string; readonly to: string; readonly type: string }>\n}\n\nfunction CorridorPanel({ t, scope, onSelect }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n onSelect: (id: string) => void\n}): React.ReactElement {\n const [graph, setGraph] = useState<CorridorGraph | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<CorridorGraph>(`corridor?status=active,archived&scope=${scope}`)\n .then(data => { if (!cancelled) setGraph(data); setFailed(null) })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope])\n if (failed !== null) return <div className={styles.expandLoading}>{t('corridorFailed')}:{failed}</div>\n if (graph === null) return <div className={styles.expandLoading}>{t('corridorLoad')}</div>\n if (graph.nodes.length === 0) return <div className={styles.empty}>{t('corridorEmpty')}</div>\n return <CorridorMap scope={scope} nodes={graph.nodes} edges={graph.edges} onSelect={onSelect} />\n}\n\n/** 宫殿健康分卡:5 维 0-100 + 总分 + 每维度进度条。 */\ninterface HealthReport {\n readonly overall: number\n readonly parts: ReadonlyArray<{\n readonly scope: string\n readonly score: number\n readonly signal: number\n readonly activeRatio: number\n readonly edgeCount: number\n readonly redacted: number\n readonly archivedRatio: number\n }>\n readonly evaluatedAt: number\n}\n\nfunction HealthScoreCard({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [report, setReport] = useState<HealthReport | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<HealthReport>(`health?scope=${scope}`)\n .then(data => { if (!cancelled) setReport(data); setFailed(null) })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope])\n if (failed !== null) return <div className={styles.expandLoading}>{t('healthFailed')}:{failed}</div>\n if (report === null) return <div className={styles.expandLoading}>{t('healthLoading')}</div>\n const tone = report.overall >= 80 ? 'good' : report.overall >= 50 ? 'mid' : 'low'\n return (\n <div className={styles.health}>\n <div className={`${styles.healthScore} ${tone === 'good' ? styles.healthScoreGood : tone === 'mid' ? styles.healthScoreMid : styles.healthScoreLow}`}>\n <b>{report.overall}</b>\n <span>/ 100</span>\n </div>\n <div className={styles.healthMetrics}>\n {report.parts.map(part => (\n <div key={part.scope} className={styles.healthMetric}>\n <div className={styles.healthMetricHead}>\n <span>{part.scope === 'user' ? t('scopeUser') : part.scope === 'project' ? t('scopeProject') : t('scopeShared')}</span>\n <b>{part.score}</b>\n </div>\n <div className={styles.healthMetricBar}>\n <i style={{ width: `${String(part.score)}%` }} />\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n/** 宫殿遥测:最近 7 天 op_log 聚合(写 / 摄取 / 整理 / 闭环等计数)。 */\ninterface TelemetrySnapshot {\n readonly windowDays: number\n readonly counts: {\n readonly writes: number\n readonly forgets: number\n readonly ingestRequests: number\n readonly ingestDones: number\n readonly distillRequests: number\n readonly consolidations: number\n }\n}\n\n/**\n * 管家日报整体条:tabs 上方常驻(原 KPI 条位置),scope 跟随 Header 全局三宫格。\n * 内容分两组横排:宫殿规模(房间 / 开放 / 闭馆 / 清晰度)+ 近 7 天活动五计数;\n * 数字与标签同行(baseline 对齐),标签 nowrap,杜绝窄卡换行。\n */\nfunction TelemetryBar({ t, scope }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n}): React.ReactElement {\n const [snap, setSnap] = useState<TelemetrySnapshot | null>(null)\n const [stats, setStats] = useState<StatsPart['stats'] | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n // 宫殿规模(stats)+ 近 7 天活动(telemetry)一次并行拉齐。\n Promise.all([\n api<TelemetrySnapshot>(`telemetry?days=7&scope=${scope}`),\n api<{ parts: StatsPart[] }>('stats'),\n ])\n .then(([tele, statRes]) => {\n if (cancelled) return\n setSnap(tele)\n setStats(statRes.parts.find(part => part.scope === scope)?.stats ?? null)\n setFailed(null)\n })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope])\n if (failed !== null) return <div className={styles.expandLoading}>{t('teleFailed')}:{failed}</div>\n if (snap === null) return <div className={styles.expandLoading}>{t('teleLoading')}</div>\n const items: Array<[string, number]> = [\n [t('teleWrites'), snap.counts.writes],\n [t('teleForgets'), snap.counts.forgets],\n [t('teleIngest'), snap.counts.ingestRequests],\n [t('teleDistill'), snap.counts.distillRequests],\n [t('teleConsolidate'), snap.counts.consolidations],\n ]\n return (\n <section className={styles.panelCard}>\n <div className={styles.panelCardTitle}>\n <h4>{t('teleTitle')}</h4>\n {/* 隐私元数据:叹号图标 + 短标签 + hover/聚焦弹出长说明,挂在卡片标题右侧。 */}\n <span className={styles.telePrivacy} role=\"note\" aria-label={t('telePrivacyHint')} tabIndex={0}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"7\" y1=\"6\" x2=\"7\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\"/>\n <circle cx=\"7\" cy=\"4.2\" r=\"0.7\" fill=\"currentColor\"/>\n </svg>\n <span className={styles.telePrivacyHint}>{t('telePrivacyHint')}</span>\n <span className={styles.telePrivacyTip} role=\"tooltip\">{t('telePrivacyTip')}</span>\n </span>\n </div>\n <div className={styles.teleBar}>\n {/* 左:规模 2×2;右:近 7 天 5 格。两区等高,组标题居左上小灰字。 */}\n <div className={styles.teleCol}>\n <span className={styles.teleColLabel}>{t('teleGroupScale')}</span>\n <div className={styles.teleGrid}>\n <div className={styles.teleStat}>\n <span>{t('kpiTotal')}</span>\n <b>{stats?.total ?? 0}</b>\n </div>\n <div className={styles.teleStat}>\n <span>{t('kpiActive')}</span>\n <b>{stats?.active ?? 0}</b>\n </div>\n <div className={styles.teleStat}>\n <span>{t('kpiForgotten')}</span>\n <b>{stats?.forgotten ?? 0}</b>\n </div>\n <div className={styles.teleStat} role=\"meter\" aria-valuemin={0} aria-valuemax={100}\n aria-valuenow={Math.round((stats?.signalRatio ?? 0) * 100)} aria-label={t('kpiSignal')}>\n <span>{t('kpiSignal')}</span>\n <b>{`${String(Math.round((stats?.signalRatio ?? 0) * 100))}%`}</b>\n </div>\n </div>\n </div>\n <div className={styles.teleCol}>\n <span className={styles.teleColLabel}>{t('teleGroupRecent')}</span>\n <div className={`${styles.teleGrid} ${styles.teleGridRecent}`}>\n {items.map(([label, value]) => (\n <div key={label} className={styles.teleStat}>\n <span>{label}</span>\n <b>{value}</b>\n </div>\n ))}\n </div>\n </div>\n </div>\n </section>\n )\n}\n\n/** 导出下拉:把三种格式(Markdown / JSON / 镜像目录)合并成一个按钮 + 弹出列表。 */\nfunction ExportMenu({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [open, setOpen] = useState(false)\n const wrapRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n if (!open) return\n const handler = (event: MouseEvent): void => {\n if (wrapRef.current === null || !wrapRef.current.contains(event.target as Node)) setOpen(false)\n }\n window.addEventListener('mousedown', handler)\n return () => { window.removeEventListener('mousedown', handler) }\n }, [open])\n const options: Array<{ label: string; hint: string; href: string }> = [\n { label: t('exportMd'), hint: t('exportMdHint'), href: `/api/engram/export?scope=${scope}&format=markdown` },\n { label: t('exportJson'), hint: t('exportJsonHint'), href: `/api/engram/export?scope=${scope}&format=json` },\n { label: t('exportMirror'), hint: t('exportMirrorHint'), href: `/api/engram/mirror?scope=${scope}` },\n ]\n return (\n <div className={styles.exportWrap} ref={wrapRef}>\n <button type=\"button\" className={styles.button} aria-haspopup=\"menu\" aria-expanded={open}\n onClick={() => { setOpen(value => !value) }}>\n {t('export')}\n <span className={styles.exportCaret} aria-hidden=\"true\">▾</span>\n </button>\n {open && (\n <div className={styles.exportMenu} role=\"menu\">\n {options.map(option => (\n <a key={option.href} role=\"menuitem\" className={styles.exportItem} href={option.href}\n onClick={() => { setOpen(false) }}>\n <span className={styles.exportItemLabel}>{option.label}</span>\n <span className={styles.exportItemHint}>{option.hint}</span>\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** 设置页「记忆库」section 主组件(t 由渲染器按 locale: NS 声明合成)。 */\nexport function EngramSection({ t }: PropsLocale<typeof NS>): React.ReactElement {\n const toast = useToast()\n /** 全局 scope(持久化):Header 三宫格是唯一切换器,驱动日报条、导览管家全部卡片、陈展列表与导出。 */\n const [scope, setScope] = usePersistedState<'user' | 'project' | 'shared'>('library.scope', 'user', ['user', 'project', 'shared'])\n /** 库顶 status / kind / q 过滤器(持久化)。 */\n const [status, setStatus] = usePersistedState<string>('library.status', 'all', ['all', 'active', 'archived', 'forgotten'])\n const [kind, setKind] = usePersistedState<string>('library.kind', 'all', ['all', 'fact', 'preference', 'decision', 'episode', 'skill'])\n const [q, setQ] = usePersistedString('library.q', '')\n /** 陈展列表排序(持久化):time = 开馆时间倒序;tour = 固定巡游路线桩位顺序。 */\n const [sort, setSort] = usePersistedState<'time' | 'tour'>('library.sort', 'time', ['time', 'tour'])\n /** 今日待回忆条数(Header 角标):与导览管家的待回忆卡同源。 */\n const [dueCount, setDueCount] = useState(0)\n /** 脱敏筛选已合并到顶部 KPI 与 tag 视觉,不再作为过滤器。 */\n const [redacted] = useState('all')\n const [offset, setOffset] = useState(0)\n const [list, setList] = useState<ListResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n /** 行内展开态:互斥的唯一展开条目(review 或 edit)。 */\n const [expanded, setExpanded] = useState<{ kind: 'review' | 'edit'; record: MemoryRow } | null>(null)\n const [reloadTick, setReloadTick] = useState(0)\n /** 批量选择:条目 id 集合(scope/过滤/翻页/搜索变更时清空)。 */\n const [selected, setSelected] = useState<ReadonlySet<string>>(new Set())\n /** 批量遗忘的两段式确认。 */\n const [confirmForget, setConfirmForget] = useState(false)\n /** Tab 视图:library 列表 / observability 召回与活动。 */\n const [activeTab, setActiveTab] = useState<'library' | 'observability'>('observability')\n\n const reload = useCallback((): void => { setReloadTick(tick => tick + 1) }, [])\n\n /** 刷新 Header 角标计数(本地回环毫秒级;失败静默归零,不打断面板)。 */\n const refreshDue = useCallback((): void => {\n api<{ items: unknown[] }>(`review-due?scope=${scope}&limit=50`)\n .then(data => { setDueCount(data.items.length) })\n .catch(() => { setDueCount(0) })\n }, [scope])\n useEffect(() => { refreshDue() }, [refreshDue])\n\n /** 角标点击:切到导览管家并滚到今日待回忆卡(待 tab 切换渲染完成后再滚)。 */\n const goToDue = (): void => {\n setActiveTab('observability')\n requestAnimationFrame(() => {\n document.getElementById('engram-review-due')?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n })\n }\n\n useEffect(() => {\n let cancelled = false\n const qs = new URLSearchParams({\n scope, status, kind, redacted, limit: String(PAGE_SIZE), offset: String(offset),\n })\n if (q !== '') qs.set('q', q)\n if (sort === 'tour') qs.set('sort', 'tour')\n api<ListResult>(`list?${qs.toString()}`)\n .then((data) => { if (!cancelled) { setList(data); setError(null) } })\n .catch((loadError: Error) => { if (!cancelled) setError(loadError.message) })\n return () => { cancelled = true }\n }, [scope, status, kind, redacted, q, sort, offset, reloadTick])\n\n const act = (route: string, record: MemoryRow): void => {\n api(route, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope }),\n })\n .then(reload)\n .catch((actError: Error) => { toast.push('error', actError.message) })\n }\n\n const toggle = (expandKind: 'review' | 'edit', record: MemoryRow): void => {\n setExpanded(current => (current !== null && current.kind === expandKind && current.record.id === record.id)\n ? null\n : { kind: expandKind, record })\n }\n\n const pageRecords = list?.records ?? []\n const selectedRecords = pageRecords.filter(record => selected.has(record.id))\n const forgetable = selectedRecords.filter(record => record.status === 'active').length\n const restorable = selectedRecords.length - forgetable\n const allSelected = pageRecords.length > 0 && pageRecords.every(record => selected.has(record.id))\n\n const toggleSelect = (id: string): void => {\n setSelected(current => {\n const next = new Set(current)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n const clearSelection = (): void => { setSelected(new Set()); setConfirmForget(false) }\n\n const toggleAllPage = (): void => {\n setSelected(current => {\n const next = new Set(current)\n if (allSelected) pageRecords.forEach(record => next.delete(record.id))\n else pageRecords.forEach(record => next.add(record.id))\n return next\n })\n }\n\n /** 批量执行:逐条调单条 API(回环毫秒级),单条失败不阻塞其余;完成即刷新并清空选择。 */\n const runBatch = (mode: 'forget' | 'restore'): void => {\n const targets = mode === 'forget'\n ? selectedRecords.filter(record => record.status === 'active')\n : selectedRecords.filter(record => record.status !== 'active')\n if (targets.length === 0) return\n void Promise.allSettled(targets.map(target => api(mode, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: target.id, scope: target.scope }),\n }))).then(() => { clearSelection(); reload() })\n }\n\n const armBatchForget = (): void => {\n // 确认态保持到用户点击确认执行或清空选择,不做自动复位(3 秒窗口曾导致执行落空)。\n if (confirmForget) { runBatch('forget'); return }\n setConfirmForget(true)\n }\n\n const page = Math.floor(offset / PAGE_SIZE) + 1\n const pages = list === null ? 1 : Math.max(1, Math.ceil(list.total / PAGE_SIZE))\n /** Segmented Control 玻璃指示器位置:根据选中按钮 DOM 测量。 */\n const segRefs = useRef<Map<string, HTMLButtonElement | null>>(new Map())\n const [segIndicator, setSegIndicator] = useState<{ left: number; width: number; opacity: number }>({ left: 0, width: 0, opacity: 0 })\n const measureSeg = useCallback((): void => {\n const node = segRefs.current.get(scope)\n if (node === null || node === undefined) return\n setSegIndicator({ left: node.offsetLeft, width: node.offsetWidth, opacity: 1 })\n }, [scope])\n useEffect(() => {\n measureSeg()\n const onResize = (): void => measureSeg()\n window.addEventListener('resize', onResize)\n return () => { window.removeEventListener('resize', onResize) }\n }, [measureSeg])\n\n return (\n <div className={styles.panel}>\n {/* Header:宫殿 Logo + 标题 + 简介 + 右侧动作按钮组。 */}\n <div className={styles.header}>\n <div className={styles.headerBrand}>\n <span className={styles.headerLogo} aria-hidden=\"true\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 48 48\" fill=\"none\">\n <path d=\"M6 20 L24 7 L42 20 Z\" fill=\"currentColor\" fillOpacity=\"0.9\"/>\n <rect x=\"9\" y=\"20\" width=\"30\" height=\"18\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"/>\n <rect x=\"13\" y=\"24\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <line x1=\"16\" y1=\"24\" x2=\"16\" y2=\"30\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"13\" y1=\"27\" x2=\"19\" y2=\"27\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M21 38 L21 28 Q21 25 24 25 Q27 25 27 28 L27 38\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\"/>\n <rect x=\"29\" y=\"24\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <line x1=\"32\" y1=\"24\" x2=\"32\" y2=\"30\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"29\" y1=\"27\" x2=\"35\" y2=\"27\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n </span>\n <div className={styles.headerTitle}>\n <h2>{t('headerTitle')}</h2>\n <p>{t('headerSubtitle')}</p>\n </div>\n </div>\n <div className={styles.headerActions}>\n <div className={`${styles.segGroup} ${styles.segScope}`}>\n <span className={styles.segIndicator}\n style={{ left: `${String(segIndicator.left)}px`, width: `${String(segIndicator.width)}px`, opacity: segIndicator.opacity }} />\n {(['user', 'project', 'shared'] as const).map(option => (\n <button key={option} type=\"button\" ref={node => { segRefs.current.set(option, node) }}\n className={scope === option ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setScope(option); setOffset(0); setExpanded(null); clearSelection() }}>\n {t(SCOPE_KEY[option])}\n </button>\n ))}\n </div>\n {/* 今日待回忆角标:有待回忆时在 Header 一眼可见,点击直达导览管家的待回忆卡。 */}\n {dueCount > 0 && (\n <button type=\"button\" className={styles.dueBadge}\n title={t('dueBadgeLabel', { n: dueCount })} aria-label={t('dueBadgeLabel', { n: dueCount })}\n onClick={goToDue}>\n <span className={styles.dueDot} aria-hidden=\"true\" />\n {dueCount}\n </button>\n )}\n <button type=\"button\" className={styles.button} onClick={() => { reload(); refreshDue() }}>{t('refresh')}</button>\n <ExportMenu t={t} scope={scope} />\n </div>\n </div>\n\n {/* 管家日报整体条(tabs 上方常驻):宫殿规模 + 近 7 天活动;scope 跟随 Header 全局三宫格。 */}\n <TelemetryBar t={t} scope={scope} />\n\n {/* 顶部 Tab Bar:两个标签页(导览管家 / 宫殿陈展;按\"管家先\"语义排序)。 */}\n <div className={styles.tabs} role=\"tablist\">\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'observability' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'observability'}\n onClick={() => { setActiveTab('observability') }}>\n {t('tabObservability')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'library' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'library'}\n onClick={() => { setActiveTab('library') }}>\n {t('tabLibrary')}\n <small>{t('tabLibraryCount', { n: list?.total ?? 0 })}</small>\n </button>\n </div>\n\n {activeTab === 'library' && (\n <div className={styles.tabPanel}>\n <div className={styles.filters}>\n <div className={styles.segGroup}>\n {([\n ['all', t('allStatuses')],\n ['active', t('statusActive')],\n ['archived', t('statusArchived')],\n ['forgotten', t('statusForgotten')],\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={status === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setStatus(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n <div className={styles.segGroup}>\n {([\n ['all', t('allKinds')],\n ...KINDS.map(option => [option, kindLabel(t, option)] as const),\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={kind === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setKind(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n <div className={styles.segGroup}>\n {([['time', t('sortTime')], ['tour', t('sortTour')]] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={sort === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setSort(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('searchPlaceholder')} value={q}\n onChange={event => { setQ(event.target.value.trim()); setOffset(0); setExpanded(null); clearSelection() }} />\n </div>\n\n {selected.size > 0 && (\n <div className={styles.batchBar}>\n <span>{t('selectedCount', { n: selected.size })}</span>\n <button type=\"button\" className={styles.button} onClick={toggleAllPage}>\n {allSelected ? t('deselectAll') : t('selectAll')}\n </button>\n <button type=\"button\" className={styles.button} disabled={restorable === 0}\n onClick={() => runBatch('restore')}>{t('batchRestore', { n: restorable })}</button>\n <button type=\"button\"\n className={confirmForget ? `${styles.button} ${styles.danger}` : styles.button}\n disabled={forgetable === 0}\n onClick={armBatchForget}>\n {confirmForget ? t('batchForgetConfirm', { n: forgetable }) : t('batchForget', { n: forgetable })}\n </button>\n <button type=\"button\" className={styles.button} onClick={clearSelection}>{t('clearSelection')}</button>\n </div>\n )}\n\n {error !== null && (\n <div className={styles.empty}>\n <b>{t('loadFailed', { msg: error })}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n {error === null && list === null && (\n <div className={styles.skeletonList}>\n {[0, 1, 2, 3].map(index => (\n <div key={index} className={styles.skeleton} style={{ animationDelay: `${String(index * 60)}ms` }}><i /><i /><i /></div>\n ))}\n </div>\n )}\n {error === null && list !== null && list.records.length === 0 && (\n <div className={styles.empty}>\n <b>{t('empty')}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n\n {(list?.records ?? []).length > 0 && (\n <div className={styles.itemList}>\n {(list?.records ?? []).map((record, index) => (\n <div key={record.id}\n className={selected.has(record.id) ? `${styles.item} ${styles.selected}` : styles.item}\n style={{ animationDelay: `${String(Math.min(index, 12) * 36)}ms` }}>\n <input type=\"checkbox\" className={styles.itemCheck} checked={selected.has(record.id)}\n aria-label={record.content.slice(0, 24)} onChange={() => toggleSelect(record.id)} />\n <div className={styles.itemBody}>\n <div className={styles.itemTags}>\n <span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span>\n <span className={`${styles.pill} ${styles.kind}`}>{kindLabel(t, record.kind)}</span>\n {record.slot !== undefined && (\n <span className={styles.pill}>{record.slot.room}#{record.slot.index}</span>\n )}\n {record.content.includes('[REDACTED:') && (\n <span className={`${styles.pill} ${styles.redacted}`}>{t('tagRedacted')}</span>\n )}\n {record.outcome !== undefined && (\n <span className={`${styles.pill} ${record.outcome === 'success' ? styles.outcomeSuccess : styles.outcomeFailure}`}>\n {record.outcome === 'success' ? t('tagOutcomeSuccess') : t('tagOutcomeFailure')}\n </span>\n )}\n <span className={styles.pill} title={fmtTime(record.createdAt)} style={{ marginLeft: 'auto' }}>\n {t(SCOPE_KEY[record.scope])} · {relTime(t, record.createdAt)}\n </span>\n </div>\n <div className={styles.content}>{record.content}</div>\n <div className={styles.itemMeta}>\n <span><b>{t('importance')}</b> {record.importance.toFixed(2)}</span>\n <span><b>{t('confidence')}</b> {record.confidence.toFixed(2)}</span>\n <span>{t('accessCount', { n: record.accessCount })}</span>\n <span>{sourceLabel(t, record)}</span>\n </div>\n </div>\n <div className={styles.itemOps}>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('review', record) }}>{t('detail')}</button>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('edit', record) }}>{t('edit')}</button>\n {record.status === 'active'\n ? <button type=\"button\" className={styles.button}\n onClick={() => { act('forget', record) }}>{t('forget')}</button>\n : <button type=\"button\" className={styles.button}\n onClick={() => { act('restore', record) }}>{t('restore')}</button>}\n </div>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.pager}>\n <button type=\"button\" className={styles.button} disabled={offset === 0} aria-label={t('prevPage')}\n onClick={() => { setOffset(Math.max(0, offset - PAGE_SIZE)); setExpanded(null); clearSelection() }}>‹</button>\n <span>{t('pagerInfo', { page, pages, total: list?.total ?? 0 })}</span>\n <button type=\"button\" className={styles.button} disabled={list === null || offset + PAGE_SIZE >= list.total}\n aria-label={t('nextPage')}\n onClick={() => { setOffset(offset + PAGE_SIZE); setExpanded(null); clearSelection() }}>›</button>\n </div>\n </div>\n )}\n\n {activeTab === 'observability' && (\n <div className={styles.tabPanel}>\n <div className={styles.layout}>\n <div className={styles.mainCol}>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('healthTitle')}</h4>\n <HealthScoreCard t={t} scope={scope} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('sectionCorridor')}</h4>\n <CorridorPanel t={t} scope={scope} onSelect={(id) => { setExpanded({ kind: 'review', record: list?.records.find(record => record.id === id) ?? ({ id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5, status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null } as MemoryRow) }) }} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('refurbTitle')}</h4>\n {/* 翻新与走廊同列:动作类信息聚簇(左 = 宫殿全局 + 整改 + 试走,试走放在最后)。 */}\n <RefurbCard t={t} scope={scope} onSelect={(id) => { setExpanded({ kind: 'review', record: list?.records.find(record => record.id === id) ?? ({ id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5, status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null } as MemoryRow) }) }} onAfterAction={reload} toast={toast} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('sectionBench')}</h4>\n <RecallBench t={t} scope={scope} />\n </section>\n </div>\n <aside className={styles.sideCol}>\n <section className={styles.panelCard} id=\"engram-review-due\">\n <h4 className={styles.panelCardTitle}>{t('reviewQueueTitle')}</h4>\n <ReviewQueueCard t={t} scope={scope} toast={toast} onAnswered={refreshDue} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('tourProposalTitle')}</h4>\n <TourProposalCard t={t} scope={scope} onSelect={(id) => { setExpanded({ kind: 'review', record: list?.records.find(record => record.id === id) ?? ({ id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5, status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null } as MemoryRow) }) }} />\n </section>\n <section className={styles.panelCard}>\n <h4 className={styles.panelCardTitle}>{t('sectionActivity')}</h4>\n <ActivityFeed t={t} />\n </section>\n </aside>\n </div>\n </div>\n )}\n\n {/* Drawer:行内展开升级为右滑入聚焦态,避免列表被展开压塌。 */}\n {expanded !== null && (\n <>\n <div className={styles.drawerScrim} onClick={() => { setExpanded(null) }} />\n <aside className={styles.drawer} role=\"dialog\" aria-label={t('drawerTitle')}>\n <header className={styles.drawerHead}>\n <div className={styles.drawerTitle}>\n <h3>{t('drawerTitle')}</h3>\n <span title={expanded.record.id}>\n {`#${expanded.record.id.slice(0, 8)}…`}\n </span>\n </div>\n <button type=\"button\" className={styles.drawerClose} aria-label={t('drawerClose')}\n onClick={() => { setExpanded(null) }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 2 L12 12 M12 2 L2 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\n </svg>\n </button>\n </header>\n <div className={styles.drawerBody}>\n {expanded.kind === 'review'\n ? <ReviewBody t={t} recordId={expanded.record.id} scope={expanded.record.scope} />\n : <EditForm t={t} record={expanded.record} onClose={() => { setExpanded(null) }}\n onSaved={() => { setExpanded(null); reload() }} toast={toast} />}\n </div>\n </aside>\n </>\n )}\n {/* Toast 叠层(右上角,position:fixed 脱离 panel 容器)。 */}\n {toast.viewport}\n </div>\n )\n}\n","/**\n * 「记忆库」client 词典:zh/en 键并集必须完全一致(类型化注册的编译约束)。\n * 数据层英文枚举(status/kind/op 等)只在显示层映射,存储值保持英文不变。\n * @module @kenz1117/dsh-engram/client/locales\n */\n\n/** 词典命名空间(同时用作 LocaleNamespaceMap 的声明合并键)。 */\nexport const NS = 'engram'\n\n/** 「记忆库」全部界面文案键。 */\nexport type EngramKey =\n | 'nav'\n | 'scopeUser'\n | 'scopeProject'\n | 'scopeShared'\n | 'refresh'\n | 'exportMd'\n | 'exportJson'\n | 'export'\n | 'exportMirror'\n | 'exportMdHint'\n | 'exportJsonHint'\n | 'exportMirrorHint'\n | 'allStatuses'\n | 'allKinds'\n | 'redactedAll'\n | 'redactedOnly'\n | 'redactedNone'\n | 'tagRedacted'\n | 'tagOutcomeSuccess'\n | 'tagOutcomeFailure'\n | 'searchPlaceholder'\n | 'statusActive'\n | 'statusArchived'\n | 'statusForgotten'\n | 'kindFact'\n | 'kindPreference'\n | 'kindDecision'\n | 'kindEpisode'\n | 'kindSkill'\n | 'labelContent'\n | 'labelKind'\n | 'labelStatus'\n | 'labelScope'\n | 'importance'\n | 'confidence'\n | 'accessCount'\n | 'labelCreated'\n | 'timeJustNow'\n | 'timeMinutesAgo'\n | 'timeHoursAgo'\n | 'timeDaysAgo'\n | 'sourceExplicit'\n | 'sourceSession'\n | 'round'\n | 'cardActive'\n | 'cardRedacted'\n | 'signalRatio'\n | 'detail'\n | 'edit'\n | 'forget'\n | 'restore'\n | 'empty'\n | 'loadFailed'\n | 'loading'\n | 'pagerInfo'\n | 'prevPage'\n | 'nextPage'\n | 'cancel'\n | 'saveWithHint'\n | 'detailAttributes'\n | 'detailSource'\n | 'detailRelations'\n | 'detailOperations'\n | 'headerTitle'\n | 'headerSubtitle'\n | 'tabLibrary'\n | 'tabObservability'\n | 'tabLibraryCount'\n | 'drawerClose'\n | 'drawerTitle'\n | 'kpiTotal'\n | 'kpiActive'\n | 'kpiForgotten'\n | 'kpiSignal'\n | 'emptyHint'\n | 'relSupersededBy'\n | 'relSupersedes'\n | 'relContradicts'\n | 'relRelated'\n | 'opWrite'\n | 'opUpdate'\n | 'opForget'\n | 'opRestore'\n | 'opDecay'\n | 'opSuperseded'\n | 'opIngestRequest'\n | 'opIngestDone'\n | 'opOutcomeReport'\n | 'opSearchRewrite'\n | 'opCompressRequest'\n | 'opDistillRequest'\n | 'selectAll'\n | 'deselectAll'\n | 'selectedCount'\n | 'batchForget'\n | 'batchForgetConfirm'\n | 'batchRestore'\n | 'clearSelection'\n | 'sectionBench'\n | 'sectionCorridor'\n | 'corridorEmpty'\n | 'corridorFailed'\n | 'corridorLoad'\n | 'healthTitle'\n | 'healthLoading'\n | 'healthFailed'\n | 'healthMetricSignal'\n | 'healthMetricActive'\n | 'healthMetricCorridors'\n | 'healthMetricRedaction'\n | 'healthMetricDecay'\n | 'teleTitle'\n | 'teleFailed'\n | 'teleLoading'\n | 'teleGroupScale'\n | 'teleGroupRecent'\n | 'telePrivacyHint'\n | 'telePrivacyTip'\n | 'teleWrites'\n | 'teleForgets'\n | 'teleIngest'\n | 'teleDistill'\n | 'teleConsolidate'\n | 'benchPlaceholder'\n | 'benchRun'\n | 'benchScopeAll'\n | 'benchHits'\n | 'benchDegraded'\n | 'benchEmpty'\n | 'benchNote'\n | 'viaFts'\n | 'viaVec'\n | 'viaBoth'\n | 'viaEdgeLabel'\n | 'benchRewrite'\n | 'benchCompress'\n | 'sectionActivity'\n | 'activityEmpty'\n | 'detailRevisions'\n | 'tourProposalTitle'\n | 'tourProposalEmpty'\n | 'tourProposalHint'\n | 'tourFocusAll'\n | 'refurbTitle'\n | 'refurbEmpty'\n | 'refurbRun'\n | 'refurbActionDemote'\n | 'refurbActionMerge'\n | 'refurbActionReview'\n | 'refurbActionSplit'\n | 'refurbCount'\n | 'refurbExecute'\n | 'refurbConfirmDemote'\n | 'refurbConfirmMerge'\n | 'refurbDemoteDone'\n | 'refurbMergeDone'\n | 'refurbActionFailed'\n | 'refurbMergeEmpty'\n | 'reviewQueueTitle'\n | 'reviewQueueEmpty'\n | 'reviewReveal'\n | 'reviewGradeRemember'\n | 'reviewGradeVague'\n | 'reviewGradeForgot'\n | 'reviewOverdue'\n | 'reviewDueToday'\n | 'reviewNoPlacard'\n | 'reviewScheduled'\n | 'sortTime'\n | 'sortTour'\n | 'dueBadgeLabel'\n/** 中文词典(宿主默认语言)。整页采用「记忆宫殿」语言:楼 / 房间 / 楼层 / 铭牌 / 参观 / 管家 / 走廊。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定以保证编译约束。 */\nexport const zh: Record<EngramKey, string> = {\n nav: '记忆宫殿',\n scopeUser: '私人宫殿',\n scopeProject: '项目宫殿',\n scopeShared: '共享宫殿',\n refresh: '重访',\n exportMd: '导出 MD',\n exportJson: '导出 JSON',\n export: '导出',\n exportMirror: '镜像目录',\n exportMdHint: '单文件,可直接分享',\n exportJsonHint: '结构化全文,便于程序处理',\n exportMirrorHint: '每房间一个 .md,可用 Obsidian 漫游',\n allStatuses: '全部房间',\n allKinds: '全部楼层',\n redactedAll: '全部铭牌',\n redactedOnly: '含涂改',\n redactedNone: '无涂改',\n tagRedacted: '已涂改',\n tagOutcomeSuccess: '管家验证·有效',\n tagOutcomeFailure: '管家验证·失效',\n searchPlaceholder: '在宫殿里寻找…',\n statusActive: '对外开放',\n statusArchived: '展厅陈列',\n statusForgotten: '已闭馆',\n kindFact: '事实层',\n kindPreference: '偏好层',\n kindDecision: '决策层',\n kindEpisode: '事件层',\n kindSkill: '技能层',\n labelContent: '铭牌',\n labelKind: '楼层',\n labelStatus: '房门状态',\n labelScope: '宫殿归属',\n importance: '地标亮度',\n confidence: '考据可靠度',\n accessCount: '参观 {n} 人次',\n labelCreated: '开馆时间',\n timeJustNow: '方才',\n timeMinutesAgo: '{n} 分钟前',\n timeHoursAgo: '{n} 小时前',\n timeDaysAgo: '{n} 天前',\n sourceExplicit: '管理员添置',\n sourceSession: '发掘地 {id}',\n round: '第 {n} 趟',\n cardActive: '开放 {n}',\n cardRedacted: '涂改 {n}',\n signalRatio: '走廊清晰度 {n}%',\n detail: '参观',\n edit: '修缮',\n forget: '封门',\n restore: '重开',\n empty: '宫殿暂无可陈展的房间',\n emptyHint: '试试调整楼层筛选,或新添一间',\n loadFailed: '访客受挫:{msg}',\n loading: '导览中…',\n pagerInfo: '第 {page} / {pages} 层 · 共 {total} 间',\n prevPage: '上层',\n nextPage: '下层',\n cancel: '作罢',\n saveWithHint: '修缮(旧铭牌归展厅)',\n detailAttributes: '铭牌',\n detailSource: '发掘地',\n detailRelations: '邻接走廊',\n detailOperations: '管家日志',\n relSupersededBy: '被替代',\n relSupersedes: '替代',\n relContradicts: '互斥',\n relRelated: '相邻',\n headerTitle: '记忆宫殿',\n headerSubtitle: '跨会话长期记忆宫殿',\n tabLibrary: '宫殿陈展',\n tabObservability: '导览管家',\n tabLibraryCount: '{n} 间',\n drawerClose: '归殿',\n drawerTitle: '房间铭牌',\n kpiTotal: '房间',\n kpiActive: '开放',\n kpiForgotten: '闭馆',\n kpiSignal: '清晰度',\n opWrite: '落成',\n opUpdate: '修缮',\n opForget: '封门',\n opRestore: '重开',\n opDecay: '闭门陈列',\n opSuperseded: '被替代',\n opIngestRequest: '发掘请求',\n opIngestDone: '发掘完成',\n opOutcomeReport: '管家验证',\n opSearchRewrite: '路线改写',\n opCompressRequest: '导览压缩',\n opDistillRequest: '重塑楼层',\n selectAll: '本页全选',\n deselectAll: '取消全选',\n selectedCount: '已选 {n} 间',\n batchForget: '批量封门({n})',\n batchForgetConfirm: '确认封门 {n} 间?',\n batchRestore: '批量重开({n})',\n clearSelection: '清空所选',\n sectionBench: '试走一遍',\n sectionCorridor: '走廊鸟瞰',\n corridorEmpty: '走廊空空如也,落成几间房间后这里会出现鸟瞰图。',\n corridorFailed: '走廊加载失败',\n corridorLoad: '加载走廊鸟瞰…',\n healthTitle: '宫殿健康分',\n healthLoading: '正在诊脉…',\n healthFailed: '诊脉失败',\n healthMetricSignal: '走廊清晰度',\n healthMetricActive: '对外开放率',\n healthMetricCorridors: '走廊密度',\n healthMetricRedaction: '涂改缓解',\n healthMetricDecay: '衰减覆盖',\n teleTitle: '管家日报',\n teleFailed: '遥测加载失败',\n teleLoading: '聚合管家记录中…',\n teleGroupScale: '规模',\n teleGroupRecent: '近 7 天',\n telePrivacyHint: '数据仅在本机聚合 · 不外传',\n telePrivacyTip: '所有 op_log 与遥测计数只在当前进程的 SQLite 里聚合,从未发送至任何外部服务;本机重启或卸载插件即清空。',\n teleWrites: '落成',\n teleForgets: '闭馆',\n teleIngest: '发掘',\n teleDistill: '蒸馏',\n teleConsolidate: '整理',\n benchPlaceholder: '说出要找的房间关键词或语义…',\n benchRun: '出发',\n benchScopeAll: '全部宫殿',\n benchHits: '到访 {n} 间',\n benchDegraded: '语义灯熄,仅关键词引路',\n benchEmpty: '此路不通',\n benchNote: '试走与正式导览共用同一张地图,会计入参观人次',\n viaFts: '关键词',\n viaVec: '语义',\n viaBoth: '双路',\n viaEdgeLabel: '邻接走廊',\n benchRewrite: '路线改写为 {n} 段',\n benchCompress: '铭牌压缩 {n} 条',\n sectionActivity: '管家日志',\n activityEmpty: '暂无管家活动',\n detailRevisions: '陈展沿革',\n tourProposalTitle: '入殿导航',\n tourProposalEmpty: '宫殿尚空,建议先放第一段记忆(调用 engram_save)',\n tourProposalHint: '点击房间可展开抽屉查看铭牌',\n tourFocusAll: '全部',\n refurbTitle: '翻新清单',\n refurbEmpty: '所有房间状态健康,无翻新建议',\n refurbRun: '重新扫描',\n refurbActionDemote: '降级',\n refurbActionMerge: '合并',\n refurbActionReview: '复习',\n refurbActionSplit: '拆分',\n refurbCount: '{n} 条建议',\n refurbExecute: '执行',\n refurbConfirmDemote: '确认降级此房间?执行后状态转 archived,可在统计页恢复。',\n refurbConfirmMerge: '确认合并 {n} 间相似房间?将触发 engram_distill 把多间归纳为 1 条高层规律。',\n refurbDemoteDone: '已降级',\n refurbMergeDone: '合并任务已派发',\n refurbActionFailed: '执行失败:{msg}',\n refurbMergeEmpty: '无可合并的候选条目',\n reviewQueueTitle: '今日待回忆',\n reviewQueueEmpty: '今日无到期记忆,宫殿节奏良好',\n reviewReveal: '揭示铭牌',\n reviewGradeRemember: '记得',\n reviewGradeVague: '模糊',\n reviewGradeForgot: '忘了',\n reviewOverdue: '逾期 {n} 天',\n reviewDueToday: '今日到期',\n reviewNoPlacard: '(无门牌)',\n reviewScheduled: '已排入 {n} 天后再回忆',\n sortTime: '按时间',\n sortTour: '按巡游路线',\n dueBadgeLabel: '今日待回忆 {n} 段,点击前往',\n}\n\n/** 英文词典。整页采用「Memory Palace」语言:palace / room / floor / placard / tour / curator / corridor。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定。 */\nexport const en: Record<EngramKey, string> = {\n nav: 'Memory Palace',\n scopeUser: 'Private Palace',\n scopeProject: 'Project Palace',\n scopeShared: 'Shared Palace',\n refresh: 'Revisit',\n exportMd: 'Export MD',\n exportJson: 'Export JSON',\n export: 'Export',\n exportMirror: 'Mirror tree',\n exportMdHint: 'Single file, easy to share',\n exportJsonHint: 'Structured full dump for scripts',\n exportMirrorHint: 'One .md per room, roamable in Obsidian',\n allStatuses: 'All rooms',\n allKinds: 'All floors',\n redactedAll: 'All placards',\n redactedOnly: 'Redacted',\n redactedNone: 'Unredacted',\n tagRedacted: 'redacted',\n tagOutcomeSuccess: 'curator: worked',\n tagOutcomeFailure: 'curator: failed',\n searchPlaceholder: 'Wander the palace…',\n statusActive: 'open to public',\n statusArchived: 'on display',\n statusForgotten: 'closed',\n kindFact: 'Fact Floor',\n kindPreference: 'Preference Floor',\n kindDecision: 'Decision Floor',\n kindEpisode: 'Episode Floor',\n kindSkill: 'Skill Floor',\n labelContent: 'Placard',\n labelKind: 'Floor',\n labelStatus: 'Door',\n labelScope: 'Palace',\n importance: 'Beacon',\n confidence: 'Provenance',\n accessCount: '{n} visits',\n labelCreated: 'Opened',\n timeJustNow: 'just now',\n timeMinutesAgo: '{n} min ago',\n timeHoursAgo: '{n} hr ago',\n timeDaysAgo: '{n} d ago',\n sourceExplicit: 'Curator placed',\n sourceSession: 'Excavated at {id}',\n round: 'pass {n}',\n cardActive: '{n} open',\n cardRedacted: '{n} redacted',\n signalRatio: 'corridor clarity {n}%',\n detail: 'Tour',\n edit: 'Renovate',\n forget: 'Close',\n restore: 'Reopen',\n empty: 'No exhibits to display',\n emptyHint: 'Adjust the floors above, or place a new room',\n loadFailed: 'Tour halted: {msg}',\n loading: 'Guiding…',\n pagerInfo: 'Floor {page} / {pages} · {total} rooms',\n prevPage: 'Floor up',\n nextPage: 'Floor down',\n cancel: 'Cancel',\n saveWithHint: 'Renovate (archive old placard)',\n detailAttributes: 'Placard',\n detailSource: 'Excavation',\n detailRelations: 'Corridors',\n detailOperations: 'Curator log',\n relSupersededBy: 'Superseded by',\n relSupersedes: 'Supersedes',\n relContradicts: 'Contradicts',\n relRelated: 'Adjacent',\n headerTitle: 'Memory Palace',\n headerSubtitle: 'Cross-session long-term memory palace',\n tabLibrary: 'Palace',\n tabObservability: 'Tour butler',\n tabLibraryCount: '{n} rooms',\n drawerClose: 'Return',\n drawerTitle: 'Room placard',\n kpiTotal: 'Rooms',\n kpiActive: 'Open',\n kpiForgotten: 'Closed',\n kpiSignal: 'Clarity',\n opWrite: 'opened',\n opUpdate: 'renovated',\n opForget: 'closed',\n opRestore: 'reopened',\n opDecay: 'archived',\n opSuperseded: 'superseded',\n opIngestRequest: 'excavation requested',\n opIngestDone: 'excavated',\n opOutcomeReport: 'curator report',\n opSearchRewrite: 'route rewritten',\n opCompressRequest: 'placard compressed',\n opDistillRequest: 'floor remodelled',\n selectAll: 'Select all on floor',\n deselectAll: 'Deselect all',\n selectedCount: '{n} rooms',\n batchForget: 'Close selected ({n})',\n batchForgetConfirm: 'Close {n} rooms?',\n batchRestore: 'Reopen selected ({n})',\n clearSelection: 'Clear selection',\n sectionBench: 'Take a walk',\n sectionCorridor: 'Corridor overview',\n corridorEmpty: 'No rooms yet — the bird’s-eye view appears after a few rooms open.',\n corridorFailed: 'Failed to load corridor',\n corridorLoad: 'Loading corridor overview…',\n healthTitle: 'Palace health',\n healthLoading: 'Taking pulse…',\n healthFailed: 'Pulse failed',\n healthMetricSignal: 'Corridor clarity',\n healthMetricActive: 'Open ratio',\n healthMetricCorridors: 'Corridor density',\n healthMetricRedaction: 'Redaction relief',\n healthMetricDecay: 'Decay coverage',\n teleTitle: 'Curator log',\n teleFailed: 'Telemetry failed',\n teleLoading: 'Aggregating curator events…',\n teleGroupScale: 'Scale',\n teleGroupRecent: 'Last 7 days',\n telePrivacyHint: 'Local aggregation only · never transmitted',\n telePrivacyTip: 'All op_log and telemetry counters are aggregated in this process\\u2019s SQLite only; nothing is sent to any external service. Clearing the plugin or restarting the host wipes the data.',\n teleWrites: 'Opened',\n teleForgets: 'Closed',\n teleIngest: 'Excavated',\n teleDistill: 'Distilled',\n teleConsolidate: 'Consolidated',\n benchPlaceholder: 'Name a room by keyword or meaning…',\n benchRun: 'Walk',\n benchScopeAll: 'All palaces',\n benchHits: '{n} rooms found',\n benchDegraded: 'Beacon dark · keyword lane only',\n benchEmpty: 'No route found',\n benchNote: 'Walk uses the same map as the guided tour and counts as a visit',\n viaFts: 'keyword',\n viaVec: 'semantic',\n viaBoth: 'dual',\n viaEdgeLabel: 'corridor',\n benchRewrite: 'route split into {n}',\n benchCompress: 'compressed {n} overflow placards',\n sectionActivity: 'Curator log',\n activityEmpty: 'No curator activity yet',\n detailRevisions: 'Exhibit history',\n tourProposalTitle: 'Tour proposal',\n tourProposalEmpty: 'The palace is empty — place a first room via engram_save',\n tourProposalHint: 'Click a room to open its placard',\n tourFocusAll: 'All',\n refurbTitle: 'Refurb suggestions',\n refurbEmpty: 'All rooms are healthy — no suggestions',\n refurbRun: 'Re-scan',\n refurbActionDemote: 'demote',\n refurbActionMerge: 'merge',\n refurbActionReview: 'review',\n refurbActionSplit: 'split',\n refurbCount: '{n} suggestions',\n refurbExecute: 'Apply',\n refurbConfirmDemote: 'Demote this room? Status will become archived; you can reopen it later.',\n refurbConfirmMerge: 'Merge {n} similar rooms? This triggers engram_distill to fold them into one higher-level pattern.',\n refurbDemoteDone: 'Demoted',\n refurbMergeDone: 'Merge dispatched',\n refurbActionFailed: 'Action failed: {msg}',\n refurbMergeEmpty: 'No merge candidates',\n reviewQueueTitle: 'Due today',\n reviewQueueEmpty: 'Nothing due today — palace rhythm is healthy',\n reviewReveal: 'Reveal placard',\n reviewGradeRemember: 'Remembered',\n reviewGradeVague: 'Hazy',\n reviewGradeForgot: 'Forgot',\n reviewOverdue: '{n}d overdue',\n reviewDueToday: 'due today',\n reviewNoPlacard: '(no placard)',\n reviewScheduled: 'Scheduled again in {n}d',\n sortTime: 'By time',\n sortTour: 'By tour route',\n dueBadgeLabel: '{n} due for review — click to open',\n}\n","/**\n * dsh-engram client half: 注册设置页「记忆库」section。\n * 数据经回环 API(/api/engram/*)读取与操作,与 host 半的路由对齐。\n * 文案经宿主 locale 服务(zh/en 词典,语言切换由渲染器自动重渲染)。\n * @module @kenz1117/dsh-engram/client\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\n// Type-only: ctx.locale 服务声明(宿主 locale 插件的 Context merge)。\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: ctx.slots(renderer 的 SlotMap 渲染接线)。\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\n// Type-only: settings.section 槽位的 SlotMap merge(ui-settings 契约)。\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\n// Type-only: LocaleNamespaceMap 声明合并目标(t 席位的键类型检查)。\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport { EngramSection } from './EngramPanel.tsx'\nimport { NS, en, zh, type EngramKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n [NS]: EngramKey\n }\n}\n\n/** 必需服务:slots 渲染接线 + locale 词典注册。 */\nexport const inject = ['slots', 'locale']\n\n/**\n * Client plugin body: 注册 zh/en 词典与设置页「记忆库」section(order 20,\n * 排在 general/models/plugins 之后)。\n * @param ctx - client root context.\n */\nexport function apply(ctx: Context): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-engram: dictionaries')\n const t = ctx.locale.bind(NS)\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'engram',\n order: 20,\n label: () => t('nav'),\n locale: NS,\n }, EngramSection))\n}\n"],"mappings":"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"}