@mingxy/cerebro 1.18.13 → 1.18.15
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/package.json +2 -2
- package/src/client.ts +10 -1
- package/src/hooks.ts +21 -5
- package/web/assets/{index-BGZ625Cl.js → index-C6yQfEU4.js} +1 -1
- package/web/index.html +1 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mingxy/cerebro",
|
|
3
|
-
"version": "1.18.
|
|
4
|
-
"description": "Cerebro persistent memory plugin for OpenCode
|
|
3
|
+
"version": "1.18.15",
|
|
4
|
+
"description": "Cerebro persistent memory plugin for OpenCode — auto-recall, auto-capture, 9 memory tools with clustering, project-scoped memory isolation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"exports": {
|
package/src/client.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logWarn, logError } from "./logger.js";
|
|
1
|
+
import { logInfo, logWarn, logError } from "./logger.js";
|
|
2
2
|
import type { OmemPluginConfig } from "./config.js";
|
|
3
3
|
|
|
4
4
|
function sanitizeContent(text: string, maxLen: number): string {
|
|
@@ -391,6 +391,15 @@ export class CerebroClient {
|
|
|
391
391
|
...recall_overrides,
|
|
392
392
|
project_path: projectPath,
|
|
393
393
|
}, 20_000);
|
|
394
|
+
logInfo("shouldRecall raw response", {
|
|
395
|
+
should_recall: res?.should_recall,
|
|
396
|
+
memCount: res?.memories?.length ?? 0,
|
|
397
|
+
discardedCount: res?.discarded?.length ?? 0,
|
|
398
|
+
confidence: res?.confidence,
|
|
399
|
+
reason: res?.reason,
|
|
400
|
+
rawKeys: res ? Object.keys(res) : "null",
|
|
401
|
+
rawJSON: JSON.stringify(res).slice(0, 500),
|
|
402
|
+
});
|
|
394
403
|
return res;
|
|
395
404
|
}
|
|
396
405
|
|
package/src/hooks.ts
CHANGED
|
@@ -136,8 +136,6 @@ export function showToast(tui: any, title: string, message: string, variant: str
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
const SYSTEM_INJECTION_PATTERNS: RegExp[] = [
|
|
139
|
-
/^\[search-mode\]/,
|
|
140
|
-
/^\[analyze-mode\]/,
|
|
141
139
|
/<!--\s*OMO_INTERNAL_INITIATOR\s*-->/,
|
|
142
140
|
/^\[SYSTEM DIRECTIVE:/,
|
|
143
141
|
/^\[restore checkpointed/,
|
|
@@ -148,7 +146,6 @@ const SYSTEM_INJECTION_PATTERNS: RegExp[] = [
|
|
|
148
146
|
/^\[GOAL\]/,
|
|
149
147
|
/^## 任务[::]/,
|
|
150
148
|
/^## 改动/,
|
|
151
|
-
/^## 任务:/,
|
|
152
149
|
/^Analyze the attached file/,
|
|
153
150
|
/^Provide ONLY the extracted/,
|
|
154
151
|
/^Called the Read tool/,
|
|
@@ -156,10 +153,21 @@ const SYSTEM_INJECTION_PATTERNS: RegExp[] = [
|
|
|
156
153
|
/^[▣▪]\s*DCP/,
|
|
157
154
|
];
|
|
158
155
|
|
|
156
|
+
const MODE_TAG_PATTERN = /^\[(?:search-mode|analyze-mode)\][\s\S]*?\n---\n?/;
|
|
157
|
+
const MODE_TAG_LINE = /^\[(?:search-mode|analyze-mode)\]\s*\n/;
|
|
158
|
+
|
|
159
159
|
function extractUserRequest(content: string): string {
|
|
160
160
|
const match = content.match(/<user-request>([\s\S]*?)<\/user-request>/);
|
|
161
161
|
let text = match ? match[1].trim() : content;
|
|
162
162
|
|
|
163
|
+
// [search-mode] / [analyze-mode]: 剥离标签+系统指令+分隔线,保留用户实际内容
|
|
164
|
+
const stripped = text.replace(MODE_TAG_PATTERN, "");
|
|
165
|
+
if (stripped !== text && stripped.trim()) {
|
|
166
|
+
text = stripped.trim();
|
|
167
|
+
} else {
|
|
168
|
+
text = text.replace(MODE_TAG_LINE, "").trim();
|
|
169
|
+
}
|
|
170
|
+
|
|
163
171
|
for (const pattern of SYSTEM_INJECTION_PATTERNS) {
|
|
164
172
|
if (pattern.test(text)) return "";
|
|
165
173
|
}
|
|
@@ -357,6 +365,14 @@ export function autoRecallHook(client: CerebroClient, containerTags: string[], t
|
|
|
357
365
|
}
|
|
358
366
|
}
|
|
359
367
|
}
|
|
368
|
+
} else {
|
|
369
|
+
// TTL 未过期 — 从缓存恢复 profile 内容
|
|
370
|
+
const cached = lastProfileBlock.get(input.sessionID);
|
|
371
|
+
if (cached) {
|
|
372
|
+
profileBlock = cached.content;
|
|
373
|
+
profileCountText = `${cached.count} preferences`;
|
|
374
|
+
logDebug("autoRecallHook profile restored from cache", { preferenceCount: cached.count, contentLen: cached.content.length });
|
|
375
|
+
}
|
|
360
376
|
}
|
|
361
377
|
|
|
362
378
|
// After compacting, sessionMessages is cleared but firstMessages gets repopulated
|
|
@@ -462,8 +478,8 @@ export function autoRecallHook(client: CerebroClient, containerTags: string[], t
|
|
|
462
478
|
};
|
|
463
479
|
|
|
464
480
|
if (!shouldRecallRes.should_recall) {
|
|
465
|
-
|
|
466
|
-
if (
|
|
481
|
+
// 兜底:即使不召回记忆,只要有 profile 就注入(与 recall 路径对齐)
|
|
482
|
+
if (profileBlock) {
|
|
467
483
|
appendToSystem(output.system, profileBlock);
|
|
468
484
|
logDebug("autoRecallHook profile injected (no-recall path)", { sessionId: input.sessionID, outputSystemLength: output.system.length });
|
|
469
485
|
|
|
@@ -161,4 +161,4 @@ $1`).replace(/(\s-\s)/g,`
|
|
|
161
161
|
`)?e:e.replace(/(#{1,3}\s+[^#])/g,`
|
|
162
162
|
$1`).replace(/(\d+\.\s+[^\d])/g,`
|
|
163
163
|
$1`).replace(/(\s-\s)/g,`
|
|
164
|
-
- `).trim()}function Tme(e){return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function Eme(e){return e?e.length<=16?e:e.slice(0,8)+`...`+e.slice(-8):`—`}function Dme(e,n=80){return e?e.length<=n?e:e.slice(0,n)+`...`:`—`}function Ome({type:e}){return e===`auto`?(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-xs bg-blue-100 text-blue-700 hover:bg-blue-100 border-blue-200`,children:[(0,G.jsx)(eh,{className:`size-3 mr-1`}),`自动注入`]}):(0,G.jsxs)(CJ,{variant:`outline`,className:`text-xs bg-emerald-50 text-emerald-700 hover:bg-emerald-50 border-emerald-200`,children:[(0,G.jsx)(jm,{className:`size-3 mr-1`}),`手动注入`]})}function kme({category:e}){return(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs font-normal ${AJ(e)}`,children:e||`未分类`})}function k9({label:e,value:n,max:r=1}){let i=Math.max(0,Math.min(n,r))/r*100;return(0,G.jsxs)(`div`,{className:`space-y-1`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between text-xs`,children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:e}),(0,G.jsx)(`span`,{className:`font-medium`,children:n===0?`—`:`${i.toFixed(1)}%`})]}),(0,G.jsx)(`div`,{className:`h-1.5 w-full rounded-full bg-muted overflow-hidden`,children:(0,G.jsx)(`div`,{className:`h-full rounded-full bg-primary transition-all`,style:{width:`${i}%`}})})]})}function Ame({relevance:e,isKept:n}){return n?e?e===`high`?(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-emerald-500/10 text-emerald-600 border-emerald-500/30`,children:`🟢 高相关`}):e===`medium`?(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-yellow-500/10 text-yellow-600 border-yellow-500/30`,children:`🟡 中相关`}):(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-muted text-muted-foreground border-border`,children:e||`—`}):(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-blue-500/10 text-blue-600 border-blue-500/30`,children:`🔵 保留`}):(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-red-500/10 text-red-600 border-red-500/30`,children:`🔴 被精炼掉`})}function jme({item:e,memory:n,memoryLoading:r,vaultUnlocked:i,memoryUnlocked:a,onUnlock:o,onLock:s,onVaultUnlock:c}){let l=!!e.refine_relevance,[u,d]=(0,y.useState)(`raw`),[f,p]=(0,y.useState)(!1),[m,h]=(0,y.useState)(``),[g,_]=(0,y.useState)(null),v=ob(e=>e.unlock),b=ob(e=>e.isUnlocked),x=n?.visibility===`private`||(n?.tags||[]).some(e=>e===`私密`||e.toLowerCase()===`private`),S=x&&!a,C=async()=>{n&&(S?i||b?o?.(n.id):p(!0):(s?.(n.id),p(!1)))},w=async()=>{if(!m.trim()){_(`请输入密码`);return}await v(m)?(p(!1),h(``),_(null),c?.(),n&&o?.(n.id)):_(`密码错误`)};return(0,G.jsxs)(`div`,{className:`rounded-md border bg-muted/50 p-3 space-y-3 ${e.is_kept?`border-border`:`border-dashed border-red-500/30 opacity-75`}`,children:[(0,G.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,G.jsx)(Ame,{relevance:e.refine_relevance,isKept:e.is_kept}),(0,G.jsx)(kme,{category:n?.category}),x&&(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-xs bg-amber-100 text-amber-700 hover:bg-amber-100 border-amber-200`,children:[(0,G.jsx)(Em,{className:`size-3 mr-1`}),`私密`]}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground font-mono`,children:[e.memory_id?.slice(0,8),`...`]})]}),x&&(0,G.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),C()},className:`text-xs text-amber-500 hover:text-amber-600 flex items-center gap-1 shrink-0`,children:[S?(0,G.jsx)(Em,{className:`size-3`}):(0,G.jsx)(Tm,{className:`size-3`}),S?`解锁`:`锁定`]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1 border-b border-border pb-1`,children:[(0,G.jsx)(`button`,{type:`button`,onClick:()=>l&&d(`refine`),className:`text-xs px-2 py-1 rounded transition-colors ${l?u===`refine`?`bg-primary/10 text-primary font-medium`:`text-muted-foreground hover:text-foreground`:`text-muted-foreground/40 cursor-not-allowed`}`,children:`精炼`}),(0,G.jsx)(`button`,{type:`button`,onClick:()=>d(`raw`),className:`text-xs px-2 py-1 rounded transition-colors ${u===`raw`?`bg-primary/10 text-primary font-medium`:`text-muted-foreground hover:text-foreground`}`,children:`原始`})]}),u===`refine`?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[e.refine_reasoning?(0,G.jsxs)(`div`,{className:`text-sm text-foreground`,children:[(0,G.jsx)(`span`,{className:`font-medium`,children:`推理说明:`}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:e.refine_reasoning})]}):(0,G.jsx)(`div`,{className:`text-sm text-muted-foreground italic`,children:`未经精炼 · 自动保留`}),(0,G.jsx)(k9,{label:`相似度得分`,value:e.score,max:1})]}):(0,G.jsx)(`div`,{className:`space-y-2`,children:r?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(Cb,{className:`h-4 w-3/4`}),(0,G.jsx)(Cb,{className:`h-4 w-1/2`})]}):n?(0,G.jsx)(G.Fragment,{children:S?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,G.jsx)(Em,{className:`size-4`}),(0,G.jsx)(`span`,{children:`私密记忆内容已隐藏`})]}),f&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{type:`password`,placeholder:`输入 Vault 密码...`,value:m,onChange:e=>{h(e.target.value),_(null)},onKeyDown:e=>e.key===`Enter`&&w(),className:g?`border-destructive flex-1`:`flex-1`}),(0,G.jsx)(q,{size:`sm`,onClick:w,children:`解锁`})]}),g&&(0,G.jsx)(`p`,{className:`text-xs text-destructive`,children:g})]})]}):(0,G.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:wme(n.content||n.l0_abstract||`—`)})})}):(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`记忆内容加载失败`})})]})}function Mme({event:e,initialItems:n,isLast:r,defaultExpanded:i,vaultUnlocked:a,unlockedMemories:o,manuallyLocked:s,onUnlock:c,onLock:l,onVaultUnlock:u}){let[d,f]=(0,y.useState)(i||!1),[p,m]=(0,y.useState)(!0),[h,g]=(0,y.useState)(n??null),[_,v]=(0,y.useState)(new Map),[b,x]=(0,y.useState)(new Set);(0,y.useEffect)(()=>{n&&h===null&&g(n)},[n,h]);let S=(0,y.useCallback)(async e=>{if(!(_.has(e)||b.has(e)))try{x(n=>new Set(n).add(e));let n=await ib.get(`/v1/memories/${e}`);v(r=>{let i=new Map(r);return i.set(e,n),i})}catch(e){console.error(`Failed to fetch memory:`,e)}finally{x(n=>{let r=new Set(n);return r.delete(e),r})}},[_,b]);(0,y.useEffect)(()=>{!d||!h||h.length===0||h.forEach(e=>{!_.has(e.memory_id)&&!b.has(e.memory_id)&&S(e.memory_id)})},[d,h,_,b,S]);let C=e=>a&&!s.has(e)||o.has(e);return(0,G.jsxs)(`div`,{className:`flex gap-4`,children:[(0,G.jsxs)(`div`,{className:`flex flex-col items-center`,children:[(0,G.jsx)(`div`,{className:`w-2.5 h-2.5 rounded-full bg-primary ring-4 ring-primary/20`}),!r&&(0,G.jsx)(`div`,{className:`w-px flex-1 bg-border mt-1`})]}),(0,G.jsx)(`div`,{className:`flex-1 pb-6`,children:(0,G.jsxs)(`div`,{className:`rounded-lg border border-border bg-card transition-colors hover:bg-muted/50`,children:[(0,G.jsxs)(`button`,{type:`button`,onClick:()=>f(!d),className:`w-full text-left p-4 cursor-pointer`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,G.jsx)(Ome,{type:e.recall_type}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(nm,{className:`size-3`}),Tme(e.created_at)]})]}),d?(0,G.jsx)(em,{className:`size-4 text-muted-foreground`}):(0,G.jsx)(Zp,{className:`size-4 text-muted-foreground`})]}),(0,G.jsxs)(`div`,{className:`mt-2 text-sm text-muted-foreground flex items-center gap-1.5`,children:[(0,G.jsx)(Lm,{className:`size-3.5`}),(0,G.jsx)(`span`,{className:`line-clamp-1`,title:e.query_text||`—`,children:Dme(e.query_text)})]})]}),d&&(0,G.jsxs)(`div`,{className:`px-4 pb-4 space-y-4 border-t border-border pt-4`,children:[e.profile_content&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`h4`,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(Kp,{className:`size-3`}),`画像注入内容`]}),(0,G.jsx)(`div`,{className:`rounded-md border border-indigo-500/20 bg-indigo-500/5 p-3`,children:(0,G.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none text-sm text-indigo-700 dark:text-indigo-300`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:e.profile_content.replace(/<\/?cerebro-profile>/g,``).trim()})})})]}),e.injected_content&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`button`,{type:`button`,onClick:()=>m(!p),className:`flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors cursor-pointer`,children:[(0,G.jsx)(tee,{className:`size-3`}),`注入内容`,p?(0,G.jsx)(em,{className:`size-3`}):(0,G.jsx)(Zp,{className:`size-3`})]}),p&&(0,G.jsx)(`div`,{className:`rounded-md border border-emerald-500/20 bg-emerald-500/5 p-3 max-h-96 overflow-y-auto`,children:(0,G.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none text-sm text-emerald-700 dark:text-emerald-300`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:e.injected_content.replace(/<\/?cerebro-context>/g,``).trim()})})})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,G.jsxs)(`h4`,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(Kp,{className:`size-3`}),`关联记忆`]})}),h&&h.length>0?(0,G.jsx)(`div`,{className:`space-y-3`,children:h.map(e=>(0,G.jsx)(jme,{item:e,memory:_.get(e.memory_id)||null,memoryLoading:b.has(e.memory_id),vaultUnlocked:a,memoryUnlocked:C(e.memory_id),onUnlock:c,onLock:l,onVaultUnlock:u},e.id))}):(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`暂无召回项`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`h4`,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(Yp,{className:`size-3`}),`匹配指标`]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,G.jsx)(k9,{label:`最大相似度`,value:e.max_score}),(0,G.jsx)(k9,{label:`LLM 置信度`,value:e.llm_confidence})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground flex-wrap`,children:[(0,G.jsx)(`span`,{className:`font-medium text-foreground`,children:`统计:`}),(0,G.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400`,children:[`保留 `,e.kept_count,` 条`]}),e.discarded_count>0&&(0,G.jsxs)(`span`,{className:`text-red-600 dark:text-red-400`,children:[`精炼掉 `,e.discarded_count,` 条`]}),e.injected_count!=null&&e.injected_count>0&&(0,G.jsxs)(`span`,{className:`text-blue-600 dark:text-blue-400`,children:[`实际注入 `,e.injected_count,` 条`]}),e.profile_injected&&(0,G.jsx)(`span`,{className:`text-indigo-600 dark:text-indigo-400`,children:`👤 画像已注入`})]})]})]})})]})}function Nme(){let{id:e}=it(),n=et(),r=Ze(),i=()=>{let e=r.state;e?.from?n(e.from,{replace:!0}):n(-1)},a=e?decodeURIComponent(e):``,[o,s]=(0,y.useState)([]),[c,l]=(0,y.useState)(new Map),[u,d]=(0,y.useState)(!0),[f,p]=(0,y.useState)(null),[m,h]=(0,y.useState)(1),[g,_]=(0,y.useState)(!1),[v,b]=(0,y.useState)(!1),[x,S]=(0,y.useState)(``),[C,w]=(0,y.useState)(null),T=ob(e=>e.unlock),E=ob(e=>e.lock),[D,O]=(0,y.useState)(!1),[k,A]=(0,y.useState)(new Set),[j,M]=(0,y.useState)(new Set),[N,P]=(0,y.useState)(null),F=Math.ceil(o.length/10),I=o.slice((m-1)*10,m*10);(0,y.useEffect)(()=>{if(!a)return;async function e(){try{d(!0),p(null);let e=await ib.get(`/v1/recall-events`,{params:{session_id:a,limit:1e4,offset:0,expand:`items`}});if(s((e?.events||[]).sort((e,n)=>new Date(n.created_at).getTime()-new Date(e.created_at).getTime())),e?.event_items){let n=new Map;e.event_items.forEach(e=>n.set(e.id,e.items||[])),l(n)}}catch(e){console.error(`Failed to fetch session detail:`,e),p(`加载 Session 详情失败`),ir.error(`加载 Session 详情失败`)}finally{d(!1)}}e()},[a]);let L=()=>{_(!0)},R=async()=>{try{await ib.delete(`/v1/session-recalls/session/${a}`),ir.success(`Session 记录已删除`),n(-1)}catch(e){console.error(`Failed to delete session records:`,e),ir.error(`删除失败`)}finally{_(!1)}},z=async()=>{if(!x.trim()){w(`请输入密码`);return}if(!await T(x)){w(`密码错误`);return}O(!0),N&&(A(e=>new Set(e).add(N)),P(null)),w(null),b(!1),S(``)},ee=()=>{O(!1),A(new Set),M(new Set),E()},B=e=>{k.has(e)||D&&!j.has(e)?(M(n=>new Set(n).add(e)),A(n=>{let r=new Set(n);return r.delete(e),r})):D?M(n=>{let r=new Set(n);return r.delete(e),r}):(P(e),b(!0))},V={total:o.length,auto:o.filter(e=>e.recall_type===`auto`).length,manual:o.filter(e=>e.recall_type===`manual`).length,totalKept:o.reduce((e,n)=>e+n.kept_count,0),totalDiscarded:o.reduce((e,n)=>e+n.discarded_count,0)};return u?(0,G.jsxs)(`div`,{className:`space-y-6 max-w-3xl`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Cb,{className:`h-8 w-8`}),(0,G.jsx)(Cb,{className:`h-6 w-32`})]}),(0,G.jsx)(Cb,{className:`h-4 w-1/2`}),(0,G.jsx)(`div`,{className:`space-y-4`,children:[1,2,3].map(e=>(0,G.jsxs)(`div`,{className:`flex gap-4`,children:[(0,G.jsx)(Cb,{className:`h-3 w-3 rounded-full`}),(0,G.jsx)(`div`,{className:`flex-1 space-y-2`,children:(0,G.jsx)(Cb,{className:`h-20 w-full`})})]},e))})]}):f?(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,onClick:()=>i(),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回`]}),(0,G.jsx)(`div`,{className:`rounded-lg border border-destructive/50 bg-destructive/10 p-6 text-sm text-destructive`,children:f})]}):(0,G.jsxs)(`div`,{className:`space-y-6 max-w-3xl`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,G.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,onClick:()=>i(),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回`]})})}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:[`Session 详情 - `,Eme(a)]}),(0,G.jsx)(`div`,{className:`flex items-center gap-3 text-sm text-muted-foreground flex-wrap`,children:(0,G.jsx)(`code`,{className:`font-mono text-xs bg-muted px-1.5 py-0.5 rounded`,children:a})})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-3 gap-4`,children:[(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`pt-4 text-center`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-semibold`,children:V.total}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`总召回事件`})]})}),(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`pt-4 text-center`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-semibold`,children:V.auto}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`自动注入`})]})}),(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`pt-4 text-center`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-semibold`,children:V.manual}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`手动注入`})]})})]}),V.totalKept>0&&(0,G.jsxs)(`div`,{className:`flex items-center gap-4 text-sm`,children:[(0,G.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 font-medium`,children:[`共保留 `,V.totalKept,` 条记忆`]}),V.totalDiscarded>0&&(0,G.jsxs)(`span`,{className:`text-red-600 dark:text-red-400 font-medium`,children:[`共精炼掉 `,V.totalDiscarded,` 条记忆`]})]}),(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-2`,children:[(0,G.jsx)(`h2`,{className:`text-sm font-medium text-muted-foreground`,children:`召回事件时间线`}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`共 `,o.length,` 个事件`]}),F>1&&(0,G.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`h-6 w-6`,onClick:()=>h(e=>Math.max(1,e-1)),disabled:m===1,children:(0,G.jsx)(Qp,{className:`size-3`})}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground min-w-[3ch] text-center`,children:[m,`/`,F]}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`h-6 w-6`,onClick:()=>h(e=>Math.min(F,e+1)),disabled:m===F,children:(0,G.jsx)($p,{className:`size-3`})})]}),D?(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:ee,children:[(0,G.jsx)(Em,{className:`size-3.5 mr-1`}),`锁定 Vault`]}):(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>b(!v),children:[(0,G.jsx)(Tm,{className:`size-3.5 mr-1`}),`解锁 Vault`]})]})]}),v&&(0,G.jsxs)(`div`,{className:`space-y-2 max-w-md`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{type:`password`,placeholder:`输入 Vault 密码...`,value:x,onChange:e=>{S(e.target.value),w(null)},onKeyDown:e=>e.key===`Enter`&&z(),className:C?`border-destructive flex-1`:`flex-1`}),(0,G.jsx)(q,{size:`sm`,onClick:z,children:`解锁`})]}),C&&(0,G.jsx)(`p`,{className:`text-xs text-destructive`,children:C})]}),o.length===0?(0,G.jsx)(`div`,{className:`rounded-lg border border-border bg-card p-8 text-center text-sm text-muted-foreground`,children:`暂无召回事件`}):(0,G.jsxs)(G.Fragment,{children:[I.map((e,n)=>(0,G.jsx)(Mme,{event:e,initialItems:c.get(e.id),isLast:n===I.length-1&&m===F,defaultExpanded:n===0&&m===1,vaultUnlocked:D,unlockedMemories:k,manuallyLocked:j,onUnlock:B,onLock:B,onVaultUnlock:()=>O(!0)},e.id)),F>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between gap-2 pt-4`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`共 `,o.length,` 个事件`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(q,{variant:`outline`,size:`sm`,onClick:()=>h(e=>Math.max(1,e-1)),disabled:m===1,children:(0,G.jsx)(Qp,{className:`size-4`})}),(0,G.jsxs)(`span`,{className:`text-sm text-muted-foreground`,children:[m,` / `,F]}),(0,G.jsx)(q,{variant:`outline`,size:`sm`,onClick:()=>h(e=>Math.min(F,e+1)),disabled:m===F,children:(0,G.jsx)($p,{className:`size-4`})})]})]})]})]}),o.length>0&&(0,G.jsx)(`div`,{className:`pt-4 border-t border-border`,children:(0,G.jsxs)(q,{variant:`outline`,size:`sm`,className:`text-destructive hover:bg-destructive/10 hover:text-destructive`,onClick:L,children:[(0,G.jsx)(Km,{className:`size-3.5 mr-1`}),`删除 Session 所有记录`]})}),(0,G.jsx)(pJ,{open:g,onOpenChange:e=>!e&&_(!1),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除 Session 记录`}),(0,G.jsx)(vJ,{children:`此操作将删除该 Session 的所有召回记录,不可撤销。确定要继续吗?`})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>_(!1),children:`取消`}),(0,G.jsx)(yJ,{onClick:R,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`删除`})]})]})})]})}function A9({...e}){return(0,G.jsx)(hg,{"data-slot":`dialog`,...e})}function Pme({...e}){return(0,G.jsx)(_g,{"data-slot":`dialog-trigger`,...e})}function Fme({...e}){return(0,G.jsx)(Zh,{"data-slot":`dialog-portal`,...e})}function Ime({className:e,...n}){return(0,G.jsx)(Eh,{"data-slot":`dialog-overlay`,className:Tp(`fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0`,e),...n})}function j9({className:e,children:n,showCloseButton:r=!0,...i}){return(0,G.jsxs)(Fme,{children:[(0,G.jsx)(Ime,{}),(0,G.jsxs)(Yh,{"data-slot":`dialog-content`,className:Tp(`fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,e),...i,children:[n,r&&(0,G.jsxs)(Dh,{"data-slot":`dialog-close`,render:(0,G.jsx)(q,{variant:`ghost`,className:`absolute top-2 right-2`,size:`icon-sm`}),children:[(0,G.jsx)($m,{}),(0,G.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function M9({className:e,...n}){return(0,G.jsx)(`div`,{"data-slot":`dialog-header`,className:Tp(`flex flex-col gap-2`,e),...n})}function N9({className:e,showCloseButton:n=!1,children:r,...i}){return(0,G.jsxs)(`div`,{"data-slot":`dialog-footer`,className:Tp(`-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end`,e),...i,children:[r,n&&(0,G.jsx)(Dh,{render:(0,G.jsx)(q,{variant:`outline`}),children:`Close`})]})}function P9({className:e,...n}){return(0,G.jsx)(gg,{"data-slot":`dialog-title`,className:Tp(`text-base leading-none font-medium`,e),...n})}function F9({className:e,...n}){return(0,G.jsx)(Oh,{"data-slot":`dialog-description`,className:Tp(`text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,e),...n})}function Lme(){let[e,n]=(0,y.useState)([]),[r,i]=(0,y.useState)(!0),[a,o]=(0,y.useState)(!1),[s,c]=(0,y.useState)(``),[l,u]=(0,y.useState)(`team`),[d,f]=(0,y.useState)(null),[p,m]=(0,y.useState)(null),[h,g]=(0,y.useState)(``),[_,v]=(0,y.useState)(`member`),[b,x]=(0,y.useState)(!1),[S,C]=(0,y.useState)({}),[w,T]=(0,y.useState)(!1),[E,D]=(0,y.useState)(!1),[O,k]=(0,y.useState)(``),[A,j]=(0,y.useState)(`member`),[M,N]=(0,y.useState)(!1),[P,F]=(0,y.useState)(null),[I,L]=(0,y.useState)(!1),R=dh(e=>e.currentUserId),z=dh(e=>e.users.find(e=>e.id===R)),ee=e.find(e=>e.id===p),B=e=>z?e.owner_id===z.apiKey||e.members.some(e=>e.user_id===z.apiKey&&(e.role===`admin`||e.role===`Admin`)):!1;(0,y.useEffect)(()=>{async function e(){if(!ee?.members?.length)return;T(!0);let e={};await Promise.all(ee.members.map(async n=>{try{let r=await ib.get(`/v1/tenants/${encodeURIComponent(n.user_id)}`);r&&(e[n.user_id]={name:r.name,created_at:r.created_at})}catch{}})),C(e),T(!1)}p&&e()},[p,ee?.members]),(0,y.useEffect)(()=>{async function e(){try{i(!0),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to fetch spaces:`,e),ir.error(`加载空间列表失败`)}finally{i(!1)}}e()},[]);async function V(){if(!s.trim()){ir.error(`请输入空间名称`);return}try{await ib.post(`/v1/spaces`,{name:s.trim(),space_type:l}),ir.success(`空间创建成功`),o(!1),c(``),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to create space:`,e),ir.error(`空间创建失败`)}}async function H(){if(!d)return;let r=e.find(e=>e.id===d)?.members.map(e=>e.user_id).filter(e=>e!==z?.apiKey)||[];try{await ib.delete(`/v1/spaces/${encodeURIComponent(d)}`),ir.success(`空间已删除`),n(e=>e.filter(e=>e.id!==d)),dh.getState().removeUsersByApiKeys(r)}catch(e){console.error(`Failed to delete space:`,e),ir.error(`空间删除失败`)}finally{f(null)}}async function U(){if(p){N(!0);try{let e=await ib.post(`/v1/tenants`,{name:O.trim()||void 0}),r=e.id,i=e.api_key;await ib.post(`/v1/spaces/${encodeURIComponent(p)}/members`,{user_id:r,role:A}),F(i),ir.success(`新用户创建并加入空间成功`),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to create user:`,e);let n=e.response?.data?.error||e.message||``;ir.error(`创建用户失败:${n||`请稍后重试`}`)}finally{N(!1)}}}async function te(e){if(p)try{await ib.delete(`/v1/spaces/${encodeURIComponent(p)}/members/${encodeURIComponent(e)}`),ir.success(`成员已移除`),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to remove member:`,e);let n=e.response?.data?.error||e.message||``;ir.error(`移除成员失败:${n||`请稍后重试`}`)}}async function W(){if(!p||!h.trim()){ir.error(`请输入用户ID`);return}let e=h.trim();if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)){ir.error(`用户ID格式不正确,请输入有效的 UUID(如:c60beb98-7aab-4985-8c1d-29ffd6aff75a)`);return}x(!0);try{await ib.post(`/v1/spaces/${encodeURIComponent(p)}/members`,{user_id:e,role:_}),ir.success(`成员添加成功`),g(``),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to add member:`,e);let n=e.response?.data?.error||e.message||``;n.includes(`not found`)||n.includes(`不存在`)?ir.error(`该用户不存在,请确认用户ID正确`):n.includes(`permission`)||n.includes(`权限`)?ir.error(`您没有权限添加成员`):ir.error(`添加成员失败:${n||`请检查用户ID是否正确`}`)}finally{x(!1)}}return r?(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`空间管理`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理您的记忆空间`})]}),(0,G.jsx)(Cb,{className:`h-9 w-24`})]}),(0,G.jsx)(`div`,{className:`grid gap-4`,children:[1,2].map(e=>(0,G.jsx)(Cb,{className:`h-32 w-full`},e))})]}):(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`空间管理`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理您的记忆空间`})]}),(0,G.jsxs)(A9,{open:a,onOpenChange:o,children:[(0,G.jsx)(Pme,{render:(0,G.jsxs)(q,{size:`sm`,children:[(0,G.jsx)(Nm,{className:`size-4 mr-1.5`}),`新建空间`]})}),(0,G.jsxs)(j9,{children:[(0,G.jsx)(M9,{children:(0,G.jsx)(P9,{children:`新建空间`})}),(0,G.jsxs)(`div`,{className:`space-y-4 pt-2`,children:[(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`空间名称`}),(0,G.jsx)(hb,{placeholder:`输入空间名称`,value:s,onChange:e=>c(e.target.value)})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`空间类型`}),(0,G.jsxs)(_9,{value:l,onValueChange:e=>u(e||`team`),children:[(0,G.jsx)(y9,{children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`team`,children:`团队`}),(0,G.jsx)(x9,{value:`personal`,children:`个人`}),(0,G.jsx)(x9,{value:`shared`,children:`共享`})]})]})]}),(0,G.jsx)(q,{className:`w-full`,onClick:V,children:`创建`})]})]})]})]}),e.length===0?(0,G.jsxs)(`div`,{className:`text-center py-12 text-muted-foreground border border-dashed border-border rounded-lg`,children:[(0,G.jsx)(`p`,{children:`暂无空间`}),(0,G.jsx)(`p`,{className:`text-sm mt-1`,children:`点击右上角按钮创建新空间`})]}):(0,G.jsx)(`div`,{className:`grid gap-4`,children:e.map(e=>(0,G.jsxs)(vb,{className:`group transition-colors hover:bg-accent/50`,children:[(0,G.jsx)(yb,{className:`pb-3`,children:(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`h3`,{className:`text-lg font-semibold`,children:e.name}),(0,G.jsx)(CJ,{variant:`outline`,children:e.space_type})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground`,children:[(0,G.jsx)(zm,{className:`size-3`}),e.members.length,` 成员`]}),(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,className:`h-7 opacity-0 group-hover:opacity-100 transition-opacity`,onClick:()=>{m(e.id),g(``),v(`member`)},children:[(0,G.jsx)(Xm,{className:`size-3.5 mr-1`}),`管理成员`]}),e.space_type!==`personal`&&B(e)&&(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 opacity-0 group-hover:opacity-100 transition-opacity`,onClick:()=>f(e.id),children:(0,G.jsx)(Km,{className:`size-3.5 text-destructive`})})]})]})}),(0,G.jsxs)(Sb,{className:`pt-0 space-y-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-4 text-sm text-muted-foreground flex-wrap`,children:[(0,G.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(Qm,{className:`size-3.5`}),e.members.map(e=>e.role).join(`, `)]}),(0,G.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(Jp,{className:`size-3.5`}),new Date(e.created_at).toLocaleDateString(`zh-CN`)]})]}),(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground font-mono`,children:[`ID: `,e.id]})]})]},e.id))}),(0,G.jsx)(pJ,{open:!!d,onOpenChange:e=>!e&&f(null),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除空间`}),(0,G.jsx)(vJ,{children:`此操作不可撤销。空间内的数据不会被删除,但空间配置将被移除。`})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>f(null),children:`取消`}),(0,G.jsx)(yJ,{onClick:H,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`删除`})]})]})}),(0,G.jsx)(A9,{open:!!p,onOpenChange:e=>!e&&m(null),children:(0,G.jsxs)(j9,{style:{width:680,maxWidth:`95vw`},children:[(0,G.jsx)(M9,{children:(0,G.jsxs)(P9,{children:[`管理成员 - `,ee?.name]})}),(0,G.jsxs)(`div`,{className:`space-y-4 pt-2`,children:[(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`当前成员`}),w&&(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`加载用户信息中...`}),(0,G.jsxs)(`div`,{className:`space-y-1`,children:[ee?.members.map(e=>{let n=S[e.user_id];return(0,G.jsxs)(`div`,{className:`grid grid-cols-[auto_1fr_80px_60px] items-center gap-3 text-sm border rounded-md px-3 py-2`,children:[(0,G.jsx)(Zm,{className:`size-3.5 text-muted-foreground`}),(0,G.jsxs)(`div`,{className:`min-w-0`,children:[(0,G.jsx)(`div`,{className:`font-mono text-xs truncate`,title:e.user_id,children:e.user_id}),n&&(0,G.jsxs)(`div`,{className:`text-xs text-muted-foreground truncate`,children:[n.name,` · `,new Date(n.created_at).toLocaleDateString(`zh-CN`)]})]}),(0,G.jsx)(CJ,{variant:`outline`,className:`justify-self-center`,children:e.role}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2 justify-self-end`,children:[(0,G.jsx)(`button`,{type:`button`,onClick:()=>{navigator.clipboard.writeText(e.user_id),ir.success(`API Key 已复制`)},className:`text-muted-foreground hover:text-foreground transition-colors`,title:`复制 API Key`,children:(0,G.jsx)(rm,{className:`size-3.5`})}),ee&&B(ee)&&e.user_id!==z?.apiKey&&e.user_id!==ee?.owner_id&&(0,G.jsx)(`button`,{type:`button`,onClick:()=>te(e.user_id),className:`text-muted-foreground hover:text-destructive transition-colors`,title:`移除成员`,children:(0,G.jsx)(Km,{className:`size-3.5`})})]})]},e.user_id)}),(!ee?.members||ee.members.length===0)&&(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`暂无成员`})]})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`添加成员`}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>{D(!0),F(null),k(``),j(`member`)},children:[(0,G.jsx)(ym,{className:`size-3.5 mr-1.5`}),`创建新用户`]})]}),E&&(0,G.jsxs)(`div`,{className:`rounded-lg border border-border bg-muted/30 p-3 space-y-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`创建新用户`}),(0,G.jsx)(`button`,{type:`button`,onClick:()=>{D(!1),F(null)},className:`text-xs text-muted-foreground hover:text-foreground`,children:`取消`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{placeholder:`用户名(可选)`,value:O,onChange:e=>k(e.target.value),className:`flex-1`}),(0,G.jsxs)(_9,{value:A,onValueChange:e=>j(e||`member`),children:[(0,G.jsx)(y9,{className:`w-28`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`admin`,children:`管理员`}),(0,G.jsx)(x9,{value:`member`,children:`成员`}),(0,G.jsx)(x9,{value:`reader`,children:`只读`})]})]})]}),(0,G.jsx)(q,{size:`sm`,className:`w-full`,onClick:U,disabled:M,children:M?`生成中...`:`生成用户并添加到空间`}),P&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`新用户 API Key(请复制保存):`}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`code`,{className:`flex-1 text-xs bg-background border rounded px-2 py-1.5 font-mono truncate`,children:P}),(0,G.jsx)(q,{size:`sm`,variant:`outline`,onClick:()=>{navigator.clipboard.writeText(P),L(!0),setTimeout(()=>L(!1),2e3)},children:I?(0,G.jsx)(Xp,{className:`size-3.5`}):(0,G.jsx)(rm,{className:`size-3.5`})})]})]})]}),!E&&(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{placeholder:`输入对方 API Key(UUID格式)`,value:h,onChange:e=>g(e.target.value),className:`flex-1`}),(0,G.jsxs)(_9,{value:_,onValueChange:e=>v(e||`member`),children:[(0,G.jsx)(y9,{className:`w-28`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`admin`,children:`管理员`}),(0,G.jsx)(x9,{value:`member`,children:`成员`}),(0,G.jsx)(x9,{value:`reader`,children:`只读`})]})]}),(0,G.jsx)(q,{size:`sm`,onClick:W,disabled:b,children:b?`添加中...`:`添加`})]})]})]})]})})]})}var I9=[`#8b5cf6`,`#ec4899`,`#06b6d4`,`#f59e0b`,`#10b981`,`#ef4444`,`#6366f1`,`#f97316`];function L9(e,n){if(!e)return[];let r=Object.entries(e).map(([e,n])=>({name:e,value:n})).sort((e,n)=>n.value-e.value);return n?r.slice(0,n):r}function Rme(){let e=et(),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)([]),[o,s]=(0,y.useState)(!0);(0,y.useEffect)(()=>{async function e(){try{s(!0);let[e,n]=await Promise.all([ib.get(`/v1/stats`),ib.get(`/v1/memories`)]);r(e),a(n?.memories||[])}catch(e){ir.error(`加载统计数据失败: `+e.message)}finally{s(!1)}}e()},[]);let c=(0,y.useMemo)(()=>{if(!n?.timeline?.length)return 0;let e=new Date().toISOString().split(`T`)[0];return n.timeline.find(n=>n.date===e)?.count??0},[n]),l=(0,y.useMemo)(()=>L9(n?.by_category,8),[n]),u=(0,y.useMemo)(()=>L9(n?.by_type),[n]),d=(0,y.useMemo)(()=>L9(n?.by_tier),[n]),f=(0,y.useMemo)(()=>L9(n?.by_state),[n]),p=(0,y.useMemo)(()=>!n||!n.total||!n.total_access_count?`0%`:`${Math.min(100,Math.round(n.total_access_count/Math.max(1,n.total)*100))}%`,[n]),m=(0,y.useMemo)(()=>{let e=[];for(let n of i)if(n.tier_history)try{let r=JSON.parse(n.tier_history);for(let i of r)e.push({memoryId:n.id,...i})}catch{}return e.sort((e,n)=>n.at.localeCompare(e.at)),e.slice(0,50)},[i]),h={access_via_get:`访问触发`,access_via_search:`搜索触发`,access_via_recall:`召回触发`,access_via_cross_space_search:`跨空间搜索触发`,scheduled_evaluation:`定时评估`};return o?(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(Cb,{className:`h-8 w-48`}),(0,G.jsx)(Cb,{className:`h-8 w-24`})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2 lg:grid-cols-4`,children:[(0,G.jsx)(Cb,{className:`h-24`}),(0,G.jsx)(Cb,{className:`h-24`}),(0,G.jsx)(Cb,{className:`h-24`}),(0,G.jsx)(Cb,{className:`h-24`})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,G.jsx)(Cb,{className:`h-80`}),(0,G.jsx)(Cb,{className:`h-80`}),(0,G.jsx)(Cb,{className:`h-80`}),(0,G.jsx)(Cb,{className:`h-80`})]})]}):(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight flex items-center gap-2`,children:[(0,G.jsx)(Yp,{className:`size-5`}),`统计分析`]}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`记忆库数据洞察与可视化`})]}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>e(`/memories`),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回记忆`]})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2 lg:grid-cols-4`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`总记忆数`}),(0,G.jsx)(qp,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.total??0})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`今日新增`}),(0,G.jsx)(qm,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:c})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`空间数`}),(0,G.jsx)(xm,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.total_spaces??Object.keys(n?.by_space??{}).length})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`活跃度`}),(0,G.jsx)(iee,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:p})})]})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`平均重要性`}),(0,G.jsx)(Hm,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.avg_importance?`${(n.avg_importance*100).toFixed(0)}%`:`—`})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`平均置信度`}),(0,G.jsx)(Yp,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.avg_confidence?`${(n.avg_confidence*100).toFixed(0)}%`:`—`})})]})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`分类分布`})}),(0,G.jsxs)(Sb,{children:[(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(iJ,{children:[(0,G.jsx)(OB,{data:l,cx:`50%`,cy:`50%`,innerRadius:60,outerRadius:100,paddingAngle:2,dataKey:`value`,children:l.map((e,n)=>(0,G.jsx)(sD,{fill:I9[n%I9.length]},`cell-${e.name}`))}),(0,G.jsx)(VE,{})]})}),(0,G.jsx)(`div`,{className:`flex flex-wrap gap-2 mt-4 justify-center`,children:l.map((e,n)=>(0,G.jsxs)(CJ,{variant:`secondary`,style:{backgroundColor:`${I9[n%I9.length]}20`,color:I9[n%I9.length]},children:[e.name,` (`,e.value,`)`]},e.name))})]})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`记忆类型分布`})}),(0,G.jsx)(Sb,{children:(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(rJ,{data:u,children:[(0,G.jsx)(eG,{strokeDasharray:`3 3`,stroke:`#333`}),(0,G.jsx)(mK,{dataKey:`name`,tick:{fontSize:12}}),(0,G.jsx)(jK,{tick:{fontSize:12}}),(0,G.jsx)(VE,{}),(0,G.jsx)(XV,{dataKey:`value`,fill:`#8b5cf6`,radius:[4,4,0,0]})]})})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`层级分布`})}),(0,G.jsx)(Sb,{children:(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(iJ,{children:[(0,G.jsx)(OB,{data:d,cx:`50%`,cy:`50%`,outerRadius:100,dataKey:`value`,label:({name:e,value:n})=>`${e}: ${n}`,children:d.map((e,n)=>(0,G.jsx)(sD,{fill:I9[n%I9.length]},`tier-${e.name}`))}),(0,G.jsx)(VE,{})]})})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`状态分布`})}),(0,G.jsx)(Sb,{children:(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(rJ,{data:f,children:[(0,G.jsx)(eG,{strokeDasharray:`3 3`,stroke:`#333`}),(0,G.jsx)(mK,{dataKey:`name`,tick:{fontSize:12}}),(0,G.jsx)(jK,{tick:{fontSize:12}}),(0,G.jsx)(VE,{}),(0,G.jsx)(XV,{dataKey:`value`,fill:`#10b981`,radius:[4,4,0,0]})]})})})]})]}),(0,G.jsxs)(vb,{className:`mt-4`,children:[(0,G.jsx)(yb,{children:(0,G.jsxs)(bb,{className:`flex items-center gap-1.5 text-base`,children:[(0,G.jsx)(mm,{className:`size-4 text-muted-foreground`}),`Tier 变更日志`]})}),(0,G.jsx)(Sb,{children:m.length===0?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-4 text-center`,children:`暂无变更记录`}):(0,G.jsx)(`div`,{className:`space-y-1`,children:m.map(n=>{let r={peripheral:0,working:1,core:2};return(0,G.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 text-sm py-2 border-b last:border-b-0 hover:bg-muted/50 px-2 rounded cursor-pointer w-full text-left`,onClick:()=>e(`/memories/${n.memoryId}`),children:[(r[n.from]??0)<(r[n.to]??0)?(0,G.jsx)(Wp,{className:`size-4 text-emerald-500 shrink-0`}):(0,G.jsx)(Bp,{className:`size-4 text-red-500 shrink-0`}),(0,G.jsx)(`span`,{className:`text-muted-foreground text-xs w-36 shrink-0`,children:new Date(n.at).toLocaleString(`zh-CN`)}),(0,G.jsxs)(`span`,{className:`text-muted-foreground font-mono text-xs`,children:[n.memoryId.slice(0,8),`...`]}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(n.from),children:jJ(n.from)}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(n.to),children:jJ(n.to)}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground ml-auto`,children:[h[n.reason]||n.reason,` · #`,n.access_count]})]},n.memoryId+n.at)})})})]})]})}var zme={access_via_get:`访问触发`,access_via_search:`搜索触发`,access_via_recall:`召回触发`,access_via_cross_space_search:`跨空间搜索触发`,scheduled_evaluation:`定时评估`},R9=20;function Bme(){let e=et(),n=Ze(),[r,i]=(0,y.useState)([]),[a,o]=(0,y.useState)(!0),[s,c]=(0,y.useState)(1),[l,u]=(0,y.useState)(`all`),[d,f]=(0,y.useState)(``),[p,m]=(0,y.useState)(``),[h,g]=(0,y.useState)(null),[_,v]=(0,y.useState)(!1),[b,x]=(0,y.useState)(0);(0,y.useEffect)(()=>{n.state?.from===`tier-history`&&n.state?.page&&c(n.state.page)},[n.state]),(0,y.useEffect)(()=>{let e=setTimeout(()=>{m(d)},300);return()=>clearTimeout(e)},[d]);let S=(0,y.useCallback)(async e=>{o(!0);try{let n=(e-1)*R9,r={limit:String(R9),offset:String(n)};l===`promote`?r.filter=`promote`:l===`demote`&&(r.filter=`demote`),p.trim()&&(r.search=p.trim());let a=await ib.get(`/v1/tier-changes`,{params:r});i(a.changes),x(a.totalCount)}catch(e){console.error(`Failed to fetch tier history:`,e)}finally{o(!1)}},[l,p]);(0,y.useEffect)(()=>{S(s)},[S,s]);let C=Math.max(1,Math.ceil(b/R9)),w=Math.min(s,C),T={peripheral:0,working:1,core:2},E=async()=>{if(!h)return;let e=h;v(!0);try{await ib.post(`/v1/tier-changes/delete`,{memory_id:e.memoryId,from:e.from,to:e.to,at:e.at,reason:e.reason}),ir.success(`已删除该条变更记录`),i(n=>n.filter(n=>!(n.memoryId===e.memoryId&&n.from===e.from&&n.to===e.to&&n.at===e.at))),x(e=>Math.max(0,e-1))}catch(e){console.error(`Failed to delete tier history entry:`,e),ir.error(`删除失败`)}finally{v(!1),g(null)}},D=n=>{e(`/memories/${n}`,{state:{from:`tier-history`,page:w}})};return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-5xl mx-auto`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight flex items-center gap-2`,children:[(0,G.jsx)(mm,{className:`size-5`}),`等级变更历史`]}),(0,G.jsxs)(`span`,{className:`text-sm text-muted-foreground`,children:[`共 `,b,` 条记录`]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-3 flex-wrap`,children:[(0,G.jsxs)(`div`,{className:`relative flex-1 min-w-[200px] max-w-xs`,children:[(0,G.jsx)(Lm,{className:`absolute left-2.5 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),(0,G.jsx)(`input`,{type:`text`,placeholder:`搜索标题、ID、原因...`,value:d,onChange:e=>{f(e.target.value),c(1)},className:`w-full h-9 pl-8 pr-3 rounded-md border border-input bg-background text-sm focus:outline-none focus:ring-1 focus:ring-ring`})]}),(0,G.jsxs)(_9,{value:l,onValueChange:e=>{e&&(u(e),c(1))},children:[(0,G.jsx)(y9,{className:`w-[130px]`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`all`,children:`全部`}),(0,G.jsx)(x9,{value:`promote`,children:`仅晋升`}),(0,G.jsx)(x9,{value:`demote`,children:`仅降级`})]})]})]}),!a&&r.length>0&&C>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`第 `,w,` / `,C,` 页`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w<=1,onClick:()=>c(w-1),children:(0,G.jsx)(Qp,{className:`size-4`})}),Array.from({length:C},(e,n)=>n+1).filter(e=>e===1||e===C||Math.abs(e-w)<=2).map((e,n,r)=>(0,G.jsxs)(`span`,{className:`flex items-center`,children:[n>0&&r[n-1]!==e-1&&(0,G.jsx)(`span`,{className:`px-1 text-xs text-muted-foreground`,children:`...`}),(0,G.jsx)(q,{variant:e===w?`default`:`outline`,size:`sm`,className:`h-7 w-7 px-0`,onClick:()=>c(e),children:e})]},e)),(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w>=C,onClick:()=>c(w+1),children:(0,G.jsx)($p,{className:`size-4`})})]})]}),(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`p-0`,children:[a?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-12 text-center`,children:`加载中...`}):r.length===0?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-12 text-center`,children:`暂无变更记录`}):(0,G.jsx)(`div`,{className:`divide-y`,children:r.map(e=>(0,G.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-3 hover:bg-muted/30 transition-colors`,children:[(T[e.from]??0)<(T[e.to]??0)?(0,G.jsx)(Wp,{className:`size-4 text-emerald-500 shrink-0`}):(0,G.jsx)(Bp,{className:`size-4 text-red-500 shrink-0`}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-36 shrink-0`,children:new Date(e.at).toLocaleString(`zh-CN`)}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.from),children:jJ(e.from)}),(0,G.jsx)(`span`,{className:`text-muted-foreground text-xs`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.to),children:jJ(e.to)}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-20 shrink-0`,children:zme[e.reason]||e.reason}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground w-16 shrink-0`,children:[`#`,e.accessCount]}),(0,G.jsx)(`button`,{type:`button`,className:`flex-1 min-w-0 text-left text-sm truncate hover:underline cursor-pointer`,onClick:()=>D(e.memoryId),title:e.memoryTitle,children:e.memoryTitle}),(0,G.jsxs)(`span`,{className:`text-xs font-mono text-muted-foreground shrink-0`,children:[e.memoryId.slice(0,8),`...`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`sm`,className:`h-7 px-2`,onClick:()=>D(e.memoryId),title:`查看详情`,children:(0,G.jsx)(sm,{className:`size-3.5`})}),(0,G.jsx)(q,{variant:`ghost`,size:`sm`,className:`h-7 px-2 text-red-500 hover:text-red-600 hover:bg-red-500/10`,onClick:()=>g(e),title:`删除此条记录`,children:(0,G.jsx)(Km,{className:`size-3.5`})})]})]},`${e.memoryId}-${e.at}-${e.from}-${e.to}`))}),C>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-3 border-t`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`第 `,w,` / `,C,` 页,共 `,b,` 条`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w<=1,onClick:()=>c(w-1),children:(0,G.jsx)(Qp,{className:`size-4`})}),Array.from({length:C},(e,n)=>n+1).filter(e=>e===1||e===C||Math.abs(e-w)<=2).map((e,n,r)=>(0,G.jsxs)(`span`,{className:`flex items-center`,children:[n>0&&r[n-1]!==e-1&&(0,G.jsx)(`span`,{className:`px-1 text-xs text-muted-foreground`,children:`...`}),(0,G.jsx)(q,{variant:e===w?`default`:`outline`,size:`sm`,className:`h-7 w-7 px-0`,onClick:()=>c(e),children:e})]},e)),(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w>=C,onClick:()=>c(w+1),children:(0,G.jsx)($p,{className:`size-4`})})]})]})]})}),(0,G.jsx)(pJ,{open:!!h,onOpenChange:e=>{e||g(null)},children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除变更记录`}),(0,G.jsxs)(vJ,{children:[`确定要删除这条 `,h&&`${jJ(h.from)} → ${jJ(h.to)}`,` 的变更记录吗?记忆本身不会被删除。`]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>g(null),disabled:_,children:`取消`}),(0,G.jsx)(yJ,{disabled:_,onClick:e=>{e.preventDefault(),E()},className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:_?`删除中...`:`确认删除`})]})]})})]})}async function Vme(){return ib.get(`/v1/stats/config`)}async function Hme(e=50){return ib.get(`/v1/tier-changes`,{params:{limit:e}})}async function Ume(){return ib.post(`/v1/lifecycle/trigger`,{})}var z9=6,Wme={access_via_get:`访问触发`,access_via_search:`搜索触发`,access_via_recall:`召回触发`,access_via_cross_space_search:`跨空间搜索触发`,scheduled_evaluation:`定时评估`},B9={peripheral:0,working:1,core:2};function Gme(){let e=new Date,n=z9-e.getHours()%z9,r=new Date(e.getTime()+n*36e5);return r.setMinutes(0,0,0),r.toLocaleString(`zh-CN`)}function Kme(e,n){let r=[];for(let i=0;i<=120;i+=2){let a=Math.log(2)/n,o=Math.exp(-a*i**+e);r.push({day:`D${i}`,Core:e<1?Math.max(o,.9):o*.95,Working:o,Peripheral:o*.85})}return r}function qme(){return(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[1,2].map(e=>(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-2`,children:(0,G.jsx)(Cb,{className:`h-4 w-28`})}),(0,G.jsxs)(Sb,{className:`space-y-2`,children:[(0,G.jsx)(Cb,{className:`h-4 w-full`}),(0,G.jsx)(Cb,{className:`h-4 w-3/4`}),(0,G.jsx)(Cb,{className:`h-4 w-1/2`})]})]},e))})}function Jme(){return(0,G.jsx)(`div`,{className:`space-y-2`,children:[1,2,3,4].map(e=>(0,G.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-3`,children:[(0,G.jsx)(Cb,{className:`h-4 w-4`}),(0,G.jsx)(Cb,{className:`h-3 w-24`}),(0,G.jsx)(Cb,{className:`h-5 w-14`}),(0,G.jsx)(Cb,{className:`h-3 w-4`}),(0,G.jsx)(Cb,{className:`h-5 w-14`}),(0,G.jsx)(Cb,{className:`h-3 flex-1`})]},e))})}function Yme(){let[e,n]=(0,y.useState)(null),[r,i]=(0,y.useState)([]),[a,o]=(0,y.useState)(0),[s,c]=(0,y.useState)(!0),[l,u]=(0,y.useState)(!0),[d,f]=(0,y.useState)(20),[p,m]=(0,y.useState)(!1),h=async()=>{try{c(!0),n(await Vme())}catch(e){console.error(`Failed to load lifecycle config:`,e),ir.error(`加载生命周期配置失败`)}finally{c(!1)}},g=async()=>{try{u(!0);let e=await Hme(d);i(e.changes||[]),o(e.totalCount||0)}catch(e){console.error(`Failed to load tier changes:`,e),ir.error(`加载升降级历史失败`)}finally{u(!1)}};(0,y.useEffect)(()=>{h(),g()},[]),(0,y.useEffect)(()=>{g()},[d]);let _=()=>{h(),g()},v=async()=>{try{m(!0);let e=await Ume();ir.success(e.message),h(),g()}catch(e){console.error(`Failed to trigger lifecycle:`,e),ir.error(`触发生命周期失败`)}finally{m(!1)}},b=e?Kme(e.decay.tiers?.working?.beta??1,e.decay.half_life_days):[],x=r.filter(e=>(B9[e.from]??0)<(B9[e.to]??0)).length,S=r.filter(e=>(B9[e.from]??0)>=(B9[e.to]??0)).length;return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-6xl mx-auto`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight flex items-center gap-2`,children:[(0,G.jsx)(Gm,{className:`size-5`}),`生命周期管理`]}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`记忆衰减、升降级、自动遗忘的生命周期策略`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:_,disabled:s&&l,children:[(0,G.jsx)(Fm,{className:`h-4 w-4 mr-1`}),`刷新`]}),(0,G.jsxs)(q,{variant:`default`,size:`sm`,onClick:v,disabled:p,children:[p?(0,G.jsx)(nee,{className:`h-4 w-4 mr-1 animate-spin`}):(0,G.jsx)(eh,{className:`h-4 w-4 mr-1`}),`立即执行`]})]})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`pb-3`,children:[(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(nm,{className:`size-4 text-violet-500`}),`调度器状态`]}),(0,G.jsx)(xb,{children:`自动评估与遗忘任务的运行状态`})]}),(0,G.jsxs)(Sb,{children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`调度间隔`}),(0,G.jsxs)(`p`,{className:`text-lg font-semibold mt-1`,children:[`每 `,z9,` 小时`]})]}),(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`预计下次运行`}),(0,G.jsx)(`p`,{className:`text-sm font-semibold mt-1`,children:Gme()})]}),(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`启动时运行`}),(0,G.jsx)(`div`,{className:`mt-1`,children:(0,G.jsx)(CJ,{variant:`outline`,className:`bg-emerald-500/10 text-emerald-600 border-emerald-500/30`,children:`已启用`})})]})]}),(0,G.jsx)(`div`,{className:`mt-4 p-3 rounded-lg border border-dashed text-xs text-muted-foreground space-y-1`,children:(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(sm,{className:`size-3.5`}),(0,G.jsx)(`span`,{children:`调度器将自动执行:Weibull 衰减计算、Tier 评估升降级、关键词 TTL 检测、Superseded 归档清理`})]})})]})]}),s?(0,G.jsx)(qme,{}):e?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-3`,children:(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(zp,{className:`size-4 text-blue-500`}),`衰减参数`]})}),(0,G.jsxs)(Sb,{className:`space-y-3`,children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 text-sm`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`默认半衰期`}),(0,G.jsxs)(`p`,{className:`font-semibold`,children:[e.decay.half_life_days,` 天`]})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`Stale 阈值`}),(0,G.jsx)(`p`,{className:`font-semibold`,children:`0.3`})]})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`权重分配`}),(0,G.jsxs)(`div`,{className:`flex gap-2`,children:[(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-blue-500/10 text-blue-600 border-blue-500/30 text-xs`,children:[`时效 `,e.decay.recency_weight]}),(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-emerald-500/10 text-emerald-600 border-emerald-500/30 text-xs`,children:[`频率 `,e.decay.frequency_weight]}),(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-violet-500/10 text-violet-600 border-violet-500/30 text-xs`,children:[`内在 `,e.decay.intrinsic_weight]})]})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Tier 衰减速率 (β)`}),(0,G.jsx)(`div`,{className:`flex gap-2`,children:Object.entries(e.decay.tiers||{}).map(([e,n])=>(0,G.jsxs)(CJ,{variant:`outline`,className:`text-xs ${NJ(e)}`,children:[jJ(e),` β=`,n.beta]},e))})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Tier 底线分数`}),(0,G.jsx)(`div`,{className:`flex gap-2`,children:Object.entries(e.decay.tiers||{}).map(([e,n])=>(0,G.jsxs)(CJ,{variant:`outline`,className:`text-xs ${NJ(e)}`,children:[jJ(e),` ≥`,n.floor]},e))})]})]})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-3`,children:(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(qm,{className:`size-4 text-emerald-500`}),`升降级规则`]})}),(0,G.jsxs)(Sb,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,G.jsx)(Wp,{className:`size-4 text-emerald-500`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`peripheral`),children:jJ(`peripheral`)}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`working`),children:jJ(`working`)})]}),(0,G.jsxs)(`div`,{className:`flex gap-2 text-xs`,children:[(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`访问 ≥`,e.promotion.peripheral_to_working.min_access_count,`次`]}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`综合 ≥`,e.promotion.peripheral_to_working.min_composite]})]})]}),(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,G.jsx)(Wp,{className:`size-4 text-emerald-500`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`working`),children:jJ(`working`)}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`core`),children:jJ(`core`)})]}),(0,G.jsxs)(`div`,{className:`flex gap-2 text-xs`,children:[(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`访问 ≥`,e.promotion.working_to_core.min_access_count,`次`]}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`综合 ≥`,e.promotion.working_to_core.min_composite]}),e.promotion.working_to_core.min_importance!=null&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`重要性 ≥`,e.promotion.working_to_core.min_importance]})]})]})]}),(0,G.jsx)(`div`,{className:`p-3 rounded-lg border border-dashed space-y-1 text-xs text-muted-foreground`,children:(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Bp,{className:`size-3.5 text-red-400`}),(0,G.jsx)(`span`,{children:`不满足条件时自动降级至低等级`})]})})]})]})]}),b.length>0&&(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`pb-2`,children:[(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(eh,{className:`size-4 text-amber-500`}),`衰减曲线预览`]}),(0,G.jsx)(xb,{children:`基于当前配置参数生成的理论衰减趋势`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`h-64`,children:(0,G.jsx)(oD,{width:`100%`,height:`100%`,children:(0,G.jsxs)(nJ,{data:b,children:[(0,G.jsx)(eG,{strokeDasharray:`3 3`,className:`opacity-30`}),(0,G.jsx)(mK,{dataKey:`day`,tick:{fontSize:11},interval:14,label:{value:`天数`,position:`insideBottomRight`,offset:-5,fontSize:11}}),(0,G.jsx)(jK,{domain:[0,1],tick:{fontSize:11},label:{value:`分数`,angle:-90,position:`insideLeft`,fontSize:11}}),(0,G.jsx)(VE,{contentStyle:{fontSize:12,borderRadius:8},formatter:e=>[e.toFixed(3)]}),(0,G.jsx)(FT,{iconType:`line`,wrapperStyle:{fontSize:12}}),(0,G.jsx)(OG,{type:`monotone`,dataKey:`Core`,stroke:`#f59e0b`,strokeWidth:2,dot:!1,name:`核心 (Core)`}),(0,G.jsx)(OG,{type:`monotone`,dataKey:`Working`,stroke:`#10b981`,strokeWidth:2,dot:!1,name:`工作区 (Working)`}),(0,G.jsx)(OG,{type:`monotone`,dataKey:`Peripheral`,stroke:`#94a3b8`,strokeWidth:2,dot:!1,name:`边缘 (Peripheral)`})]})})})})]})]}):(0,G.jsx)(vb,{children:(0,G.jsx)(Sb,{className:`py-8 text-center`,children:(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`无法加载生命周期配置`})})}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-2`,children:(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(bb,{className:`text-sm font-medium`,children:`升降级历史`}),(0,G.jsx)(xb,{children:`最近的 Tier 变更记录`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-emerald-500/10 text-emerald-600 border-emerald-500/30 text-xs`,children:[`↑ 升级 `,x]}),(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-red-500/10 text-red-600 border-red-500/30 text-xs`,children:[`↓ 降级 `,S]}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`共 `,a,` 条`]})]})]})}),(0,G.jsx)(Sb,{className:`p-0`,children:l?(0,G.jsx)(Jme,{}):r.length===0?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-12 text-center`,children:`暂无变更记录`}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`div`,{className:`divide-y`,children:r.map(e=>(0,G.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-3 hover:bg-muted/30 transition-colors`,children:[(B9[e.from]??0)<(B9[e.to]??0)?(0,G.jsx)(Wp,{className:`size-4 text-emerald-500 shrink-0`}):(0,G.jsx)(Bp,{className:`size-4 text-red-500 shrink-0`}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-36 shrink-0`,children:new Date(e.at).toLocaleString(`zh-CN`)}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.from),children:jJ(e.from)}),(0,G.jsx)(`span`,{className:`text-muted-foreground text-xs`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.to),children:jJ(e.to)}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-20 shrink-0`,children:Wme[e.reason]||e.reason}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground w-12 shrink-0`,children:[`#`,e.accessCount]}),(0,G.jsx)(`span`,{className:`text-xs flex-1 min-w-0 truncate text-muted-foreground`,children:e.memoryTitle||e.memoryId?.slice(0,12)||`—`}),(0,G.jsx)(`span`,{className:`text-xs font-mono text-muted-foreground shrink-0`,children:e.memoryId?`${e.memoryId.slice(0,8)}...`:`—`})]},`${e.memoryId}-${e.at}-${e.from}-${e.to}`))}),r.length<a&&(0,G.jsx)(`div`,{className:`flex items-center justify-center px-4 py-3 border-t`,children:(0,G.jsx)(q,{variant:`ghost`,size:`sm`,onClick:()=>f(e=>e+20),children:`加载更多`})})]})})]})]})}function V9(){let e=et(),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)(!1),[o,s]=(0,y.useState)(null),[c,l]=(0,y.useState)(!1),u=(0,y.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),e.type===`dragenter`||e.type===`dragover`?l(!0):e.type===`dragleave`&&l(!1)},[]),d=(0,y.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),l(!1),e.dataTransfer.files&&e.dataTransfer.files[0]&&(r(e.dataTransfer.files[0]),s(null))},[]);return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-3xl`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`icon`,onClick:()=>e(`/memories`),children:(0,G.jsx)(Vp,{className:`h-4 w-4`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`批量导入`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`从 JSON、CSV 或 Markdown 文件导入记忆`})]})]}),(0,G.jsx)(vb,{className:`border-2 border-dashed p-8 transition-colors ${c?`border-primary bg-primary/5`:`border-border`}`,onDragEnter:u,onDragLeave:u,onDragOver:u,onDrop:d,children:(0,G.jsxs)(`div`,{className:`flex flex-col items-center justify-center gap-4 text-center`,children:[(0,G.jsx)(Ym,{className:`h-10 w-10 text-muted-foreground`}),(0,G.jsxs)(`div`,{className:`space-y-1`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:n?n.name:`拖拽文件到此处,或点击选择`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`支持 JSON、CSV、Markdown 格式`})]}),(0,G.jsx)(`input`,{type:`file`,accept:`.json,.csv,.md,.markdown`,onChange:e=>{e.target.files&&e.target.files[0]&&(r(e.target.files[0]),s(null))},className:`hidden`,id:`file-upload`}),(0,G.jsx)(q,{variant:`outline`,size:`sm`,onClick:()=>document.getElementById(`file-upload`)?.click(),children:`选择文件`})]})}),n&&(0,G.jsxs)(`div`,{className:`flex items-center gap-3 rounded-lg border border-border bg-card p-4`,children:[(e=>e.endsWith(`.json`)?(0,G.jsx)(cm,{className:`h-8 w-8 text-blue-500`}):e.endsWith(`.csv`)?(0,G.jsx)(lm,{className:`h-8 w-8 text-green-500`}):e.endsWith(`.md`)||e.endsWith(`.markdown`)?(0,G.jsx)(um,{className:`h-8 w-8 text-purple-500`}):(0,G.jsx)(um,{className:`h-8 w-8 text-muted-foreground`}))(n.name),(0,G.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium truncate`,children:n.name}),(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[(n.size/1024).toFixed(1),` KB`]})]}),(0,G.jsx)(q,{onClick:async()=>{if(!n){ir.error(`请先选择文件`);return}let e=new FormData;e.append(`file`,n);let r=n.name.endsWith(`.json`)?`json`:n.name.endsWith(`.csv`)?`csv`:`md`;e.append(`format`,r),a(!0);try{let n=await ib.post(`/v1/imports`,e,{headers:{"Content-Type":`multipart/form-data`}});s({success:!0,imported:n.imported||0,failed:n.failed||0,errors:n.errors}),ir.success(`成功导入 ${n.imported||0} 条记忆`)}catch(e){let n=e.response?.data?.error||e.message||`导入失败`;s({success:!1,imported:0,failed:0,errors:[n]}),ir.error(n)}finally{a(!1)}},disabled:i,size:`sm`,children:i?`导入中...`:`开始导入`})]}),o&&(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 mb-4`,children:[o.success?(0,G.jsx)(tm,{className:`h-5 w-5 text-green-500`}):(0,G.jsx)(eee,{className:`h-5 w-5 text-red-500`}),(0,G.jsx)(`h3`,{className:`font-semibold`,children:o.success?`导入成功`:`导入失败`})]}),o.success&&(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,G.jsxs)(`div`,{className:`rounded-lg bg-green-500/10 p-4 text-center`,children:[(0,G.jsx)(`p`,{className:`text-2xl font-bold text-green-500`,children:o.imported}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`成功导入`})]}),(0,G.jsxs)(`div`,{className:`rounded-lg bg-red-500/10 p-4 text-center`,children:[(0,G.jsx)(`p`,{className:`text-2xl font-bold text-red-500`,children:o.failed}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`导入失败`})]})]}),o.errors&&o.errors.length>0&&(0,G.jsxs)(`div`,{className:`mt-4 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium text-red-500`,children:`错误信息:`}),o.errors.map(e=>(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e},e))]})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-3`,children:`支持格式说明`}),(0,G.jsxs)(`div`,{className:`space-y-3 text-sm`,children:[(0,G.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,G.jsx)(cm,{className:`h-4 w-4 text-blue-500 mt-0.5`}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`font-medium`,children:`JSON`}),(0,G.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`标准 JSON 数组格式,每条记忆包含 content, tags, category 等字段`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,G.jsx)(lm,{className:`h-4 w-4 text-green-500 mt-0.5`}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`font-medium`,children:`CSV`}),(0,G.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`包含列:content, tags, category, importance, confidence`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,G.jsx)(um,{className:`h-4 w-4 text-purple-500 mt-0.5`}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`font-medium`,children:`Markdown`}),(0,G.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`每条记忆用标题分隔,支持 frontmatter 元数据`})]})]})]})]})]})}function Xme(){let{theme:e,setTheme:n}=Cr(),{hasPassword:r,setPassword:i,lock:a}=ob(),[o,s]=(0,y.useState)(``),[c,l]=(0,y.useState)(!1),[u,d]=(0,y.useState)(!1),[f,p]=(0,y.useState)(!1);return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-2xl`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`系统设置`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理您的偏好设置和数据`})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`外观`}),(0,G.jsx)(`div`,{className:`space-y-4`,children:(0,G.jsxs)(`div`,{children:[(0,G.jsx)(gb,{className:`text-sm font-medium`,children:`主题模式`}),(0,G.jsxs)(`div`,{className:`flex gap-2 mt-2`,children:[(0,G.jsxs)(q,{variant:e===`light`?`default`:`outline`,size:`sm`,onClick:()=>n(`light`),className:`gap-2`,children:[(0,G.jsx)(Um,{className:`h-4 w-4`}),`亮色`]}),(0,G.jsxs)(q,{variant:e===`dark`?`default`:`outline`,size:`sm`,onClick:()=>n(`dark`),className:`gap-2`,children:[(0,G.jsx)(Am,{className:`h-4 w-4`}),`暗黑`]}),(0,G.jsxs)(q,{variant:e===`system`?`default`:`outline`,size:`sm`,onClick:()=>n(`system`),className:`gap-2`,children:[(0,G.jsx)(km,{className:`h-4 w-4`}),`跟随系统`]})]})]})})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`私密空间 Vault`}),(0,G.jsxs)(`div`,{className:`space-y-4`,children:[r?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Vault 密码已设置。私密记忆需要输入密码才能查看。`}),(0,G.jsxs)(`div`,{className:`flex gap-2`,children:[(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>l(!c),children:[(0,G.jsx)(Em,{className:`h-4 w-4 mr-2`}),`修改密码`]}),(0,G.jsxs)(q,{variant:`destructive`,size:`sm`,onClick:()=>p(!0),children:[(0,G.jsx)(Km,{className:`h-4 w-4 mr-2`}),`重置 Vault`]})]})]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`尚未设置 Vault 密码。设置后,私密记忆将受到密码保护。`}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>l(!0),children:[(0,G.jsx)(Em,{className:`h-4 w-4 mr-2`}),`设置 Vault 密码`]})]}),c&&(0,G.jsxs)(`div`,{className:`flex gap-2 mt-4`,children:[(0,G.jsx)(`input`,{type:`password`,placeholder:`输入新密码`,value:o,onChange:e=>s(e.target.value),className:`flex-1 rounded-md border border-input bg-background px-3 py-2 text-sm`}),(0,G.jsx)(q,{size:`sm`,onClick:()=>{if(!o||o.length<4){ir.error(`密码至少需要 4 位`);return}i(o),ir.success(`Vault 密码已设置`),s(``),l(!1)},children:`确认`})]})]})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`数据管理`}),(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`导出记忆数据`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`从服务端导出所有记忆为 JSON 文件`})]}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:async()=>{d(!0);try{let e=await ib.get(`/v1/memories`,{params:{limit:1e4}}),n={memories:e.memories||[],total_count:e.total_count||0,exportedAt:new Date().toISOString()},r=new Blob([JSON.stringify(n,null,2)],{type:`application/json`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=`omem-memories-${new Date().toISOString().slice(0,10)}.json`,a.click(),URL.revokeObjectURL(i),ir.success(`已导出 ${n.total_count} 条记忆`)}catch(e){console.error(`Failed to export memories:`,e),ir.error(`导出记忆数据失败`)}finally{d(!1)}},disabled:u,children:[(0,G.jsx)(im,{className:`h-4 w-4 mr-2`}),u?`导出中...`:`导出`]})]}),(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`导出本地配置`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`将登录信息、主题等本地设置导出备份`})]}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>{let e={auth:JSON.parse(sessionStorage.getItem(`omem-auth`)||`{}`),vault:`已迁移到服务端存储`,theme:localStorage.getItem(`omem-theme`)||`system`,exportedAt:new Date().toISOString()},n=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`omem-config-${new Date().toISOString().slice(0,10)}.json`,i.click(),URL.revokeObjectURL(r),ir.success(`本地配置已导出`)},children:[(0,G.jsx)(am,{className:`h-4 w-4 mr-2`}),`导出`]})]}),(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`清除缓存`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`清除所有本地存储的数据(不可逆)`})]}),(0,G.jsxs)(q,{variant:`destructive`,size:`sm`,onClick:()=>{sessionStorage.clear(),ir.success(`缓存已清除`,{description:`所有本地数据已清除,刷新页面后生效`})},children:[(0,G.jsx)(Km,{className:`h-4 w-4 mr-2`}),`清除`]})]})]})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`关于`}),(0,G.jsxs)(`div`,{className:`space-y-2 text-sm`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(vm,{className:`h-4 w-4 text-muted-foreground`}),(0,G.jsx)(`span`,{children:`omem-web v0.1.0`})]}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`omem 自部署版 Web 管理端`}),(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`备案号:`,(0,G.jsx)(`a`,{href:`https://beian.miit.gov.cn`,target:`_blank`,rel:`noopener noreferrer`,className:`underline`,children:`吉ICP备2026003061号`})]})]})]}),(0,G.jsx)(pJ,{open:f,onOpenChange:p,children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认重置 Vault`}),(0,G.jsx)(vJ,{children:`此操作不可恢复。重置后所有受 Vault 保护的私密记忆将无法访问。`})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>p(!1),children:`取消`}),(0,G.jsx)(yJ,{onClick:async()=>{try{await ib.delete(`/v1/vault/password`),a(),ir.success(`Vault 已重置`),l(!1),p(!1)}catch{ir.error(`重置 Vault 失败`)}},className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`确认重置`})]})]})})]})}function H9(e){return`/v2/profile${e}`}var U9={getPreferences(e){return ib.get(H9(`/preferences`),{params:e?{project_path:e}:void 0})},getPreference(e){return ib.get(H9(`/preferences/${e}`))},createPreference(e){return ib.post(H9(`/preferences`),e)},updatePreference(e,n){return ib.put(H9(`/preferences/${e}`),n)},deletePreference(e){return ib.delete(H9(`/preferences/${e}`))},getStats(e){return ib.get(H9(`/stats`),{params:e?{project_path:e}:void 0})},getInjection(e){return ib.get(H9(`/inject`),{params:e?{project_path:e}:void 0})},triggerInduction(e,n){return ib.post(H9(`/induction/trigger`),{candidate_texts:e??[],project_path:n})},getInductionRuns(e){return ib.get(H9(`/induction/runs`),{params:e?{project_path:e}:void 0})},getVersions(e){return ib.get(H9(`/versions`),{params:e?{project_path:e}:void 0})},getChangelog(e){return ib.get(H9(`/changelog`),{params:e?{project_path:e}:void 0})}};function W9(e){let n=e.toLowerCase();return n.includes(`喜欢`)||n.includes(`偏好`)||n.includes(`习惯`)?{type:`preference`,icon:Cm,color:`text-amber-600 dark:text-amber-400`,bgColor:`bg-amber-50 dark:bg-amber-500/10 border-amber-200 dark:border-amber-500/30`,label:`偏好`}:n.includes(`项目`)||n.includes(`工程`)||n.includes(`开发`)?{type:`project`,icon:eh,color:`text-blue-600 dark:text-blue-400`,bgColor:`bg-blue-50 dark:bg-blue-500/10 border-blue-200 dark:border-blue-500/30`,label:`项目`}:n.includes(`技能`)||n.includes(`能力`)||n.includes(`精通`)||n.includes(`熟练`)?{type:`skill`,icon:Vm,color:`text-violet-600 dark:text-violet-400`,bgColor:`bg-violet-50 dark:bg-violet-500/10 border-violet-200 dark:border-violet-500/30`,label:`技能`}:n.includes(`笔记`)||n.includes(`记录`)||n.includes(`文档`)?{type:`note`,icon:Gp,color:`text-slate-600 dark:text-slate-400`,bgColor:`bg-slate-50 dark:bg-slate-500/10 border-slate-200 dark:border-slate-500/30`,label:`笔记`}:{type:`fact`,icon:Zm,color:`text-emerald-600 dark:text-emerald-400`,bgColor:`bg-emerald-50 dark:bg-emerald-500/10 border-emerald-200 dark:border-emerald-500/30`,label:`事实`}}function Zme(){return{type:`private`,icon:Em,color:`text-amber-600 dark:text-amber-400`,bgColor:`bg-amber-50 dark:bg-amber-500/10 border-amber-200 dark:border-amber-500/30`,label:`私密`}}function G9(e){return e.replace(/^#+\s*/,``).trim()}function Qme(e,n){return n===`private`?!0:e.some(e=>e===`私密`||e.toLowerCase()===`private`)}function $me(e){return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function K9(e){let n=Date.now()-new Date(e).getTime(),r=Math.floor(n/6e4);if(r<1)return`刚刚`;if(r<60)return`${r} 分钟前`;let i=Math.floor(r/60);if(i<24)return`${i} 小时前`;let a=Math.floor(i/24);return a<30?`${a} 天前`:$me(e)}function q9({content:e}){let[n,r]=(0,y.useState)(!1),i=(0,y.useRef)(null),[a,o]=(0,y.useState)(!1);return(0,y.useEffect)(()=>{let e=i.current;if(!e)return;let n=new ResizeObserver(()=>o(e.scrollHeight>e.clientHeight));return n.observe(e),()=>n.disconnect()},[]),(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:Tp(`relative`,!n&&`max-h-60 overflow-hidden`),children:[(0,G.jsx)(`div`,{ref:i,className:`prose prose-sm dark:prose-invert max-w-none`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:e})}),!n&&a&&(0,G.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-10 bg-gradient-to-t from-background to-transparent pointer-events-none`})]}),a&&(0,G.jsx)(q,{variant:`ghost`,size:`sm`,className:`mt-1 h-auto py-1 px-2 text-xs text-muted-foreground hover:text-foreground`,onClick:()=>r(!n),children:n?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(em,{className:`size-3 mr-1`}),`收起`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(Zp,{className:`size-3 mr-1`}),`展开全文`]})})]})}var ehe=[{name:`communication_style`,display:`沟通风格`},{name:`tone`,display:`语气偏好`},{name:`code_style`,display:`代码风格`},{name:`error_handling`,display:`错误处理`},{name:`naming_convention`,display:`命名规范`},{name:`testing_strategy`,display:`测试策略`},{name:`workflow_preference`,display:`工作流偏好`},{name:`commit_style`,display:`提交风格`},{name:`emoji_preference`,display:`Emoji偏好`},{name:`self_reference`,display:`自称方式`},{name:`address_style`,display:`称呼方式`},{name:`language`,display:`语言`},{name:`framework_preference`,display:`框架偏好`},{name:`preferred_tools`,display:`工具偏好`}],the={communication_style:`沟通风格`,coding_preferences:`编码偏好`,project_context:`项目上下文`,tool_preferences:`工具偏好`,domain_knowledge:`领域知识`,work_style:`工作风格`,language_preference:`语言偏好`,framework_preferences:`框架偏好`},nhe={communication_style:zp,coding_preferences:eh,project_context:dm,tool_preferences:xm,domain_knowledge:Gp,work_style:Pm,language_preference:Cm,framework_preferences:Vm};function rhe(e){return the[e]||e.replace(/_/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function ihe(e){return nhe[e]||xm}var ahe={global:{className:`bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-500/30`,label:`全局`},project:{className:`bg-violet-50 dark:bg-violet-500/10 text-violet-700 dark:text-violet-300 border-violet-200 dark:border-violet-500/30`,label:`项目`},session:{className:`bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 border-emerald-200 dark:border-emerald-500/30`,label:`会话`}};function ohe(){let e=et(),n=ob(e=>e.unlock),r=ob(e=>e.hasPassword),i=ob(e=>e.isUnlocked),[a,o]=(0,y.useState)(null),[s,c]=(0,y.useState)(null),[l,u]=(0,y.useState)([]),[d,f]=(0,y.useState)([]),[p,m]=(0,y.useState)(!0),[h,g]=(0,y.useState)(`preferences`),[_,v]=(0,y.useState)(``),[b,x]=(0,y.useState)(!1),[S,C]=(0,y.useState)(null),[w,T]=(0,y.useState)(``),[E,D]=(0,y.useState)(null),[O,k]=(0,y.useState)(!1),[A,j]=(0,y.useState)(new Set),[M,N]=(0,y.useState)(!1),[P,F]=(0,y.useState)(null),[I,L]=(0,y.useState)(!1),[R,z]=(0,y.useState)(null),[ee,B]=(0,y.useState)(!1),[V,H]=(0,y.useState)(``),[U,te]=(0,y.useState)(`all`),[W,ne]=(0,y.useState)(1),[re,ie]=(0,y.useState)(1);(0,y.useEffect)(()=>{async function e(){try{m(!0);let e=_||void 0,[n,r,i,a]=await Promise.all([ib.get(`/v1/profile`).catch(()=>null),U9.getStats(e).catch(()=>null),U9.getPreferences(e).catch(()=>[]),U9.getChangelog(e).catch(()=>[])]);n&&o(n),r&&c(r),u(Array.isArray(i)?i:[]),f(Array.isArray(a)?a:[])}catch(e){console.error(`Failed to load profile:`,e),ir.error(`加载画像数据失败`)}finally{m(!1)}}e()},[_]);let ae=async()=>{if(!w.trim()){D(`请输入密码`);return}k(!0);let e=await n(w);if(k(!1),!e){D(`密码错误`);return}S&&j(e=>new Set(e).add(S)),x(!1),C(null),T(``),D(null),ir.success(`已解锁`)},oe=e=>{if(i){j(n=>new Set(n).add(e));return}if(!r){ir.error(`请先在设置中设置密码`);return}C(e),T(``),D(null),x(!0)},se=a?.static_facts||[],ce=a?.dynamic_context||[],le=(0,y.useMemo)(()=>se.map(e=>{let n=Qme(e.tags||[],e.visibility),r=n?Zme():W9(e.content);return{fact:e.content,factObj:e,isPrivate:n,meta:r}}),[se]),ue=(0,y.useMemo)(()=>{let e=new Map;for(let n of l){if(U!==`all`&&n.scope!==U)continue;if(V.trim()){let e=V.toLowerCase();if(!n.value.toLowerCase().includes(e)&&!n.slot.toLowerCase().includes(e)&&!(n.project_path||``).toLowerCase().includes(e))continue}let r=e.get(n.slot)||[];r.push(n),e.set(n.slot,r)}return e},[l,V,U]),de=(0,y.useMemo)(()=>Array.from(ue.entries()),[ue]),fe=Math.max(1,Math.ceil(de.length/5)),pe=(0,y.useMemo)(()=>{let e=(W-1)*5;return de.slice(e,e+5)},[de,W]),me=async()=>{let e=_||void 0,[n,r]=await Promise.all([U9.getPreferences(e),U9.getStats(e).catch(()=>null)]);u(Array.isArray(n)?n:[]),r&&c(r)},he=async e=>{if(!(!(`slot`in e)||!e.slot))try{L(!0),await U9.createPreference(e),ir.success(`偏好已创建`),N(!1),await me()}catch{ir.error(`创建失败`)}finally{L(!1)}},ge=async(e,n)=>{try{L(!0),await U9.updatePreference(e,n),ir.success(`偏好已更新`),F(null);let r=_||void 0,i=await U9.getPreferences(r);u(Array.isArray(i)?i:[])}catch{ir.error(`更新失败`)}finally{L(!1)}},_e=async()=>{if(R)try{B(!0),await U9.deletePreference(R.id),ir.success(`偏好已删除`),z(null),await me()}catch{ir.error(`删除失败`)}finally{B(!1)}},ve=(0,y.useMemo)(()=>{let e=new Set;for(let n of l)n.project_path&&e.add(n.project_path);return Array.from(e).sort()},[l]),ye=l.length;return(0,G.jsxs)(`div`,{className:`min-h-screen bg-gradient-to-b from-background via-background to-muted/30`,children:[(0,G.jsxs)(`div`,{className:`max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-6 space-y-6`,children:[(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,className:`text-muted-foreground hover:text-foreground -ml-2`,onClick:()=>e(-1),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回`]}),(0,G.jsxs)(`div`,{className:`relative overflow-hidden rounded-2xl bg-gradient-to-br from-amber-50 via-orange-50 to-rose-50 dark:from-amber-500/10 dark:via-orange-500/5 dark:to-rose-500/10 border border-amber-200/50 dark:border-amber-500/20 p-6 md:p-8`,children:[(0,G.jsx)(`div`,{className:`absolute top-0 right-0 -mt-8 -mr-8 w-48 h-48 bg-amber-400/15 dark:bg-amber-500/10 rounded-full blur-3xl`}),(0,G.jsx)(`div`,{className:`absolute bottom-0 left-0 -mb-6 -ml-6 w-36 h-36 bg-orange-400/10 dark:bg-orange-500/8 rounded-full blur-3xl`}),(0,G.jsxs)(`div`,{className:`relative z-10 flex flex-col md:flex-row md:items-center md:justify-between gap-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-14 rounded-2xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg shadow-amber-500/25`,children:(0,G.jsx)(Zm,{className:`size-7 text-white`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl md:text-3xl font-bold tracking-tight text-foreground`,children:`用户画像`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:`偏好 · 记忆 · 洞察`})]})]}),(0,G.jsxs)(`div`,{className:`flex flex-wrap gap-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-white/80 dark:bg-card/80 border border-amber-200/60 dark:border-amber-500/20 shadow-sm`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-8 rounded-lg bg-amber-100 dark:bg-amber-500/15`,children:(0,G.jsx)(xm,{className:`size-4 text-amber-600 dark:text-amber-400`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-lg font-bold leading-none text-foreground`,children:ye}),(0,G.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`条偏好`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-white/80 dark:bg-card/80 border border-orange-200/60 dark:border-orange-500/20 shadow-sm`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-8 rounded-lg bg-orange-100 dark:bg-orange-500/15`,children:(0,G.jsx)(Yp,{className:`size-4 text-orange-600 dark:text-orange-400`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-lg font-bold leading-none text-foreground`,children:s?.total??0}),(0,G.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`归纳总量`})]})]}),s?.last_induction_at&&(0,G.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-white/80 dark:bg-card/80 border border-rose-200/60 dark:border-rose-500/20 shadow-sm`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-8 rounded-lg bg-rose-100 dark:bg-rose-500/15`,children:(0,G.jsx)(nm,{className:`size-4 text-rose-600 dark:text-rose-400`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-semibold leading-none text-foreground`,children:K9(s.last_induction_at)}),(0,G.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`最近归纳`})]})]})]})]})]}),(0,G.jsxs)(F7,{value:h,onValueChange:g,className:`space-y-4`,children:[(0,G.jsxs)(I7,{className:`bg-muted/60 p-1 h-auto`,children:[(0,G.jsxs)(L7,{value:`preferences`,className:`data-[state=active]:bg-background data-[state=active]:shadow-sm gap-1.5 px-4 py-2 text-sm`,children:[(0,G.jsx)(Vm,{className:`size-3.5`}),`偏好管理`]}),(0,G.jsxs)(L7,{value:`overview`,className:`data-[state=active]:bg-background data-[state=active]:shadow-sm gap-1.5 px-4 py-2 text-sm`,children:[(0,G.jsx)(Zm,{className:`size-3.5`}),`画像概览`]}),(0,G.jsxs)(L7,{value:`changelog`,className:`data-[state=active]:bg-background data-[state=active]:shadow-sm gap-1.5 px-4 py-2 text-sm`,children:[(0,G.jsx)(mm,{className:`size-3.5`}),`变更历史`]})]}),(0,G.jsxs)(R7,{value:`preferences`,className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex flex-col sm:flex-row items-start sm:items-center gap-3`,children:[(0,G.jsxs)(`div`,{className:`relative flex-1 w-full sm:max-w-xs`,children:[(0,G.jsx)(Lm,{className:`absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),(0,G.jsx)(hb,{placeholder:`搜索偏好...`,value:V,onChange:e=>{H(e.target.value),ne(1)},className:`pl-9 h-9 bg-muted/40`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[ve.length>0&&(0,G.jsxs)(_9,{value:_,onValueChange:e=>e!=null&&v(e),children:[(0,G.jsxs)(y9,{className:`h-9 w-[180px] text-xs`,children:[(0,G.jsx)(dm,{className:`size-3.5 mr-1.5 text-muted-foreground`}),(0,G.jsx)(v9,{placeholder:`全部项目`})]}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`__all__`,children:`全部项目`}),ve.map(e=>(0,G.jsx)(x9,{value:e,children:e.split(`/`).pop()||e},e))]})]}),(0,G.jsxs)(_9,{value:U,onValueChange:e=>{e!=null&&(te(e),ne(1))},children:[(0,G.jsx)(y9,{className:`h-9 w-[100px] text-xs`,children:(0,G.jsx)(v9,{placeholder:`范围`})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`all`,children:`全部范围`}),(0,G.jsx)(x9,{value:`global`,children:`全局`}),(0,G.jsx)(x9,{value:`project`,children:`项目`}),(0,G.jsx)(x9,{value:`session`,children:`会话`})]})]})]}),(0,G.jsxs)(q,{className:`ml-auto h-9 gap-1.5 bg-gradient-to-r from-amber-500 to-orange-500 hover:from-amber-600 hover:to-orange-600 text-white shadow-sm`,onClick:()=>N(!0),children:[(0,G.jsx)(Nm,{className:`size-4`}),`新建偏好`]})]}),p?(0,G.jsx)(`div`,{className:`space-y-4`,children:[1,2,3].map(e=>(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(Cb,{className:`h-5 w-24 rounded-md`}),(0,G.jsx)(Cb,{className:`h-24 w-full rounded-xl`})]},e))}):ue.size===0?(0,G.jsx)(vb,{className:`border-dashed`,children:(0,G.jsxs)(Sb,{className:`py-16 flex flex-col items-center gap-3 text-muted-foreground`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-12 rounded-2xl bg-muted`,children:(0,G.jsx)(Vm,{className:`size-6`})}),(0,G.jsxs)(`div`,{className:`text-center`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`暂无偏好数据`}),(0,G.jsx)(`p`,{className:`text-xs mt-1`,children:`点击「新建偏好」开始构建你的画像`})]})]})}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`div`,{id:`pref-slot-list`,className:`space-y-4`,children:pe.map(([e,n])=>(0,G.jsx)(she,{slot:e,preferences:n,onEdit:e=>F(e),onDelete:e=>z(e)},e))}),fe>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between pt-2`,children:[(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`第 `,W,` / `,fe,` 页 · 共 `,de.length,` 个分组`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,G.jsx)(q,{variant:`outline`,size:`icon`,className:`size-8`,disabled:W<=1,onClick:()=>{ne(e=>Math.max(1,e-1)),document.getElementById(`pref-slot-list`)?.scrollIntoView({behavior:`smooth`,block:`start`})},children:(0,G.jsx)(Qp,{className:`size-4`})}),Array.from({length:fe},(e,n)=>n+1).map(e=>(0,G.jsx)(q,{variant:e===W?`default`:`outline`,size:`icon`,className:Tp(`size-8 text-xs`,e===W&&`bg-gradient-to-r from-amber-500 to-orange-500 text-white border-0`),onClick:()=>{ne(e),document.getElementById(`pref-slot-list`)?.scrollIntoView({behavior:`smooth`,block:`start`})},children:e},e)),(0,G.jsx)(q,{variant:`outline`,size:`icon`,className:`size-8`,disabled:W>=fe,onClick:()=>{ne(e=>Math.min(fe,e+1)),document.getElementById(`pref-slot-list`)?.scrollIntoView({behavior:`smooth`,block:`start`})},children:(0,G.jsx)($p,{className:`size-4`})})]})]})]})]}),(0,G.jsx)(R7,{value:`overview`,className:`space-y-6`,children:p?(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[1,2,3,4].map(e=>(0,G.jsx)(Cb,{className:`h-48 w-full rounded-xl`},e))}):(0,G.jsxs)(G.Fragment,{children:[le.length>0&&(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(zm,{className:`size-5 text-amber-500`}),(0,G.jsx)(`h2`,{className:`text-lg font-semibold`,children:`画像特征`}),(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-[10px]`,children:[le.length,` 条`]})]}),(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:le.map(({fact:e,factObj:n,isPrivate:r,meta:i})=>{let a=i.icon,o=A.has(e),s=r&&o&&n?.l2_content||G9(e);return(0,G.jsx)(vb,{className:Tp(`relative overflow-hidden border transition-all duration-200 hover:shadow-md`,r&&!o&&`border-amber-200 dark:border-amber-500/30`),children:(0,G.jsxs)(Sb,{className:`p-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,G.jsx)(`div`,{className:Tp(`flex items-center justify-center size-8 rounded-lg border`,i.bgColor),children:(0,G.jsx)(a,{className:Tp(`size-4`,i.color)})}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[r&&(0,G.jsxs)(CJ,{variant:`outline`,className:`text-[10px] gap-1 bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-200 dark:border-amber-500/30`,children:[(0,G.jsx)(Em,{className:`size-2.5`}),`私密`]}),(0,G.jsx)(CJ,{variant:`outline`,className:Tp(`text-[10px]`,i.bgColor,i.color),children:i.label})]})]}),(0,G.jsx)(`div`,{className:Tp(r&&!o&&`blur-[6px] select-none opacity-40`),children:(0,G.jsx)(q9,{content:s})}),r&&!o&&(0,G.jsx)(`button`,{type:`button`,className:`mt-3 w-full flex items-center justify-center gap-2 px-3 py-2 rounded-lg bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-300 text-xs font-medium hover:bg-amber-100 dark:hover:bg-amber-500/20 transition-colors border border-amber-200 dark:border-amber-500/30 cursor-pointer`,onClick:()=>oe(e),children:o?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(om,{className:`size-3.5`}),`已解锁`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(Em,{className:`size-3.5`}),`点击解锁私密内容`]})})]})},`sf-${e.slice(0,40)}`)})})]}),ce.length>0&&(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(zp,{className:`size-5 text-blue-500`}),(0,G.jsx)(`h2`,{className:`text-lg font-semibold`,children:`静态偏好`}),(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-[10px]`,children:[ce.length,` 条`]})]}),(0,G.jsxs)(`div`,{className:`relative pl-6 space-y-3`,children:[(0,G.jsx)(`div`,{className:`absolute left-[11px] top-2 bottom-2 w-px bg-gradient-to-b from-blue-300 via-orange-300 to-transparent dark:from-blue-500/40 dark:via-orange-500/40 dark:to-transparent`}),ce.map((e,n)=>{let r=W9(e),i=r.icon;return(0,G.jsxs)(`div`,{className:`relative group`,children:[(0,G.jsx)(`div`,{className:`absolute -left-6 top-2.5 size-[22px] rounded-full bg-gradient-to-br from-blue-400 to-orange-400 ring-[3px] ring-background flex items-center justify-center shadow-sm group-hover:scale-110 transition-transform`,children:(0,G.jsx)(`span`,{className:`text-[9px] font-bold text-white`,children:n+1})}),(0,G.jsx)(vb,{className:`overflow-hidden hover:shadow-sm transition-shadow`,children:(0,G.jsxs)(Sb,{className:`p-3.5`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 mb-2`,children:[(0,G.jsx)(`div`,{className:Tp(`flex items-center justify-center size-5 rounded-md border`,r.bgColor),children:(0,G.jsx)(i,{className:Tp(`size-3`,r.color)})}),(0,G.jsx)(`span`,{className:Tp(`text-[10px] font-medium px-1.5 py-0.5 rounded border`,r.bgColor,r.color),children:r.label})]}),(0,G.jsx)(q9,{content:G9(e)})]})})]},`dc-${n}`)})]})]}),le.length===0&&ce.length===0&&(0,G.jsx)(vb,{className:`border-dashed`,children:(0,G.jsxs)(Sb,{className:`py-16 flex flex-col items-center gap-3 text-muted-foreground`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-12 rounded-2xl bg-muted`,children:(0,G.jsx)(Zm,{className:`size-6`})}),(0,G.jsxs)(`div`,{className:`text-center`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`暂无画像数据`}),(0,G.jsx)(`p`,{className:`text-xs mt-1`,children:`存储更多记忆后,系统将自动构建您的用户画像`})]})]})})]})}),(0,G.jsx)(R7,{value:`changelog`,className:`space-y-4`,children:p?(0,G.jsx)(`div`,{className:`space-y-3`,children:[1,2,3].map(e=>(0,G.jsx)(Cb,{className:`h-20 w-full rounded-xl`},e))}):d.length===0?(0,G.jsx)(vb,{className:`border-dashed`,children:(0,G.jsxs)(Sb,{className:`py-16 flex flex-col items-center gap-3 text-muted-foreground`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-12 rounded-2xl bg-muted`,children:(0,G.jsx)(mm,{className:`size-6`})}),(0,G.jsxs)(`div`,{className:`text-center`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`暂无变更记录`}),(0,G.jsx)(`p`,{className:`text-xs mt-1`,children:`偏好变更时将自动记录在这里`})]})]})}):(()=>{let e=Math.ceil(d.length/10),n=d.slice((re-1)*10,re*10);return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`relative pl-6 space-y-3`,children:[(0,G.jsx)(`div`,{className:`absolute left-[11px] top-2 bottom-2 w-px bg-gradient-to-b from-violet-300 via-sky-300 to-transparent dark:from-violet-500/40 dark:via-sky-500/40 dark:to-transparent`}),n.map(e=>{let n=e.action===`created`,r=e.action===`updated`,i=n?{bg:`from-emerald-400 to-teal-400`,color:`text-emerald-700 dark:text-emerald-300`,badgeClass:`bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 border-emerald-200 dark:border-emerald-500/30`,symbol:`+`,label:`创建`}:r?{bg:`from-blue-400 to-sky-400`,color:`text-blue-700 dark:text-blue-300`,badgeClass:`bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-500/30`,symbol:`~`,label:`更新`}:{bg:`from-rose-400 to-red-400`,color:`text-rose-700 dark:text-rose-300`,badgeClass:`bg-rose-50 dark:bg-rose-500/10 text-rose-700 dark:text-rose-300 border-rose-200 dark:border-rose-500/30`,symbol:`−`,label:`删除`};return(0,G.jsxs)(`div`,{className:`relative group min-w-0`,children:[(0,G.jsx)(`div`,{className:Tp(`absolute -left-6 top-2.5 size-[22px] rounded-full bg-gradient-to-br ring-[3px] ring-background flex items-center justify-center shadow-sm group-hover:scale-110 transition-transform`,i.bg),children:(0,G.jsx)(`span`,{className:`text-[9px] font-bold text-white`,children:i.symbol})}),(0,G.jsx)(vb,{className:`overflow-hidden hover:shadow-sm transition-shadow min-w-0`,children:(0,G.jsxs)(Sb,{className:`p-4 space-y-2 min-w-0`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,G.jsxs)(CJ,{variant:`outline`,className:Tp(`text-[10px] gap-1 shrink-0`,i.badgeClass),children:[n?(0,G.jsx)(Nm,{className:`size-2.5`}):r?(0,G.jsx)(Mm,{className:`size-2.5`}):(0,G.jsx)(Km,{className:`size-2.5`}),i.label]}),e.source&&(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.source}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground ml-auto shrink-0`,children:K9(e.created_at)})]}),e.old_value&&(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground line-through break-all`,children:e.old_value}),e.new_value&&(0,G.jsx)(`p`,{className:`text-sm leading-relaxed break-words`,children:e.new_value})]})})]},e.id)})]}),e>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-center gap-2 pt-2`,children:[(0,G.jsxs)(q,{variant:`outline`,size:`sm`,className:`h-7 text-xs gap-1`,disabled:re<=1,onClick:()=>ie(e=>Math.max(1,e-1)),children:[(0,G.jsx)(Qp,{className:`size-3`}),`上一页`]}),(0,G.jsx)(`div`,{className:`flex items-center gap-1`,children:Array.from({length:e},(e,n)=>n+1).map(e=>(0,G.jsx)(q,{variant:re===e?`default`:`ghost`,size:`sm`,className:`h-7 w-7 text-xs p-0`,onClick:()=>ie(e),children:e},e))}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,className:`h-7 text-xs gap-1`,disabled:re>=e,onClick:()=>ie(n=>Math.min(e,n+1)),children:[`下一页`,(0,G.jsx)($p,{className:`size-3`})]})]})]})})()})]})]}),(0,G.jsx)(pJ,{open:!!R,onOpenChange:e=>{!e&&!ee&&z(null)},children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除偏好`}),(0,G.jsxs)(vJ,{children:[`确定要删除这条偏好吗?此操作不可撤销。`,R&&(0,G.jsx)(`span`,{className:`block mt-2 px-3 py-2 rounded-lg bg-muted text-sm text-foreground truncate`,children:R.value})]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{disabled:ee,children:`取消`}),(0,G.jsx)(yJ,{disabled:ee,onClick:_e,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:ee?`删除中...`:`删除`})]})]})}),(0,G.jsx)(J9,{open:M,onOpenChange:N,saving:I,onSubmit:he,title:`新建偏好`}),(0,G.jsx)(J9,{open:!!P,onOpenChange:e=>{e||F(null)},saving:I,onSubmit:e=>{P&&ge(P.id,e)},pref:P,title:`编辑偏好`}),(0,G.jsx)(A9,{open:b,onOpenChange:e=>{e||(x(!1),T(``),D(null))},children:(0,G.jsxs)(j9,{className:`sm:max-w-sm`,children:[(0,G.jsxs)(M9,{children:[(0,G.jsxs)(P9,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Em,{className:`size-4 text-amber-500`}),`解锁私密记忆`]}),(0,G.jsx)(F9,{children:`请输入您的 Vault 密码以解锁受保护的内容。`})]}),(0,G.jsx)(`div`,{className:`space-y-3`,children:(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`密码`}),(0,G.jsx)(hb,{type:`password`,placeholder:`输入 Vault 密码...`,value:w,onChange:e=>{T(e.target.value),D(null)},onKeyDown:e=>e.key===`Enter`&&ae(),className:E?`border-destructive`:``,autoFocus:!0}),E&&(0,G.jsx)(`p`,{className:`text-xs text-destructive`,children:E})]})}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>x(!1),disabled:O,children:`取消`}),(0,G.jsx)(q,{onClick:ae,disabled:O||!w.trim(),children:O?`解锁中...`:`解锁`})]})]})})]})}function she({slot:e,preferences:n,onEdit:r,onDelete:i}){let[a,o]=(0,y.useState)(!1),[s,c]=(0,y.useState)(4),l=ihe(e),u=n.slice(0,s),d=s<n.length;return(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2.5 w-full group cursor-pointer text-left border-none bg-transparent p-0`,onClick:()=>{o(!a),c(4)},children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-7 rounded-lg bg-gradient-to-br from-amber-100 to-orange-100 dark:from-amber-500/15 dark:to-orange-500/15 border border-amber-200/60 dark:border-amber-500/20`,children:(0,G.jsx)(l,{className:`size-3.5 text-amber-600 dark:text-amber-400`})}),(0,G.jsx)(`span`,{className:`text-sm font-semibold text-foreground`,children:rhe(e)}),(0,G.jsx)(CJ,{variant:`secondary`,className:`text-[10px]`,children:n.length}),(0,G.jsx)(`div`,{className:`flex-1`}),(0,G.jsx)($p,{className:Tp(`size-4 text-muted-foreground transition-transform duration-200`,!a&&`rotate-90`)})]}),!a&&(0,G.jsxs)(`div`,{className:`space-y-2.5 pl-9`,children:[(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-2.5`,children:u.map(e=>(0,G.jsx)(che,{pref:e,onEdit:r,onDelete:i},e.id))}),d&&(0,G.jsxs)(`button`,{type:`button`,className:`w-full flex items-center justify-center gap-1.5 py-2 text-xs text-muted-foreground hover:text-foreground transition-colors rounded-lg hover:bg-muted/50 cursor-pointer`,onClick:()=>c(e=>Math.min(e+4,n.length)),children:[(0,G.jsx)(Zp,{className:`size-3.5`}),`加载更多(剩余 `,n.length-s,` 条)`]})]})]})}function che({pref:e,onEdit:n,onDelete:r}){let i=ahe[e.scope]||{className:`bg-slate-50 dark:bg-slate-500/10 text-slate-700 dark:text-slate-300 border-slate-200 dark:border-slate-500/30`,label:e.scope};return(0,G.jsx)(vb,{className:`group hover:shadow-md transition-all duration-200 border-border/60`,children:(0,G.jsxs)(Sb,{className:`p-3.5 space-y-2.5`,children:[(0,G.jsx)(`p`,{className:`text-sm leading-relaxed whitespace-pre-wrap break-words`,children:e.value}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1.5 flex-wrap`,children:[(0,G.jsx)(CJ,{variant:`outline`,className:Tp(`text-[10px] gap-1`,i.className),children:i.label}),e.project_path&&(0,G.jsxs)(CJ,{variant:`outline`,className:`text-[10px] gap-1 bg-violet-50 dark:bg-violet-500/10 text-violet-700 dark:text-violet-300 border-violet-200 dark:border-violet-500/30`,children:[(0,G.jsx)(dm,{className:`size-2.5`}),e.project_path.split(`/`).pop()]}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground ml-auto`,children:K9(e.updated_at)})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity pt-1 border-t border-border/40`,children:[(0,G.jsxs)(`span`,{className:`text-[10px] text-muted-foreground mr-auto`,children:[`置信度 `,(e.confidence*100).toFixed(0),`%`]}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-muted-foreground hover:text-foreground`,onClick:()=>n(e),children:(0,G.jsx)(Mm,{className:`size-3.5`})}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-muted-foreground hover:text-destructive`,onClick:()=>r(e),children:(0,G.jsx)(Km,{className:`size-3.5`})})]})]})})}function J9({open:e,onOpenChange:n,saving:r,onSubmit:i,pref:a,title:o}){let s=!!a,[c,l]=(0,y.useState)(a?.slot||``),[u,d]=(0,y.useState)(``),[f,p]=(0,y.useState)(a?.value||``),[m,h]=(0,y.useState)(String(a?.confidence??.8)),[g,_]=(0,y.useState)(a?.scope||`global`),[v,b]=(0,y.useState)(a?.project_path||``);(0,y.useEffect)(()=>{if(e){let e=a?.slot||``;l(e),d(e.startsWith(`custom:`)?e.slice(7):``),p(a?.value||``),h(String(a?.confidence??.8)),_(a?.scope||`global`),b(a?.project_path||``)}},[e,a]);let x=c===`__custom__`;return(0,G.jsx)(A9,{open:e,onOpenChange:n,children:(0,G.jsxs)(j9,{className:`sm:max-w-md`,children:[(0,G.jsxs)(M9,{children:[(0,G.jsxs)(P9,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Vm,{className:`size-4 text-amber-500`}),o]}),(0,G.jsx)(F9,{children:s?`修改偏好信息。`:`添加一条新的偏好。`})]}),(0,G.jsxs)(`div`,{className:`space-y-4 py-1`,children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`Slot (类别)`}),s?(0,G.jsx)(hb,{value:c,disabled:!0,className:`h-9 bg-muted/60`}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(_9,{value:c||void 0,onValueChange:e=>e!=null&&l(e),children:[(0,G.jsx)(y9,{className:`h-9 w-full`,children:(0,G.jsx)(v9,{placeholder:`选择类别...`})}),(0,G.jsxs)(b9,{children:[ehe.map(e=>(0,G.jsx)(x9,{value:e.name,children:e.display},e.name)),(0,G.jsx)(x9,{value:`__custom__`,children:`自定义 (custom:...)`})]})]}),x&&(0,G.jsx)(hb,{placeholder:`自定义 slot 名 (小写字母+数字+下划线)`,value:u,onChange:e=>{d(e.target.value.replace(/[^a-z0-9_]/g,``))},className:`h-9`,maxLength:50})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`范围`}),(0,G.jsxs)(_9,{value:g,onValueChange:e=>e!=null&&_(e),children:[(0,G.jsx)(y9,{className:`h-9`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`global`,children:`全局`}),(0,G.jsx)(x9,{value:`project`,children:`项目`}),(0,G.jsx)(x9,{value:`session`,children:`会话`})]})]})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`内容`}),(0,G.jsx)(T9,{placeholder:`偏好内容...`,value:f,onChange:e=>p(e.target.value),rows:3,className:`resize-none`,maxLength:500})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`置信度 (0-1)`}),(0,G.jsx)(hb,{type:`number`,min:`0`,max:`1`,step:`0.1`,value:m,onChange:e=>h(e.target.value),className:`h-9`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`项目路径 (可选)`}),(0,G.jsx)(hb,{placeholder:`例: /path/to/project`,value:v,onChange:e=>b(e.target.value),className:`h-9`,maxLength:200})]})]})]}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>n(!1),disabled:r,children:`取消`}),(0,G.jsx)(q,{onClick:()=>{let e=x?`custom:${u.trim()}`:c.trim();if(!e||!f.trim()){ir.error(`请填写 Slot 和内容`);return}if(x&&!u.trim()){ir.error(`请填写自定义 Slot 名`);return}if(s){let e={};f!==(a?.value||``)&&(e.value=f.trim()),m!==String(a?.confidence??.8)&&(e.confidence=parseFloat(m)),g!==(a?.scope||`global`)&&(e.scope=g),v!==(a?.project_path||``)&&(e.project_path=v.trim()||void 0),i(e)}else i({slot:e,value:f.trim(),confidence:parseFloat(m)||.8,scope:g,project_path:v.trim()||void 0})},disabled:r||!f.trim()||(x?!u.trim():!c.trim()),className:`bg-gradient-to-r from-amber-500 to-orange-500 hover:from-amber-600 hover:to-orange-600 text-white`,children:r?s?`保存中...`:`创建中...`:s?`保存`:`创建`})]})]})})}var Y9=y.createContext(void 0);function lhe(){let e=y.useContext(Y9);if(e===void 0)throw Error(Ir(63));return e}var X9=function(e){return e.checked=`data-checked`,e.unchecked=`data-unchecked`,e.disabled=`data-disabled`,e.readonly=`data-readonly`,e.required=`data-required`,e.valid=`data-valid`,e.invalid=`data-invalid`,e.touched=`data-touched`,e.dirty=`data-dirty`,e.filled=`data-filled`,e.focused=`data-focused`,e}({}),Z9={...lb,checked(e){return e?{[X9.checked]:``}:{[X9.unchecked]:``}}};function uhe(e,n,r,i=!0,a){let[o,s]=y.useState(),c=yd(a?`${a}-label`:void 0),l=e??n??o;return Pr(()=>{let a=e||n||!i?void 0:dhe(r.current,c);o!==a&&s(a)}),l}function dhe(e,n){let r=fhe(e);if(r)return!r.id&&n&&(r.id=n),r.id||void 0}function fhe(e){if(!e)return;let n=e.parentElement;if(n&&n.tagName===`LABEL`)return n;let r=e.id;if(r){let n=e.nextElementSibling;if(n&&n.htmlFor===r)return n}let i=e.labels;return i&&i[0]}var phe=y.forwardRef(function(e,n){let{checked:r,className:i,defaultChecked:a,"aria-labelledby":o,form:s,id:c,inputRef:l,name:u,nativeButton:d=!1,onCheckedChange:f,readOnly:p=!1,required:m=!1,disabled:h=!1,render:g,uncheckedValue:_,value:v,style:b,...x}=e,{clearErrors:S}=db(),{state:C,setTouched:w,setDirty:T,validityData:E,setFilled:D,setFocused:O,shouldValidateOnChange:k,validationMode:A,disabled:j,name:M,validation:N}=ub(),{labelId:P}=fb(),F=j||h,I=M??u,L=Ca(f),R=y.useRef(null),z=pa(R,l,N.inputRef),ee=y.useRef(null),B=yd(),V=mb({id:c,implicit:!1,controlRef:ee}),H=d?void 0:V,[U,te]=Rg({controlled:r,default:!!a,name:`Switch`,state:`checked`});pb(ee,{id:B,value:U}),Pr(()=>{R.current&&D(R.current.checked)},[R,D]),cg(U,()=>{S(I),T(U!==E.initialValue),D(U),k()?N.commit(U):N.commit(U,!0)});let{getButtonProps:W,buttonRef:ne}=mh({disabled:F,native:d}),re=uhe(o,P,R,!d,H),ie={id:d?V:B,role:`switch`,"aria-checked":U,"aria-readonly":p||void 0,"aria-required":m||void 0,"aria-labelledby":re,onFocus(){F||O(!0)},onBlur(){let e=R.current;!e||F||(w(!0),O(!1),A===`onBlur`&&N.commit(e.checked))},onClick(e){p||F||(e.preventDefault(),R.current?.dispatchEvent(new PointerEvent(`click`,{bubbles:!0,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey})))}},ae=y.useMemo(()=>Rs({checked:U,disabled:F,form:s,id:H,name:I,required:m,style:I?Na:Ma,tabIndex:-1,type:`checkbox`,"aria-hidden":!0,ref:z,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(p){e.preventDefault();return}let n=e.currentTarget.checked,r=Ii(xi,e.nativeEvent);L?.(n,r),!r.isCanceled&&te(n)},onFocus(){ee.current?.focus()}},N.getInputValidationProps,v===void 0?hi:{value:v}),[U,F,s,z,H,I,L,p,m,te,N,v]),oe=y.useMemo(()=>({...C,checked:U,disabled:F,readOnly:p,required:m}),[C,U,F,p,m]),se=Qs(`span`,e,{state:oe,ref:[n,ee,ne],props:[ie,N.getValidationProps,x,W],stateAttributesMapping:Z9});return(0,G.jsxs)(Y9.Provider,{value:oe,children:[se,!U&&I&&_!==void 0&&(0,G.jsx)(`input`,{type:`hidden`,form:s,name:I,value:_}),(0,G.jsx)(`input`,{...ae,suppressHydrationWarning:!0})]})}),mhe=y.forwardRef(function(e,n){let{render:r,className:i,style:a,...o}=e,{state:s}=ub(),c=lhe();return Qs(`span`,e,{state:{...s,...c},ref:n,stateAttributesMapping:Z9,props:o})});function hhe({className:e,size:n=`default`,...r}){return(0,G.jsx)(phe,{"data-slot":`switch`,"data-size":n,className:Tp(`peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50`,e),...r,children:(0,G.jsx)(mhe,{"data-slot":`switch-thumb`,className:`pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground`})})}var Q9={list(){return ib.get(`/v1/categories`)},get(e){return ib.get(`/v1/categories/${encodeURIComponent(e)}`)},create(e){return ib.post(`/v1/categories`,e)},update(e,n){return ib.put(`/v1/categories/${encodeURIComponent(e)}`,n)},delete(e){return ib.delete(`/v1/categories/${encodeURIComponent(e)}`)},listAliases(){return ib.get(`/v1/categories/aliases`)},createAlias(e,n){return ib.post(`/v1/categories/aliases`,{alias:e,target:n})},deleteAlias(e){return ib.delete(`/v1/categories/aliases/${encodeURIComponent(e)}`)}},$9={name:``,display_name:``,description:``,decision_rule:``,always_merge:!1,append_only:!1,temporal_versioned:!1,merge_supported:!1,admission_weight:.5,importance_base:.5,prompt_format:``,default_visibility:`global`,default_scope:`global`,default_ttl_days:0,sort_order:100,is_active:!0};function ghe(){let[e,n]=(0,y.useState)([]),[r,i]=(0,y.useState)([]),[a,o]=(0,y.useState)(!0),[s,c]=(0,y.useState)(null),[l,u]=(0,y.useState)(!1),[d,f]=(0,y.useState)($9),[p,m]=(0,y.useState)(null),[h,g]=(0,y.useState)(!1),[_,v]=(0,y.useState)(``),[b,x]=(0,y.useState)(``),[S,C]=(0,y.useState)(null),w=(0,y.useCallback)(async()=>{try{let e=await Q9.list();n(Array.isArray(e)?e:[])}catch{ir.error(`加载分类失败`)}},[]),T=(0,y.useCallback)(async()=>{try{let e=await Q9.listAliases();i(Array.isArray(e)?e:[])}catch{ir.error(`加载别名失败`)}},[]);(0,y.useEffect)(()=>{Promise.all([w(),T()]).finally(()=>o(!1))},[w,T]);let E=()=>{c(null),f($9),u(!0)},D=e=>{c(e),f({name:e.name,display_name:e.display_name,description:e.description,decision_rule:e.decision_rule||``,always_merge:e.always_merge,append_only:e.append_only,temporal_versioned:e.temporal_versioned,merge_supported:e.merge_supported,admission_weight:e.admission_weight,importance_base:e.importance_base,prompt_format:e.prompt_format||``,default_visibility:e.default_visibility,default_scope:e.default_scope,default_ttl_days:e.default_ttl_days||0,sort_order:e.sort_order,is_active:e.is_active}),u(!0)};return a?(0,G.jsx)(`div`,{className:`flex items-center justify-center h-64 text-muted-foreground`,children:`加载中...`}):(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-bold`,children:`分类字典`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理记忆分类和别名映射`})]}),(0,G.jsxs)(`div`,{className:`flex gap-2`,children:[(0,G.jsxs)(q,{variant:`outline`,onClick:()=>g(!0),children:[(0,G.jsx)(wm,{className:`size-4 mr-1`}),`添加别名`]}),(0,G.jsxs)(q,{onClick:E,children:[(0,G.jsx)(Nm,{className:`size-4 mr-1`}),`新建分类`]})]})]}),(0,G.jsx)(k7,{}),r.length>0&&(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`h2`,{className:`text-lg font-semibold flex items-center gap-2`,children:[(0,G.jsx)(wm,{className:`size-4`}),`别名映射 (`,r.length,`)`]}),(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3`,children:r.map(e=>(0,G.jsxs)(vb,{className:`p-3 flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,G.jsx)(`code`,{className:`bg-muted px-1.5 py-0.5 rounded text-xs`,children:e.alias}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(`code`,{className:`bg-muted px-1.5 py-0.5 rounded text-xs`,children:e.target})]}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-destructive hover:text-destructive`,onClick:()=>C(e.alias),children:(0,G.jsx)($m,{className:`size-3.5`})})]},e.alias))}),(0,G.jsx)(k7,{})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`h2`,{className:`text-lg font-semibold flex items-center gap-2`,children:[(0,G.jsx)(Wm,{className:`size-4`}),`分类列表 (`,e.length,`)`]}),(0,G.jsx)(`div`,{className:`border rounded-lg overflow-hidden`,children:(0,G.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,G.jsx)(`thead`,{className:`bg-muted/50`,children:(0,G.jsxs)(`tr`,{children:[(0,G.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`名称`}),(0,G.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`显示名`}),(0,G.jsx)(`th`,{className:`text-left p-3 font-medium hidden md:table-cell`,children:`描述`}),(0,G.jsx)(`th`,{className:`text-center p-3 font-medium`,children:`权重`}),(0,G.jsx)(`th`,{className:`text-center p-3 font-medium`,children:`状态`}),(0,G.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`操作`})]})}),(0,G.jsx)(`tbody`,{className:`divide-y`,children:e.map(e=>(0,G.jsxs)(`tr`,{className:`hover:bg-muted/30`,children:[(0,G.jsx)(`td`,{className:`p-3`,children:(0,G.jsx)(`code`,{className:`bg-muted px-1.5 py-0.5 rounded text-xs`,children:e.name})}),(0,G.jsx)(`td`,{className:`p-3 font-medium`,children:e.display_name}),(0,G.jsx)(`td`,{className:`p-3 text-muted-foreground hidden md:table-cell max-w-[200px] truncate`,children:e.description}),(0,G.jsx)(`td`,{className:`p-3 text-center`,children:(0,G.jsx)(`span`,{className:`text-xs`,children:e.admission_weight.toFixed(2)})}),(0,G.jsx)(`td`,{className:`p-3 text-center`,children:(0,G.jsx)(`span`,{className:`text-xs px-2 py-0.5 rounded-full ${e.is_active?`bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400`:`bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400`}`,children:e.is_active?`启用`:`禁用`})}),(0,G.jsx)(`td`,{className:`p-3 text-right`,children:(0,G.jsxs)(`div`,{className:`flex justify-end gap-1`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7`,onClick:()=>D(e),children:(0,G.jsx)(ree,{className:`size-3.5`})}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-destructive hover:text-destructive`,onClick:()=>m(e.name),children:(0,G.jsx)(Km,{className:`size-3.5`})})]})})]},e.name))})]})})]}),(0,G.jsx)(A9,{open:l,onOpenChange:u,children:(0,G.jsxs)(j9,{className:`max-w-lg max-h-[80vh] overflow-y-auto`,children:[(0,G.jsx)(M9,{children:(0,G.jsx)(P9,{children:s?`编辑分类`:`新建分类`})}),(0,G.jsxs)(`div`,{className:`space-y-4 py-2`,children:[!s&&(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`名称 (name)`}),(0,G.jsx)(hb,{value:d.name,onChange:e=>f(n=>({...n,name:e.target.value.toLowerCase()})),placeholder:`e.g. preferences`,maxLength:50})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`显示名 (display_name)`}),(0,G.jsx)(hb,{value:d.display_name,onChange:e=>f(n=>({...n,display_name:e.target.value})),placeholder:`e.g. 偏好设置`,maxLength:100})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`描述`}),(0,G.jsx)(hb,{value:d.description,onChange:e=>f(n=>({...n,description:e.target.value})),placeholder:`分类描述`,maxLength:500})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`决策规则 (decision_rule)`}),(0,G.jsx)(hb,{value:d.decision_rule,onChange:e=>f(n=>({...n,decision_rule:e.target.value})),placeholder:`可选`,maxLength:200})]}),(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`准入权重`}),(0,G.jsx)(hb,{type:`number`,step:.05,min:0,max:1,value:d.admission_weight,onChange:e=>f(n=>({...n,admission_weight:+e.target.value}))})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`重要性基数`}),(0,G.jsx)(hb,{type:`number`,step:.05,min:0,max:1,value:d.importance_base,onChange:e=>f(n=>({...n,importance_base:+e.target.value}))})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`排序`}),(0,G.jsx)(hb,{type:`number`,value:d.sort_order,onChange:e=>f(n=>({...n,sort_order:+e.target.value}))})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`默认TTL (天)`}),(0,G.jsx)(hb,{type:`number`,value:d.default_ttl_days,onChange:e=>f(n=>({...n,default_ttl_days:+e.target.value}))})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`提示格式 (prompt_format)`}),(0,G.jsx)(hb,{value:d.prompt_format,onChange:e=>f(n=>({...n,prompt_format:e.target.value})),placeholder:`可选`,maxLength:500})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`默认可见性`}),(0,G.jsxs)(`select`,{className:`w-full h-9 rounded-md border border-input bg-background px-3 text-sm`,value:d.default_visibility,onChange:e=>f(n=>({...n,default_visibility:e.target.value})),children:[(0,G.jsx)(`option`,{value:`global`,children:`global`}),(0,G.jsx)(`option`,{value:`project`,children:`project`}),(0,G.jsx)(`option`,{value:`private`,children:`private`})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`默认作用域`}),(0,G.jsxs)(`select`,{className:`w-full h-9 rounded-md border border-input bg-background px-3 text-sm`,value:d.default_scope,onChange:e=>f(n=>({...n,default_scope:e.target.value})),children:[(0,G.jsx)(`option`,{value:`global`,children:`global`}),(0,G.jsx)(`option`,{value:`project`,children:`project`})]})]})]}),(0,G.jsx)(k7,{}),(0,G.jsx)(`div`,{className:`grid grid-cols-2 gap-3`,children:[[`always_merge`,`始终合并`],[`append_only`,`仅追加`],[`temporal_versioned`,`时序版本`],[`merge_supported`,`支持合并`],[`is_active`,`启用`]].map(([e,n])=>(0,G.jsxs)(`div`,{className:`flex items-center justify-between rounded-md border p-3`,children:[(0,G.jsx)(gb,{className:`text-sm`,children:n}),(0,G.jsx)(hhe,{checked:d[e],onCheckedChange:n=>f(r=>({...r,[e]:n}))})]},e))})]}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>u(!1),children:`取消`}),(0,G.jsx)(q,{onClick:async()=>{if(!d.name.trim()||!d.display_name.trim()){ir.error(`名称和显示名为必填项`);return}try{let e={...d,decision_rule:d.decision_rule||null,prompt_format:d.prompt_format||null,default_ttl_days:d.default_ttl_days||null};s?(await Q9.update(s.name,e),ir.success(`分类已更新`)):(await Q9.create(e),ir.success(`分类已创建`)),u(!1),w()}catch(e){let n=e instanceof Error?e.message:`操作失败`;ir.error(n)}},children:s?`保存`:`创建`})]})]})}),(0,G.jsx)(pJ,{open:!!p,onOpenChange:()=>m(null),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除分类`}),(0,G.jsxs)(vJ,{children:[`确定要删除分类 "`,p,`" 吗?此操作不可撤销。`]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{children:`取消`}),(0,G.jsx)(yJ,{onClick:async()=>{if(p)try{await Q9.delete(p),ir.success(`分类已删除`),m(null),w()}catch{ir.error(`删除失败`)}},children:`删除`})]})]})}),(0,G.jsx)(A9,{open:h,onOpenChange:g,children:(0,G.jsxs)(j9,{className:`max-w-sm`,children:[(0,G.jsx)(M9,{children:(0,G.jsx)(P9,{children:`添加别名`})}),(0,G.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`别名`}),(0,G.jsx)(hb,{value:_,onChange:e=>v(e.target.value),placeholder:`e.g. likes`,maxLength:50})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`目标分类`}),(0,G.jsxs)(`select`,{className:`w-full h-9 rounded-md border border-input bg-background px-3 text-sm`,value:b,onChange:e=>x(e.target.value),children:[(0,G.jsx)(`option`,{value:``,children:`选择分类...`}),e.map(e=>(0,G.jsxs)(`option`,{value:e.name,children:[e.display_name,` (`,e.name,`)`]},e.name))]})]})]}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>g(!1),children:`取消`}),(0,G.jsx)(q,{onClick:async()=>{if(!_.trim()||!b.trim()){ir.error(`别名和目标分类为必填项`);return}try{await Q9.createAlias(_,b),ir.success(`别名已创建`),g(!1),v(``),x(``),T()}catch(e){let n=e instanceof Error?e.message:`创建别名失败`;ir.error(n)}},children:`创建`})]})]})}),(0,G.jsx)(pJ,{open:!!S,onOpenChange:()=>C(null),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除别名`}),(0,G.jsxs)(vJ,{children:[`确定要删除别名 "`,S,`" 吗?`]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{children:`取消`}),(0,G.jsx)(yJ,{onClick:async()=>{if(S)try{await Q9.deleteAlias(S),ir.success(`别名已删除`),C(null),T()}catch{ir.error(`删除别名失败`)}},children:`删除`})]})]})})]})}function _he(){let e=et();return(0,G.jsx)(`div`,{className:`flex h-screen w-full flex-col items-center justify-center bg-background text-foreground`,children:(0,G.jsxs)(`div`,{className:`text-center space-y-6`,children:[(0,G.jsx)(`div`,{className:`text-8xl font-bold text-muted-foreground/30`,children:`404`}),(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`页面不存在`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground max-w-sm`,children:`您访问的页面可能已经删除、移动,或者从未存在过。`}),(0,G.jsxs)(`div`,{className:`flex items-center justify-center gap-3`,children:[(0,G.jsxs)(q,{variant:`outline`,onClick:()=>e(-1),children:[(0,G.jsx)(Vp,{className:`h-4 w-4 mr-2`}),`返回上一页`]}),(0,G.jsxs)(q,{onClick:()=>e(`/dashboard`),children:[(0,G.jsx)(hm,{className:`h-4 w-4 mr-2`}),`返回首页`]})]})]})})}var vhe=class extends y.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,n){console.error(`ErrorBoundary caught an error:`,e,n)}handleRefresh=()=>{window.location.reload()};handleGoHome=()=>{window.location.href=`/`};render(){return this.state.hasError?(0,G.jsx)(`div`,{className:`flex h-screen w-full flex-col items-center justify-center bg-background text-foreground`,children:(0,G.jsxs)(`div`,{className:`text-center space-y-6 max-w-md px-4`,children:[(0,G.jsx)(`div`,{className:`text-6xl font-bold text-destructive/30`,children:`⚠️`}),(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`出错了`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`应用遇到了意外错误。请尝试刷新页面,或返回首页。`}),this.state.error&&(0,G.jsx)(`div`,{className:`rounded-lg bg-muted p-4 text-left`,children:(0,G.jsx)(`p`,{className:`text-xs font-mono text-muted-foreground break-all`,children:this.state.error.message})}),(0,G.jsxs)(`div`,{className:`flex items-center justify-center gap-3`,children:[(0,G.jsxs)(q,{variant:`outline`,onClick:this.handleRefresh,children:[(0,G.jsx)(Pm,{className:`h-4 w-4 mr-2`}),`刷新页面`]}),(0,G.jsxs)(q,{onClick:this.handleGoHome,children:[(0,G.jsx)(hm,{className:`h-4 w-4 mr-2`}),`返回首页`]})]})]})}):this.props.children}};function yhe({children:e}){let n=dh(e=>e.isAuthenticated),r=typeof window<`u`&&window.localStorage.getItem(`e2e_bypass_auth`)===`true`;return n||r?e:(0,G.jsx)(Ot,{to:`/login`,replace:!0})}function bhe(){return(0,G.jsx)(vhe,{children:(0,G.jsxs)(Mt,{children:[(0,G.jsx)(At,{path:`/login`,element:(0,G.jsx)(_b,{})}),(0,G.jsxs)(At,{path:`/*`,element:(0,G.jsx)(yhe,{children:(0,G.jsx)(Ree,{})}),children:[(0,G.jsx)(At,{index:!0,element:(0,G.jsx)(Ot,{to:`/dashboard`,replace:!0})}),(0,G.jsx)(At,{path:`dashboard`,element:(0,G.jsx)(fJ,{})}),(0,G.jsx)(At,{path:`memories`,element:(0,G.jsx)(RJ,{})}),(0,G.jsx)(At,{path:`memories/:id`,element:(0,G.jsx)(pme,{})}),(0,G.jsx)(At,{path:`memories/new`,element:(0,G.jsx)(E9,{})}),(0,G.jsx)(At,{path:`memories/:id/edit`,element:(0,G.jsx)(E9,{})}),(0,G.jsx)(At,{path:`memories/:id/edit-insight`,element:(0,G.jsx)(vme,{})}),(0,G.jsx)(At,{path:`vault`,element:(0,G.jsx)(xme,{})}),(0,G.jsx)(At,{path:`spaces`,element:(0,G.jsx)(Lme,{})}),(0,G.jsx)(At,{path:`sessions`,element:(0,G.jsx)(Cme,{})}),(0,G.jsx)(At,{path:`sessions/:id`,element:(0,G.jsx)(Nme,{})}),(0,G.jsx)(At,{path:`analytics`,element:(0,G.jsx)(Rme,{})}),(0,G.jsx)(At,{path:`tier-history`,element:(0,G.jsx)(Bme,{})}),(0,G.jsx)(At,{path:`lifecycle`,element:(0,G.jsx)(Yme,{})}),(0,G.jsx)(At,{path:`import`,element:(0,G.jsx)(V9,{})}),(0,G.jsx)(At,{path:`profile`,element:(0,G.jsx)(ohe,{})}),(0,G.jsx)(At,{path:`settings`,element:(0,G.jsx)(Xme,{})}),(0,G.jsx)(At,{path:`categories`,element:(0,G.jsx)(ghe,{})}),(0,G.jsx)(At,{path:`*`,element:(0,G.jsx)(_he,{})})]})]})})}(0,x.createRoot)(document.getElementById(`root`)).render((0,G.jsx)(y.StrictMode,{children:(0,G.jsx)(Sn,{children:(0,G.jsx)(Sr,{defaultTheme:`dark`,storageKey:`omem-theme`,children:(0,G.jsxs)(Dp,{children:[(0,G.jsx)(jp,{children:(0,G.jsx)(bhe,{})}),(0,G.jsx)(yr,{position:`top-right`,richColors:!0,closeButton:!0})]})})})}));
|
|
164
|
+
- `).trim()}function Tme(e){return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function Eme(e){return e?e.length<=16?e:e.slice(0,8)+`...`+e.slice(-8):`—`}function Dme(e,n=80){return e?e.length<=n?e:e.slice(0,n)+`...`:`—`}function Ome({type:e}){return e===`auto`?(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-xs bg-blue-100 text-blue-700 hover:bg-blue-100 border-blue-200`,children:[(0,G.jsx)(eh,{className:`size-3 mr-1`}),`自动注入`]}):(0,G.jsxs)(CJ,{variant:`outline`,className:`text-xs bg-emerald-50 text-emerald-700 hover:bg-emerald-50 border-emerald-200`,children:[(0,G.jsx)(jm,{className:`size-3 mr-1`}),`手动注入`]})}function kme({category:e}){return(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs font-normal ${AJ(e)}`,children:e||`未分类`})}function k9({label:e,value:n,max:r=1}){let i=Math.max(0,Math.min(n,r))/r*100;return(0,G.jsxs)(`div`,{className:`space-y-1`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between text-xs`,children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:e}),(0,G.jsx)(`span`,{className:`font-medium`,children:n===0?`—`:`${i.toFixed(1)}%`})]}),(0,G.jsx)(`div`,{className:`h-1.5 w-full rounded-full bg-muted overflow-hidden`,children:(0,G.jsx)(`div`,{className:`h-full rounded-full bg-primary transition-all`,style:{width:`${i}%`}})})]})}function Ame({relevance:e,isKept:n}){return n?e?e===`high`?(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-emerald-500/10 text-emerald-600 border-emerald-500/30`,children:`🟢 高相关`}):e===`medium`?(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-yellow-500/10 text-yellow-600 border-yellow-500/30`,children:`🟡 中相关`}):(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-muted text-muted-foreground border-border`,children:e||`—`}):(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-blue-500/10 text-blue-600 border-blue-500/30`,children:`🔵 保留`}):(0,G.jsx)(CJ,{variant:`outline`,className:`text-xs bg-red-500/10 text-red-600 border-red-500/30`,children:`🔴 被精炼掉`})}function jme({item:e,memory:n,memoryLoading:r,vaultUnlocked:i,memoryUnlocked:a,onUnlock:o,onLock:s,onVaultUnlock:c}){let l=!!e.refine_relevance,[u,d]=(0,y.useState)(`raw`),[f,p]=(0,y.useState)(!1),[m,h]=(0,y.useState)(``),[g,_]=(0,y.useState)(null),v=ob(e=>e.unlock),b=ob(e=>e.isUnlocked),x=n?.visibility===`private`||(n?.tags||[]).some(e=>e===`私密`||e.toLowerCase()===`private`),S=x&&!a,C=async()=>{n&&(S?i||b?o?.(n.id):p(!0):(s?.(n.id),p(!1)))},w=async()=>{if(!m.trim()){_(`请输入密码`);return}await v(m)?(p(!1),h(``),_(null),c?.(),n&&o?.(n.id)):_(`密码错误`)};return(0,G.jsxs)(`div`,{className:`rounded-md border bg-muted/50 p-3 space-y-3 ${e.is_kept?`border-border`:`border-dashed border-red-500/30 opacity-75`}`,children:[(0,G.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,G.jsx)(Ame,{relevance:e.refine_relevance,isKept:e.is_kept}),(0,G.jsx)(kme,{category:n?.category}),x&&(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-xs bg-amber-100 text-amber-700 hover:bg-amber-100 border-amber-200`,children:[(0,G.jsx)(Em,{className:`size-3 mr-1`}),`私密`]}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground font-mono`,children:[e.memory_id?.slice(0,8),`...`]})]}),x&&(0,G.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),C()},className:`text-xs text-amber-500 hover:text-amber-600 flex items-center gap-1 shrink-0`,children:[S?(0,G.jsx)(Em,{className:`size-3`}):(0,G.jsx)(Tm,{className:`size-3`}),S?`解锁`:`锁定`]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1 border-b border-border pb-1`,children:[(0,G.jsx)(`button`,{type:`button`,onClick:()=>l&&d(`refine`),className:`text-xs px-2 py-1 rounded transition-colors ${l?u===`refine`?`bg-primary/10 text-primary font-medium`:`text-muted-foreground hover:text-foreground`:`text-muted-foreground/40 cursor-not-allowed`}`,children:`精炼`}),(0,G.jsx)(`button`,{type:`button`,onClick:()=>d(`raw`),className:`text-xs px-2 py-1 rounded transition-colors ${u===`raw`?`bg-primary/10 text-primary font-medium`:`text-muted-foreground hover:text-foreground`}`,children:`原始`})]}),u===`refine`?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[e.refine_reasoning?(0,G.jsxs)(`div`,{className:`text-sm text-foreground`,children:[(0,G.jsx)(`span`,{className:`font-medium`,children:`推理说明:`}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:e.refine_reasoning})]}):(0,G.jsx)(`div`,{className:`text-sm text-muted-foreground italic`,children:`未经精炼 · 自动保留`}),(0,G.jsx)(k9,{label:`相似度得分`,value:e.score,max:1})]}):(0,G.jsx)(`div`,{className:`space-y-2`,children:r?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(Cb,{className:`h-4 w-3/4`}),(0,G.jsx)(Cb,{className:`h-4 w-1/2`})]}):n?(0,G.jsx)(G.Fragment,{children:S?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,G.jsx)(Em,{className:`size-4`}),(0,G.jsx)(`span`,{children:`私密记忆内容已隐藏`})]}),f&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{type:`password`,placeholder:`输入 Vault 密码...`,value:m,onChange:e=>{h(e.target.value),_(null)},onKeyDown:e=>e.key===`Enter`&&w(),className:g?`border-destructive flex-1`:`flex-1`}),(0,G.jsx)(q,{size:`sm`,onClick:w,children:`解锁`})]}),g&&(0,G.jsx)(`p`,{className:`text-xs text-destructive`,children:g})]})]}):(0,G.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:wme(n.content||n.l0_abstract||`—`)})})}):(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`记忆内容加载失败`})})]})}function Mme({event:e,initialItems:n,isLast:r,defaultExpanded:i,vaultUnlocked:a,unlockedMemories:o,manuallyLocked:s,onUnlock:c,onLock:l,onVaultUnlock:u}){let[d,f]=(0,y.useState)(i||!1),[p,m]=(0,y.useState)(!0),[h,g]=(0,y.useState)(n??null),[_,v]=(0,y.useState)(new Map),[b,x]=(0,y.useState)(new Set);(0,y.useEffect)(()=>{n&&h===null&&g(n)},[n,h]);let S=(0,y.useCallback)(async e=>{try{x(n=>new Set(n).add(e));let n=await ib.get(`/v1/memories/${e}`);v(r=>{let i=new Map(r);return i.set(e,n),i})}catch(e){console.error(`Failed to fetch memory:`,e)}finally{x(n=>{let r=new Set(n);return r.delete(e),r})}},[]),C=(0,y.useRef)(new Set);(0,y.useEffect)(()=>{!d||!h||h.length===0||h.forEach(e=>{C.current.has(e.memory_id)||(C.current.add(e.memory_id),S(e.memory_id))})},[d,h,S]);let w=e=>a&&!s.has(e)||o.has(e);return(0,G.jsxs)(`div`,{className:`flex gap-4`,children:[(0,G.jsxs)(`div`,{className:`flex flex-col items-center`,children:[(0,G.jsx)(`div`,{className:`w-2.5 h-2.5 rounded-full bg-primary ring-4 ring-primary/20`}),!r&&(0,G.jsx)(`div`,{className:`w-px flex-1 bg-border mt-1`})]}),(0,G.jsx)(`div`,{className:`flex-1 pb-6`,children:(0,G.jsxs)(`div`,{className:`rounded-lg border border-border bg-card transition-colors hover:bg-muted/50`,children:[(0,G.jsxs)(`button`,{type:`button`,onClick:()=>f(!d),className:`w-full text-left p-4 cursor-pointer`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,G.jsx)(Ome,{type:e.recall_type}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(nm,{className:`size-3`}),Tme(e.created_at)]})]}),d?(0,G.jsx)(em,{className:`size-4 text-muted-foreground`}):(0,G.jsx)(Zp,{className:`size-4 text-muted-foreground`})]}),(0,G.jsxs)(`div`,{className:`mt-2 text-sm text-muted-foreground flex items-center gap-1.5`,children:[(0,G.jsx)(Lm,{className:`size-3.5`}),(0,G.jsx)(`span`,{className:`line-clamp-1`,title:e.query_text||`—`,children:Dme(e.query_text)})]})]}),d&&(0,G.jsxs)(`div`,{className:`px-4 pb-4 space-y-4 border-t border-border pt-4`,children:[e.profile_content&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`h4`,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(Kp,{className:`size-3`}),`画像注入内容`]}),(0,G.jsx)(`div`,{className:`rounded-md border border-indigo-500/20 bg-indigo-500/5 p-3`,children:(0,G.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none text-sm text-indigo-700 dark:text-indigo-300`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:e.profile_content.replace(/<\/?cerebro-profile>/g,``).trim()})})})]}),e.injected_content&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`button`,{type:`button`,onClick:()=>m(!p),className:`flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors cursor-pointer`,children:[(0,G.jsx)(tee,{className:`size-3`}),`注入内容`,p?(0,G.jsx)(em,{className:`size-3`}):(0,G.jsx)(Zp,{className:`size-3`})]}),p&&(0,G.jsx)(`div`,{className:`rounded-md border border-emerald-500/20 bg-emerald-500/5 p-3 max-h-96 overflow-y-auto`,children:(0,G.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none text-sm text-emerald-700 dark:text-emerald-300`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:e.injected_content.replace(/<\/?cerebro-context>/g,``).trim()})})})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,G.jsxs)(`h4`,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(Kp,{className:`size-3`}),`关联记忆`]})}),h&&h.length>0?(0,G.jsx)(`div`,{className:`space-y-3`,children:h.map(e=>(0,G.jsx)(jme,{item:e,memory:_.get(e.memory_id)||null,memoryLoading:b.has(e.memory_id),vaultUnlocked:a,memoryUnlocked:w(e.memory_id),onUnlock:c,onLock:l,onVaultUnlock:u},e.id))}):(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`暂无召回项`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`h4`,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1`,children:[(0,G.jsx)(Yp,{className:`size-3`}),`匹配指标`]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,G.jsx)(k9,{label:`最大相似度`,value:e.max_score}),(0,G.jsx)(k9,{label:`LLM 置信度`,value:e.llm_confidence})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground flex-wrap`,children:[(0,G.jsx)(`span`,{className:`font-medium text-foreground`,children:`统计:`}),(0,G.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400`,children:[`保留 `,e.kept_count,` 条`]}),e.discarded_count>0&&(0,G.jsxs)(`span`,{className:`text-red-600 dark:text-red-400`,children:[`精炼掉 `,e.discarded_count,` 条`]}),e.injected_count!=null&&e.injected_count>0&&(0,G.jsxs)(`span`,{className:`text-blue-600 dark:text-blue-400`,children:[`实际注入 `,e.injected_count,` 条`]}),e.profile_injected&&(0,G.jsx)(`span`,{className:`text-indigo-600 dark:text-indigo-400`,children:`👤 画像已注入`})]})]})]})})]})}function Nme(){let{id:e}=it(),n=et(),r=Ze(),i=()=>{let e=r.state;e?.from?n(e.from,{replace:!0}):n(-1)},a=e?decodeURIComponent(e):``,[o,s]=(0,y.useState)([]),[c,l]=(0,y.useState)(new Map),[u,d]=(0,y.useState)(!0),[f,p]=(0,y.useState)(null),[m,h]=(0,y.useState)(1),[g,_]=(0,y.useState)(!1),[v,b]=(0,y.useState)(!1),[x,S]=(0,y.useState)(``),[C,w]=(0,y.useState)(null),T=ob(e=>e.unlock),E=ob(e=>e.lock),[D,O]=(0,y.useState)(!1),[k,A]=(0,y.useState)(new Set),[j,M]=(0,y.useState)(new Set),[N,P]=(0,y.useState)(null),F=Math.ceil(o.length/10),I=o.slice((m-1)*10,m*10);(0,y.useEffect)(()=>{if(!a)return;async function e(){try{d(!0),p(null);let e=await ib.get(`/v1/recall-events`,{params:{session_id:a,limit:1e4,offset:0,expand:`items`}});if(s((e?.events||[]).sort((e,n)=>new Date(n.created_at).getTime()-new Date(e.created_at).getTime())),e?.event_items){let n=new Map;e.event_items.forEach(e=>n.set(e.id,e.items||[])),l(n)}}catch(e){console.error(`Failed to fetch session detail:`,e),p(`加载 Session 详情失败`),ir.error(`加载 Session 详情失败`)}finally{d(!1)}}e()},[a]);let L=()=>{_(!0)},R=async()=>{try{await ib.delete(`/v1/session-recalls/session/${a}`),ir.success(`Session 记录已删除`),n(-1)}catch(e){console.error(`Failed to delete session records:`,e),ir.error(`删除失败`)}finally{_(!1)}},z=async()=>{if(!x.trim()){w(`请输入密码`);return}if(!await T(x)){w(`密码错误`);return}O(!0),N&&(A(e=>new Set(e).add(N)),P(null)),w(null),b(!1),S(``)},ee=()=>{O(!1),A(new Set),M(new Set),E()},B=e=>{k.has(e)||D&&!j.has(e)?(M(n=>new Set(n).add(e)),A(n=>{let r=new Set(n);return r.delete(e),r})):D?M(n=>{let r=new Set(n);return r.delete(e),r}):(P(e),b(!0))},V={total:o.length,auto:o.filter(e=>e.recall_type===`auto`).length,manual:o.filter(e=>e.recall_type===`manual`).length,totalKept:o.reduce((e,n)=>e+n.kept_count,0),totalDiscarded:o.reduce((e,n)=>e+n.discarded_count,0)};return u?(0,G.jsxs)(`div`,{className:`space-y-6 max-w-3xl`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Cb,{className:`h-8 w-8`}),(0,G.jsx)(Cb,{className:`h-6 w-32`})]}),(0,G.jsx)(Cb,{className:`h-4 w-1/2`}),(0,G.jsx)(`div`,{className:`space-y-4`,children:[1,2,3].map(e=>(0,G.jsxs)(`div`,{className:`flex gap-4`,children:[(0,G.jsx)(Cb,{className:`h-3 w-3 rounded-full`}),(0,G.jsx)(`div`,{className:`flex-1 space-y-2`,children:(0,G.jsx)(Cb,{className:`h-20 w-full`})})]},e))})]}):f?(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,onClick:()=>i(),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回`]}),(0,G.jsx)(`div`,{className:`rounded-lg border border-destructive/50 bg-destructive/10 p-6 text-sm text-destructive`,children:f})]}):(0,G.jsxs)(`div`,{className:`space-y-6 max-w-3xl`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,G.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,onClick:()=>i(),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回`]})})}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:[`Session 详情 - `,Eme(a)]}),(0,G.jsx)(`div`,{className:`flex items-center gap-3 text-sm text-muted-foreground flex-wrap`,children:(0,G.jsx)(`code`,{className:`font-mono text-xs bg-muted px-1.5 py-0.5 rounded`,children:a})})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-3 gap-4`,children:[(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`pt-4 text-center`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-semibold`,children:V.total}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`总召回事件`})]})}),(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`pt-4 text-center`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-semibold`,children:V.auto}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`自动注入`})]})}),(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`pt-4 text-center`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-semibold`,children:V.manual}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`手动注入`})]})})]}),V.totalKept>0&&(0,G.jsxs)(`div`,{className:`flex items-center gap-4 text-sm`,children:[(0,G.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 font-medium`,children:[`共保留 `,V.totalKept,` 条记忆`]}),V.totalDiscarded>0&&(0,G.jsxs)(`span`,{className:`text-red-600 dark:text-red-400 font-medium`,children:[`共精炼掉 `,V.totalDiscarded,` 条记忆`]})]}),(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-2`,children:[(0,G.jsx)(`h2`,{className:`text-sm font-medium text-muted-foreground`,children:`召回事件时间线`}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`共 `,o.length,` 个事件`]}),F>1&&(0,G.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`h-6 w-6`,onClick:()=>h(e=>Math.max(1,e-1)),disabled:m===1,children:(0,G.jsx)(Qp,{className:`size-3`})}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground min-w-[3ch] text-center`,children:[m,`/`,F]}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`h-6 w-6`,onClick:()=>h(e=>Math.min(F,e+1)),disabled:m===F,children:(0,G.jsx)($p,{className:`size-3`})})]}),D?(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:ee,children:[(0,G.jsx)(Em,{className:`size-3.5 mr-1`}),`锁定 Vault`]}):(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>b(!v),children:[(0,G.jsx)(Tm,{className:`size-3.5 mr-1`}),`解锁 Vault`]})]})]}),v&&(0,G.jsxs)(`div`,{className:`space-y-2 max-w-md`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{type:`password`,placeholder:`输入 Vault 密码...`,value:x,onChange:e=>{S(e.target.value),w(null)},onKeyDown:e=>e.key===`Enter`&&z(),className:C?`border-destructive flex-1`:`flex-1`}),(0,G.jsx)(q,{size:`sm`,onClick:z,children:`解锁`})]}),C&&(0,G.jsx)(`p`,{className:`text-xs text-destructive`,children:C})]}),o.length===0?(0,G.jsx)(`div`,{className:`rounded-lg border border-border bg-card p-8 text-center text-sm text-muted-foreground`,children:`暂无召回事件`}):(0,G.jsxs)(G.Fragment,{children:[I.map((e,n)=>(0,G.jsx)(Mme,{event:e,initialItems:c.get(e.id),isLast:n===I.length-1&&m===F,defaultExpanded:n===0&&m===1,vaultUnlocked:D,unlockedMemories:k,manuallyLocked:j,onUnlock:B,onLock:B,onVaultUnlock:()=>O(!0)},e.id)),F>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between gap-2 pt-4`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`共 `,o.length,` 个事件`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(q,{variant:`outline`,size:`sm`,onClick:()=>h(e=>Math.max(1,e-1)),disabled:m===1,children:(0,G.jsx)(Qp,{className:`size-4`})}),(0,G.jsxs)(`span`,{className:`text-sm text-muted-foreground`,children:[m,` / `,F]}),(0,G.jsx)(q,{variant:`outline`,size:`sm`,onClick:()=>h(e=>Math.min(F,e+1)),disabled:m===F,children:(0,G.jsx)($p,{className:`size-4`})})]})]})]})]}),o.length>0&&(0,G.jsx)(`div`,{className:`pt-4 border-t border-border`,children:(0,G.jsxs)(q,{variant:`outline`,size:`sm`,className:`text-destructive hover:bg-destructive/10 hover:text-destructive`,onClick:L,children:[(0,G.jsx)(Km,{className:`size-3.5 mr-1`}),`删除 Session 所有记录`]})}),(0,G.jsx)(pJ,{open:g,onOpenChange:e=>!e&&_(!1),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除 Session 记录`}),(0,G.jsx)(vJ,{children:`此操作将删除该 Session 的所有召回记录,不可撤销。确定要继续吗?`})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>_(!1),children:`取消`}),(0,G.jsx)(yJ,{onClick:R,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`删除`})]})]})})]})}function A9({...e}){return(0,G.jsx)(hg,{"data-slot":`dialog`,...e})}function Pme({...e}){return(0,G.jsx)(_g,{"data-slot":`dialog-trigger`,...e})}function Fme({...e}){return(0,G.jsx)(Zh,{"data-slot":`dialog-portal`,...e})}function Ime({className:e,...n}){return(0,G.jsx)(Eh,{"data-slot":`dialog-overlay`,className:Tp(`fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0`,e),...n})}function j9({className:e,children:n,showCloseButton:r=!0,...i}){return(0,G.jsxs)(Fme,{children:[(0,G.jsx)(Ime,{}),(0,G.jsxs)(Yh,{"data-slot":`dialog-content`,className:Tp(`fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,e),...i,children:[n,r&&(0,G.jsxs)(Dh,{"data-slot":`dialog-close`,render:(0,G.jsx)(q,{variant:`ghost`,className:`absolute top-2 right-2`,size:`icon-sm`}),children:[(0,G.jsx)($m,{}),(0,G.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function M9({className:e,...n}){return(0,G.jsx)(`div`,{"data-slot":`dialog-header`,className:Tp(`flex flex-col gap-2`,e),...n})}function N9({className:e,showCloseButton:n=!1,children:r,...i}){return(0,G.jsxs)(`div`,{"data-slot":`dialog-footer`,className:Tp(`-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end`,e),...i,children:[r,n&&(0,G.jsx)(Dh,{render:(0,G.jsx)(q,{variant:`outline`}),children:`Close`})]})}function P9({className:e,...n}){return(0,G.jsx)(gg,{"data-slot":`dialog-title`,className:Tp(`text-base leading-none font-medium`,e),...n})}function F9({className:e,...n}){return(0,G.jsx)(Oh,{"data-slot":`dialog-description`,className:Tp(`text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,e),...n})}function Lme(){let[e,n]=(0,y.useState)([]),[r,i]=(0,y.useState)(!0),[a,o]=(0,y.useState)(!1),[s,c]=(0,y.useState)(``),[l,u]=(0,y.useState)(`team`),[d,f]=(0,y.useState)(null),[p,m]=(0,y.useState)(null),[h,g]=(0,y.useState)(``),[_,v]=(0,y.useState)(`member`),[b,x]=(0,y.useState)(!1),[S,C]=(0,y.useState)({}),[w,T]=(0,y.useState)(!1),[E,D]=(0,y.useState)(!1),[O,k]=(0,y.useState)(``),[A,j]=(0,y.useState)(`member`),[M,N]=(0,y.useState)(!1),[P,F]=(0,y.useState)(null),[I,L]=(0,y.useState)(!1),R=dh(e=>e.currentUserId),z=dh(e=>e.users.find(e=>e.id===R)),ee=e.find(e=>e.id===p),B=e=>z?e.owner_id===z.apiKey||e.members.some(e=>e.user_id===z.apiKey&&(e.role===`admin`||e.role===`Admin`)):!1;(0,y.useEffect)(()=>{async function e(){if(!ee?.members?.length)return;T(!0);let e={};await Promise.all(ee.members.map(async n=>{try{let r=await ib.get(`/v1/tenants/${encodeURIComponent(n.user_id)}`);r&&(e[n.user_id]={name:r.name,created_at:r.created_at})}catch{}})),C(e),T(!1)}p&&e()},[p,ee?.members]),(0,y.useEffect)(()=>{async function e(){try{i(!0),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to fetch spaces:`,e),ir.error(`加载空间列表失败`)}finally{i(!1)}}e()},[]);async function V(){if(!s.trim()){ir.error(`请输入空间名称`);return}try{await ib.post(`/v1/spaces`,{name:s.trim(),space_type:l}),ir.success(`空间创建成功`),o(!1),c(``),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to create space:`,e),ir.error(`空间创建失败`)}}async function H(){if(!d)return;let r=e.find(e=>e.id===d)?.members.map(e=>e.user_id).filter(e=>e!==z?.apiKey)||[];try{await ib.delete(`/v1/spaces/${encodeURIComponent(d)}`),ir.success(`空间已删除`),n(e=>e.filter(e=>e.id!==d)),dh.getState().removeUsersByApiKeys(r)}catch(e){console.error(`Failed to delete space:`,e),ir.error(`空间删除失败`)}finally{f(null)}}async function U(){if(p){N(!0);try{let e=await ib.post(`/v1/tenants`,{name:O.trim()||void 0}),r=e.id,i=e.api_key;await ib.post(`/v1/spaces/${encodeURIComponent(p)}/members`,{user_id:r,role:A}),F(i),ir.success(`新用户创建并加入空间成功`),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to create user:`,e);let n=e.response?.data?.error||e.message||``;ir.error(`创建用户失败:${n||`请稍后重试`}`)}finally{N(!1)}}}async function te(e){if(p)try{await ib.delete(`/v1/spaces/${encodeURIComponent(p)}/members/${encodeURIComponent(e)}`),ir.success(`成员已移除`),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to remove member:`,e);let n=e.response?.data?.error||e.message||``;ir.error(`移除成员失败:${n||`请稍后重试`}`)}}async function W(){if(!p||!h.trim()){ir.error(`请输入用户ID`);return}let e=h.trim();if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)){ir.error(`用户ID格式不正确,请输入有效的 UUID(如:c60beb98-7aab-4985-8c1d-29ffd6aff75a)`);return}x(!0);try{await ib.post(`/v1/spaces/${encodeURIComponent(p)}/members`,{user_id:e,role:_}),ir.success(`成员添加成功`),g(``),n(await ib.get(`/v1/spaces`)||[])}catch(e){console.error(`Failed to add member:`,e);let n=e.response?.data?.error||e.message||``;n.includes(`not found`)||n.includes(`不存在`)?ir.error(`该用户不存在,请确认用户ID正确`):n.includes(`permission`)||n.includes(`权限`)?ir.error(`您没有权限添加成员`):ir.error(`添加成员失败:${n||`请检查用户ID是否正确`}`)}finally{x(!1)}}return r?(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`空间管理`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理您的记忆空间`})]}),(0,G.jsx)(Cb,{className:`h-9 w-24`})]}),(0,G.jsx)(`div`,{className:`grid gap-4`,children:[1,2].map(e=>(0,G.jsx)(Cb,{className:`h-32 w-full`},e))})]}):(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`空间管理`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理您的记忆空间`})]}),(0,G.jsxs)(A9,{open:a,onOpenChange:o,children:[(0,G.jsx)(Pme,{render:(0,G.jsxs)(q,{size:`sm`,children:[(0,G.jsx)(Nm,{className:`size-4 mr-1.5`}),`新建空间`]})}),(0,G.jsxs)(j9,{children:[(0,G.jsx)(M9,{children:(0,G.jsx)(P9,{children:`新建空间`})}),(0,G.jsxs)(`div`,{className:`space-y-4 pt-2`,children:[(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`空间名称`}),(0,G.jsx)(hb,{placeholder:`输入空间名称`,value:s,onChange:e=>c(e.target.value)})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`空间类型`}),(0,G.jsxs)(_9,{value:l,onValueChange:e=>u(e||`team`),children:[(0,G.jsx)(y9,{children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`team`,children:`团队`}),(0,G.jsx)(x9,{value:`personal`,children:`个人`}),(0,G.jsx)(x9,{value:`shared`,children:`共享`})]})]})]}),(0,G.jsx)(q,{className:`w-full`,onClick:V,children:`创建`})]})]})]})]}),e.length===0?(0,G.jsxs)(`div`,{className:`text-center py-12 text-muted-foreground border border-dashed border-border rounded-lg`,children:[(0,G.jsx)(`p`,{children:`暂无空间`}),(0,G.jsx)(`p`,{className:`text-sm mt-1`,children:`点击右上角按钮创建新空间`})]}):(0,G.jsx)(`div`,{className:`grid gap-4`,children:e.map(e=>(0,G.jsxs)(vb,{className:`group transition-colors hover:bg-accent/50`,children:[(0,G.jsx)(yb,{className:`pb-3`,children:(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`h3`,{className:`text-lg font-semibold`,children:e.name}),(0,G.jsx)(CJ,{variant:`outline`,children:e.space_type})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground`,children:[(0,G.jsx)(zm,{className:`size-3`}),e.members.length,` 成员`]}),(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,className:`h-7 opacity-0 group-hover:opacity-100 transition-opacity`,onClick:()=>{m(e.id),g(``),v(`member`)},children:[(0,G.jsx)(Xm,{className:`size-3.5 mr-1`}),`管理成员`]}),e.space_type!==`personal`&&B(e)&&(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 opacity-0 group-hover:opacity-100 transition-opacity`,onClick:()=>f(e.id),children:(0,G.jsx)(Km,{className:`size-3.5 text-destructive`})})]})]})}),(0,G.jsxs)(Sb,{className:`pt-0 space-y-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-4 text-sm text-muted-foreground flex-wrap`,children:[(0,G.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(Qm,{className:`size-3.5`}),e.members.map(e=>e.role).join(`, `)]}),(0,G.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(Jp,{className:`size-3.5`}),new Date(e.created_at).toLocaleDateString(`zh-CN`)]})]}),(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground font-mono`,children:[`ID: `,e.id]})]})]},e.id))}),(0,G.jsx)(pJ,{open:!!d,onOpenChange:e=>!e&&f(null),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除空间`}),(0,G.jsx)(vJ,{children:`此操作不可撤销。空间内的数据不会被删除,但空间配置将被移除。`})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>f(null),children:`取消`}),(0,G.jsx)(yJ,{onClick:H,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`删除`})]})]})}),(0,G.jsx)(A9,{open:!!p,onOpenChange:e=>!e&&m(null),children:(0,G.jsxs)(j9,{style:{width:680,maxWidth:`95vw`},children:[(0,G.jsx)(M9,{children:(0,G.jsxs)(P9,{children:[`管理成员 - `,ee?.name]})}),(0,G.jsxs)(`div`,{className:`space-y-4 pt-2`,children:[(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`当前成员`}),w&&(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`加载用户信息中...`}),(0,G.jsxs)(`div`,{className:`space-y-1`,children:[ee?.members.map(e=>{let n=S[e.user_id];return(0,G.jsxs)(`div`,{className:`grid grid-cols-[auto_1fr_80px_60px] items-center gap-3 text-sm border rounded-md px-3 py-2`,children:[(0,G.jsx)(Zm,{className:`size-3.5 text-muted-foreground`}),(0,G.jsxs)(`div`,{className:`min-w-0`,children:[(0,G.jsx)(`div`,{className:`font-mono text-xs truncate`,title:e.user_id,children:e.user_id}),n&&(0,G.jsxs)(`div`,{className:`text-xs text-muted-foreground truncate`,children:[n.name,` · `,new Date(n.created_at).toLocaleDateString(`zh-CN`)]})]}),(0,G.jsx)(CJ,{variant:`outline`,className:`justify-self-center`,children:e.role}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2 justify-self-end`,children:[(0,G.jsx)(`button`,{type:`button`,onClick:()=>{navigator.clipboard.writeText(e.user_id),ir.success(`API Key 已复制`)},className:`text-muted-foreground hover:text-foreground transition-colors`,title:`复制 API Key`,children:(0,G.jsx)(rm,{className:`size-3.5`})}),ee&&B(ee)&&e.user_id!==z?.apiKey&&e.user_id!==ee?.owner_id&&(0,G.jsx)(`button`,{type:`button`,onClick:()=>te(e.user_id),className:`text-muted-foreground hover:text-destructive transition-colors`,title:`移除成员`,children:(0,G.jsx)(Km,{className:`size-3.5`})})]})]},e.user_id)}),(!ee?.members||ee.members.length===0)&&(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`暂无成员`})]})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`添加成员`}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>{D(!0),F(null),k(``),j(`member`)},children:[(0,G.jsx)(ym,{className:`size-3.5 mr-1.5`}),`创建新用户`]})]}),E&&(0,G.jsxs)(`div`,{className:`rounded-lg border border-border bg-muted/30 p-3 space-y-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium`,children:`创建新用户`}),(0,G.jsx)(`button`,{type:`button`,onClick:()=>{D(!1),F(null)},className:`text-xs text-muted-foreground hover:text-foreground`,children:`取消`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{placeholder:`用户名(可选)`,value:O,onChange:e=>k(e.target.value),className:`flex-1`}),(0,G.jsxs)(_9,{value:A,onValueChange:e=>j(e||`member`),children:[(0,G.jsx)(y9,{className:`w-28`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`admin`,children:`管理员`}),(0,G.jsx)(x9,{value:`member`,children:`成员`}),(0,G.jsx)(x9,{value:`reader`,children:`只读`})]})]})]}),(0,G.jsx)(q,{size:`sm`,className:`w-full`,onClick:U,disabled:M,children:M?`生成中...`:`生成用户并添加到空间`}),P&&(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`新用户 API Key(请复制保存):`}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`code`,{className:`flex-1 text-xs bg-background border rounded px-2 py-1.5 font-mono truncate`,children:P}),(0,G.jsx)(q,{size:`sm`,variant:`outline`,onClick:()=>{navigator.clipboard.writeText(P),L(!0),setTimeout(()=>L(!1),2e3)},children:I?(0,G.jsx)(Xp,{className:`size-3.5`}):(0,G.jsx)(rm,{className:`size-3.5`})})]})]})]}),!E&&(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(hb,{placeholder:`输入对方 API Key(UUID格式)`,value:h,onChange:e=>g(e.target.value),className:`flex-1`}),(0,G.jsxs)(_9,{value:_,onValueChange:e=>v(e||`member`),children:[(0,G.jsx)(y9,{className:`w-28`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`admin`,children:`管理员`}),(0,G.jsx)(x9,{value:`member`,children:`成员`}),(0,G.jsx)(x9,{value:`reader`,children:`只读`})]})]}),(0,G.jsx)(q,{size:`sm`,onClick:W,disabled:b,children:b?`添加中...`:`添加`})]})]})]})]})})]})}var I9=[`#8b5cf6`,`#ec4899`,`#06b6d4`,`#f59e0b`,`#10b981`,`#ef4444`,`#6366f1`,`#f97316`];function L9(e,n){if(!e)return[];let r=Object.entries(e).map(([e,n])=>({name:e,value:n})).sort((e,n)=>n.value-e.value);return n?r.slice(0,n):r}function Rme(){let e=et(),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)([]),[o,s]=(0,y.useState)(!0);(0,y.useEffect)(()=>{async function e(){try{s(!0);let[e,n]=await Promise.all([ib.get(`/v1/stats`),ib.get(`/v1/memories`)]);r(e),a(n?.memories||[])}catch(e){ir.error(`加载统计数据失败: `+e.message)}finally{s(!1)}}e()},[]);let c=(0,y.useMemo)(()=>{if(!n?.timeline?.length)return 0;let e=new Date().toISOString().split(`T`)[0];return n.timeline.find(n=>n.date===e)?.count??0},[n]),l=(0,y.useMemo)(()=>L9(n?.by_category,8),[n]),u=(0,y.useMemo)(()=>L9(n?.by_type),[n]),d=(0,y.useMemo)(()=>L9(n?.by_tier),[n]),f=(0,y.useMemo)(()=>L9(n?.by_state),[n]),p=(0,y.useMemo)(()=>!n||!n.total||!n.total_access_count?`0%`:`${Math.min(100,Math.round(n.total_access_count/Math.max(1,n.total)*100))}%`,[n]),m=(0,y.useMemo)(()=>{let e=[];for(let n of i)if(n.tier_history)try{let r=JSON.parse(n.tier_history);for(let i of r)e.push({memoryId:n.id,...i})}catch{}return e.sort((e,n)=>n.at.localeCompare(e.at)),e.slice(0,50)},[i]),h={access_via_get:`访问触发`,access_via_search:`搜索触发`,access_via_recall:`召回触发`,access_via_cross_space_search:`跨空间搜索触发`,scheduled_evaluation:`定时评估`};return o?(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(Cb,{className:`h-8 w-48`}),(0,G.jsx)(Cb,{className:`h-8 w-24`})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2 lg:grid-cols-4`,children:[(0,G.jsx)(Cb,{className:`h-24`}),(0,G.jsx)(Cb,{className:`h-24`}),(0,G.jsx)(Cb,{className:`h-24`}),(0,G.jsx)(Cb,{className:`h-24`})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,G.jsx)(Cb,{className:`h-80`}),(0,G.jsx)(Cb,{className:`h-80`}),(0,G.jsx)(Cb,{className:`h-80`}),(0,G.jsx)(Cb,{className:`h-80`})]})]}):(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight flex items-center gap-2`,children:[(0,G.jsx)(Yp,{className:`size-5`}),`统计分析`]}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`记忆库数据洞察与可视化`})]}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>e(`/memories`),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回记忆`]})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2 lg:grid-cols-4`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`总记忆数`}),(0,G.jsx)(qp,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.total??0})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`今日新增`}),(0,G.jsx)(qm,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:c})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`空间数`}),(0,G.jsx)(xm,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.total_spaces??Object.keys(n?.by_space??{}).length})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`活跃度`}),(0,G.jsx)(iee,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:p})})]})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`平均重要性`}),(0,G.jsx)(Hm,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.avg_importance?`${(n.avg_importance*100).toFixed(0)}%`:`—`})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`flex flex-row items-center justify-between pb-2`,children:[(0,G.jsx)(bb,{className:`text-sm font-medium text-muted-foreground`,children:`平均置信度`}),(0,G.jsx)(Yp,{className:`size-4 text-muted-foreground`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:n?.avg_confidence?`${(n.avg_confidence*100).toFixed(0)}%`:`—`})})]})]}),(0,G.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`分类分布`})}),(0,G.jsxs)(Sb,{children:[(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(iJ,{children:[(0,G.jsx)(OB,{data:l,cx:`50%`,cy:`50%`,innerRadius:60,outerRadius:100,paddingAngle:2,dataKey:`value`,children:l.map((e,n)=>(0,G.jsx)(sD,{fill:I9[n%I9.length]},`cell-${e.name}`))}),(0,G.jsx)(VE,{})]})}),(0,G.jsx)(`div`,{className:`flex flex-wrap gap-2 mt-4 justify-center`,children:l.map((e,n)=>(0,G.jsxs)(CJ,{variant:`secondary`,style:{backgroundColor:`${I9[n%I9.length]}20`,color:I9[n%I9.length]},children:[e.name,` (`,e.value,`)`]},e.name))})]})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`记忆类型分布`})}),(0,G.jsx)(Sb,{children:(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(rJ,{data:u,children:[(0,G.jsx)(eG,{strokeDasharray:`3 3`,stroke:`#333`}),(0,G.jsx)(mK,{dataKey:`name`,tick:{fontSize:12}}),(0,G.jsx)(jK,{tick:{fontSize:12}}),(0,G.jsx)(VE,{}),(0,G.jsx)(XV,{dataKey:`value`,fill:`#8b5cf6`,radius:[4,4,0,0]})]})})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`层级分布`})}),(0,G.jsx)(Sb,{children:(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(iJ,{children:[(0,G.jsx)(OB,{data:d,cx:`50%`,cy:`50%`,outerRadius:100,dataKey:`value`,label:({name:e,value:n})=>`${e}: ${n}`,children:d.map((e,n)=>(0,G.jsx)(sD,{fill:I9[n%I9.length]},`tier-${e.name}`))}),(0,G.jsx)(VE,{})]})})})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{children:(0,G.jsx)(bb,{className:`text-base`,children:`状态分布`})}),(0,G.jsx)(Sb,{children:(0,G.jsx)(oD,{width:`100%`,height:280,children:(0,G.jsxs)(rJ,{data:f,children:[(0,G.jsx)(eG,{strokeDasharray:`3 3`,stroke:`#333`}),(0,G.jsx)(mK,{dataKey:`name`,tick:{fontSize:12}}),(0,G.jsx)(jK,{tick:{fontSize:12}}),(0,G.jsx)(VE,{}),(0,G.jsx)(XV,{dataKey:`value`,fill:`#10b981`,radius:[4,4,0,0]})]})})})]})]}),(0,G.jsxs)(vb,{className:`mt-4`,children:[(0,G.jsx)(yb,{children:(0,G.jsxs)(bb,{className:`flex items-center gap-1.5 text-base`,children:[(0,G.jsx)(mm,{className:`size-4 text-muted-foreground`}),`Tier 变更日志`]})}),(0,G.jsx)(Sb,{children:m.length===0?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-4 text-center`,children:`暂无变更记录`}):(0,G.jsx)(`div`,{className:`space-y-1`,children:m.map(n=>{let r={peripheral:0,working:1,core:2};return(0,G.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 text-sm py-2 border-b last:border-b-0 hover:bg-muted/50 px-2 rounded cursor-pointer w-full text-left`,onClick:()=>e(`/memories/${n.memoryId}`),children:[(r[n.from]??0)<(r[n.to]??0)?(0,G.jsx)(Wp,{className:`size-4 text-emerald-500 shrink-0`}):(0,G.jsx)(Bp,{className:`size-4 text-red-500 shrink-0`}),(0,G.jsx)(`span`,{className:`text-muted-foreground text-xs w-36 shrink-0`,children:new Date(n.at).toLocaleString(`zh-CN`)}),(0,G.jsxs)(`span`,{className:`text-muted-foreground font-mono text-xs`,children:[n.memoryId.slice(0,8),`...`]}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(n.from),children:jJ(n.from)}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(n.to),children:jJ(n.to)}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground ml-auto`,children:[h[n.reason]||n.reason,` · #`,n.access_count]})]},n.memoryId+n.at)})})})]})]})}var zme={access_via_get:`访问触发`,access_via_search:`搜索触发`,access_via_recall:`召回触发`,access_via_cross_space_search:`跨空间搜索触发`,scheduled_evaluation:`定时评估`},R9=20;function Bme(){let e=et(),n=Ze(),[r,i]=(0,y.useState)([]),[a,o]=(0,y.useState)(!0),[s,c]=(0,y.useState)(1),[l,u]=(0,y.useState)(`all`),[d,f]=(0,y.useState)(``),[p,m]=(0,y.useState)(``),[h,g]=(0,y.useState)(null),[_,v]=(0,y.useState)(!1),[b,x]=(0,y.useState)(0);(0,y.useEffect)(()=>{n.state?.from===`tier-history`&&n.state?.page&&c(n.state.page)},[n.state]),(0,y.useEffect)(()=>{let e=setTimeout(()=>{m(d)},300);return()=>clearTimeout(e)},[d]);let S=(0,y.useCallback)(async e=>{o(!0);try{let n=(e-1)*R9,r={limit:String(R9),offset:String(n)};l===`promote`?r.filter=`promote`:l===`demote`&&(r.filter=`demote`),p.trim()&&(r.search=p.trim());let a=await ib.get(`/v1/tier-changes`,{params:r});i(a.changes),x(a.totalCount)}catch(e){console.error(`Failed to fetch tier history:`,e)}finally{o(!1)}},[l,p]);(0,y.useEffect)(()=>{S(s)},[S,s]);let C=Math.max(1,Math.ceil(b/R9)),w=Math.min(s,C),T={peripheral:0,working:1,core:2},E=async()=>{if(!h)return;let e=h;v(!0);try{await ib.post(`/v1/tier-changes/delete`,{memory_id:e.memoryId,from:e.from,to:e.to,at:e.at,reason:e.reason}),ir.success(`已删除该条变更记录`),i(n=>n.filter(n=>!(n.memoryId===e.memoryId&&n.from===e.from&&n.to===e.to&&n.at===e.at))),x(e=>Math.max(0,e-1))}catch(e){console.error(`Failed to delete tier history entry:`,e),ir.error(`删除失败`)}finally{v(!1),g(null)}},D=n=>{e(`/memories/${n}`,{state:{from:`tier-history`,page:w}})};return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-5xl mx-auto`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight flex items-center gap-2`,children:[(0,G.jsx)(mm,{className:`size-5`}),`等级变更历史`]}),(0,G.jsxs)(`span`,{className:`text-sm text-muted-foreground`,children:[`共 `,b,` 条记录`]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-3 flex-wrap`,children:[(0,G.jsxs)(`div`,{className:`relative flex-1 min-w-[200px] max-w-xs`,children:[(0,G.jsx)(Lm,{className:`absolute left-2.5 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),(0,G.jsx)(`input`,{type:`text`,placeholder:`搜索标题、ID、原因...`,value:d,onChange:e=>{f(e.target.value),c(1)},className:`w-full h-9 pl-8 pr-3 rounded-md border border-input bg-background text-sm focus:outline-none focus:ring-1 focus:ring-ring`})]}),(0,G.jsxs)(_9,{value:l,onValueChange:e=>{e&&(u(e),c(1))},children:[(0,G.jsx)(y9,{className:`w-[130px]`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`all`,children:`全部`}),(0,G.jsx)(x9,{value:`promote`,children:`仅晋升`}),(0,G.jsx)(x9,{value:`demote`,children:`仅降级`})]})]})]}),!a&&r.length>0&&C>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`第 `,w,` / `,C,` 页`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w<=1,onClick:()=>c(w-1),children:(0,G.jsx)(Qp,{className:`size-4`})}),Array.from({length:C},(e,n)=>n+1).filter(e=>e===1||e===C||Math.abs(e-w)<=2).map((e,n,r)=>(0,G.jsxs)(`span`,{className:`flex items-center`,children:[n>0&&r[n-1]!==e-1&&(0,G.jsx)(`span`,{className:`px-1 text-xs text-muted-foreground`,children:`...`}),(0,G.jsx)(q,{variant:e===w?`default`:`outline`,size:`sm`,className:`h-7 w-7 px-0`,onClick:()=>c(e),children:e})]},e)),(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w>=C,onClick:()=>c(w+1),children:(0,G.jsx)($p,{className:`size-4`})})]})]}),(0,G.jsx)(vb,{children:(0,G.jsxs)(Sb,{className:`p-0`,children:[a?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-12 text-center`,children:`加载中...`}):r.length===0?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-12 text-center`,children:`暂无变更记录`}):(0,G.jsx)(`div`,{className:`divide-y`,children:r.map(e=>(0,G.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-3 hover:bg-muted/30 transition-colors`,children:[(T[e.from]??0)<(T[e.to]??0)?(0,G.jsx)(Wp,{className:`size-4 text-emerald-500 shrink-0`}):(0,G.jsx)(Bp,{className:`size-4 text-red-500 shrink-0`}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-36 shrink-0`,children:new Date(e.at).toLocaleString(`zh-CN`)}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.from),children:jJ(e.from)}),(0,G.jsx)(`span`,{className:`text-muted-foreground text-xs`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.to),children:jJ(e.to)}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-20 shrink-0`,children:zme[e.reason]||e.reason}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground w-16 shrink-0`,children:[`#`,e.accessCount]}),(0,G.jsx)(`button`,{type:`button`,className:`flex-1 min-w-0 text-left text-sm truncate hover:underline cursor-pointer`,onClick:()=>D(e.memoryId),title:e.memoryTitle,children:e.memoryTitle}),(0,G.jsxs)(`span`,{className:`text-xs font-mono text-muted-foreground shrink-0`,children:[e.memoryId.slice(0,8),`...`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`sm`,className:`h-7 px-2`,onClick:()=>D(e.memoryId),title:`查看详情`,children:(0,G.jsx)(sm,{className:`size-3.5`})}),(0,G.jsx)(q,{variant:`ghost`,size:`sm`,className:`h-7 px-2 text-red-500 hover:text-red-600 hover:bg-red-500/10`,onClick:()=>g(e),title:`删除此条记录`,children:(0,G.jsx)(Km,{className:`size-3.5`})})]})]},`${e.memoryId}-${e.at}-${e.from}-${e.to}`))}),C>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-3 border-t`,children:[(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`第 `,w,` / `,C,` 页,共 `,b,` 条`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w<=1,onClick:()=>c(w-1),children:(0,G.jsx)(Qp,{className:`size-4`})}),Array.from({length:C},(e,n)=>n+1).filter(e=>e===1||e===C||Math.abs(e-w)<=2).map((e,n,r)=>(0,G.jsxs)(`span`,{className:`flex items-center`,children:[n>0&&r[n-1]!==e-1&&(0,G.jsx)(`span`,{className:`px-1 text-xs text-muted-foreground`,children:`...`}),(0,G.jsx)(q,{variant:e===w?`default`:`outline`,size:`sm`,className:`h-7 w-7 px-0`,onClick:()=>c(e),children:e})]},e)),(0,G.jsx)(q,{variant:`outline`,size:`sm`,className:`h-7 px-2`,disabled:w>=C,onClick:()=>c(w+1),children:(0,G.jsx)($p,{className:`size-4`})})]})]})]})}),(0,G.jsx)(pJ,{open:!!h,onOpenChange:e=>{e||g(null)},children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除变更记录`}),(0,G.jsxs)(vJ,{children:[`确定要删除这条 `,h&&`${jJ(h.from)} → ${jJ(h.to)}`,` 的变更记录吗?记忆本身不会被删除。`]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>g(null),disabled:_,children:`取消`}),(0,G.jsx)(yJ,{disabled:_,onClick:e=>{e.preventDefault(),E()},className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:_?`删除中...`:`确认删除`})]})]})})]})}async function Vme(){return ib.get(`/v1/stats/config`)}async function Hme(e=50){return ib.get(`/v1/tier-changes`,{params:{limit:e}})}async function Ume(){return ib.post(`/v1/lifecycle/trigger`,{})}var z9=6,Wme={access_via_get:`访问触发`,access_via_search:`搜索触发`,access_via_recall:`召回触发`,access_via_cross_space_search:`跨空间搜索触发`,scheduled_evaluation:`定时评估`},B9={peripheral:0,working:1,core:2};function Gme(){let e=new Date,n=z9-e.getHours()%z9,r=new Date(e.getTime()+n*36e5);return r.setMinutes(0,0,0),r.toLocaleString(`zh-CN`)}function Kme(e,n){let r=[];for(let i=0;i<=120;i+=2){let a=Math.log(2)/n,o=Math.exp(-a*i**+e);r.push({day:`D${i}`,Core:e<1?Math.max(o,.9):o*.95,Working:o,Peripheral:o*.85})}return r}function qme(){return(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[1,2].map(e=>(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-2`,children:(0,G.jsx)(Cb,{className:`h-4 w-28`})}),(0,G.jsxs)(Sb,{className:`space-y-2`,children:[(0,G.jsx)(Cb,{className:`h-4 w-full`}),(0,G.jsx)(Cb,{className:`h-4 w-3/4`}),(0,G.jsx)(Cb,{className:`h-4 w-1/2`})]})]},e))})}function Jme(){return(0,G.jsx)(`div`,{className:`space-y-2`,children:[1,2,3,4].map(e=>(0,G.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-3`,children:[(0,G.jsx)(Cb,{className:`h-4 w-4`}),(0,G.jsx)(Cb,{className:`h-3 w-24`}),(0,G.jsx)(Cb,{className:`h-5 w-14`}),(0,G.jsx)(Cb,{className:`h-3 w-4`}),(0,G.jsx)(Cb,{className:`h-5 w-14`}),(0,G.jsx)(Cb,{className:`h-3 flex-1`})]},e))})}function Yme(){let[e,n]=(0,y.useState)(null),[r,i]=(0,y.useState)([]),[a,o]=(0,y.useState)(0),[s,c]=(0,y.useState)(!0),[l,u]=(0,y.useState)(!0),[d,f]=(0,y.useState)(20),[p,m]=(0,y.useState)(!1),h=async()=>{try{c(!0),n(await Vme())}catch(e){console.error(`Failed to load lifecycle config:`,e),ir.error(`加载生命周期配置失败`)}finally{c(!1)}},g=async()=>{try{u(!0);let e=await Hme(d);i(e.changes||[]),o(e.totalCount||0)}catch(e){console.error(`Failed to load tier changes:`,e),ir.error(`加载升降级历史失败`)}finally{u(!1)}};(0,y.useEffect)(()=>{h(),g()},[]),(0,y.useEffect)(()=>{g()},[d]);let _=()=>{h(),g()},v=async()=>{try{m(!0);let e=await Ume();ir.success(e.message),h(),g()}catch(e){console.error(`Failed to trigger lifecycle:`,e),ir.error(`触发生命周期失败`)}finally{m(!1)}},b=e?Kme(e.decay.tiers?.working?.beta??1,e.decay.half_life_days):[],x=r.filter(e=>(B9[e.from]??0)<(B9[e.to]??0)).length,S=r.filter(e=>(B9[e.from]??0)>=(B9[e.to]??0)).length;return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-6xl mx-auto`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsxs)(`h1`,{className:`text-2xl font-semibold tracking-tight flex items-center gap-2`,children:[(0,G.jsx)(Gm,{className:`size-5`}),`生命周期管理`]}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`记忆衰减、升降级、自动遗忘的生命周期策略`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:_,disabled:s&&l,children:[(0,G.jsx)(Fm,{className:`h-4 w-4 mr-1`}),`刷新`]}),(0,G.jsxs)(q,{variant:`default`,size:`sm`,onClick:v,disabled:p,children:[p?(0,G.jsx)(nee,{className:`h-4 w-4 mr-1 animate-spin`}):(0,G.jsx)(eh,{className:`h-4 w-4 mr-1`}),`立即执行`]})]})]}),(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`pb-3`,children:[(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(nm,{className:`size-4 text-violet-500`}),`调度器状态`]}),(0,G.jsx)(xb,{children:`自动评估与遗忘任务的运行状态`})]}),(0,G.jsxs)(Sb,{children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`调度间隔`}),(0,G.jsxs)(`p`,{className:`text-lg font-semibold mt-1`,children:[`每 `,z9,` 小时`]})]}),(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`预计下次运行`}),(0,G.jsx)(`p`,{className:`text-sm font-semibold mt-1`,children:Gme()})]}),(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`启动时运行`}),(0,G.jsx)(`div`,{className:`mt-1`,children:(0,G.jsx)(CJ,{variant:`outline`,className:`bg-emerald-500/10 text-emerald-600 border-emerald-500/30`,children:`已启用`})})]})]}),(0,G.jsx)(`div`,{className:`mt-4 p-3 rounded-lg border border-dashed text-xs text-muted-foreground space-y-1`,children:(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(sm,{className:`size-3.5`}),(0,G.jsx)(`span`,{children:`调度器将自动执行:Weibull 衰减计算、Tier 评估升降级、关键词 TTL 检测、Superseded 归档清理`})]})})]})]}),s?(0,G.jsx)(qme,{}):e?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-3`,children:(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(zp,{className:`size-4 text-blue-500`}),`衰减参数`]})}),(0,G.jsxs)(Sb,{className:`space-y-3`,children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 text-sm`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`默认半衰期`}),(0,G.jsxs)(`p`,{className:`font-semibold`,children:[e.decay.half_life_days,` 天`]})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`Stale 阈值`}),(0,G.jsx)(`p`,{className:`font-semibold`,children:`0.3`})]})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`权重分配`}),(0,G.jsxs)(`div`,{className:`flex gap-2`,children:[(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-blue-500/10 text-blue-600 border-blue-500/30 text-xs`,children:[`时效 `,e.decay.recency_weight]}),(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-emerald-500/10 text-emerald-600 border-emerald-500/30 text-xs`,children:[`频率 `,e.decay.frequency_weight]}),(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-violet-500/10 text-violet-600 border-violet-500/30 text-xs`,children:[`内在 `,e.decay.intrinsic_weight]})]})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Tier 衰减速率 (β)`}),(0,G.jsx)(`div`,{className:`flex gap-2`,children:Object.entries(e.decay.tiers||{}).map(([e,n])=>(0,G.jsxs)(CJ,{variant:`outline`,className:`text-xs ${NJ(e)}`,children:[jJ(e),` β=`,n.beta]},e))})]}),(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Tier 底线分数`}),(0,G.jsx)(`div`,{className:`flex gap-2`,children:Object.entries(e.decay.tiers||{}).map(([e,n])=>(0,G.jsxs)(CJ,{variant:`outline`,className:`text-xs ${NJ(e)}`,children:[jJ(e),` ≥`,n.floor]},e))})]})]})]}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-3`,children:(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(qm,{className:`size-4 text-emerald-500`}),`升降级规则`]})}),(0,G.jsxs)(Sb,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,G.jsx)(Wp,{className:`size-4 text-emerald-500`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`peripheral`),children:jJ(`peripheral`)}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`working`),children:jJ(`working`)})]}),(0,G.jsxs)(`div`,{className:`flex gap-2 text-xs`,children:[(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`访问 ≥`,e.promotion.peripheral_to_working.min_access_count,`次`]}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`综合 ≥`,e.promotion.peripheral_to_working.min_composite]})]})]}),(0,G.jsxs)(`div`,{className:`p-3 rounded-lg border space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,G.jsx)(Wp,{className:`size-4 text-emerald-500`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`working`),children:jJ(`working`)}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(`core`),children:jJ(`core`)})]}),(0,G.jsxs)(`div`,{className:`flex gap-2 text-xs`,children:[(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`访问 ≥`,e.promotion.working_to_core.min_access_count,`次`]}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`综合 ≥`,e.promotion.working_to_core.min_composite]}),e.promotion.working_to_core.min_importance!=null&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,G.jsxs)(`span`,{className:`text-muted-foreground`,children:[`重要性 ≥`,e.promotion.working_to_core.min_importance]})]})]})]}),(0,G.jsx)(`div`,{className:`p-3 rounded-lg border border-dashed space-y-1 text-xs text-muted-foreground`,children:(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Bp,{className:`size-3.5 text-red-400`}),(0,G.jsx)(`span`,{children:`不满足条件时自动降级至低等级`})]})})]})]})]}),b.length>0&&(0,G.jsxs)(vb,{children:[(0,G.jsxs)(yb,{className:`pb-2`,children:[(0,G.jsxs)(bb,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(eh,{className:`size-4 text-amber-500`}),`衰减曲线预览`]}),(0,G.jsx)(xb,{children:`基于当前配置参数生成的理论衰减趋势`})]}),(0,G.jsx)(Sb,{children:(0,G.jsx)(`div`,{className:`h-64`,children:(0,G.jsx)(oD,{width:`100%`,height:`100%`,children:(0,G.jsxs)(nJ,{data:b,children:[(0,G.jsx)(eG,{strokeDasharray:`3 3`,className:`opacity-30`}),(0,G.jsx)(mK,{dataKey:`day`,tick:{fontSize:11},interval:14,label:{value:`天数`,position:`insideBottomRight`,offset:-5,fontSize:11}}),(0,G.jsx)(jK,{domain:[0,1],tick:{fontSize:11},label:{value:`分数`,angle:-90,position:`insideLeft`,fontSize:11}}),(0,G.jsx)(VE,{contentStyle:{fontSize:12,borderRadius:8},formatter:e=>[e.toFixed(3)]}),(0,G.jsx)(FT,{iconType:`line`,wrapperStyle:{fontSize:12}}),(0,G.jsx)(OG,{type:`monotone`,dataKey:`Core`,stroke:`#f59e0b`,strokeWidth:2,dot:!1,name:`核心 (Core)`}),(0,G.jsx)(OG,{type:`monotone`,dataKey:`Working`,stroke:`#10b981`,strokeWidth:2,dot:!1,name:`工作区 (Working)`}),(0,G.jsx)(OG,{type:`monotone`,dataKey:`Peripheral`,stroke:`#94a3b8`,strokeWidth:2,dot:!1,name:`边缘 (Peripheral)`})]})})})})]})]}):(0,G.jsx)(vb,{children:(0,G.jsx)(Sb,{className:`py-8 text-center`,children:(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`无法加载生命周期配置`})})}),(0,G.jsxs)(vb,{children:[(0,G.jsx)(yb,{className:`pb-2`,children:(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(bb,{className:`text-sm font-medium`,children:`升降级历史`}),(0,G.jsx)(xb,{children:`最近的 Tier 变更记录`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-emerald-500/10 text-emerald-600 border-emerald-500/30 text-xs`,children:[`↑ 升级 `,x]}),(0,G.jsxs)(CJ,{variant:`outline`,className:`bg-red-500/10 text-red-600 border-red-500/30 text-xs`,children:[`↓ 降级 `,S]}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`共 `,a,` 条`]})]})]})}),(0,G.jsx)(Sb,{className:`p-0`,children:l?(0,G.jsx)(Jme,{}):r.length===0?(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground py-12 text-center`,children:`暂无变更记录`}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`div`,{className:`divide-y`,children:r.map(e=>(0,G.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-3 hover:bg-muted/30 transition-colors`,children:[(B9[e.from]??0)<(B9[e.to]??0)?(0,G.jsx)(Wp,{className:`size-4 text-emerald-500 shrink-0`}):(0,G.jsx)(Bp,{className:`size-4 text-red-500 shrink-0`}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-36 shrink-0`,children:new Date(e.at).toLocaleString(`zh-CN`)}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.from),children:jJ(e.from)}),(0,G.jsx)(`span`,{className:`text-muted-foreground text-xs`,children:`→`}),(0,G.jsx)(CJ,{variant:`outline`,className:NJ(e.to),children:jJ(e.to)}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground w-20 shrink-0`,children:Wme[e.reason]||e.reason}),(0,G.jsxs)(`span`,{className:`text-xs text-muted-foreground w-12 shrink-0`,children:[`#`,e.accessCount]}),(0,G.jsx)(`span`,{className:`text-xs flex-1 min-w-0 truncate text-muted-foreground`,children:e.memoryTitle||e.memoryId?.slice(0,12)||`—`}),(0,G.jsx)(`span`,{className:`text-xs font-mono text-muted-foreground shrink-0`,children:e.memoryId?`${e.memoryId.slice(0,8)}...`:`—`})]},`${e.memoryId}-${e.at}-${e.from}-${e.to}`))}),r.length<a&&(0,G.jsx)(`div`,{className:`flex items-center justify-center px-4 py-3 border-t`,children:(0,G.jsx)(q,{variant:`ghost`,size:`sm`,onClick:()=>f(e=>e+20),children:`加载更多`})})]})})]})]})}function V9(){let e=et(),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)(!1),[o,s]=(0,y.useState)(null),[c,l]=(0,y.useState)(!1),u=(0,y.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),e.type===`dragenter`||e.type===`dragover`?l(!0):e.type===`dragleave`&&l(!1)},[]),d=(0,y.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),l(!1),e.dataTransfer.files&&e.dataTransfer.files[0]&&(r(e.dataTransfer.files[0]),s(null))},[]);return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-3xl`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`icon`,onClick:()=>e(`/memories`),children:(0,G.jsx)(Vp,{className:`h-4 w-4`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`批量导入`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`从 JSON、CSV 或 Markdown 文件导入记忆`})]})]}),(0,G.jsx)(vb,{className:`border-2 border-dashed p-8 transition-colors ${c?`border-primary bg-primary/5`:`border-border`}`,onDragEnter:u,onDragLeave:u,onDragOver:u,onDrop:d,children:(0,G.jsxs)(`div`,{className:`flex flex-col items-center justify-center gap-4 text-center`,children:[(0,G.jsx)(Ym,{className:`h-10 w-10 text-muted-foreground`}),(0,G.jsxs)(`div`,{className:`space-y-1`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:n?n.name:`拖拽文件到此处,或点击选择`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`支持 JSON、CSV、Markdown 格式`})]}),(0,G.jsx)(`input`,{type:`file`,accept:`.json,.csv,.md,.markdown`,onChange:e=>{e.target.files&&e.target.files[0]&&(r(e.target.files[0]),s(null))},className:`hidden`,id:`file-upload`}),(0,G.jsx)(q,{variant:`outline`,size:`sm`,onClick:()=>document.getElementById(`file-upload`)?.click(),children:`选择文件`})]})}),n&&(0,G.jsxs)(`div`,{className:`flex items-center gap-3 rounded-lg border border-border bg-card p-4`,children:[(e=>e.endsWith(`.json`)?(0,G.jsx)(cm,{className:`h-8 w-8 text-blue-500`}):e.endsWith(`.csv`)?(0,G.jsx)(lm,{className:`h-8 w-8 text-green-500`}):e.endsWith(`.md`)||e.endsWith(`.markdown`)?(0,G.jsx)(um,{className:`h-8 w-8 text-purple-500`}):(0,G.jsx)(um,{className:`h-8 w-8 text-muted-foreground`}))(n.name),(0,G.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium truncate`,children:n.name}),(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[(n.size/1024).toFixed(1),` KB`]})]}),(0,G.jsx)(q,{onClick:async()=>{if(!n){ir.error(`请先选择文件`);return}let e=new FormData;e.append(`file`,n);let r=n.name.endsWith(`.json`)?`json`:n.name.endsWith(`.csv`)?`csv`:`md`;e.append(`format`,r),a(!0);try{let n=await ib.post(`/v1/imports`,e,{headers:{"Content-Type":`multipart/form-data`}});s({success:!0,imported:n.imported||0,failed:n.failed||0,errors:n.errors}),ir.success(`成功导入 ${n.imported||0} 条记忆`)}catch(e){let n=e.response?.data?.error||e.message||`导入失败`;s({success:!1,imported:0,failed:0,errors:[n]}),ir.error(n)}finally{a(!1)}},disabled:i,size:`sm`,children:i?`导入中...`:`开始导入`})]}),o&&(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 mb-4`,children:[o.success?(0,G.jsx)(tm,{className:`h-5 w-5 text-green-500`}):(0,G.jsx)(eee,{className:`h-5 w-5 text-red-500`}),(0,G.jsx)(`h3`,{className:`font-semibold`,children:o.success?`导入成功`:`导入失败`})]}),o.success&&(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,G.jsxs)(`div`,{className:`rounded-lg bg-green-500/10 p-4 text-center`,children:[(0,G.jsx)(`p`,{className:`text-2xl font-bold text-green-500`,children:o.imported}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`成功导入`})]}),(0,G.jsxs)(`div`,{className:`rounded-lg bg-red-500/10 p-4 text-center`,children:[(0,G.jsx)(`p`,{className:`text-2xl font-bold text-red-500`,children:o.failed}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`导入失败`})]})]}),o.errors&&o.errors.length>0&&(0,G.jsxs)(`div`,{className:`mt-4 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium text-red-500`,children:`错误信息:`}),o.errors.map(e=>(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e},e))]})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-3`,children:`支持格式说明`}),(0,G.jsxs)(`div`,{className:`space-y-3 text-sm`,children:[(0,G.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,G.jsx)(cm,{className:`h-4 w-4 text-blue-500 mt-0.5`}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`font-medium`,children:`JSON`}),(0,G.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`标准 JSON 数组格式,每条记忆包含 content, tags, category 等字段`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,G.jsx)(lm,{className:`h-4 w-4 text-green-500 mt-0.5`}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`font-medium`,children:`CSV`}),(0,G.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`包含列:content, tags, category, importance, confidence`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,G.jsx)(um,{className:`h-4 w-4 text-purple-500 mt-0.5`}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`font-medium`,children:`Markdown`}),(0,G.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`每条记忆用标题分隔,支持 frontmatter 元数据`})]})]})]})]})]})}function Xme(){let{theme:e,setTheme:n}=Cr(),{hasPassword:r,setPassword:i,lock:a}=ob(),[o,s]=(0,y.useState)(``),[c,l]=(0,y.useState)(!1),[u,d]=(0,y.useState)(!1),[f,p]=(0,y.useState)(!1);return(0,G.jsxs)(`div`,{className:`space-y-6 max-w-2xl`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`系统设置`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理您的偏好设置和数据`})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`外观`}),(0,G.jsx)(`div`,{className:`space-y-4`,children:(0,G.jsxs)(`div`,{children:[(0,G.jsx)(gb,{className:`text-sm font-medium`,children:`主题模式`}),(0,G.jsxs)(`div`,{className:`flex gap-2 mt-2`,children:[(0,G.jsxs)(q,{variant:e===`light`?`default`:`outline`,size:`sm`,onClick:()=>n(`light`),className:`gap-2`,children:[(0,G.jsx)(Um,{className:`h-4 w-4`}),`亮色`]}),(0,G.jsxs)(q,{variant:e===`dark`?`default`:`outline`,size:`sm`,onClick:()=>n(`dark`),className:`gap-2`,children:[(0,G.jsx)(Am,{className:`h-4 w-4`}),`暗黑`]}),(0,G.jsxs)(q,{variant:e===`system`?`default`:`outline`,size:`sm`,onClick:()=>n(`system`),className:`gap-2`,children:[(0,G.jsx)(km,{className:`h-4 w-4`}),`跟随系统`]})]})]})})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`私密空间 Vault`}),(0,G.jsxs)(`div`,{className:`space-y-4`,children:[r?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Vault 密码已设置。私密记忆需要输入密码才能查看。`}),(0,G.jsxs)(`div`,{className:`flex gap-2`,children:[(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>l(!c),children:[(0,G.jsx)(Em,{className:`h-4 w-4 mr-2`}),`修改密码`]}),(0,G.jsxs)(q,{variant:`destructive`,size:`sm`,onClick:()=>p(!0),children:[(0,G.jsx)(Km,{className:`h-4 w-4 mr-2`}),`重置 Vault`]})]})]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`尚未设置 Vault 密码。设置后,私密记忆将受到密码保护。`}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>l(!0),children:[(0,G.jsx)(Em,{className:`h-4 w-4 mr-2`}),`设置 Vault 密码`]})]}),c&&(0,G.jsxs)(`div`,{className:`flex gap-2 mt-4`,children:[(0,G.jsx)(`input`,{type:`password`,placeholder:`输入新密码`,value:o,onChange:e=>s(e.target.value),className:`flex-1 rounded-md border border-input bg-background px-3 py-2 text-sm`}),(0,G.jsx)(q,{size:`sm`,onClick:()=>{if(!o||o.length<4){ir.error(`密码至少需要 4 位`);return}i(o),ir.success(`Vault 密码已设置`),s(``),l(!1)},children:`确认`})]})]})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`数据管理`}),(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`导出记忆数据`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`从服务端导出所有记忆为 JSON 文件`})]}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:async()=>{d(!0);try{let e=await ib.get(`/v1/memories`,{params:{limit:1e4}}),n={memories:e.memories||[],total_count:e.total_count||0,exportedAt:new Date().toISOString()},r=new Blob([JSON.stringify(n,null,2)],{type:`application/json`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=`omem-memories-${new Date().toISOString().slice(0,10)}.json`,a.click(),URL.revokeObjectURL(i),ir.success(`已导出 ${n.total_count} 条记忆`)}catch(e){console.error(`Failed to export memories:`,e),ir.error(`导出记忆数据失败`)}finally{d(!1)}},disabled:u,children:[(0,G.jsx)(im,{className:`h-4 w-4 mr-2`}),u?`导出中...`:`导出`]})]}),(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`导出本地配置`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`将登录信息、主题等本地设置导出备份`})]}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,onClick:()=>{let e={auth:JSON.parse(sessionStorage.getItem(`omem-auth`)||`{}`),vault:`已迁移到服务端存储`,theme:localStorage.getItem(`omem-theme`)||`system`,exportedAt:new Date().toISOString()},n=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`omem-config-${new Date().toISOString().slice(0,10)}.json`,i.click(),URL.revokeObjectURL(r),ir.success(`本地配置已导出`)},children:[(0,G.jsx)(am,{className:`h-4 w-4 mr-2`}),`导出`]})]}),(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`清除缓存`}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`清除所有本地存储的数据(不可逆)`})]}),(0,G.jsxs)(q,{variant:`destructive`,size:`sm`,onClick:()=>{sessionStorage.clear(),ir.success(`缓存已清除`,{description:`所有本地数据已清除,刷新页面后生效`})},children:[(0,G.jsx)(Km,{className:`h-4 w-4 mr-2`}),`清除`]})]})]})]}),(0,G.jsxs)(vb,{className:`p-6`,children:[(0,G.jsx)(`h3`,{className:`font-semibold mb-4`,children:`关于`}),(0,G.jsxs)(`div`,{className:`space-y-2 text-sm`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(vm,{className:`h-4 w-4 text-muted-foreground`}),(0,G.jsx)(`span`,{children:`omem-web v0.1.0`})]}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`omem 自部署版 Web 管理端`}),(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`备案号:`,(0,G.jsx)(`a`,{href:`https://beian.miit.gov.cn`,target:`_blank`,rel:`noopener noreferrer`,className:`underline`,children:`吉ICP备2026003061号`})]})]})]}),(0,G.jsx)(pJ,{open:f,onOpenChange:p,children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认重置 Vault`}),(0,G.jsx)(vJ,{children:`此操作不可恢复。重置后所有受 Vault 保护的私密记忆将无法访问。`})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{onClick:()=>p(!1),children:`取消`}),(0,G.jsx)(yJ,{onClick:async()=>{try{await ib.delete(`/v1/vault/password`),a(),ir.success(`Vault 已重置`),l(!1),p(!1)}catch{ir.error(`重置 Vault 失败`)}},className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`确认重置`})]})]})})]})}function H9(e){return`/v2/profile${e}`}var U9={getPreferences(e){return ib.get(H9(`/preferences`),{params:e?{project_path:e}:void 0})},getPreference(e){return ib.get(H9(`/preferences/${e}`))},createPreference(e){return ib.post(H9(`/preferences`),e)},updatePreference(e,n){return ib.put(H9(`/preferences/${e}`),n)},deletePreference(e){return ib.delete(H9(`/preferences/${e}`))},getStats(e){return ib.get(H9(`/stats`),{params:e?{project_path:e}:void 0})},getInjection(e){return ib.get(H9(`/inject`),{params:e?{project_path:e}:void 0})},triggerInduction(e,n){return ib.post(H9(`/induction/trigger`),{candidate_texts:e??[],project_path:n})},getInductionRuns(e){return ib.get(H9(`/induction/runs`),{params:e?{project_path:e}:void 0})},getVersions(e){return ib.get(H9(`/versions`),{params:e?{project_path:e}:void 0})},getChangelog(e){return ib.get(H9(`/changelog`),{params:e?{project_path:e}:void 0})}};function W9(e){let n=e.toLowerCase();return n.includes(`喜欢`)||n.includes(`偏好`)||n.includes(`习惯`)?{type:`preference`,icon:Cm,color:`text-amber-600 dark:text-amber-400`,bgColor:`bg-amber-50 dark:bg-amber-500/10 border-amber-200 dark:border-amber-500/30`,label:`偏好`}:n.includes(`项目`)||n.includes(`工程`)||n.includes(`开发`)?{type:`project`,icon:eh,color:`text-blue-600 dark:text-blue-400`,bgColor:`bg-blue-50 dark:bg-blue-500/10 border-blue-200 dark:border-blue-500/30`,label:`项目`}:n.includes(`技能`)||n.includes(`能力`)||n.includes(`精通`)||n.includes(`熟练`)?{type:`skill`,icon:Vm,color:`text-violet-600 dark:text-violet-400`,bgColor:`bg-violet-50 dark:bg-violet-500/10 border-violet-200 dark:border-violet-500/30`,label:`技能`}:n.includes(`笔记`)||n.includes(`记录`)||n.includes(`文档`)?{type:`note`,icon:Gp,color:`text-slate-600 dark:text-slate-400`,bgColor:`bg-slate-50 dark:bg-slate-500/10 border-slate-200 dark:border-slate-500/30`,label:`笔记`}:{type:`fact`,icon:Zm,color:`text-emerald-600 dark:text-emerald-400`,bgColor:`bg-emerald-50 dark:bg-emerald-500/10 border-emerald-200 dark:border-emerald-500/30`,label:`事实`}}function Zme(){return{type:`private`,icon:Em,color:`text-amber-600 dark:text-amber-400`,bgColor:`bg-amber-50 dark:bg-amber-500/10 border-amber-200 dark:border-amber-500/30`,label:`私密`}}function G9(e){return e.replace(/^#+\s*/,``).trim()}function Qme(e,n){return n===`private`?!0:e.some(e=>e===`私密`||e.toLowerCase()===`private`)}function $me(e){return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function K9(e){let n=Date.now()-new Date(e).getTime(),r=Math.floor(n/6e4);if(r<1)return`刚刚`;if(r<60)return`${r} 分钟前`;let i=Math.floor(r/60);if(i<24)return`${i} 小时前`;let a=Math.floor(i/24);return a<30?`${a} 天前`:$me(e)}function q9({content:e}){let[n,r]=(0,y.useState)(!1),i=(0,y.useRef)(null),[a,o]=(0,y.useState)(!1);return(0,y.useEffect)(()=>{let e=i.current;if(!e)return;let n=new ResizeObserver(()=>o(e.scrollHeight>e.clientHeight));return n.observe(e),()=>n.disconnect()},[]),(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:Tp(`relative`,!n&&`max-h-60 overflow-hidden`),children:[(0,G.jsx)(`div`,{ref:i,className:`prose prose-sm dark:prose-invert max-w-none`,children:(0,G.jsx)(b0,{remarkPlugins:[d3],children:e})}),!n&&a&&(0,G.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-10 bg-gradient-to-t from-background to-transparent pointer-events-none`})]}),a&&(0,G.jsx)(q,{variant:`ghost`,size:`sm`,className:`mt-1 h-auto py-1 px-2 text-xs text-muted-foreground hover:text-foreground`,onClick:()=>r(!n),children:n?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(em,{className:`size-3 mr-1`}),`收起`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(Zp,{className:`size-3 mr-1`}),`展开全文`]})})]})}var ehe=[{name:`communication_style`,display:`沟通风格`},{name:`tone`,display:`语气偏好`},{name:`code_style`,display:`代码风格`},{name:`error_handling`,display:`错误处理`},{name:`naming_convention`,display:`命名规范`},{name:`testing_strategy`,display:`测试策略`},{name:`workflow_preference`,display:`工作流偏好`},{name:`commit_style`,display:`提交风格`},{name:`emoji_preference`,display:`Emoji偏好`},{name:`self_reference`,display:`自称方式`},{name:`address_style`,display:`称呼方式`},{name:`language`,display:`语言`},{name:`framework_preference`,display:`框架偏好`},{name:`preferred_tools`,display:`工具偏好`}],the={communication_style:`沟通风格`,coding_preferences:`编码偏好`,project_context:`项目上下文`,tool_preferences:`工具偏好`,domain_knowledge:`领域知识`,work_style:`工作风格`,language_preference:`语言偏好`,framework_preferences:`框架偏好`},nhe={communication_style:zp,coding_preferences:eh,project_context:dm,tool_preferences:xm,domain_knowledge:Gp,work_style:Pm,language_preference:Cm,framework_preferences:Vm};function rhe(e){return the[e]||e.replace(/_/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function ihe(e){return nhe[e]||xm}var ahe={global:{className:`bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-500/30`,label:`全局`},project:{className:`bg-violet-50 dark:bg-violet-500/10 text-violet-700 dark:text-violet-300 border-violet-200 dark:border-violet-500/30`,label:`项目`},session:{className:`bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 border-emerald-200 dark:border-emerald-500/30`,label:`会话`}};function ohe(){let e=et(),n=ob(e=>e.unlock),r=ob(e=>e.hasPassword),i=ob(e=>e.isUnlocked),[a,o]=(0,y.useState)(null),[s,c]=(0,y.useState)(null),[l,u]=(0,y.useState)([]),[d,f]=(0,y.useState)([]),[p,m]=(0,y.useState)(!0),[h,g]=(0,y.useState)(`preferences`),[_,v]=(0,y.useState)(``),[b,x]=(0,y.useState)(!1),[S,C]=(0,y.useState)(null),[w,T]=(0,y.useState)(``),[E,D]=(0,y.useState)(null),[O,k]=(0,y.useState)(!1),[A,j]=(0,y.useState)(new Set),[M,N]=(0,y.useState)(!1),[P,F]=(0,y.useState)(null),[I,L]=(0,y.useState)(!1),[R,z]=(0,y.useState)(null),[ee,B]=(0,y.useState)(!1),[V,H]=(0,y.useState)(``),[U,te]=(0,y.useState)(`all`),[W,ne]=(0,y.useState)(1),[re,ie]=(0,y.useState)(1);(0,y.useEffect)(()=>{async function e(){try{m(!0);let e=_||void 0,[n,r,i,a]=await Promise.all([ib.get(`/v1/profile`).catch(()=>null),U9.getStats(e).catch(()=>null),U9.getPreferences(e).catch(()=>[]),U9.getChangelog(e).catch(()=>[])]);n&&o(n),r&&c(r),u(Array.isArray(i)?i:[]),f(Array.isArray(a)?a:[])}catch(e){console.error(`Failed to load profile:`,e),ir.error(`加载画像数据失败`)}finally{m(!1)}}e()},[_]);let ae=async()=>{if(!w.trim()){D(`请输入密码`);return}k(!0);let e=await n(w);if(k(!1),!e){D(`密码错误`);return}S&&j(e=>new Set(e).add(S)),x(!1),C(null),T(``),D(null),ir.success(`已解锁`)},oe=e=>{if(i){j(n=>new Set(n).add(e));return}if(!r){ir.error(`请先在设置中设置密码`);return}C(e),T(``),D(null),x(!0)},se=a?.static_facts||[],ce=a?.dynamic_context||[],le=(0,y.useMemo)(()=>se.map(e=>{let n=Qme(e.tags||[],e.visibility),r=n?Zme():W9(e.content);return{fact:e.content,factObj:e,isPrivate:n,meta:r}}),[se]),ue=(0,y.useMemo)(()=>{let e=new Map;for(let n of l){if(U!==`all`&&n.scope!==U)continue;if(V.trim()){let e=V.toLowerCase();if(!n.value.toLowerCase().includes(e)&&!n.slot.toLowerCase().includes(e)&&!(n.project_path||``).toLowerCase().includes(e))continue}let r=e.get(n.slot)||[];r.push(n),e.set(n.slot,r)}return e},[l,V,U]),de=(0,y.useMemo)(()=>Array.from(ue.entries()),[ue]),fe=Math.max(1,Math.ceil(de.length/5)),pe=(0,y.useMemo)(()=>{let e=(W-1)*5;return de.slice(e,e+5)},[de,W]),me=async()=>{let e=_||void 0,[n,r]=await Promise.all([U9.getPreferences(e),U9.getStats(e).catch(()=>null)]);u(Array.isArray(n)?n:[]),r&&c(r)},he=async e=>{if(!(!(`slot`in e)||!e.slot))try{L(!0),await U9.createPreference(e),ir.success(`偏好已创建`),N(!1),await me()}catch{ir.error(`创建失败`)}finally{L(!1)}},ge=async(e,n)=>{try{L(!0),await U9.updatePreference(e,n),ir.success(`偏好已更新`),F(null);let r=_||void 0,i=await U9.getPreferences(r);u(Array.isArray(i)?i:[])}catch{ir.error(`更新失败`)}finally{L(!1)}},_e=async()=>{if(R)try{B(!0),await U9.deletePreference(R.id),ir.success(`偏好已删除`),z(null),await me()}catch{ir.error(`删除失败`)}finally{B(!1)}},ve=(0,y.useMemo)(()=>{let e=new Set;for(let n of l)n.project_path&&e.add(n.project_path);return Array.from(e).sort()},[l]),ye=l.length;return(0,G.jsxs)(`div`,{className:`min-h-screen bg-gradient-to-b from-background via-background to-muted/30`,children:[(0,G.jsxs)(`div`,{className:`max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-6 space-y-6`,children:[(0,G.jsxs)(q,{variant:`ghost`,size:`sm`,className:`text-muted-foreground hover:text-foreground -ml-2`,onClick:()=>e(-1),children:[(0,G.jsx)(Vp,{className:`size-4 mr-1.5`}),`返回`]}),(0,G.jsxs)(`div`,{className:`relative overflow-hidden rounded-2xl bg-gradient-to-br from-amber-50 via-orange-50 to-rose-50 dark:from-amber-500/10 dark:via-orange-500/5 dark:to-rose-500/10 border border-amber-200/50 dark:border-amber-500/20 p-6 md:p-8`,children:[(0,G.jsx)(`div`,{className:`absolute top-0 right-0 -mt-8 -mr-8 w-48 h-48 bg-amber-400/15 dark:bg-amber-500/10 rounded-full blur-3xl`}),(0,G.jsx)(`div`,{className:`absolute bottom-0 left-0 -mb-6 -ml-6 w-36 h-36 bg-orange-400/10 dark:bg-orange-500/8 rounded-full blur-3xl`}),(0,G.jsxs)(`div`,{className:`relative z-10 flex flex-col md:flex-row md:items-center md:justify-between gap-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-14 rounded-2xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg shadow-amber-500/25`,children:(0,G.jsx)(Zm,{className:`size-7 text-white`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl md:text-3xl font-bold tracking-tight text-foreground`,children:`用户画像`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:`偏好 · 记忆 · 洞察`})]})]}),(0,G.jsxs)(`div`,{className:`flex flex-wrap gap-3`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-white/80 dark:bg-card/80 border border-amber-200/60 dark:border-amber-500/20 shadow-sm`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-8 rounded-lg bg-amber-100 dark:bg-amber-500/15`,children:(0,G.jsx)(xm,{className:`size-4 text-amber-600 dark:text-amber-400`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-lg font-bold leading-none text-foreground`,children:ye}),(0,G.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`条偏好`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-white/80 dark:bg-card/80 border border-orange-200/60 dark:border-orange-500/20 shadow-sm`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-8 rounded-lg bg-orange-100 dark:bg-orange-500/15`,children:(0,G.jsx)(Yp,{className:`size-4 text-orange-600 dark:text-orange-400`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-lg font-bold leading-none text-foreground`,children:s?.total??0}),(0,G.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`归纳总量`})]})]}),s?.last_induction_at&&(0,G.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-white/80 dark:bg-card/80 border border-rose-200/60 dark:border-rose-500/20 shadow-sm`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-8 rounded-lg bg-rose-100 dark:bg-rose-500/15`,children:(0,G.jsx)(nm,{className:`size-4 text-rose-600 dark:text-rose-400`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-semibold leading-none text-foreground`,children:K9(s.last_induction_at)}),(0,G.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`最近归纳`})]})]})]})]})]}),(0,G.jsxs)(F7,{value:h,onValueChange:g,className:`space-y-4`,children:[(0,G.jsxs)(I7,{className:`bg-muted/60 p-1 h-auto`,children:[(0,G.jsxs)(L7,{value:`preferences`,className:`data-[state=active]:bg-background data-[state=active]:shadow-sm gap-1.5 px-4 py-2 text-sm`,children:[(0,G.jsx)(Vm,{className:`size-3.5`}),`偏好管理`]}),(0,G.jsxs)(L7,{value:`overview`,className:`data-[state=active]:bg-background data-[state=active]:shadow-sm gap-1.5 px-4 py-2 text-sm`,children:[(0,G.jsx)(Zm,{className:`size-3.5`}),`画像概览`]}),(0,G.jsxs)(L7,{value:`changelog`,className:`data-[state=active]:bg-background data-[state=active]:shadow-sm gap-1.5 px-4 py-2 text-sm`,children:[(0,G.jsx)(mm,{className:`size-3.5`}),`变更历史`]})]}),(0,G.jsxs)(R7,{value:`preferences`,className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex flex-col sm:flex-row items-start sm:items-center gap-3`,children:[(0,G.jsxs)(`div`,{className:`relative flex-1 w-full sm:max-w-xs`,children:[(0,G.jsx)(Lm,{className:`absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),(0,G.jsx)(hb,{placeholder:`搜索偏好...`,value:V,onChange:e=>{H(e.target.value),ne(1)},className:`pl-9 h-9 bg-muted/40`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[ve.length>0&&(0,G.jsxs)(_9,{value:_,onValueChange:e=>e!=null&&v(e),children:[(0,G.jsxs)(y9,{className:`h-9 w-[180px] text-xs`,children:[(0,G.jsx)(dm,{className:`size-3.5 mr-1.5 text-muted-foreground`}),(0,G.jsx)(v9,{placeholder:`全部项目`})]}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`__all__`,children:`全部项目`}),ve.map(e=>(0,G.jsx)(x9,{value:e,children:e.split(`/`).pop()||e},e))]})]}),(0,G.jsxs)(_9,{value:U,onValueChange:e=>{e!=null&&(te(e),ne(1))},children:[(0,G.jsx)(y9,{className:`h-9 w-[100px] text-xs`,children:(0,G.jsx)(v9,{placeholder:`范围`})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`all`,children:`全部范围`}),(0,G.jsx)(x9,{value:`global`,children:`全局`}),(0,G.jsx)(x9,{value:`project`,children:`项目`}),(0,G.jsx)(x9,{value:`session`,children:`会话`})]})]})]}),(0,G.jsxs)(q,{className:`ml-auto h-9 gap-1.5 bg-gradient-to-r from-amber-500 to-orange-500 hover:from-amber-600 hover:to-orange-600 text-white shadow-sm`,onClick:()=>N(!0),children:[(0,G.jsx)(Nm,{className:`size-4`}),`新建偏好`]})]}),p?(0,G.jsx)(`div`,{className:`space-y-4`,children:[1,2,3].map(e=>(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(Cb,{className:`h-5 w-24 rounded-md`}),(0,G.jsx)(Cb,{className:`h-24 w-full rounded-xl`})]},e))}):ue.size===0?(0,G.jsx)(vb,{className:`border-dashed`,children:(0,G.jsxs)(Sb,{className:`py-16 flex flex-col items-center gap-3 text-muted-foreground`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-12 rounded-2xl bg-muted`,children:(0,G.jsx)(Vm,{className:`size-6`})}),(0,G.jsxs)(`div`,{className:`text-center`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`暂无偏好数据`}),(0,G.jsx)(`p`,{className:`text-xs mt-1`,children:`点击「新建偏好」开始构建你的画像`})]})]})}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`div`,{id:`pref-slot-list`,className:`space-y-4`,children:pe.map(([e,n])=>(0,G.jsx)(she,{slot:e,preferences:n,onEdit:e=>F(e),onDelete:e=>z(e)},e))}),fe>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-between pt-2`,children:[(0,G.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`第 `,W,` / `,fe,` 页 · 共 `,de.length,` 个分组`]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,G.jsx)(q,{variant:`outline`,size:`icon`,className:`size-8`,disabled:W<=1,onClick:()=>{ne(e=>Math.max(1,e-1)),document.getElementById(`pref-slot-list`)?.scrollIntoView({behavior:`smooth`,block:`start`})},children:(0,G.jsx)(Qp,{className:`size-4`})}),Array.from({length:fe},(e,n)=>n+1).map(e=>(0,G.jsx)(q,{variant:e===W?`default`:`outline`,size:`icon`,className:Tp(`size-8 text-xs`,e===W&&`bg-gradient-to-r from-amber-500 to-orange-500 text-white border-0`),onClick:()=>{ne(e),document.getElementById(`pref-slot-list`)?.scrollIntoView({behavior:`smooth`,block:`start`})},children:e},e)),(0,G.jsx)(q,{variant:`outline`,size:`icon`,className:`size-8`,disabled:W>=fe,onClick:()=>{ne(e=>Math.min(fe,e+1)),document.getElementById(`pref-slot-list`)?.scrollIntoView({behavior:`smooth`,block:`start`})},children:(0,G.jsx)($p,{className:`size-4`})})]})]})]})]}),(0,G.jsx)(R7,{value:`overview`,className:`space-y-6`,children:p?(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[1,2,3,4].map(e=>(0,G.jsx)(Cb,{className:`h-48 w-full rounded-xl`},e))}):(0,G.jsxs)(G.Fragment,{children:[le.length>0&&(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(zm,{className:`size-5 text-amber-500`}),(0,G.jsx)(`h2`,{className:`text-lg font-semibold`,children:`画像特征`}),(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-[10px]`,children:[le.length,` 条`]})]}),(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:le.map(({fact:e,factObj:n,isPrivate:r,meta:i})=>{let a=i.icon,o=A.has(e),s=r&&o&&n?.l2_content||G9(e);return(0,G.jsx)(vb,{className:Tp(`relative overflow-hidden border transition-all duration-200 hover:shadow-md`,r&&!o&&`border-amber-200 dark:border-amber-500/30`),children:(0,G.jsxs)(Sb,{className:`p-4`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,G.jsx)(`div`,{className:Tp(`flex items-center justify-center size-8 rounded-lg border`,i.bgColor),children:(0,G.jsx)(a,{className:Tp(`size-4`,i.color)})}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[r&&(0,G.jsxs)(CJ,{variant:`outline`,className:`text-[10px] gap-1 bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-200 dark:border-amber-500/30`,children:[(0,G.jsx)(Em,{className:`size-2.5`}),`私密`]}),(0,G.jsx)(CJ,{variant:`outline`,className:Tp(`text-[10px]`,i.bgColor,i.color),children:i.label})]})]}),(0,G.jsx)(`div`,{className:Tp(r&&!o&&`blur-[6px] select-none opacity-40`),children:(0,G.jsx)(q9,{content:s})}),r&&!o&&(0,G.jsx)(`button`,{type:`button`,className:`mt-3 w-full flex items-center justify-center gap-2 px-3 py-2 rounded-lg bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-300 text-xs font-medium hover:bg-amber-100 dark:hover:bg-amber-500/20 transition-colors border border-amber-200 dark:border-amber-500/30 cursor-pointer`,onClick:()=>oe(e),children:o?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(om,{className:`size-3.5`}),`已解锁`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(Em,{className:`size-3.5`}),`点击解锁私密内容`]})})]})},`sf-${e.slice(0,40)}`)})})]}),ce.length>0&&(0,G.jsxs)(`div`,{className:`space-y-4`,children:[(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(zp,{className:`size-5 text-blue-500`}),(0,G.jsx)(`h2`,{className:`text-lg font-semibold`,children:`静态偏好`}),(0,G.jsxs)(CJ,{variant:`secondary`,className:`text-[10px]`,children:[ce.length,` 条`]})]}),(0,G.jsxs)(`div`,{className:`relative pl-6 space-y-3`,children:[(0,G.jsx)(`div`,{className:`absolute left-[11px] top-2 bottom-2 w-px bg-gradient-to-b from-blue-300 via-orange-300 to-transparent dark:from-blue-500/40 dark:via-orange-500/40 dark:to-transparent`}),ce.map((e,n)=>{let r=W9(e),i=r.icon;return(0,G.jsxs)(`div`,{className:`relative group`,children:[(0,G.jsx)(`div`,{className:`absolute -left-6 top-2.5 size-[22px] rounded-full bg-gradient-to-br from-blue-400 to-orange-400 ring-[3px] ring-background flex items-center justify-center shadow-sm group-hover:scale-110 transition-transform`,children:(0,G.jsx)(`span`,{className:`text-[9px] font-bold text-white`,children:n+1})}),(0,G.jsx)(vb,{className:`overflow-hidden hover:shadow-sm transition-shadow`,children:(0,G.jsxs)(Sb,{className:`p-3.5`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 mb-2`,children:[(0,G.jsx)(`div`,{className:Tp(`flex items-center justify-center size-5 rounded-md border`,r.bgColor),children:(0,G.jsx)(i,{className:Tp(`size-3`,r.color)})}),(0,G.jsx)(`span`,{className:Tp(`text-[10px] font-medium px-1.5 py-0.5 rounded border`,r.bgColor,r.color),children:r.label})]}),(0,G.jsx)(q9,{content:G9(e)})]})})]},`dc-${n}`)})]})]}),le.length===0&&ce.length===0&&(0,G.jsx)(vb,{className:`border-dashed`,children:(0,G.jsxs)(Sb,{className:`py-16 flex flex-col items-center gap-3 text-muted-foreground`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-12 rounded-2xl bg-muted`,children:(0,G.jsx)(Zm,{className:`size-6`})}),(0,G.jsxs)(`div`,{className:`text-center`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`暂无画像数据`}),(0,G.jsx)(`p`,{className:`text-xs mt-1`,children:`存储更多记忆后,系统将自动构建您的用户画像`})]})]})})]})}),(0,G.jsx)(R7,{value:`changelog`,className:`space-y-4`,children:p?(0,G.jsx)(`div`,{className:`space-y-3`,children:[1,2,3].map(e=>(0,G.jsx)(Cb,{className:`h-20 w-full rounded-xl`},e))}):d.length===0?(0,G.jsx)(vb,{className:`border-dashed`,children:(0,G.jsxs)(Sb,{className:`py-16 flex flex-col items-center gap-3 text-muted-foreground`,children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-12 rounded-2xl bg-muted`,children:(0,G.jsx)(mm,{className:`size-6`})}),(0,G.jsxs)(`div`,{className:`text-center`,children:[(0,G.jsx)(`p`,{className:`text-sm font-medium`,children:`暂无变更记录`}),(0,G.jsx)(`p`,{className:`text-xs mt-1`,children:`偏好变更时将自动记录在这里`})]})]})}):(()=>{let e=Math.ceil(d.length/10),n=d.slice((re-1)*10,re*10);return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`relative pl-6 space-y-3`,children:[(0,G.jsx)(`div`,{className:`absolute left-[11px] top-2 bottom-2 w-px bg-gradient-to-b from-violet-300 via-sky-300 to-transparent dark:from-violet-500/40 dark:via-sky-500/40 dark:to-transparent`}),n.map(e=>{let n=e.action===`created`,r=e.action===`updated`,i=n?{bg:`from-emerald-400 to-teal-400`,color:`text-emerald-700 dark:text-emerald-300`,badgeClass:`bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 border-emerald-200 dark:border-emerald-500/30`,symbol:`+`,label:`创建`}:r?{bg:`from-blue-400 to-sky-400`,color:`text-blue-700 dark:text-blue-300`,badgeClass:`bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-500/30`,symbol:`~`,label:`更新`}:{bg:`from-rose-400 to-red-400`,color:`text-rose-700 dark:text-rose-300`,badgeClass:`bg-rose-50 dark:bg-rose-500/10 text-rose-700 dark:text-rose-300 border-rose-200 dark:border-rose-500/30`,symbol:`−`,label:`删除`};return(0,G.jsxs)(`div`,{className:`relative group min-w-0`,children:[(0,G.jsx)(`div`,{className:Tp(`absolute -left-6 top-2.5 size-[22px] rounded-full bg-gradient-to-br ring-[3px] ring-background flex items-center justify-center shadow-sm group-hover:scale-110 transition-transform`,i.bg),children:(0,G.jsx)(`span`,{className:`text-[9px] font-bold text-white`,children:i.symbol})}),(0,G.jsx)(vb,{className:`overflow-hidden hover:shadow-sm transition-shadow min-w-0`,children:(0,G.jsxs)(Sb,{className:`p-4 space-y-2 min-w-0`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,G.jsxs)(CJ,{variant:`outline`,className:Tp(`text-[10px] gap-1 shrink-0`,i.badgeClass),children:[n?(0,G.jsx)(Nm,{className:`size-2.5`}):r?(0,G.jsx)(Mm,{className:`size-2.5`}):(0,G.jsx)(Km,{className:`size-2.5`}),i.label]}),e.source&&(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.source}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground ml-auto shrink-0`,children:K9(e.created_at)})]}),e.old_value&&(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground line-through break-all`,children:e.old_value}),e.new_value&&(0,G.jsx)(`p`,{className:`text-sm leading-relaxed break-words`,children:e.new_value})]})})]},e.id)})]}),e>1&&(0,G.jsxs)(`div`,{className:`flex items-center justify-center gap-2 pt-2`,children:[(0,G.jsxs)(q,{variant:`outline`,size:`sm`,className:`h-7 text-xs gap-1`,disabled:re<=1,onClick:()=>ie(e=>Math.max(1,e-1)),children:[(0,G.jsx)(Qp,{className:`size-3`}),`上一页`]}),(0,G.jsx)(`div`,{className:`flex items-center gap-1`,children:Array.from({length:e},(e,n)=>n+1).map(e=>(0,G.jsx)(q,{variant:re===e?`default`:`ghost`,size:`sm`,className:`h-7 w-7 text-xs p-0`,onClick:()=>ie(e),children:e},e))}),(0,G.jsxs)(q,{variant:`outline`,size:`sm`,className:`h-7 text-xs gap-1`,disabled:re>=e,onClick:()=>ie(n=>Math.min(e,n+1)),children:[`下一页`,(0,G.jsx)($p,{className:`size-3`})]})]})]})})()})]})]}),(0,G.jsx)(pJ,{open:!!R,onOpenChange:e=>{!e&&!ee&&z(null)},children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除偏好`}),(0,G.jsxs)(vJ,{children:[`确定要删除这条偏好吗?此操作不可撤销。`,R&&(0,G.jsx)(`span`,{className:`block mt-2 px-3 py-2 rounded-lg bg-muted text-sm text-foreground truncate`,children:R.value})]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{disabled:ee,children:`取消`}),(0,G.jsx)(yJ,{disabled:ee,onClick:_e,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:ee?`删除中...`:`删除`})]})]})}),(0,G.jsx)(J9,{open:M,onOpenChange:N,saving:I,onSubmit:he,title:`新建偏好`}),(0,G.jsx)(J9,{open:!!P,onOpenChange:e=>{e||F(null)},saving:I,onSubmit:e=>{P&&ge(P.id,e)},pref:P,title:`编辑偏好`}),(0,G.jsx)(A9,{open:b,onOpenChange:e=>{e||(x(!1),T(``),D(null))},children:(0,G.jsxs)(j9,{className:`sm:max-w-sm`,children:[(0,G.jsxs)(M9,{children:[(0,G.jsxs)(P9,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Em,{className:`size-4 text-amber-500`}),`解锁私密记忆`]}),(0,G.jsx)(F9,{children:`请输入您的 Vault 密码以解锁受保护的内容。`})]}),(0,G.jsx)(`div`,{className:`space-y-3`,children:(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`密码`}),(0,G.jsx)(hb,{type:`password`,placeholder:`输入 Vault 密码...`,value:w,onChange:e=>{T(e.target.value),D(null)},onKeyDown:e=>e.key===`Enter`&&ae(),className:E?`border-destructive`:``,autoFocus:!0}),E&&(0,G.jsx)(`p`,{className:`text-xs text-destructive`,children:E})]})}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>x(!1),disabled:O,children:`取消`}),(0,G.jsx)(q,{onClick:ae,disabled:O||!w.trim(),children:O?`解锁中...`:`解锁`})]})]})})]})}function she({slot:e,preferences:n,onEdit:r,onDelete:i}){let[a,o]=(0,y.useState)(!1),[s,c]=(0,y.useState)(4),l=ihe(e),u=n.slice(0,s),d=s<n.length;return(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2.5 w-full group cursor-pointer text-left border-none bg-transparent p-0`,onClick:()=>{o(!a),c(4)},children:[(0,G.jsx)(`div`,{className:`flex items-center justify-center size-7 rounded-lg bg-gradient-to-br from-amber-100 to-orange-100 dark:from-amber-500/15 dark:to-orange-500/15 border border-amber-200/60 dark:border-amber-500/20`,children:(0,G.jsx)(l,{className:`size-3.5 text-amber-600 dark:text-amber-400`})}),(0,G.jsx)(`span`,{className:`text-sm font-semibold text-foreground`,children:rhe(e)}),(0,G.jsx)(CJ,{variant:`secondary`,className:`text-[10px]`,children:n.length}),(0,G.jsx)(`div`,{className:`flex-1`}),(0,G.jsx)($p,{className:Tp(`size-4 text-muted-foreground transition-transform duration-200`,!a&&`rotate-90`)})]}),!a&&(0,G.jsxs)(`div`,{className:`space-y-2.5 pl-9`,children:[(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-2.5`,children:u.map(e=>(0,G.jsx)(che,{pref:e,onEdit:r,onDelete:i},e.id))}),d&&(0,G.jsxs)(`button`,{type:`button`,className:`w-full flex items-center justify-center gap-1.5 py-2 text-xs text-muted-foreground hover:text-foreground transition-colors rounded-lg hover:bg-muted/50 cursor-pointer`,onClick:()=>c(e=>Math.min(e+4,n.length)),children:[(0,G.jsx)(Zp,{className:`size-3.5`}),`加载更多(剩余 `,n.length-s,` 条)`]})]})]})}function che({pref:e,onEdit:n,onDelete:r}){let i=ahe[e.scope]||{className:`bg-slate-50 dark:bg-slate-500/10 text-slate-700 dark:text-slate-300 border-slate-200 dark:border-slate-500/30`,label:e.scope};return(0,G.jsx)(vb,{className:`group hover:shadow-md transition-all duration-200 border-border/60`,children:(0,G.jsxs)(Sb,{className:`p-3.5 space-y-2.5`,children:[(0,G.jsx)(`p`,{className:`text-sm leading-relaxed whitespace-pre-wrap break-words`,children:e.value}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1.5 flex-wrap`,children:[(0,G.jsx)(CJ,{variant:`outline`,className:Tp(`text-[10px] gap-1`,i.className),children:i.label}),e.project_path&&(0,G.jsxs)(CJ,{variant:`outline`,className:`text-[10px] gap-1 bg-violet-50 dark:bg-violet-500/10 text-violet-700 dark:text-violet-300 border-violet-200 dark:border-violet-500/30`,children:[(0,G.jsx)(dm,{className:`size-2.5`}),e.project_path.split(`/`).pop()]}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground ml-auto`,children:K9(e.updated_at)})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity pt-1 border-t border-border/40`,children:[(0,G.jsxs)(`span`,{className:`text-[10px] text-muted-foreground mr-auto`,children:[`置信度 `,(e.confidence*100).toFixed(0),`%`]}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-muted-foreground hover:text-foreground`,onClick:()=>n(e),children:(0,G.jsx)(Mm,{className:`size-3.5`})}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-muted-foreground hover:text-destructive`,onClick:()=>r(e),children:(0,G.jsx)(Km,{className:`size-3.5`})})]})]})})}function J9({open:e,onOpenChange:n,saving:r,onSubmit:i,pref:a,title:o}){let s=!!a,[c,l]=(0,y.useState)(a?.slot||``),[u,d]=(0,y.useState)(``),[f,p]=(0,y.useState)(a?.value||``),[m,h]=(0,y.useState)(String(a?.confidence??.8)),[g,_]=(0,y.useState)(a?.scope||`global`),[v,b]=(0,y.useState)(a?.project_path||``);(0,y.useEffect)(()=>{if(e){let e=a?.slot||``;l(e),d(e.startsWith(`custom:`)?e.slice(7):``),p(a?.value||``),h(String(a?.confidence??.8)),_(a?.scope||`global`),b(a?.project_path||``)}},[e,a]);let x=c===`__custom__`;return(0,G.jsx)(A9,{open:e,onOpenChange:n,children:(0,G.jsxs)(j9,{className:`sm:max-w-md`,children:[(0,G.jsxs)(M9,{children:[(0,G.jsxs)(P9,{className:`flex items-center gap-2`,children:[(0,G.jsx)(Vm,{className:`size-4 text-amber-500`}),o]}),(0,G.jsx)(F9,{children:s?`修改偏好信息。`:`添加一条新的偏好。`})]}),(0,G.jsxs)(`div`,{className:`space-y-4 py-1`,children:[(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`Slot (类别)`}),s?(0,G.jsx)(hb,{value:c,disabled:!0,className:`h-9 bg-muted/60`}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(_9,{value:c||void 0,onValueChange:e=>e!=null&&l(e),children:[(0,G.jsx)(y9,{className:`h-9 w-full`,children:(0,G.jsx)(v9,{placeholder:`选择类别...`})}),(0,G.jsxs)(b9,{children:[ehe.map(e=>(0,G.jsx)(x9,{value:e.name,children:e.display},e.name)),(0,G.jsx)(x9,{value:`__custom__`,children:`自定义 (custom:...)`})]})]}),x&&(0,G.jsx)(hb,{placeholder:`自定义 slot 名 (小写字母+数字+下划线)`,value:u,onChange:e=>{d(e.target.value.replace(/[^a-z0-9_]/g,``))},className:`h-9`,maxLength:50})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`范围`}),(0,G.jsxs)(_9,{value:g,onValueChange:e=>e!=null&&_(e),children:[(0,G.jsx)(y9,{className:`h-9`,children:(0,G.jsx)(v9,{})}),(0,G.jsxs)(b9,{children:[(0,G.jsx)(x9,{value:`global`,children:`全局`}),(0,G.jsx)(x9,{value:`project`,children:`项目`}),(0,G.jsx)(x9,{value:`session`,children:`会话`})]})]})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`内容`}),(0,G.jsx)(T9,{placeholder:`偏好内容...`,value:f,onChange:e=>p(e.target.value),rows:3,className:`resize-none`,maxLength:500})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`置信度 (0-1)`}),(0,G.jsx)(hb,{type:`number`,min:`0`,max:`1`,step:`0.1`,value:m,onChange:e=>h(e.target.value),className:`h-9`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{className:`text-xs`,children:`项目路径 (可选)`}),(0,G.jsx)(hb,{placeholder:`例: /path/to/project`,value:v,onChange:e=>b(e.target.value),className:`h-9`,maxLength:200})]})]})]}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>n(!1),disabled:r,children:`取消`}),(0,G.jsx)(q,{onClick:()=>{let e=x?`custom:${u.trim()}`:c.trim();if(!e||!f.trim()){ir.error(`请填写 Slot 和内容`);return}if(x&&!u.trim()){ir.error(`请填写自定义 Slot 名`);return}if(s){let e={};f!==(a?.value||``)&&(e.value=f.trim()),m!==String(a?.confidence??.8)&&(e.confidence=parseFloat(m)),g!==(a?.scope||`global`)&&(e.scope=g),v!==(a?.project_path||``)&&(e.project_path=v.trim()||void 0),i(e)}else i({slot:e,value:f.trim(),confidence:parseFloat(m)||.8,scope:g,project_path:v.trim()||void 0})},disabled:r||!f.trim()||(x?!u.trim():!c.trim()),className:`bg-gradient-to-r from-amber-500 to-orange-500 hover:from-amber-600 hover:to-orange-600 text-white`,children:r?s?`保存中...`:`创建中...`:s?`保存`:`创建`})]})]})})}var Y9=y.createContext(void 0);function lhe(){let e=y.useContext(Y9);if(e===void 0)throw Error(Ir(63));return e}var X9=function(e){return e.checked=`data-checked`,e.unchecked=`data-unchecked`,e.disabled=`data-disabled`,e.readonly=`data-readonly`,e.required=`data-required`,e.valid=`data-valid`,e.invalid=`data-invalid`,e.touched=`data-touched`,e.dirty=`data-dirty`,e.filled=`data-filled`,e.focused=`data-focused`,e}({}),Z9={...lb,checked(e){return e?{[X9.checked]:``}:{[X9.unchecked]:``}}};function uhe(e,n,r,i=!0,a){let[o,s]=y.useState(),c=yd(a?`${a}-label`:void 0),l=e??n??o;return Pr(()=>{let a=e||n||!i?void 0:dhe(r.current,c);o!==a&&s(a)}),l}function dhe(e,n){let r=fhe(e);if(r)return!r.id&&n&&(r.id=n),r.id||void 0}function fhe(e){if(!e)return;let n=e.parentElement;if(n&&n.tagName===`LABEL`)return n;let r=e.id;if(r){let n=e.nextElementSibling;if(n&&n.htmlFor===r)return n}let i=e.labels;return i&&i[0]}var phe=y.forwardRef(function(e,n){let{checked:r,className:i,defaultChecked:a,"aria-labelledby":o,form:s,id:c,inputRef:l,name:u,nativeButton:d=!1,onCheckedChange:f,readOnly:p=!1,required:m=!1,disabled:h=!1,render:g,uncheckedValue:_,value:v,style:b,...x}=e,{clearErrors:S}=db(),{state:C,setTouched:w,setDirty:T,validityData:E,setFilled:D,setFocused:O,shouldValidateOnChange:k,validationMode:A,disabled:j,name:M,validation:N}=ub(),{labelId:P}=fb(),F=j||h,I=M??u,L=Ca(f),R=y.useRef(null),z=pa(R,l,N.inputRef),ee=y.useRef(null),B=yd(),V=mb({id:c,implicit:!1,controlRef:ee}),H=d?void 0:V,[U,te]=Rg({controlled:r,default:!!a,name:`Switch`,state:`checked`});pb(ee,{id:B,value:U}),Pr(()=>{R.current&&D(R.current.checked)},[R,D]),cg(U,()=>{S(I),T(U!==E.initialValue),D(U),k()?N.commit(U):N.commit(U,!0)});let{getButtonProps:W,buttonRef:ne}=mh({disabled:F,native:d}),re=uhe(o,P,R,!d,H),ie={id:d?V:B,role:`switch`,"aria-checked":U,"aria-readonly":p||void 0,"aria-required":m||void 0,"aria-labelledby":re,onFocus(){F||O(!0)},onBlur(){let e=R.current;!e||F||(w(!0),O(!1),A===`onBlur`&&N.commit(e.checked))},onClick(e){p||F||(e.preventDefault(),R.current?.dispatchEvent(new PointerEvent(`click`,{bubbles:!0,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey})))}},ae=y.useMemo(()=>Rs({checked:U,disabled:F,form:s,id:H,name:I,required:m,style:I?Na:Ma,tabIndex:-1,type:`checkbox`,"aria-hidden":!0,ref:z,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(p){e.preventDefault();return}let n=e.currentTarget.checked,r=Ii(xi,e.nativeEvent);L?.(n,r),!r.isCanceled&&te(n)},onFocus(){ee.current?.focus()}},N.getInputValidationProps,v===void 0?hi:{value:v}),[U,F,s,z,H,I,L,p,m,te,N,v]),oe=y.useMemo(()=>({...C,checked:U,disabled:F,readOnly:p,required:m}),[C,U,F,p,m]),se=Qs(`span`,e,{state:oe,ref:[n,ee,ne],props:[ie,N.getValidationProps,x,W],stateAttributesMapping:Z9});return(0,G.jsxs)(Y9.Provider,{value:oe,children:[se,!U&&I&&_!==void 0&&(0,G.jsx)(`input`,{type:`hidden`,form:s,name:I,value:_}),(0,G.jsx)(`input`,{...ae,suppressHydrationWarning:!0})]})}),mhe=y.forwardRef(function(e,n){let{render:r,className:i,style:a,...o}=e,{state:s}=ub(),c=lhe();return Qs(`span`,e,{state:{...s,...c},ref:n,stateAttributesMapping:Z9,props:o})});function hhe({className:e,size:n=`default`,...r}){return(0,G.jsx)(phe,{"data-slot":`switch`,"data-size":n,className:Tp(`peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50`,e),...r,children:(0,G.jsx)(mhe,{"data-slot":`switch-thumb`,className:`pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground`})})}var Q9={list(){return ib.get(`/v1/categories`)},get(e){return ib.get(`/v1/categories/${encodeURIComponent(e)}`)},create(e){return ib.post(`/v1/categories`,e)},update(e,n){return ib.put(`/v1/categories/${encodeURIComponent(e)}`,n)},delete(e){return ib.delete(`/v1/categories/${encodeURIComponent(e)}`)},listAliases(){return ib.get(`/v1/categories/aliases`)},createAlias(e,n){return ib.post(`/v1/categories/aliases`,{alias:e,target:n})},deleteAlias(e){return ib.delete(`/v1/categories/aliases/${encodeURIComponent(e)}`)}},$9={name:``,display_name:``,description:``,decision_rule:``,always_merge:!1,append_only:!1,temporal_versioned:!1,merge_supported:!1,admission_weight:.5,importance_base:.5,prompt_format:``,default_visibility:`global`,default_scope:`global`,default_ttl_days:0,sort_order:100,is_active:!0};function ghe(){let[e,n]=(0,y.useState)([]),[r,i]=(0,y.useState)([]),[a,o]=(0,y.useState)(!0),[s,c]=(0,y.useState)(null),[l,u]=(0,y.useState)(!1),[d,f]=(0,y.useState)($9),[p,m]=(0,y.useState)(null),[h,g]=(0,y.useState)(!1),[_,v]=(0,y.useState)(``),[b,x]=(0,y.useState)(``),[S,C]=(0,y.useState)(null),w=(0,y.useCallback)(async()=>{try{let e=await Q9.list();n(Array.isArray(e)?e:[])}catch{ir.error(`加载分类失败`)}},[]),T=(0,y.useCallback)(async()=>{try{let e=await Q9.listAliases();i(Array.isArray(e)?e:[])}catch{ir.error(`加载别名失败`)}},[]);(0,y.useEffect)(()=>{Promise.all([w(),T()]).finally(()=>o(!1))},[w,T]);let E=()=>{c(null),f($9),u(!0)},D=e=>{c(e),f({name:e.name,display_name:e.display_name,description:e.description,decision_rule:e.decision_rule||``,always_merge:e.always_merge,append_only:e.append_only,temporal_versioned:e.temporal_versioned,merge_supported:e.merge_supported,admission_weight:e.admission_weight,importance_base:e.importance_base,prompt_format:e.prompt_format||``,default_visibility:e.default_visibility,default_scope:e.default_scope,default_ttl_days:e.default_ttl_days||0,sort_order:e.sort_order,is_active:e.is_active}),u(!0)};return a?(0,G.jsx)(`div`,{className:`flex items-center justify-center h-64 text-muted-foreground`,children:`加载中...`}):(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`h1`,{className:`text-2xl font-bold`,children:`分类字典`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`管理记忆分类和别名映射`})]}),(0,G.jsxs)(`div`,{className:`flex gap-2`,children:[(0,G.jsxs)(q,{variant:`outline`,onClick:()=>g(!0),children:[(0,G.jsx)(wm,{className:`size-4 mr-1`}),`添加别名`]}),(0,G.jsxs)(q,{onClick:E,children:[(0,G.jsx)(Nm,{className:`size-4 mr-1`}),`新建分类`]})]})]}),(0,G.jsx)(k7,{}),r.length>0&&(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`h2`,{className:`text-lg font-semibold flex items-center gap-2`,children:[(0,G.jsx)(wm,{className:`size-4`}),`别名映射 (`,r.length,`)`]}),(0,G.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3`,children:r.map(e=>(0,G.jsxs)(vb,{className:`p-3 flex items-center justify-between`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,G.jsx)(`code`,{className:`bg-muted px-1.5 py-0.5 rounded text-xs`,children:e.alias}),(0,G.jsx)(`span`,{className:`text-muted-foreground`,children:`→`}),(0,G.jsx)(`code`,{className:`bg-muted px-1.5 py-0.5 rounded text-xs`,children:e.target})]}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-destructive hover:text-destructive`,onClick:()=>C(e.alias),children:(0,G.jsx)($m,{className:`size-3.5`})})]},e.alias))}),(0,G.jsx)(k7,{})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`h2`,{className:`text-lg font-semibold flex items-center gap-2`,children:[(0,G.jsx)(Wm,{className:`size-4`}),`分类列表 (`,e.length,`)`]}),(0,G.jsx)(`div`,{className:`border rounded-lg overflow-hidden`,children:(0,G.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,G.jsx)(`thead`,{className:`bg-muted/50`,children:(0,G.jsxs)(`tr`,{children:[(0,G.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`名称`}),(0,G.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`显示名`}),(0,G.jsx)(`th`,{className:`text-left p-3 font-medium hidden md:table-cell`,children:`描述`}),(0,G.jsx)(`th`,{className:`text-center p-3 font-medium`,children:`权重`}),(0,G.jsx)(`th`,{className:`text-center p-3 font-medium`,children:`状态`}),(0,G.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`操作`})]})}),(0,G.jsx)(`tbody`,{className:`divide-y`,children:e.map(e=>(0,G.jsxs)(`tr`,{className:`hover:bg-muted/30`,children:[(0,G.jsx)(`td`,{className:`p-3`,children:(0,G.jsx)(`code`,{className:`bg-muted px-1.5 py-0.5 rounded text-xs`,children:e.name})}),(0,G.jsx)(`td`,{className:`p-3 font-medium`,children:e.display_name}),(0,G.jsx)(`td`,{className:`p-3 text-muted-foreground hidden md:table-cell max-w-[200px] truncate`,children:e.description}),(0,G.jsx)(`td`,{className:`p-3 text-center`,children:(0,G.jsx)(`span`,{className:`text-xs`,children:e.admission_weight.toFixed(2)})}),(0,G.jsx)(`td`,{className:`p-3 text-center`,children:(0,G.jsx)(`span`,{className:`text-xs px-2 py-0.5 rounded-full ${e.is_active?`bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400`:`bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400`}`,children:e.is_active?`启用`:`禁用`})}),(0,G.jsx)(`td`,{className:`p-3 text-right`,children:(0,G.jsxs)(`div`,{className:`flex justify-end gap-1`,children:[(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7`,onClick:()=>D(e),children:(0,G.jsx)(ree,{className:`size-3.5`})}),(0,G.jsx)(q,{variant:`ghost`,size:`icon`,className:`size-7 text-destructive hover:text-destructive`,onClick:()=>m(e.name),children:(0,G.jsx)(Km,{className:`size-3.5`})})]})})]},e.name))})]})})]}),(0,G.jsx)(A9,{open:l,onOpenChange:u,children:(0,G.jsxs)(j9,{className:`max-w-lg max-h-[80vh] overflow-y-auto`,children:[(0,G.jsx)(M9,{children:(0,G.jsx)(P9,{children:s?`编辑分类`:`新建分类`})}),(0,G.jsxs)(`div`,{className:`space-y-4 py-2`,children:[!s&&(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`名称 (name)`}),(0,G.jsx)(hb,{value:d.name,onChange:e=>f(n=>({...n,name:e.target.value.toLowerCase()})),placeholder:`e.g. preferences`,maxLength:50})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`显示名 (display_name)`}),(0,G.jsx)(hb,{value:d.display_name,onChange:e=>f(n=>({...n,display_name:e.target.value})),placeholder:`e.g. 偏好设置`,maxLength:100})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`描述`}),(0,G.jsx)(hb,{value:d.description,onChange:e=>f(n=>({...n,description:e.target.value})),placeholder:`分类描述`,maxLength:500})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`决策规则 (decision_rule)`}),(0,G.jsx)(hb,{value:d.decision_rule,onChange:e=>f(n=>({...n,decision_rule:e.target.value})),placeholder:`可选`,maxLength:200})]}),(0,G.jsx)(k7,{}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`准入权重`}),(0,G.jsx)(hb,{type:`number`,step:.05,min:0,max:1,value:d.admission_weight,onChange:e=>f(n=>({...n,admission_weight:+e.target.value}))})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`重要性基数`}),(0,G.jsx)(hb,{type:`number`,step:.05,min:0,max:1,value:d.importance_base,onChange:e=>f(n=>({...n,importance_base:+e.target.value}))})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`排序`}),(0,G.jsx)(hb,{type:`number`,value:d.sort_order,onChange:e=>f(n=>({...n,sort_order:+e.target.value}))})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`默认TTL (天)`}),(0,G.jsx)(hb,{type:`number`,value:d.default_ttl_days,onChange:e=>f(n=>({...n,default_ttl_days:+e.target.value}))})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`提示格式 (prompt_format)`}),(0,G.jsx)(hb,{value:d.prompt_format,onChange:e=>f(n=>({...n,prompt_format:e.target.value})),placeholder:`可选`,maxLength:500})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`默认可见性`}),(0,G.jsxs)(`select`,{className:`w-full h-9 rounded-md border border-input bg-background px-3 text-sm`,value:d.default_visibility,onChange:e=>f(n=>({...n,default_visibility:e.target.value})),children:[(0,G.jsx)(`option`,{value:`global`,children:`global`}),(0,G.jsx)(`option`,{value:`project`,children:`project`}),(0,G.jsx)(`option`,{value:`private`,children:`private`})]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`默认作用域`}),(0,G.jsxs)(`select`,{className:`w-full h-9 rounded-md border border-input bg-background px-3 text-sm`,value:d.default_scope,onChange:e=>f(n=>({...n,default_scope:e.target.value})),children:[(0,G.jsx)(`option`,{value:`global`,children:`global`}),(0,G.jsx)(`option`,{value:`project`,children:`project`})]})]})]}),(0,G.jsx)(k7,{}),(0,G.jsx)(`div`,{className:`grid grid-cols-2 gap-3`,children:[[`always_merge`,`始终合并`],[`append_only`,`仅追加`],[`temporal_versioned`,`时序版本`],[`merge_supported`,`支持合并`],[`is_active`,`启用`]].map(([e,n])=>(0,G.jsxs)(`div`,{className:`flex items-center justify-between rounded-md border p-3`,children:[(0,G.jsx)(gb,{className:`text-sm`,children:n}),(0,G.jsx)(hhe,{checked:d[e],onCheckedChange:n=>f(r=>({...r,[e]:n}))})]},e))})]}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>u(!1),children:`取消`}),(0,G.jsx)(q,{onClick:async()=>{if(!d.name.trim()||!d.display_name.trim()){ir.error(`名称和显示名为必填项`);return}try{let e={...d,decision_rule:d.decision_rule||null,prompt_format:d.prompt_format||null,default_ttl_days:d.default_ttl_days||null};s?(await Q9.update(s.name,e),ir.success(`分类已更新`)):(await Q9.create(e),ir.success(`分类已创建`)),u(!1),w()}catch(e){let n=e instanceof Error?e.message:`操作失败`;ir.error(n)}},children:s?`保存`:`创建`})]})]})}),(0,G.jsx)(pJ,{open:!!p,onOpenChange:()=>m(null),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除分类`}),(0,G.jsxs)(vJ,{children:[`确定要删除分类 "`,p,`" 吗?此操作不可撤销。`]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{children:`取消`}),(0,G.jsx)(yJ,{onClick:async()=>{if(p)try{await Q9.delete(p),ir.success(`分类已删除`),m(null),w()}catch{ir.error(`删除失败`)}},children:`删除`})]})]})}),(0,G.jsx)(A9,{open:h,onOpenChange:g,children:(0,G.jsxs)(j9,{className:`max-w-sm`,children:[(0,G.jsx)(M9,{children:(0,G.jsx)(P9,{children:`添加别名`})}),(0,G.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`别名`}),(0,G.jsx)(hb,{value:_,onChange:e=>v(e.target.value),placeholder:`e.g. likes`,maxLength:50})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(gb,{children:`目标分类`}),(0,G.jsxs)(`select`,{className:`w-full h-9 rounded-md border border-input bg-background px-3 text-sm`,value:b,onChange:e=>x(e.target.value),children:[(0,G.jsx)(`option`,{value:``,children:`选择分类...`}),e.map(e=>(0,G.jsxs)(`option`,{value:e.name,children:[e.display_name,` (`,e.name,`)`]},e.name))]})]})]}),(0,G.jsxs)(N9,{children:[(0,G.jsx)(q,{variant:`outline`,onClick:()=>g(!1),children:`取消`}),(0,G.jsx)(q,{onClick:async()=>{if(!_.trim()||!b.trim()){ir.error(`别名和目标分类为必填项`);return}try{await Q9.createAlias(_,b),ir.success(`别名已创建`),g(!1),v(``),x(``),T()}catch(e){let n=e instanceof Error?e.message:`创建别名失败`;ir.error(n)}},children:`创建`})]})]})}),(0,G.jsx)(pJ,{open:!!S,onOpenChange:()=>C(null),children:(0,G.jsxs)(mJ,{children:[(0,G.jsxs)(hJ,{children:[(0,G.jsx)(_J,{children:`确认删除别名`}),(0,G.jsxs)(vJ,{children:[`确定要删除别名 "`,S,`" 吗?`]})]}),(0,G.jsxs)(gJ,{children:[(0,G.jsx)(bJ,{children:`取消`}),(0,G.jsx)(yJ,{onClick:async()=>{if(S)try{await Q9.deleteAlias(S),ir.success(`别名已删除`),C(null),T()}catch{ir.error(`删除别名失败`)}},children:`删除`})]})]})})]})}function _he(){let e=et();return(0,G.jsx)(`div`,{className:`flex h-screen w-full flex-col items-center justify-center bg-background text-foreground`,children:(0,G.jsxs)(`div`,{className:`text-center space-y-6`,children:[(0,G.jsx)(`div`,{className:`text-8xl font-bold text-muted-foreground/30`,children:`404`}),(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`页面不存在`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground max-w-sm`,children:`您访问的页面可能已经删除、移动,或者从未存在过。`}),(0,G.jsxs)(`div`,{className:`flex items-center justify-center gap-3`,children:[(0,G.jsxs)(q,{variant:`outline`,onClick:()=>e(-1),children:[(0,G.jsx)(Vp,{className:`h-4 w-4 mr-2`}),`返回上一页`]}),(0,G.jsxs)(q,{onClick:()=>e(`/dashboard`),children:[(0,G.jsx)(hm,{className:`h-4 w-4 mr-2`}),`返回首页`]})]})]})})}var vhe=class extends y.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,n){console.error(`ErrorBoundary caught an error:`,e,n)}handleRefresh=()=>{window.location.reload()};handleGoHome=()=>{window.location.href=`/`};render(){return this.state.hasError?(0,G.jsx)(`div`,{className:`flex h-screen w-full flex-col items-center justify-center bg-background text-foreground`,children:(0,G.jsxs)(`div`,{className:`text-center space-y-6 max-w-md px-4`,children:[(0,G.jsx)(`div`,{className:`text-6xl font-bold text-destructive/30`,children:`⚠️`}),(0,G.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`出错了`}),(0,G.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`应用遇到了意外错误。请尝试刷新页面,或返回首页。`}),this.state.error&&(0,G.jsx)(`div`,{className:`rounded-lg bg-muted p-4 text-left`,children:(0,G.jsx)(`p`,{className:`text-xs font-mono text-muted-foreground break-all`,children:this.state.error.message})}),(0,G.jsxs)(`div`,{className:`flex items-center justify-center gap-3`,children:[(0,G.jsxs)(q,{variant:`outline`,onClick:this.handleRefresh,children:[(0,G.jsx)(Pm,{className:`h-4 w-4 mr-2`}),`刷新页面`]}),(0,G.jsxs)(q,{onClick:this.handleGoHome,children:[(0,G.jsx)(hm,{className:`h-4 w-4 mr-2`}),`返回首页`]})]})]})}):this.props.children}};function yhe({children:e}){let n=dh(e=>e.isAuthenticated),r=typeof window<`u`&&window.localStorage.getItem(`e2e_bypass_auth`)===`true`;return n||r?e:(0,G.jsx)(Ot,{to:`/login`,replace:!0})}function bhe(){return(0,G.jsx)(vhe,{children:(0,G.jsxs)(Mt,{children:[(0,G.jsx)(At,{path:`/login`,element:(0,G.jsx)(_b,{})}),(0,G.jsxs)(At,{path:`/*`,element:(0,G.jsx)(yhe,{children:(0,G.jsx)(Ree,{})}),children:[(0,G.jsx)(At,{index:!0,element:(0,G.jsx)(Ot,{to:`/dashboard`,replace:!0})}),(0,G.jsx)(At,{path:`dashboard`,element:(0,G.jsx)(fJ,{})}),(0,G.jsx)(At,{path:`memories`,element:(0,G.jsx)(RJ,{})}),(0,G.jsx)(At,{path:`memories/:id`,element:(0,G.jsx)(pme,{})}),(0,G.jsx)(At,{path:`memories/new`,element:(0,G.jsx)(E9,{})}),(0,G.jsx)(At,{path:`memories/:id/edit`,element:(0,G.jsx)(E9,{})}),(0,G.jsx)(At,{path:`memories/:id/edit-insight`,element:(0,G.jsx)(vme,{})}),(0,G.jsx)(At,{path:`vault`,element:(0,G.jsx)(xme,{})}),(0,G.jsx)(At,{path:`spaces`,element:(0,G.jsx)(Lme,{})}),(0,G.jsx)(At,{path:`sessions`,element:(0,G.jsx)(Cme,{})}),(0,G.jsx)(At,{path:`sessions/:id`,element:(0,G.jsx)(Nme,{})}),(0,G.jsx)(At,{path:`analytics`,element:(0,G.jsx)(Rme,{})}),(0,G.jsx)(At,{path:`tier-history`,element:(0,G.jsx)(Bme,{})}),(0,G.jsx)(At,{path:`lifecycle`,element:(0,G.jsx)(Yme,{})}),(0,G.jsx)(At,{path:`import`,element:(0,G.jsx)(V9,{})}),(0,G.jsx)(At,{path:`profile`,element:(0,G.jsx)(ohe,{})}),(0,G.jsx)(At,{path:`settings`,element:(0,G.jsx)(Xme,{})}),(0,G.jsx)(At,{path:`categories`,element:(0,G.jsx)(ghe,{})}),(0,G.jsx)(At,{path:`*`,element:(0,G.jsx)(_he,{})})]})]})})}(0,x.createRoot)(document.getElementById(`root`)).render((0,G.jsx)(y.StrictMode,{children:(0,G.jsx)(Sn,{children:(0,G.jsx)(Sr,{defaultTheme:`dark`,storageKey:`omem-theme`,children:(0,G.jsxs)(Dp,{children:[(0,G.jsx)(jp,{children:(0,G.jsx)(bhe,{})}),(0,G.jsx)(yr,{position:`top-right`,richColors:!0,closeButton:!0})]})})})}));
|
package/web/index.html
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<script>window.__OMEM_API_URL__ = "__OMEM_API_URL__";</script>
|
|
8
8
|
<title>omem - 记忆管理</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-C6yQfEU4.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/assets/index-CmkWtIf5.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|