@kenz1117/dsh-engram 0.7.2 → 0.7.4
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/README.en.md +19 -6
- package/README.md +19 -6
- package/lib/client.js +1 -1
- package/lib/client.js.map +1 -1
- package/lib/index.js +754 -94
- package/package.json +1 -1
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 /** 桩位(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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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["useMemo","useRef","useState","styles","styles","useState","useRef","useCallback","useState","useCallback","styles","useState","useCallback","useRef"],"sources":["../src/client/locales.ts","../src/client/CorridorMap.tsx","../src/client/Toast.tsx","../src/client/UiStorage.ts","../src/client/EngramPanel.tsx","../src/client/index.ts"],"sourcesContent":["/**\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 | 'cardRedacted'\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 | 'tabToday'\n | 'tabLibrary'\n | 'tabCorridor'\n | 'tabLog'\n | 'tabLibraryCount'\n | 'roomsTitle'\n | 'roomsHint'\n | 'reviewQueueHint'\n | 'healthEvaluatedAt'\n | 'logFilterAll'\n | 'logFilterWrite'\n | 'logFilterIngest'\n | 'logFilterRetrieve'\n | 'logFilterOrganize'\n | 'logCount'\n | 'benchTitle'\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 | 'sectionCorridor'\n | 'corridorEmpty'\n | 'corridorFailed'\n | 'corridorLoad'\n | 'corridorAria'\n | 'corridorSummary'\n | 'edgeSupersedes'\n | 'edgeContradicts'\n | 'edgeOther'\n | 'healthLoading'\n | 'teleFailed'\n | 'teleLoading'\n | 'teleGroupRecent'\n | 'telePrivacyHint'\n | 'telePrivacyTip'\n | 'teleWrites'\n | 'teleIngest'\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 | '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 | 'tabBackfill'\n | 'backfillIntro'\n | 'backfillRulesTitle'\n | 'backfillDays'\n | 'backfillDaysAll'\n | 'backfillDaysUnit'\n | 'backfillMaxTurns'\n | 'backfillMaxTotal'\n | 'backfillModel'\n | 'backfillModelAuto'\n | 'backfillIncludeSubagents'\n | 'backfillIncludeSeeded'\n | 'backfillIncludeNoCwd'\n | 'backfillReestimate'\n | 'backfillEstimateTitle'\n | 'backfillCandidates'\n | 'backfillPendingTurns'\n | 'backfillAlready'\n | 'backfillSkippedDetail'\n | 'backfillTruncated'\n | 'backfillStart'\n | 'backfillPause'\n | 'backfillStateRunning'\n | 'backfillStateDone'\n | 'backfillStateCancelled'\n | 'backfillStateFailed'\n | 'backfillProgressSessions'\n | 'backfillProgressTurns'\n | 'backfillWritten'\n | 'backfillTurnsSkipped'\n | 'backfillTurnsFailed'\n | 'backfillFailures'\n | 'backfillEstimating'\n | 'backfillSkipReasons'\n | 'backfillRouteHint'\n | 'skipLowActivity'\n | 'skipChitchat'\n | 'skipForbidden'\n | 'skipNoContent'\n | 'skipAlready'\n | 'skipNoTurn'\n | 'skipNoRoute'\n | 'skipUnparsable'\n\n/** kind 数据值 → 词典键(面板与走廊图共用一份,避免两处各自硬编码房间名)。 */\nexport const KIND_KEY: Readonly<Record<string, EngramKey>> = {\n fact: 'kindFact',\n preference: 'kindPreference',\n decision: 'kindDecision',\n episode: 'kindEpisode',\n skill: 'kindSkill',\n}\n\n/** 中文词典(宿主默认语言)。整页采用「记忆宫殿」语言:宫殿 / 房间(kind 分组)/ 记忆 / 铭牌 / 参观 / 管家 / 走廊。\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 cardRedacted: '涂改 {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 tabToday: '今日管家',\n tabLibrary: '宫殿陈展',\n tabCorridor: '走廊巡游',\n tabLog: '管家日志',\n tabLibraryCount: '{n} 条',\n roomsTitle: '房间目录',\n roomsHint: '每间满 9 个桩位后开新间',\n reviewQueueHint: '只给线索:先在脑中复述,再揭示核对',\n healthEvaluatedAt: '诊脉于 {time}',\n logFilterAll: '全部',\n logFilterWrite: '落成类',\n logFilterIngest: '发掘',\n logFilterRetrieve: '检索',\n logFilterOrganize: '整理',\n logCount: '{n} 条 · 两库合并倒序',\n benchTitle: '检索实验台',\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 sectionCorridor: '走廊鸟瞰',\n corridorEmpty: '走廊空空如也,落成几条记忆后这里会出现鸟瞰图。',\n corridorFailed: '走廊加载失败',\n corridorLoad: '加载走廊鸟瞰…',\n corridorAria: '走廊鸟瞰图',\n corridorSummary: '{nodes} 条记忆 · {edges} 条走廊',\n edgeSupersedes: '推陈出新',\n edgeContradicts: '互斥',\n edgeOther: '相邻 / 支持 / 提炼',\n healthLoading: '正在诊脉…',\n teleFailed: '遥测加载失败',\n teleLoading: '聚合管家记录中…',\n teleGroupRecent: '近 7 天',\n telePrivacyHint: '数据仅在本机聚合 · 不外传',\n telePrivacyTip: '所有 op_log 与遥测计数只在当前进程的 SQLite 里聚合,从未发送至任何外部服务;本机重启或卸载插件即清空。',\n teleWrites: '落成',\n teleIngest: '发掘',\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 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 tabBackfill: '历史回填',\n backfillIntro: '把 dsh 的历史会话逐轮提炼进宫殿:每条会话写进它自己 cwd 对应的项目库;已摄取过的轮次按幂等键自动跳过,中断后再次开始即可续做。回填的条目不会进入今日复习队列。',\n backfillRulesTitle: '导入规则',\n backfillDays: '时间窗',\n backfillDaysAll: '不限',\n backfillDaysUnit: '{n} 天',\n backfillMaxTurns: '单会话最多轮数',\n backfillMaxTotal: '本次总轮数上限',\n backfillModel: '辅助模型',\n backfillModelAuto: '自动(用当前在用的模型)',\n backfillIncludeSubagents: '包含子代理会话',\n backfillIncludeSeeded: '包含种子会话',\n backfillIncludeNoCwd: '包含无 cwd 会话(只能进私人宫殿)',\n backfillReestimate: '重新估算',\n backfillEstimateTitle: '估算',\n backfillCandidates: '候选会话 {n}',\n backfillPendingTurns: '待处理 {n} 轮',\n backfillAlready: '已摄取跳过 {n} 轮',\n backfillSkippedDetail: '已排除:子代理 {subagent} · 种子 {seeded} · 无 cwd {noCwd} · 超时间窗 {tooOld} · 日志不可读 {unreadable}',\n backfillTruncated: '候选超出总轮数上限:本次只处理最近的一部分会话,可调大上限或分几次跑',\n backfillStart: '开始回填',\n backfillPause: '暂停',\n backfillStateRunning: '回填中…',\n backfillStateDone: '已完成',\n backfillStateCancelled: '已中止(可再次开始续做)',\n backfillStateFailed: '失败',\n backfillProgressSessions: '会话 {done}/{total}',\n backfillProgressTurns: '轮次 {done}/{total}',\n backfillWritten: '写入 {n} 条',\n backfillTurnsSkipped: '跳过 {n} 轮',\n backfillTurnsFailed: '失败 {n} 轮',\n backfillFailures: '失败明细',\n backfillEstimating: '正在估算…',\n backfillSkipReasons: '跳过原因',\n backfillRouteHint: '失败多半是因为历史会话当时用的模型在当前环境不可用:可在 cordis.yml 配置 provider/model,或先用目标模型跑一轮会话(回填会复用当前在用的模型)再重试——已完成的轮次会自动跳过。',\n skipLowActivity: '低活动轮',\n skipChitchat: '寒暄轮',\n skipForbidden: '显式禁记',\n skipNoContent: '无用户内容',\n skipAlready: '已摄取',\n skipNoTurn: '无此轮',\n skipNoRoute: '日志无路由',\n skipUnparsable: '提炼输出不可解析',\n}\n\n/** 英文词典。整页采用「Memory Palace」语言:palace / room (kind group) / memory / 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 memory, roamable in Obsidian',\n allStatuses: 'All statuses',\n allKinds: 'All rooms',\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 Hall',\n kindPreference: 'Preference Pavilion',\n kindDecision: 'Decision Chamber',\n kindEpisode: 'Episode Gallery',\n kindSkill: 'Skill Workshop',\n labelContent: 'Placard',\n labelKind: 'Room',\n labelStatus: 'Status',\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 cardRedacted: '{n} redacted',\n detail: 'Tour',\n edit: 'Renovate',\n forget: 'Close',\n restore: 'Reopen',\n empty: 'No memories to display',\n emptyHint: 'Adjust the rooms above, or place a new memory',\n loadFailed: 'Tour halted: {msg}',\n loading: 'Guiding…',\n pagerInfo: 'Page {page} / {pages} · {total} memories',\n prevPage: 'Previous page',\n nextPage: 'Next page',\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 tabToday: 'Today',\n tabLibrary: 'Palace',\n tabCorridor: 'Corridor tour',\n tabLog: 'Curator log',\n tabLibraryCount: '{n} memories',\n roomsTitle: 'Room directory',\n roomsHint: 'A new room opens once 9 slots fill',\n reviewQueueHint: 'Cues only: recall first, then reveal to check',\n healthEvaluatedAt: 'Scored {time}',\n logFilterAll: 'All',\n logFilterWrite: 'Writes',\n logFilterIngest: 'Capture',\n logFilterRetrieve: 'Retrieval',\n logFilterOrganize: 'Organize',\n logCount: '{n} entries · both stores merged, newest first',\n benchTitle: 'Retrieval bench',\n drawerClose: 'Return',\n drawerTitle: 'Memory placard',\n kpiTotal: 'Memories',\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: 'rooms merged',\n selectAll: 'Select all on page',\n deselectAll: 'Deselect all',\n selectedCount: '{n} memories',\n batchForget: 'Close selected ({n})',\n batchForgetConfirm: 'Close {n} memories?',\n batchRestore: 'Reopen selected ({n})',\n clearSelection: 'Clear selection',\n sectionCorridor: 'Corridor overview',\n corridorEmpty: 'No memories yet — the bird’s-eye view appears after a few memories arrive.',\n corridorFailed: 'Failed to load corridor',\n corridorLoad: 'Loading corridor overview…',\n corridorAria: 'Corridor overview map',\n corridorSummary: '{nodes} memories · {edges} corridors',\n edgeSupersedes: 'supersedes',\n edgeContradicts: 'contradicts',\n edgeOther: 'related / supports / refines',\n healthLoading: 'Taking pulse…',\n teleFailed: 'Telemetry failed',\n teleLoading: 'Aggregating curator events…',\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 teleIngest: 'Excavated',\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 activityEmpty: 'No curator activity yet',\n detailRevisions: 'Exhibit history',\n tourProposalTitle: 'Tour proposal',\n tourProposalEmpty: 'The palace is empty — place a first memory via engram_save',\n tourProposalHint: 'Click a memory 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 memory? Status will become archived; you can reopen it later.',\n refurbConfirmMerge: 'Merge {n} similar memories? 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 tabBackfill: 'History backfill',\n backfillIntro: 'Distils past dsh sessions into the palace, turn by turn: each session is written into the project store matching its own cwd. Turns already captured are skipped by idempotency key, so starting again resumes where it stopped. Backfilled memories never enter the due-today queue.',\n backfillRulesTitle: 'Import rules',\n backfillDays: 'Time window',\n backfillDaysAll: 'All',\n backfillDaysUnit: '{n} days',\n backfillMaxTurns: 'Max turns per session',\n backfillMaxTotal: 'Total turn budget',\n backfillModel: 'Auxiliary model',\n backfillModelAuto: 'Auto (model currently in use)',\n backfillIncludeSubagents: 'Include subagent sessions',\n backfillIncludeSeeded: 'Include seeded sessions',\n backfillIncludeNoCwd: 'Include sessions without cwd (private palace only)',\n backfillReestimate: 'Re-estimate',\n backfillEstimateTitle: 'Estimate',\n backfillCandidates: '{n} candidate sessions',\n backfillPendingTurns: '{n} turns pending',\n backfillAlready: '{n} turns already captured',\n backfillSkippedDetail: 'Excluded: subagent {subagent} · seeded {seeded} · no cwd {noCwd} · outside window {tooOld} · unreadable {unreadable}',\n backfillTruncated: 'Candidates exceed the total turn budget: only the most recent sessions run this time — raise the budget or run in batches',\n backfillStart: 'Start backfill',\n backfillPause: 'Pause',\n backfillStateRunning: 'Running…',\n backfillStateDone: 'Finished',\n backfillStateCancelled: 'Stopped (start again to resume)',\n backfillStateFailed: 'Failed',\n backfillProgressSessions: 'Sessions {done}/{total}',\n backfillProgressTurns: 'Turns {done}/{total}',\n backfillWritten: '{n} memories written',\n backfillTurnsSkipped: '{n} turns skipped',\n backfillTurnsFailed: '{n} turns failed',\n backfillFailures: 'Failures',\n backfillEstimating: 'Estimating…',\n backfillSkipReasons: 'Skipped',\n backfillRouteHint: 'Failures are usually because the model a past session used is not available here: set provider/model in cordis.yml, or run one turn with the target model first (backfill reuses the model currently in use) and retry — finished turns are skipped automatically.',\n skipLowActivity: 'low activity',\n skipChitchat: 'chitchat',\n skipForbidden: 'capture forbidden',\n skipNoContent: 'no user content',\n skipAlready: 'already captured',\n skipNoTurn: 'no such turn',\n skipNoRoute: 'no route in log',\n skipUnparsable: 'unparsable output',\n}\n","/**\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'\nimport { KIND_KEY, type EngramKey } from './locales.ts'\n\n/** 走廊图使用的翻译函数(渲染器合成的窄签名)。 */\ntype CorridorT = (key: EngramKey, params?: Record<string, unknown>) => string\n\n/** kind → 本地化房间名(词典缺失时回退数据值)。 */\nfunction roomLabel(t: CorridorT, kind: string): string {\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key as EngramKey)\n}\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 个语义色相(按 kind 分组)。 */\nconst KIND_PALETTE: Readonly<Record<string, string>> = {\n fact: '#5b8def',\n preference: '#f0a85c',\n decision: '#9b6bd9',\n episode: '#3cb489',\n skill: '#e26b86',\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 /** 界面文案(房间名与图例走宿主 locale 词典)。 */\n readonly t: CorridorT\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, t } = 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 roomKinds = 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}>{t('corridorEmpty')}</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={t('corridorAria')} key={scope}>\n {/* 房间背景带(斑马纹区隔)。scope 切换通过父 svg key 重挂载触发 fade-in。 */}\n {roomKinds.map((kind, idx) => {\n const band = width / Math.max(roomKinds.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 {roomKinds.map((kind, idx) => {\n const band = width / Math.max(roomKinds.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 {roomLabel(t, 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 = KIND_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\">{roomLabel(t, 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 {roomKinds.map(kind => (\n <span key={kind} className={styles.legendItem}>\n <span className={styles.legendDot} style={{ background: KIND_PALETTE[kind] ?? '#7d8590' }} />\n {roomLabel(t, kind)}\n </span>\n ))}\n <span className={styles.legendItem}>{t('corridorSummary', { nodes: nodes.length, edges: 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' ? t('edgeSupersedes') : type === 'contradicts' ? t('edgeContradicts') : t('edgeOther')}</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 { KIND_KEY, 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 /** 各房间(kind)条目数;stats 路由的 byKind 字段(房间目录数据源)。 */\n readonly byKind?: Readonly<Record<string, 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 SCOPE_KEY: Record<MemoryRow['scope'], EngramKey> = {\n user: 'scopeUser',\n project: 'scopeProject',\n shared: 'scopeShared',\n}\n/** 房间色相类(panel.module.css 的 .roomFact 等);未知 kind 回退通用的 .kind。 */\nconst ROOM_CLASS: Record<string, string> = {\n fact: 'roomFact',\n preference: 'roomPreference',\n decision: 'roomDecision',\n episode: 'roomEpisode',\n skill: 'roomSkill',\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/** 房间 pill 的类名:按 kind 取色相类,未知 kind 回退通用品牌色。 */\nfunction roomPillClass(kind: string): string {\n return `${styles.pill} ${styles[ROOM_CLASS[kind] ?? 'kind'] ?? ''}`\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/** 速览指标:大数 + 小标签 + 可选尾注;secondary 用于并排的次级计数。 */\nfunction Metric({ label, value, tail, secondary }: {\n label: string\n value: string | number\n tail?: string | undefined\n secondary?: boolean\n}): React.ReactElement {\n return (\n <div className={styles.metric}>\n <span className={styles.metricLabel}>{label}</span>\n <b className={secondary === true ? `${styles.metricValue} ${styles.metricValueSecondary}` : styles.metricValue}>{value}</b>\n {tail !== undefined && <span className={styles.metricTail}>{tail}</span>}\n </div>\n )\n}\n\n/** 健康分环:SVG 描边进度(0-100),颜色随分数分档。 */\nfunction HealthRing({ score }: { score: number }): React.ReactElement {\n const radius = 24\n const circumference = 2 * Math.PI * radius\n const filled = circumference * (Math.min(100, Math.max(0, score)) / 100)\n const tone = score >= 80 ? 'var(--dsw-alias-state-success-primary)'\n : score >= 50 ? 'var(--dsw-alias-state-warn-primary)'\n : 'var(--dsw-alias-state-error-primary)'\n return (\n <div className={styles.ring} role=\"meter\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={score}>\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" aria-hidden=\"true\">\n <circle cx=\"28\" cy=\"28\" r={radius} fill=\"none\" stroke=\"var(--dsw-alias-border-l2)\" strokeWidth=\"4\" />\n <circle cx=\"28\" cy=\"28\" r={radius} fill=\"none\" stroke={tone} strokeWidth=\"4\" strokeLinecap=\"round\"\n strokeDasharray={`${filled.toFixed(1)} ${circumference.toFixed(1)}`} />\n </svg>\n <b>{score}</b>\n </div>\n )\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={roomPillClass(record.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={roomPillClass(hit.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 枚举 → 分组(数据层英文枚举只在显示层映射)。 */\ntype LogFilter = 'all' | 'write' | 'ingest' | 'retrieve' | 'organize'\nconst LOG_GROUPS: Readonly<Record<LogFilter, readonly string[] | null>> = {\n all: null,\n write: ['write', 'update', 'forget', 'restore', 'decay', 'superseded', 'outcome-report'],\n ingest: ['ingest-request', 'ingest-done'],\n retrieve: ['search-rewrite-request', 'compress-request'],\n organize: ['distill-request'],\n}\nconst LOG_FILTER_KEY: Readonly<Record<LogFilter, EngramKey>> = {\n all: 'logFilterAll',\n write: 'logFilterWrite',\n ingest: 'logFilterIngest',\n retrieve: 'logFilterRetrieve',\n organize: 'logFilterOrganize',\n}\n/** 分组 → 行首色点类(与工具条计数、筛选分组同色)。 */\nconst LOG_DOT: Readonly<Record<'write' | 'ingest' | 'retrieve' | 'organize', string>> = {\n write: 'logDotWrite',\n ingest: 'logDotIngest',\n retrieve: 'logDotRetrieve',\n organize: 'logDotOrganize',\n}\n/** op 枚举 → 所属筛选分组(未归类返回 all)。 */\nfunction logGroupOf(op: string): LogFilter {\n for (const group of ['write', 'ingest', 'retrieve', 'organize'] as const) {\n if (LOG_GROUPS[group]?.includes(op) === true) return group\n }\n return 'all'\n}\n/** 行首色点类名:未归类的 op 用中性灰点,避免出现无颜色的空列。 */\nfunction logDotClass(op: string): string {\n const group = logGroupOf(op)\n const base = styles.logDot ?? ''\n return group === 'all' ? base : `${base} ${styles[LOG_DOT[group]] ?? ''}`\n}\n\n/**\n * 管家日志整页视图:顶部近 7 天三个计数,下面是两库合并的完整 op_log\n * (时间 · 操作 · 宫殿 · 摘要),可按操作类别筛选;不再限高裁切,供逐条审计。\n */\nfunction LogPanel({ t, telemetry }: { t: T; telemetry: TelemetrySnapshot | null }): React.ReactElement {\n const [rows, setRows] = useState<ActivityRow[] | null>(null)\n const [filter, setFilter] = useState<LogFilter>('all')\n useEffect(() => {\n let cancelled = false\n api<{ operations: ActivityRow[] }>('activity?limit=50')\n .then((data) => { if (!cancelled) setRows(data.operations) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [])\n const allow = LOG_GROUPS[filter]\n const visible = (rows ?? []).filter(row => allow === null || allow.includes(row.op))\n const counts = telemetry?.counts\n return (\n <section className={styles.section}>\n {/* 一条工具条:标题 + 条数 + 近 7 天三类计数(带类别色点)+ 类别筛选,\n 取代原先「独立计数卡 + 筛选行」两段式。 */}\n <div className={styles.logToolbar}>\n <h4 className={styles.sectionTitle}>{t('tabLog')}</h4>\n <span className={styles.sectionHint}>{t('logCount', { n: visible.length })}</span>\n <span className={styles.logCounts}>\n <span><i className={`${styles.logDot} ${styles.logDotWrite}`} aria-hidden=\"true\" />{t('teleWrites')} <b>{counts?.writes ?? 0}</b></span>\n <span><i className={`${styles.logDot} ${styles.logDotIngest}`} aria-hidden=\"true\" />{t('teleIngest')} <b>{counts?.ingestDones ?? 0}</b></span>\n <span><i className={`${styles.logDot} ${styles.logDotOrganize}`} aria-hidden=\"true\" />{t('teleConsolidate')} <b>{counts?.consolidations ?? 0}</b></span>\n </span>\n <div className={styles.segGroup} role=\"tablist\">\n {(['all', 'write', 'ingest', 'retrieve', 'organize'] as const).map(option => (\n <button key={option} type=\"button\" role=\"tab\" aria-selected={filter === option}\n className={filter === option ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setFilter(option) }}>{t(LOG_FILTER_KEY[option])}</button>\n ))}\n </div>\n </div>\n <div className={styles.panelCard}>\n {rows === null\n ? <div className={styles.expandLoading}>{t('loading')}</div>\n : visible.length === 0\n ? <div className={styles.expandLoading}>{t('activityEmpty')}</div>\n : (\n <div className={styles.logList}>\n {visible.map((op, index) => (\n <div key={index} className={styles.logRow}>\n <i className={logDotClass(op.op)} aria-hidden=\"true\" />\n <span className={styles.logTime}>{relTime(t, op.at)}</span>\n <span className={styles.logOp}>{opLabel(t, op.op)}</span>\n <span className={styles.logScope}>{op.scope === 'user' ? t('scopeUser') : t('scopeProject')}</span>\n <span className={styles.logDetail} title={op.detail ?? ''}>{activityDetail(t, op.detail)}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\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={roomPillClass(item.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.chipRow} 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.chip} ${styles.chipOn}` : styles.chip}\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}>{kindLabel(t, 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} t={t} />\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\n/** 房间目录:kind → 条目数(stats.byKind);色块与房间 pill 同色相。 */\nfunction RoomDirectory({ t, byKind }: { t: T; byKind: Readonly<Record<string, number>> }): React.ReactElement {\n return (\n <div className={styles.roomList}>\n {KINDS.map(kind => (\n <div key={kind} className={styles.roomRow}>\n <span className={`${styles.roomSwatch} ${styles[ROOM_CLASS[kind] ?? ''] ?? ''}`} aria-hidden=\"true\" />\n <span>{kindLabel(t, kind)}</span>\n <b className={styles.roomCount}>{byKind[kind] ?? 0}</b>\n </div>\n ))}\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 * 宫殿总览取数:规模(stats,含房间分布)+ 近 7 天活动(telemetry)+ 健康分(health)\n * 一次并行拉齐,供今日速览、健康分构成与房间目录共用(同一路由不重复请求)。\n * @param scope - 当前观察的宫殿(跟随 Header 三宫格)。\n * @returns 各段数据与取数失败原因(失败时保留上一次成功值)。\n */\nfunction usePalaceOverview(scope: 'user' | 'project' | 'shared'): {\n stats: StatsPart['stats'] | null\n byKind: Readonly<Record<string, number>>\n telemetry: TelemetrySnapshot | null\n health: HealthReport | null\n failed: string | null\n} {\n const [state, setState] = useState<{\n stats: StatsPart['stats'] | null\n byKind: Readonly<Record<string, number>>\n telemetry: TelemetrySnapshot | null\n health: HealthReport | null\n failed: string | null\n }>({ stats: null, byKind: {}, telemetry: null, health: null, failed: null })\n useEffect(() => {\n let cancelled = false\n Promise.all([\n api<{ parts: StatsPart[] }>('stats'),\n api<TelemetrySnapshot>(`telemetry?days=7&scope=${scope}`),\n api<HealthReport>(`health?scope=${scope}`),\n ])\n .then(([statRes, tele, health]) => {\n if (cancelled) return\n const stats = statRes.parts.find(part => part.scope === scope)?.stats ?? null\n setState({ stats, byKind: stats?.byKind ?? {}, telemetry: tele, health, failed: null })\n })\n .catch((error: Error) => {\n if (!cancelled) setState(current => ({ ...current, failed: error.message }))\n })\n return () => { cancelled = true }\n }, [scope])\n return state\n}\n\n/**\n * 今日速览:三个主指标(记忆 / 开放 / 清晰度)+ 近 7 天三个次级计数 + 健康分环。\n * 取代原先常驻的九格日报条——主次分层,其余计数下沉到「管家日志」tab。\n */\nfunction TodayHero({ t, overview }: { t: T; overview: ReturnType<typeof usePalaceOverview> }): React.ReactElement {\n const { stats, telemetry, health, failed } = overview\n if (failed !== null) {\n return <section className={styles.panelCard}><div className={styles.expandLoading}>{t('teleFailed')}:{failed}</div></section>\n }\n if (telemetry === null) {\n return <section className={styles.panelCard}><div className={styles.expandLoading}>{t('teleLoading')}</div></section>\n }\n const counts = telemetry.counts\n return (\n <section className={styles.panelCard}>\n <div className={styles.hero}>\n <div className={styles.heroMetrics}>\n <Metric label={t('kpiTotal')} value={stats?.total ?? 0}\n tail={`${t('teleGroupRecent')} +${String(counts.writes)}`} />\n <Metric label={t('kpiActive')} value={stats?.active ?? 0}\n tail={`${t('kpiForgotten')} ${String(stats?.forgotten ?? 0)}`} />\n <Metric label={t('kpiSignal')} value={`${String(Math.round((stats?.signalRatio ?? 0) * 100))}%`}\n tail={t('cardRedacted', { n: stats?.redacted ?? 0 })} />\n </div>\n <div className={styles.heroSide}>\n <Metric label={t('teleWrites')} value={counts.writes} secondary />\n <Metric label={t('teleIngest')} value={counts.ingestRequests} secondary />\n <Metric label={t('teleConsolidate')} value={counts.consolidations} secondary />\n <HealthRing score={health?.overall ?? 0} />\n </div>\n </div>\n <div className={styles.heroFoot}>\n <span className={styles.sectionHint}>\n {health === null ? t('healthLoading') : t('healthEvaluatedAt', { time: relTime(t, health.evaluatedAt) })}\n </span>\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 </section>\n )\n}\n\n/** 历史回填 API 的估算结构(GET /api/engram/history-backfill)。 */\ninterface BackfillEstimateView {\n readonly rules: {\n readonly days: number\n readonly maxTurnsPerSession: number\n readonly maxTotalTurns: number\n readonly includeSubagents: boolean\n readonly includeSeeded: boolean\n readonly includeNoCwd: boolean\n }\n readonly candidates: number\n readonly eligibleTurns: number\n readonly pendingTurns: number\n readonly alreadyIngested: number\n readonly skipped: {\n readonly subagent: number\n readonly seeded: number\n readonly noCwd: number\n readonly tooOld: number\n readonly unreadable: number\n }\n readonly truncated: boolean\n readonly unavailable?: string\n}\n\n/** 宿主已注册的 provider 与模型清单(GET /api/engram/models)。 */\ninterface ModelsView {\n readonly providers: readonly { readonly id: string; readonly name: string; readonly models: readonly { readonly id: string; readonly name: string }[] }[]\n readonly failures: readonly string[]\n}\n\n/** 历史回填任务状态(GET /api/engram/history-backfill/status)。 */\ninterface BackfillStatusView {\n readonly progress: {\n readonly state: 'running' | 'done' | 'cancelled' | 'failed'\n readonly sessionsTotal: number\n readonly sessionsDone: number\n readonly turnsPlanned: number\n readonly turnsDone: number\n readonly memoriesWritten: number\n readonly turnsSkipped: number\n readonly turnsFailed: number\n readonly skipReasons: Readonly<Record<string, number>>\n readonly currentSession?: string\n }\n readonly failures: readonly { readonly sessionId: string; readonly turn: number; readonly reason: string }[]\n readonly error?: string\n}\n\n/** 跳过原因(摄取管线的英文枚举)→ 词典键。 */\nconst SKIP_KEY: Record<string, EngramKey> = {\n 'low-activity': 'skipLowActivity',\n chitchat: 'skipChitchat',\n 'capture-forbidden': 'skipForbidden',\n 'no-user-content': 'skipNoContent',\n 'already-ingested': 'skipAlready',\n 'no-such-turn': 'skipNoTurn',\n 'no-previous-turn': 'skipNoTurn',\n 'no-route-in-log': 'skipNoRoute',\n unparsable: 'skipUnparsable',\n}\n\n/** 跳过原因的本地化标签(未知枚举回退原值)。 */\nfunction skipLabel(t: T, reason: string): string {\n const key = SKIP_KEY[reason]\n return key === undefined ? reason : t(key)\n}\n\n/**\n * 历史回填:导入规则由用户选择(时间窗 / 轮数上限 / 三类会话过滤),\n * 先估算(零成本)再执行;运行中每 1.5 秒轮询进度,可暂停续做。\n */\nfunction HistoryBackfillCard({ t, toast }: { t: T; toast: ToastController }): React.ReactElement {\n /** 规则(持久化):时间窗与过滤开关以字符串存,便于 localStorage 往返。 */\n const [days, setDays] = usePersistedState<string>('backfill.days', '7', ['7', '30', '90', '0'])\n const [maxTurns, setMaxTurns] = usePersistedString('backfill.maxTurns', '20')\n const [maxTotal, setMaxTotal] = usePersistedString('backfill.maxTotal', '200')\n const [subagents, setSubagents] = usePersistedState<string>('backfill.subagents', 'false', ['false', 'true'])\n const [seeded, setSeeded] = usePersistedState<string>('backfill.seeded', 'false', ['false', 'true'])\n const [noCwd, setNoCwd] = usePersistedState<string>('backfill.noCwd', 'false', ['false', 'true'])\n /** 辅助模型选择:'' = 自动(用当前在用的模型);否则 `provider::model`。 */\n const [modelChoice, setModelChoice] = usePersistedString('backfill.model', '')\n const [models, setModels] = useState<ModelsView | null>(null)\n const [estimate, setEstimate] = useState<BackfillEstimateView | null>(null)\n const [status, setStatus] = useState<BackfillStatusView | null>(null)\n const [busy, setBusy] = useState(false)\n\n // 已注册模型清单:只拉一次(模型注册表变化不频繁,切换 tab 会重新挂载)。\n useEffect(() => {\n let cancelled = false\n api<ModelsView>('models')\n .then((data) => { if (!cancelled) setModels(data) })\n .catch(() => { if (!cancelled) setModels({ providers: [], failures: [] }) })\n return () => { cancelled = true }\n }, [])\n\n /** 显式选中的辅助模型(未选 = 交给后端用当前在用的模型)。 */\n const selection = ((): { provider: string; model: string } | undefined => {\n if (modelChoice === '') return undefined\n const separator = modelChoice.indexOf('::')\n if (separator <= 0) return undefined\n return { provider: modelChoice.slice(0, separator), model: modelChoice.slice(separator + 2) }\n })()\n\n const params = new URLSearchParams({\n days, maxTurnsPerSession: maxTurns, maxTotalTurns: maxTotal,\n includeSubagents: subagents, includeSeeded: seeded, includeNoCwd: noCwd,\n })\n if (selection !== undefined) {\n params.set('provider', selection.provider)\n params.set('model', selection.model)\n }\n const query = params.toString()\n\n const reload = useCallback((): void => {\n setBusy(true)\n api<{ estimate: BackfillEstimateView }>(`history-backfill?${query}`)\n .then((data) => { setEstimate(data.estimate) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }, [query, toast])\n useEffect(() => { reload() }, [reload])\n\n // 进度轮询:运行中每 1.5 秒一次;空闲只拉一次拿最终态。\n const running = status?.progress.state === 'running'\n useEffect(() => {\n let cancelled = false\n const poll = (): void => {\n api<BackfillStatusView>('history-backfill/status')\n .then((data) => { if (!cancelled) setStatus(data) })\n .catch(() => { /* 轮询失败静默重试,不打断面板 */ })\n }\n poll()\n if (!running) return () => { cancelled = true }\n const timer = window.setInterval(poll, 1500)\n return () => { cancelled = true; window.clearInterval(timer) }\n }, [running])\n\n const start = (): void => {\n setBusy(true)\n api<{ ok: boolean; status: BackfillStatusView }>('history-backfill/start', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n days: Number(days), maxTurnsPerSession: Number(maxTurns), maxTotalTurns: Number(maxTotal),\n includeSubagents: subagents === 'true', includeSeeded: seeded === 'true', includeNoCwd: noCwd === 'true',\n ...(selection === undefined ? {} : { provider: selection.provider, model: selection.model }),\n }),\n })\n .then((data) => { setStatus(data.status) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }\n const pause = (): void => {\n api<{ status: BackfillStatusView }>('history-backfill/cancel', {\n method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}',\n })\n .then((data) => { setStatus(data.status) })\n .catch((error: Error) => { toast.push('error', error.message) })\n }\n\n const progress = status?.progress\n const stateLabel = progress === undefined\n ? ''\n : progress.state === 'running' ? t('backfillStateRunning')\n : progress.state === 'done' ? t('backfillStateDone')\n : progress.state === 'cancelled' ? t('backfillStateCancelled')\n : t('backfillStateFailed')\n const percent = progress === undefined || progress.turnsPlanned === 0\n ? 0\n : Math.min(100, Math.round((progress.turnsDone / progress.turnsPlanned) * 100))\n\n return (\n <div className={styles.backfill}>\n <p className={styles.backfillIntro}>{t('backfillIntro')}</p>\n\n {/* 导入规则:全部由用户选择(持久化,下次进来沿用)。 */}\n <div className={styles.backfillRules}>\n <label className={styles.backfillRule}>\n <span>{t('backfillDays')}</span>\n <select className={styles.input} value={days} onChange={event => { setDays(event.target.value) }}>\n <option value=\"7\">{t('backfillDaysUnit', { n: 7 })}</option>\n <option value=\"30\">{t('backfillDaysUnit', { n: 30 })}</option>\n <option value=\"90\">{t('backfillDaysUnit', { n: 90 })}</option>\n <option value=\"0\">{t('backfillDaysAll')}</option>\n </select>\n </label>\n <label className={styles.backfillRule}>\n <span>{t('backfillMaxTurns')}</span>\n <input className={styles.input} type=\"number\" min={1} max={500} value={maxTurns}\n onChange={event => { setMaxTurns(event.target.value) }} />\n </label>\n <label className={styles.backfillRule}>\n <span>{t('backfillMaxTotal')}</span>\n <input className={styles.input} type=\"number\" min={1} max={5000} value={maxTotal}\n onChange={event => { setMaxTotal(event.target.value) }} />\n </label>\n {/* 辅助模型:默认「自动」= 回填时用你当前在用的模型(历史日志里的旧模型可能已不可用)。 */}\n <label className={styles.backfillRule}>\n <span>{t('backfillModel')}</span>\n <select className={styles.input} value={modelChoice}\n onChange={event => { setModelChoice(event.target.value) }}>\n <option value=\"\">{t('backfillModelAuto')}</option>\n {(models?.providers ?? []).map(provider => (\n <optgroup key={provider.id} label={provider.name}>\n {provider.models.map(model => (\n <option key={`${provider.id}::${model.id}`} value={`${provider.id}::${model.id}`}>{model.name}</option>\n ))}\n </optgroup>\n ))}\n </select>\n </label>\n </div>\n <div className={styles.backfillToggles}>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={subagents === 'true'}\n onChange={event => { setSubagents(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeSubagents')}\n </label>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={seeded === 'true'}\n onChange={event => { setSeeded(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeSeeded')}\n </label>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={noCwd === 'true'}\n onChange={event => { setNoCwd(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeNoCwd')}\n </label>\n </div>\n\n {/* 估算:零成本先看数(不写库、不调 LLM)。 */}\n <div className={styles.backfillEstimate}>\n {estimate === null\n ? <span className={styles.backfillMuted}>{t('backfillEstimating')}</span>\n : estimate.unavailable !== undefined\n ? <span className={styles.backfillMuted}>{estimate.unavailable}</span>\n : (\n <>\n <div className={styles.backfillNumbers}>\n <span className={styles.backfillMetric}>{t('backfillCandidates', { n: estimate.candidates })}</span>\n <span className={styles.backfillMetric}>{t('backfillPendingTurns', { n: estimate.pendingTurns })}</span>\n <span className={styles.backfillMetric}>{t('backfillAlready', { n: estimate.alreadyIngested })}</span>\n </div>\n <div className={styles.backfillMuted}>\n {t('backfillSkippedDetail', {\n subagent: estimate.skipped.subagent,\n seeded: estimate.skipped.seeded,\n noCwd: estimate.skipped.noCwd,\n tooOld: estimate.skipped.tooOld,\n unreadable: estimate.skipped.unreadable,\n })}\n </div>\n {estimate.truncated && <div className={styles.backfillMuted}>{t('backfillTruncated')}</div>}\n </>\n )}\n </div>\n\n <div className={styles.backfillActions}>\n <button type=\"button\" className={styles.button} disabled={busy} onClick={reload}>{t('backfillReestimate')}</button>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n disabled={busy || running || estimate === null || estimate.unavailable !== undefined || estimate.pendingTurns === 0}\n onClick={start}>{t('backfillStart')}</button>\n <button type=\"button\" className={styles.button} disabled={!running} onClick={pause}>{t('backfillPause')}</button>\n </div>\n {progress !== undefined && (\n <div className={styles.backfillProgress}>\n <div className={styles.backfillProgressHead}>\n <span>{stateLabel}</span>\n <span>{t('backfillProgressTurns', { done: progress.turnsDone, total: progress.turnsPlanned })}</span>\n </div>\n <div className={styles.progressBar}><i style={{ width: `${String(percent)}%` }} /></div>\n <div className={styles.backfillMeta}>\n <span>{t('backfillProgressSessions', { done: progress.sessionsDone, total: progress.sessionsTotal })}</span>\n <span>{t('backfillWritten', { n: progress.memoriesWritten })}</span>\n <span>{t('backfillTurnsSkipped', { n: progress.turnsSkipped })}</span>\n <span>{t('backfillTurnsFailed', { n: progress.turnsFailed })}</span>\n </div>\n {/* 跳过原因分布:让「写入很少」可解释(多为节流跳过而非失败)。 */}\n {Object.keys(progress.skipReasons).length > 0 && (\n <div className={styles.backfillMeta}>\n <span>{t('backfillSkipReasons')}</span>\n {Object.entries(progress.skipReasons).sort(([, a], [, b]) => b - a).map(([reason, count]) => (\n <span key={reason}>{`${skipLabel(t, reason)} ${String(count)}`}</span>\n ))}\n </div>\n )}\n {(status?.failures ?? []).length > 0 && (\n <ul className={styles.backfillFailures}>\n <li className={styles.backfillMuted}>{t('backfillFailures')}</li>\n {status!.failures.slice(0, 3).map((failure, index) => (\n <li key={`${failure.sessionId}-${String(failure.turn)}-${String(index)}`}>\n {`${failure.sessionId.slice(-12)} · ${String(failure.turn)} · ${failure.reason}`}\n </li>\n ))}\n </ul>\n )}\n {(status?.failures ?? []).length > 0 && (\n <div className={styles.backfillMuted}>{t('backfillRouteHint')}</div>\n )}\n {status?.error !== undefined && <div className={styles.backfillMuted}>{status.error}</div>}\n </div>\n )}\n </div>\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 视图:today 今日速览 / library 陈展列表 / corridor 走廊与检索 / log 管家日志 / backfill 历史回填。 */\n const [activeTab, setActiveTab] = useState<'today' | 'library' | 'corridor' | 'log' | 'backfill'>('today')\n /** 今日速览、健康分构成与房间目录共用一份总览数据(同一路由不重复请求)。 */\n const overview = usePalaceOverview(scope)\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('today')\n requestAnimationFrame(() => {\n document.getElementById('engram-review-due')?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n })\n }\n\n /** 打开详情抽屉:陈展列表已有该行时复用真实行,只有 id 的列表用最小占位行(抽屉自行拉 review)。 */\n const openReview = useCallback((id: string): void => {\n const record = list?.records.find(row => row.id === id)\n setExpanded({\n kind: 'review',\n record: record ?? ({\n id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5,\n status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null,\n } as MemoryRow),\n })\n }, [list, scope])\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 {/* 顶部 Tab Bar:五个视图(今日 / 宫殿 / 走廊 / 日志 / 回填;按「先管家后陈展」语义排序)。\n 原常驻管家日报条已收进「今日」视图的速览卡,其余计数移入「日志」。 */}\n <div className={styles.tabs} role=\"tablist\">\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'today' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'today'}\n onClick={() => { setActiveTab('today') }}>\n {t('tabToday')}\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 <button type=\"button\" role=\"tab\"\n className={activeTab === 'corridor' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'corridor'}\n onClick={() => { setActiveTab('corridor') }}>\n {t('tabCorridor')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'log' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'log'}\n onClick={() => { setActiveTab('log') }}>\n {t('tabLog')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'backfill' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'backfill'}\n onClick={() => { setActiveTab('backfill') }}>\n {t('tabBackfill')}\n </button>\n </div>\n\n {activeTab === 'library' && (\n <div className={styles.tabPanel}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabLibrary')}</h4>\n </div>\n {/* 工具行:搜索占主宽,状态与排序靠右;房间筛选另起一行 chips,避免六项分段挤断换行。 */}\n <div className={styles.toolbarRow}>\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 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 {([['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 </div>\n <div className={styles.chipRow}>\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\" aria-pressed={kind === value}\n className={kind === value ? `${styles.chip} ${styles.chipOn}` : styles.chip}\n onClick={() => { setKind(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\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={roomPillClass(record.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.itemStamp} title={fmtTime(record.createdAt)}>\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 === 'today' && (\n <div className={styles.tabPanel}>\n {/* 今日速览:主指标 + 健康环,替代原常驻日报条。 */}\n <TodayHero t={t} overview={overview} />\n <div className={styles.layout}>\n {/* 左:入殿导航(进宫的入口);右:房间目录 + 今日待回忆 + 翻新清单(要看的与要做的)。 */}\n <div className={styles.mainCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tourProposalTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <TourProposalCard t={t} scope={scope} onSelect={openReview} />\n </div>\n </section>\n </div>\n <aside className={styles.sideCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('roomsTitle')}</h4>\n <span className={styles.sectionHint}>{t('roomsHint')}</span>\n </div>\n <div className={styles.panelCard}>\n <RoomDirectory t={t} byKind={overview.byKind} />\n </div>\n </section>\n <section className={styles.section} id=\"engram-review-due\">\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('reviewQueueTitle')}</h4>\n <span className={styles.sectionHint}>{t('reviewQueueHint')}</span>\n </div>\n <div className={styles.panelCard}>\n <ReviewQueueCard t={t} scope={scope} toast={toast} onAnswered={refreshDue} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('refurbTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <RefurbCard t={t} scope={scope} onSelect={openReview} onAfterAction={reload} toast={toast} />\n </div>\n </section>\n </aside>\n </div>\n </div>\n )}\n\n {activeTab === 'corridor' && (\n <div className={styles.tabPanel}>\n {/* 纵向堆叠:先看走廊结构(鸟瞰),再进检索实验台;两块都吃满宽度,图与命中行不被压窄。 */}\n <div className={styles.mainCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('sectionCorridor')}</h4>\n </div>\n <div className={styles.panelCard}>\n <CorridorPanel t={t} scope={scope} onSelect={openReview} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('benchTitle')}</h4>\n <span className={styles.sectionHint}>{t('benchNote')}</span>\n </div>\n <div className={styles.panelCard}>\n <RecallBench t={t} scope={scope} />\n </div>\n </section>\n </div>\n </div>\n )}\n\n {activeTab === 'log' && (\n <div className={styles.tabPanel}>\n <LogPanel t={t} telemetry={overview.telemetry} />\n </div>\n )}\n\n {activeTab === 'backfill' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('backfillRulesTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <HistoryBackfillCard t={t} toast={toast} />\n </div>\n </section>\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 * 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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"}
|