@kenz1117/dsh-engram 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +4 -3
- package/README.md +7 -5
- package/icon-256.svg +40 -0
- package/icon.svg +29 -0
- package/lib/client.js +1 -1
- package/lib/client.js.map +1 -1
- package/lib/index.js +2211 -386
- package/package.json +18 -4
package/README.en.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# dsh-engram
|
|
4
4
|
|
|
5
|
-
<p align="center">Cross-session long-term memory for DeepSeek Harness — the agent remembers your preferences, project conventions, and factual history across sessions and projects, and keeps evolving with use (capture → reinforce → distill → decay). Pure TypeScript: no external processes, no Python dependency.</p>
|
|
5
|
+
<p align="center">Cross-session long-term memory for DeepSeek Harness — a cognitive-science reframe of agent memory under the "memory palace" metaphor: imagery labels, corridor topology, closure questions, consolidation merging, and decay forgetting. The agent remembers your preferences, project conventions, and factual history across sessions and projects, and keeps evolving with use (capture → reinforce → distill → decay). Pure TypeScript: no external processes, no Python dependency.</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://github.com/kenz1117/dsh-engram/blob/main/LICENSE"><img alt="GitHub license" src="https://img.shields.io/github/license/kenz1117/dsh-engram"></a>
|
|
@@ -36,8 +36,9 @@ Zero configuration after install (stores and model cache default to `~/.dsh/engr
|
|
|
36
36
|
- **Knowledge flywheel**: capture/save → contradiction candidates (high-similarity neighbors create `contradicts` edges on write, for the model/user to adjudicate) → hit reinforcement (confidence +0.05) → distillation (topic clusters merge into higher-level rules, supersedes chains, confidence inheritance) → decay (low-importance, long-unaccessed entries archive; restorable).
|
|
37
37
|
- **Automatic capture** (when `ingest` is enabled): each new turn's first step extracts candidate facts from the previous turn out of the session log, and session end captures the final turn too (failures leave a pending key that the next session replays; capture is idempotent per session+turn), written with low confidence and deduplicated by embedding — memories accumulate without you saying "remember this".
|
|
38
38
|
- **Provenance audit**: every memory records its source session, turn, and event seq; `engram_review` traces the full source chain, supersede chain, contradictions, and operation log; all writes/edits/forgets/distills/decays land in the operation log table.
|
|
39
|
-
- **Web management panel
|
|
40
|
-
- **Portable data**: `engram_export` exports Markdown / JSON files in one step.
|
|
39
|
+
- **Web management panel** (v0.7.0+): a "Memory Library" tab in Settings — Tour butler (7 cards: health score, curator log, corridor bird's-eye, recall bench, refurb list, activity log, tour proposal) plus Room exhibition (list & edit). A single 3-pill scope switcher in the header drives every panel; UI copy is bilingual zh/en and follows the host language setting live. Filter by redaction marks (include/exclude `[REDACTED:*]` entries) with amber badges for audit coverage.
|
|
40
|
+
- **Portable data**: `engram_export` exports Markdown / JSON files in one step, with a redacted-view variant (secondary scrubbing + 40-char preview truncation, share-safe). `engram_mirror` writes an Obsidian / Logseq-friendly mirror directory (one Markdown per memory with YAML frontmatter + `[[id]]` backlinks), turning the palace into a human-readable private knowledge base.
|
|
41
|
+
- **AGI Architecture Exploration (dsh-market · AGI Architecture)**: listed in dsh-market's "AGI Architecture Exploration" category as a cognitive-science reframe of agent long-term memory — memory palace (imagery labels + room placards), corridor topology (force-directed graph), closure questions (the ingest prompt nudges the model to ask clarifying questions), consolidation merging (heuristic dedup + cosine similarity) — sitting alongside MemGPT / Letta in the "agent memory architecture" conversation.
|
|
41
42
|
|
|
42
43
|
## Tools (9, narrow parameters)
|
|
43
44
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# dsh-engram
|
|
4
4
|
|
|
5
|
-
<p align="center">DeepSeek Harness 跨会话长期记忆插件 — Agent 在会话与项目之间记住用户偏好、项目约定与经历事实,并随使用持续演化(摄取 → 强化 → 蒸馏 → 衰减)。纯 TypeScript,零外部进程、零 Python 依赖。</p>
|
|
5
|
+
<p align="center">DeepSeek Harness 跨会话长期记忆插件 — 以「记忆宫殿」隐喻重构 agent 长期记忆的认知架构:意象标签、走廊拓扑、闭环提问、巩固合并与衰减遗忘。Agent 在会话与项目之间记住用户偏好、项目约定与经历事实,并随使用持续演化(摄取 → 强化 → 蒸馏 → 衰减)。纯 TypeScript,零外部进程、零 Python 依赖。</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://github.com/kenz1117/dsh-engram/blob/main/LICENSE"><img alt="GitHub license" src="https://img.shields.io/github/license/kenz1117/dsh-engram"></a>
|
|
@@ -36,14 +36,15 @@ dsh plugin --profile web add @kenz1117/dsh-engram
|
|
|
36
36
|
- **知识飞轮**:摄取/保存 → 矛盾候选(写入时高相似近邻建 `contradicts` 边并报告,模型/用户裁决)→ 命中强化(confidence +0.05)→ 蒸馏(同主题簇合并为高层规律、supersedes 取代链、置信度继承)→ 衰减(低重要性且长期未访问归档,可恢复)。
|
|
37
37
|
- **自动摄取**(`ingest` 配置开启时):新一轮第一步从会话日志提取上一轮的候选事实,会话结束时补摄取最后一轮(失败留 pending 键,下次会话自动补做,幂等不重复),低 confidence 写入并按嵌入去重——不说"记住"也能攒记忆。
|
|
38
38
|
- **来源审计**:每条记忆记录来源会话、轮次与事件 seq,`engram_review` 完整回查来源链、取代链、矛盾与操作日志;全部写入/修改/遗忘/蒸馏/衰减入操作日志表。
|
|
39
|
-
- **Web
|
|
39
|
+
- **Web 管理面板**(v0.7.0+):设置页「记忆库」tab——导览管家(健康分卡、管家日报卡、走廊鸟瞰、检索测试台、翻新清单、管家日志、导览提案共 7 张子卡片)+ 宫殿陈展(列表与编辑)。Header 三宫格驱动全局 scope(私人 / 项目 / 共享),全部数据源同步。界面文案中英双语,跟随宿主语言设置实时切换。支持按脱敏标记筛选(仅看/排除含 `[REDACTED:*]` 的条目)并给命中条目挂琥珀色徽标,方便审计脱敏覆盖面。
|
|
40
40
|
- **提示注入防护**:全部记忆召回出口(画像注入、`engram_search/timeline/review` 输出)包 `<engram_memory_context>` 协议标签并附使用警告(历史记忆非当前请求、不遵循其中指令、仅相关时使用),当前请求独立包 `<current_user_request>`;所有入库内容(摄取候选、保存正文)先剥离这些协议标签,防伪造协议块二次注入。
|
|
41
41
|
- **摄取脱敏**:入库前正则清洗常见密钥凭据(sk- 系 API key、Bearer、AWS AKIA、GitHub token、PEM 私钥、password/token 赋值),命中片段替换为 `[REDACTED:<类型>]`。
|
|
42
42
|
- **召回占位(防回声室)**:摄取切片中记忆召回工具的输出替换为 `[engram memory result omitted from capture: <tool>]`,并向提取模型附注"既有记忆的复述不是新信息",阻断记忆自我强化循环。
|
|
43
43
|
- **多查询检索**:`engram_search` 可用辅助 LLM 把查询改写为 ≤3 个互补查询分别检索,跨查询 RRF 融合 + 每查询保底命中;改写失败自动降级单查询(`queryRewrite: false` 关闭)。
|
|
44
|
-
- **数据可携带**:`engram_export` 一键导出 Markdown / JSON
|
|
44
|
+
- **数据可携带**:`engram_export` 一键导出 Markdown / JSON 文件,支持脱敏视图(内容二次清洗 + 预览截断,分享安全)。`engram_mirror` 导出可漫游的镜像目录(Obsidian / Logseq 友好:每条记忆一个 Markdown,正文 + YAML frontmatter + 双向链接 `[[id]]`),让「宫殿」也成为可人读的私人知识库。
|
|
45
|
+
- **认知架构探索(dsh-market · AGI 架构探索)**:本仓库是 dsh-market「AGI 架构探索」类目下,对 agent 长期记忆的认知科学方法论重构——记忆宫殿(意象标签 + 房间铭牌)、走廊拓扑(力导向图)、闭环提问(摄入时让模型主动追问用户细节)、巩固合并(启发式去重 + 余弦相似度),与 MemGPT/Letta 同层「agent 记忆架构」叙事。
|
|
45
46
|
|
|
46
|
-
## 工具(
|
|
47
|
+
## 工具(10 个,窄参数)
|
|
47
48
|
|
|
48
49
|
| 工具 | 作用 |
|
|
49
50
|
|---|---|
|
|
@@ -52,9 +53,10 @@ dsh plugin --profile web add @kenz1117/dsh-engram
|
|
|
52
53
|
| `engram_timeline` | 时间线浏览 |
|
|
53
54
|
| `engram_update` | 修正(supersedes 取代链) |
|
|
54
55
|
| `engram_forget` | 遗忘(软删可恢复) |
|
|
56
|
+
| `engram_report` | 回报使用效果(skill 类首选):success 提权 +0.05 / failure 降权 -0.1,持续无效的记忆被衰减自然淘汰 |
|
|
55
57
|
| `engram_review` | 审计单条:来源链、取代链、矛盾、操作日志 |
|
|
56
58
|
| `engram_stats` | 全库统计与信噪比 |
|
|
57
|
-
| `engram_export` | 导出 Markdown / JSON
|
|
59
|
+
| `engram_export` | 导出 Markdown / JSON 文件(数据可携带);`redactedView: true` 输出脱敏视图(二次清洗 + 40 字预览截断,可安全分享) |
|
|
58
60
|
| `engram_distill` | 蒸馏:同主题簇合并为高层规律(LLM) |
|
|
59
61
|
|
|
60
62
|
## 配置
|
package/icon-256.svg
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!-- 记忆宫殿大图标:256×256,正面立柱,渲染端用作市场卡片与详情页头图。 -->
|
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256" role="img" aria-label="Memory Palace">
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
6
|
+
<stop offset="0%" stop-color="#5b8def" stop-opacity="0.18"/>
|
|
7
|
+
<stop offset="100%" stop-color="#5b8def" stop-opacity="0.04"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
<linearGradient id="roof" x1="0" y1="0" x2="1" y2="1">
|
|
10
|
+
<stop offset="0%" stop-color="#5b8def" stop-opacity="0.95"/>
|
|
11
|
+
<stop offset="100%" stop-color="#5b8def" stop-opacity="0.65"/>
|
|
12
|
+
</linearGradient>
|
|
13
|
+
<linearGradient id="floor" x1="0" y1="0" x2="0" y2="1">
|
|
14
|
+
<stop offset="0%" stop-color="#5b8def" stop-opacity="0.55"/>
|
|
15
|
+
<stop offset="100%" stop-color="#5b8def" stop-opacity="0.35"/>
|
|
16
|
+
</linearGradient>
|
|
17
|
+
</defs>
|
|
18
|
+
<!-- 圆角背板 -->
|
|
19
|
+
<rect x="8" y="8" width="240" height="240" rx="32" fill="url(#bg)" stroke="#5b8def" stroke-opacity="0.25" stroke-width="2"/>
|
|
20
|
+
<!-- 三层阶梯 -->
|
|
21
|
+
<rect x="48" y="200" width="160" height="8" rx="2" fill="url(#floor)"/>
|
|
22
|
+
<rect x="58" y="208" width="140" height="8" rx="2" fill="url(#floor)"/>
|
|
23
|
+
<rect x="68" y="216" width="120" height="8" rx="2" fill="url(#floor)"/>
|
|
24
|
+
<!-- 三角顶 -->
|
|
25
|
+
<path d="M44 120 L128 56 L212 120 Z" fill="url(#roof)"/>
|
|
26
|
+
<!-- 立柱与墙身 -->
|
|
27
|
+
<rect x="60" y="120" width="136" height="80" rx="3" fill="#fff" stroke="#5b8def" stroke-width="3"/>
|
|
28
|
+
<line x1="60" y1="120" x2="196" y2="120" stroke="#5b8def" stroke-width="3"/>
|
|
29
|
+
<!-- 左窗 -->
|
|
30
|
+
<rect x="76" y="136" width="28" height="28" rx="3" fill="none" stroke="#5b8def" stroke-width="3"/>
|
|
31
|
+
<line x1="90" y1="136" x2="90" y2="164" stroke="#5b8def" stroke-width="2"/>
|
|
32
|
+
<line x1="76" y1="150" x2="104" y2="150" stroke="#5b8def" stroke-width="2"/>
|
|
33
|
+
<!-- 中门 -->
|
|
34
|
+
<path d="M112 200 L112 156 Q112 144 128 144 Q144 144 144 156 L144 200" fill="#fff" stroke="#5b8def" stroke-width="3"/>
|
|
35
|
+
<circle cx="138" cy="180" r="2.5" fill="#5b8def"/>
|
|
36
|
+
<!-- 右窗 -->
|
|
37
|
+
<rect x="152" y="136" width="28" height="28" rx="3" fill="none" stroke="#5b8def" stroke-width="3"/>
|
|
38
|
+
<line x1="166" y1="136" x2="166" y2="164" stroke="#5b8def" stroke-width="2"/>
|
|
39
|
+
<line x1="152" y1="150" x2="180" y2="150" stroke="#5b8def" stroke-width="2"/>
|
|
40
|
+
</svg>
|
package/icon.svg
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!-- 记忆宫殿图标:宫殿正面(门廊 + 三角顶 + 三扇窗),所有线条与令牌对齐。 -->
|
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48" role="img" aria-label="Memory Palace">
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="roof" x1="0" y1="0" x2="1" y2="1">
|
|
6
|
+
<stop offset="0%" stop-color="currentColor" stop-opacity="0.85"/>
|
|
7
|
+
<stop offset="100%" stop-color="currentColor" stop-opacity="0.55"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
</defs>
|
|
10
|
+
<!-- 地基 -->
|
|
11
|
+
<rect x="5" y="38" width="38" height="3" rx="1.5" fill="currentColor" opacity="0.25"/>
|
|
12
|
+
<!-- 三角顶 -->
|
|
13
|
+
<path d="M6 20 L24 7 L42 20 Z" fill="url(#roof)"/>
|
|
14
|
+
<!-- 立柱与墙身 -->
|
|
15
|
+
<rect x="9" y="20" width="30" height="18" rx="1.5" fill="none" stroke="currentColor" stroke-width="2"/>
|
|
16
|
+
<line x1="9" y1="20" x2="39" y2="20" stroke="currentColor" stroke-width="2"/>
|
|
17
|
+
<!-- 左窗 -->
|
|
18
|
+
<rect x="13" y="24" width="6" height="6" rx="1" fill="none" stroke="currentColor" stroke-width="1.6"/>
|
|
19
|
+
<line x1="16" y1="24" x2="16" y2="30" stroke="currentColor" stroke-width="1.2"/>
|
|
20
|
+
<line x1="13" y1="27" x2="19" y2="27" stroke="currentColor" stroke-width="1.2"/>
|
|
21
|
+
<!-- 中门 -->
|
|
22
|
+
<path d="M21 38 L21 28 Q21 25 24 25 Q27 25 27 28 L27 38" fill="none" stroke="currentColor" stroke-width="1.8"/>
|
|
23
|
+
<!-- 右窗 -->
|
|
24
|
+
<rect x="29" y="24" width="6" height="6" rx="1" fill="none" stroke="currentColor" stroke-width="1.6"/>
|
|
25
|
+
<line x1="32" y1="24" x2="32" y2="30" stroke="currentColor" stroke-width="1.2"/>
|
|
26
|
+
<line x1="29" y1="27" x2="35" y2="27" stroke="currentColor" stroke-width="1.2"/>
|
|
27
|
+
<!-- 阶梯 -->
|
|
28
|
+
<line x1="20" y1="40.5" x2="28" y2="40.5" stroke="currentColor" stroke-width="1.2" opacity="0.6"/>
|
|
29
|
+
</svg>
|
package/lib/client.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
window.__ModuleLoader__.load({id:`@kenz1117/dsh-engram`,factory:e=>{var t={exports:{}},n=t.exports;Object.defineProperty(n,Symbol.toStringTag,{value:`Module`});let r=e("react"),i=e("react/jsx-runtime"),a=`@kenz1117/dsh-engram/panel.module.css`;if(typeof document<`u`&&document.querySelector(`style[data-plugin-css=`+JSON.stringify(a)+`]`)===null){let e=document.createElement(`style`);e.dataset.plugin=`@kenz1117/dsh-engram`,e.dataset.pluginCss=a,e.textContent=`.bWwFiW_panel{max-width:920px;animation:.24s both bWwFiW_rise}@keyframes bWwFiW_rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.bWwFiW_toolbar{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:16px;display:flex}.bWwFiW_scopeTabs{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:flex-end;gap:20px;margin-right:auto;display:flex}.bWwFiW_scopeOn,.bWwFiW_scopeOff{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;padding:7px 1px 9px;font-size:13px;line-height:20px;transition:color .14s;position:relative}.bWwFiW_scopeOn,.bWwFiW_scopeOff:hover{color:var(--dsw-alias-label-primary)}.bWwFiW_scopeOn:after{background:var(--dsw-alias-brand-primary);content:"";border-radius:2px 2px 0 0;height:2px;position:absolute;bottom:-1px;left:0;right:0}.bWwFiW_button{color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:8px;padding:5px 12px;font-size:13px;line-height:18px;transition:color .14s,border-color .14s,background .14s,transform .1s}.bWwFiW_button:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 7%, transparent)}.bWwFiW_button:active{transform:scale(.97)}.bWwFiW_button:disabled{opacity:.4;cursor:default;border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);background:0 0;transform:none}.bWwFiW_primary{background:var(--dsw-alias-button-primary-fill);border-color:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.bWwFiW_primary:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);filter:brightness(1.08)}.bWwFiW_cards{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-bottom:16px;display:grid}.bWwFiW_card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);text-align:left;cursor:pointer;color:var(--dsw-alias-label-primary);font:inherit;border-radius:12px;padding:14px 16px 12px;transition:border-color .16s,transform .16s,box-shadow .16s;position:relative;overflow:hidden}.bWwFiW_card:hover{border-color:var(--dsw-alias-border-l1,var(--dsw-alias-brand-primary));box-shadow:0 6px 18px -8px color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);transform:translateY(-1px)}.bWwFiW_card b{font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:26px;line-height:1.15;display:block}.bWwFiW_card span{color:var(--dsw-alias-label-secondary);font-size:12px}.bWwFiW_cardOn{border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 55%, transparent);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 5%, var(--dsw-alias-bg-layer-1))}.bWwFiW_cardOn:before{background:var(--dsw-alias-brand-primary);content:"";width:3px;position:absolute;top:0;bottom:0;left:0}.bWwFiW_cardMeter{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 18%, transparent);border-radius:2px;height:3px;margin-top:10px;display:block;overflow:hidden}.bWwFiW_cardMeter i{background:var(--dsw-alias-brand-primary);border-radius:2px;height:100%;transition:width .3s;display:block}.bWwFiW_filters{flex-wrap:wrap;gap:8px;margin-bottom:16px;display:flex}.bWwFiW_input{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:6px 10px;font-size:13px;transition:border-color .14s,box-shadow .14s}.bWwFiW_input:focus-visible{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, transparent);outline:none}.bWwFiW_filters .bWwFiW_input{flex:1;min-width:160px}.bWwFiW_filters select.bWwFiW_input{flex:0 auto;min-width:120px}.bWwFiW_item{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;margin-bottom:10px;padding:13px 16px 11px;transition:border-color .16s,background .16s,box-shadow .16s;animation:.26s both bWwFiW_rise;position:relative}.bWwFiW_item:hover{border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, var(--dsw-alias-border-l2));box-shadow:0 8px 22px -12px color-mix(in srgb, var(--dsw-alias-label-primary) 26%, transparent)}.bWwFiW_itemSelected{border-color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 4%, var(--dsw-alias-bg-layer-1))}.bWwFiW_row1{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:7px;display:flex}.bWwFiW_itemCheck{accent-color:var(--dsw-alias-brand-primary);cursor:pointer;flex:none;width:15px;height:15px}.bWwFiW_statusWrap{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:12px;display:inline-flex}.bWwFiW_statusWrap:before{background:var(--dsw-alias-label-tertiary);content:"";border-radius:50%;width:7px;height:7px}.bWwFiW_statusWrap.bWwFiW_active{color:var(--dsw-alias-state-success-primary)}.bWwFiW_statusWrap.bWwFiW_active:before{background:var(--dsw-alias-state-success-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-state-success-primary) 16%, transparent)}.bWwFiW_statusWrap.bWwFiW_archived{color:var(--dsw-alias-state-warn-primary)}.bWwFiW_statusWrap.bWwFiW_archived:before{background:var(--dsw-alias-state-warn-primary)}.bWwFiW_statusWrap.bWwFiW_forgotten{color:var(--dsw-alias-state-error-primary)}.bWwFiW_statusWrap.bWwFiW_forgotten:before{background:var(--dsw-alias-state-error-primary)}.bWwFiW_chip{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent);border-radius:6px;padding:0 8px;font-size:11px;line-height:18px}.bWwFiW_redactedChip{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent)}.bWwFiW_scopeTag{color:var(--dsw-alias-label-tertiary);font-size:11px}.bWwFiW_timeTag{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;margin-left:auto;font-size:12px}.bWwFiW_content{white-space:pre-wrap;word-break:break-word;color:var(--dsw-alias-label-primary);-webkit-line-clamp:4;-webkit-box-orient:vertical;font-size:14px;line-height:1.7;display:-webkit-box;overflow:hidden}.bWwFiW_meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:16px;margin-top:8px;font-size:12px;display:flex}.bWwFiW_meterField{font-variant-numeric:tabular-nums;align-items:center;gap:7px;display:inline-flex}.bWwFiW_meter{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 18%, transparent);border-radius:2px;width:52px;height:4px;overflow:hidden}.bWwFiW_meter i{background:var(--dsw-alias-brand-primary);border-radius:2px;height:100%;display:block}.bWwFiW_meter.bWwFiW_conf i{background:var(--dsw-alias-state-success-primary)}.bWwFiW_ops{opacity:.55;gap:6px;margin-top:9px;transition:opacity .16s;display:flex}.bWwFiW_item:hover .bWwFiW_ops,.bWwFiW_item:focus-within .bWwFiW_ops{opacity:1}.bWwFiW_ops .bWwFiW_button{background:var(--dsw-alias-fill-tsp-secondary);border-color:#0000;padding:3px 10px;font-size:12px}.bWwFiW_ops .bWwFiW_button:hover{border-color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 8%, transparent)}.bWwFiW_batchBar{z-index:5;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 82%, transparent);backdrop-filter:blur(10px);border:1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));box-shadow:0 10px 28px -12px color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);border-radius:12px;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:12px;padding:9px 14px;animation:.2s both bWwFiW_barUp;display:flex;position:sticky;bottom:12px}@keyframes bWwFiW_barUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.bWwFiW_batchBar>span{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;margin-right:auto;font-size:13px}.bWwFiW_danger{background:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-foreground)}.bWwFiW_danger:hover{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-foreground);filter:brightness(1.08)}.bWwFiW_skeleton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;margin-bottom:10px;padding:13px 16px}.bWwFiW_skeleton i{background:linear-gradient(90deg, color-mix(in srgb, var(--dsw-alias-label-tertiary) 12%, transparent) 25%, color-mix(in srgb, var(--dsw-alias-label-tertiary) 24%, transparent) 50%, color-mix(in srgb, var(--dsw-alias-label-tertiary) 12%, transparent) 75%);background-size:200% 100%;border-radius:6px;height:12px;margin:8px 0;animation:1.3s linear infinite bWwFiW_shimmer;display:block}.bWwFiW_skeleton i:first-child{width:34%;margin-top:2px}.bWwFiW_skeleton i:last-child{width:62%}@keyframes bWwFiW_shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.bWwFiW_empty{text-align:center;color:var(--dsw-alias-label-secondary);padding:48px 0 52px}.bWwFiW_empty:before{border:1px solid var(--dsw-alias-border-l2);background:linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent), transparent 70%);content:"";border-radius:10px;width:34px;height:34px;margin:0 auto 12px;display:block;transform:rotate(45deg)scale(.8)}.bWwFiW_expand{border-top:1px dashed var(--dsw-alias-border-l2);margin-top:10px;padding-top:12px;animation:.18s both bWwFiW_rise}.bWwFiW_expandLoading{color:var(--dsw-alias-label-secondary);font-size:13px}.bWwFiW_attrGrid{grid-template-columns:max-content 1fr;align-items:center;gap:7px 16px;font-size:13px;display:grid}.bWwFiW_attrGrid>dt{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px}.bWwFiW_attrGrid>dd{color:var(--dsw-alias-label-primary);flex-wrap:wrap;align-items:center;gap:8px;margin:0;display:flex}.bWwFiW_relBlock{margin-top:12px}.bWwFiW_relBlock>h5{color:var(--dsw-alias-label-tertiary);margin:0 0 6px;font-size:12px;font-weight:500}.bWwFiW_relChips{flex-wrap:wrap;gap:6px;display:flex}.bWwFiW_relChip{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-base);border-radius:6px;padding:2px 8px;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:11px}.bWwFiW_timeline{margin:12px 0 0;padding:0 0 0 14px;list-style:none;position:relative}.bWwFiW_timeline:before{background:var(--dsw-alias-border-l2);content:"";width:1px;position:absolute;top:6px;bottom:6px;left:3px}.bWwFiW_timeline li{color:var(--dsw-alias-label-secondary);padding:5px 0 5px 12px;font-size:12px;line-height:1.6;position:relative}.bWwFiW_timeline li:before{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-brand-primary);content:"";border-radius:50%;width:7px;height:7px;position:absolute;top:10px;left:-14px}.bWwFiW_timeline time{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-tertiary);margin-right:8px}.bWwFiW_timeline b{color:var(--dsw-alias-label-primary);font-weight:500}.bWwFiW_editForm{flex-direction:column;display:flex}.bWwFiW_editForm .bWwFiW_input{box-sizing:border-box;width:100%}.bWwFiW_fieldLabel{color:var(--dsw-alias-label-secondary);margin:12px 0 5px;font-size:12px;display:block}.bWwFiW_editForm input[type=range]{accent-color:var(--dsw-alias-brand-primary)}.bWwFiW_modalFoot{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.bWwFiW_pager{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:12px;margin-top:18px;font-size:13px;display:flex}`,document.head.appendChild(e)}var o={empty:`bWwFiW_empty`,scopeTabs:`bWwFiW_scopeTabs`,item:`bWwFiW_item`,cardMeter:`bWwFiW_cardMeter`,modalFoot:`bWwFiW_modalFoot`,itemCheck:`bWwFiW_itemCheck`,button:`bWwFiW_button`,shimmer:`bWwFiW_shimmer`,expand:`bWwFiW_expand`,relChip:`bWwFiW_relChip`,scopeOn:`bWwFiW_scopeOn`,active:`bWwFiW_active`,barUp:`bWwFiW_barUp`,relChips:`bWwFiW_relChips`,editForm:`bWwFiW_editForm`,attrGrid:`bWwFiW_attrGrid`,input:`bWwFiW_input`,expandLoading:`bWwFiW_expandLoading`,forgotten:`bWwFiW_forgotten`,danger:`bWwFiW_danger`,relBlock:`bWwFiW_relBlock`,content:`bWwFiW_content`,rise:`bWwFiW_rise`,primary:`bWwFiW_primary`,panel:`bWwFiW_panel`,ops:`bWwFiW_ops`,batchBar:`bWwFiW_batchBar`,statusWrap:`bWwFiW_statusWrap`,conf:`bWwFiW_conf`,cardOn:`bWwFiW_cardOn`,timeline:`bWwFiW_timeline`,fieldLabel:`bWwFiW_fieldLabel`,card:`bWwFiW_card`,scopeTag:`bWwFiW_scopeTag`,meta:`bWwFiW_meta`,cards:`bWwFiW_cards`,pager:`bWwFiW_pager`,filters:`bWwFiW_filters`,meter:`bWwFiW_meter`,scopeOff:`bWwFiW_scopeOff`,row1:`bWwFiW_row1`,timeTag:`bWwFiW_timeTag`,redactedChip:`bWwFiW_redactedChip`,toolbar:`bWwFiW_toolbar`,itemSelected:`bWwFiW_itemSelected`,meterField:`bWwFiW_meterField`,skeleton:`bWwFiW_skeleton`,chip:`bWwFiW_chip`,archived:`bWwFiW_archived`};let s=[`fact`,`preference`,`decision`,`episode`,`skill`],c={active:`statusActive`,archived:`statusArchived`,forgotten:`statusForgotten`},l={fact:`kindFact`,preference:`kindPreference`,decision:`kindDecision`,episode:`kindEpisode`,skill:`kindSkill`},u={user:`scopeUser`,project:`scopeProject`},d={write:`opWrite`,update:`opUpdate`,forget:`opForget`,restore:`opRestore`,decay:`opDecay`,superseded:`opSuperseded`,"ingest-request":`opIngestRequest`,"distill-request":`opDistillRequest`},f={supersededBy:`relSupersededBy`,supersedes:`relSupersedes`,contradicts:`relContradicts`,related:`relRelated`},p={kind:`labelKind`,scope:`labelScope`,status:`labelStatus`};function m(e,t){let n=l[t];return n===void 0?t:e(n)}function h(e,t){let n=d[t];return n===void 0?t:e(n)}function g(e,t,n){if(n===null)return``;if(t!==`write`&&t!==`update`&&t!==`superseded`)return` ${n}`;try{let t=JSON.parse(n),r=Object.entries(t);return r.length===0?` ${n}`:` `+r.map(([t,n])=>{let r=p[t];return r===void 0?`${t}=${String(n)}`:t===`kind`&&typeof n==`string`?`${e(r)}=${m(e,n)}`:t===`scope`&&(n===`user`||n===`project`)?`${e(r)}=${e(u[n])}`:`${e(r)}=${String(n)}`}).join(` · `)}catch{return` ${n}`}}function _(e,t){if(t.sourceSessionId===null)return e(`sourceExplicit`);let n=`${t.sourceSessionId.slice(0,16)}…`;return e(`sourceSession`,{id:t.sourceRound===null?n:`${n} ${e(`round`,{n:t.sourceRound})}`})}async function v(e,t){let n=await fetch(`/api/engram/${e}`,t),r=await n.json();if(!n.ok)throw Error(r.error??`HTTP ${String(n.status)}`);return r}function y(e){return new Date(e).toLocaleString(navigator.language||`zh-CN`,{hour12:!1})}function b(e,t){let n=Math.max(0,Date.now()-t),r=Math.floor(n/6e4);if(r<1)return e(`timeJustNow`);if(r<60)return e(`timeMinutesAgo`,{n:r});let i=Math.floor(r/60);return i<48?e(`timeHoursAgo`,{n:i}):e(`timeDaysAgo`,{n:Math.floor(i/24)})}function x({value:e,conf:t}){return(0,i.jsx)(`span`,{className:t===!0?`${o.meter} ${o.conf}`:o.meter,children:(0,i.jsx)(`i`,{style:{width:`${String(Math.round(Math.min(1,Math.max(0,e))*100))}%`}})})}function S({ids:e}){return(0,i.jsx)(`div`,{className:o.relChips,children:e.map(e=>(0,i.jsx)(`span`,{className:o.relChip,title:e,children:e.slice(0,18)},e))})}function C({t:e,recordId:t,scope:n}){let[a,s]=(0,r.useState)(null),[l,u]=(0,r.useState)(null);if((0,r.useEffect)(()=>{let e=!1;return v(`review?scope=${n}&id=${encodeURIComponent(t)}`).then(t=>{e||s(t)}).catch(t=>{e||u(t.message)}),()=>{e=!0}},[t,n,e]),l!==null)return(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loadFailed`,{msg:l})});if(a===null)return(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loading`)});let{record:d}=a,p=[`supersededBy`,`supersedes`,`contradicts`,`related`].map(e=>({key:e,label:f[e],ids:a[e]??[]})).filter(e=>e.ids.length>0),b=a.operations??[];return(0,i.jsxs)(`div`,{children:[(0,i.jsxs)(`dl`,{className:o.attrGrid,children:[(0,i.jsx)(`dt`,{children:e(`labelContent`)}),(0,i.jsx)(`dd`,{children:d.content}),(0,i.jsx)(`dt`,{children:e(`labelKind`)}),(0,i.jsx)(`dd`,{children:(0,i.jsx)(`span`,{className:o.chip,children:m(e,d.kind)})}),(0,i.jsx)(`dt`,{children:e(`labelStatus`)}),(0,i.jsx)(`dd`,{children:(0,i.jsx)(`span`,{className:`${o.statusWrap} ${o[d.status]}`,children:e(c[d.status])})}),(0,i.jsx)(`dt`,{children:e(`importance`)}),(0,i.jsxs)(`dd`,{children:[d.importance.toFixed(2),(0,i.jsx)(x,{value:d.importance})]}),(0,i.jsx)(`dt`,{children:e(`confidence`)}),(0,i.jsxs)(`dd`,{children:[d.confidence.toFixed(2),(0,i.jsx)(x,{value:d.confidence,conf:!0})]}),(0,i.jsx)(`dt`,{children:e(`detailSource`)}),(0,i.jsx)(`dd`,{children:_(e,d)}),(0,i.jsx)(`dt`,{children:e(`labelCreated`)}),(0,i.jsx)(`dd`,{children:y(d.createdAt)})]}),p.map(({key:t,label:n,ids:r})=>(0,i.jsxs)(`div`,{className:o.relBlock,children:[(0,i.jsx)(`h5`,{children:n===void 0?t:e(n)}),(0,i.jsx)(S,{ids:r})]},t)),b.length>0&&(0,i.jsxs)(`div`,{className:o.relBlock,children:[(0,i.jsx)(`h5`,{children:e(`detailOperations`)}),(0,i.jsx)(`ul`,{className:o.timeline,children:b.map((t,n)=>(0,i.jsxs)(`li`,{children:[(0,i.jsx)(`time`,{children:y(t.at)}),(0,i.jsx)(`b`,{children:h(e,t.op)}),g(e,t.op,t.detail)]},n))})]})]})}function w({t:e,record:t,onClose:n,onSaved:a}){let[c,l]=(0,r.useState)(t.content),[u,d]=(0,r.useState)(t.kind),[f,p]=(0,r.useState)(t.importance);return(0,i.jsxs)(`div`,{className:o.editForm,children:[(0,i.jsx)(`label`,{className:o.fieldLabel,children:e(`labelContent`)}),(0,i.jsx)(`textarea`,{className:o.input,rows:3,value:c,onChange:e=>l(e.target.value)}),(0,i.jsx)(`label`,{className:o.fieldLabel,children:e(`labelKind`)}),(0,i.jsx)(`select`,{className:o.input,value:u,onChange:e=>d(e.target.value),children:s.map(t=>(0,i.jsx)(`option`,{value:t,children:m(e,t)},t))}),(0,i.jsx)(`label`,{className:o.fieldLabel,children:`${e(`importance`)} ${f.toFixed(2)}`}),(0,i.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:f,onChange:e=>p(Number(e.target.value))}),(0,i.jsxs)(`div`,{className:o.modalFoot,children:[(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:n,children:e(`cancel`)}),(0,i.jsx)(`button`,{type:`button`,className:`${o.button} ${o.primary}`,onClick:()=>{v(`update`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,scope:t.scope,content:c,kind:u,importance:f})}).then(a).catch(e=>{alert(e.message)})},children:e(`saveWithHint`)})]})]})}function T({t:e}){let[t,n]=(0,r.useState)(`user`),[a,l]=(0,r.useState)(`all`),[d,f]=(0,r.useState)(`all`),[p,h]=(0,r.useState)(`all`),[g,S]=(0,r.useState)(``),[T,E]=(0,r.useState)(0),[D,O]=(0,r.useState)(null),[k,A]=(0,r.useState)(null),[j,M]=(0,r.useState)(null),[N,P]=(0,r.useState)(null),[F,I]=(0,r.useState)(0),[L,R]=(0,r.useState)(new Set),[z,B]=(0,r.useState)(!1),V=(0,r.useCallback)(()=>{I(e=>e+1)},[]);(0,r.useEffect)(()=>{let e=!1,n=new URLSearchParams({scope:t,status:a,kind:d,redacted:p,limit:`20`,offset:String(T)});return g!==``&&n.set(`q`,g),v(`list?${n.toString()}`).then(t=>{e||(O(t),M(null))}).catch(t=>{e||M(t.message)}),v(`stats`).then(t=>{e||A(t.parts)}).catch(()=>{}),()=>{e=!0}},[t,a,d,p,g,T,F]);let H=(e,t)=>{v(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,scope:t.scope})}).then(V).catch(e=>{alert(e.message)})},U=(e,t)=>{P(n=>n!==null&&n.kind===e&&n.record.id===t.id?null:{kind:e,record:t})},W=D?.records??[],G=W.filter(e=>L.has(e.id)),K=G.filter(e=>e.status===`active`).length,q=G.length-K,J=W.length>0&&W.every(e=>L.has(e.id)),Y=e=>{R(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},X=()=>{R(new Set),B(!1)},Z=()=>{R(e=>{let t=new Set(e);return J?W.forEach(e=>t.delete(e.id)):W.forEach(e=>t.add(e.id)),t})},Q=e=>{let t=e===`forget`?G.filter(e=>e.status===`active`):G.filter(e=>e.status!==`active`);t.length!==0&&Promise.allSettled(t.map(t=>v(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,scope:t.scope})}))).then(()=>{X(),V()})},$=()=>{if(z){Q(`forget`);return}B(!0)},ee=Math.floor(T/20)+1,te=D===null?1:Math.max(1,Math.ceil(D.total/20));return(0,i.jsxs)(`div`,{className:o.panel,children:[(0,i.jsxs)(`div`,{className:o.toolbar,children:[(0,i.jsx)(`div`,{className:o.scopeTabs,children:[`user`,`project`].map(r=>(0,i.jsx)(`button`,{type:`button`,className:t===r?o.scopeOn:o.scopeOff,onClick:()=>{n(r),E(0),P(null),X()},children:e(u[r])},r))}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:V,children:e(`refresh`)}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{location.href=`/api/engram/export?scope=${t}&format=markdown`},children:e(`exportMd`)}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{location.href=`/api/engram/export?scope=${t}&format=json`},children:e(`exportJson`)})]}),(0,i.jsx)(`div`,{className:o.cards,children:(k??[]).map(r=>(0,i.jsxs)(`button`,{type:`button`,className:r.scope===t?`${o.card} ${o.cardOn}`:o.card,onClick:()=>{n(r.scope),E(0),X()},children:[(0,i.jsx)(`b`,{children:r.stats.total}),(0,i.jsx)(`span`,{children:`${e(u[r.scope])} · ${e(`cardActive`,{n:r.stats.active})} · ${e(`signalRatio`,{n:Math.round(r.stats.signalRatio*100)})}`}),(0,i.jsx)(`span`,{className:o.cardMeter,children:(0,i.jsx)(`i`,{style:{width:`${String(Math.round(r.stats.signalRatio*100))}%`}})})]},r.scope))}),(0,i.jsxs)(`div`,{className:o.filters,children:[(0,i.jsxs)(`select`,{className:o.input,value:a,onChange:e=>{l(e.target.value),E(0),P(null),X()},children:[(0,i.jsx)(`option`,{value:`all`,children:e(`allStatuses`)}),(0,i.jsx)(`option`,{value:`active`,children:e(`statusActive`)}),(0,i.jsx)(`option`,{value:`archived`,children:e(`statusArchived`)}),(0,i.jsx)(`option`,{value:`forgotten`,children:e(`statusForgotten`)})]}),(0,i.jsxs)(`select`,{className:o.input,value:d,onChange:e=>{f(e.target.value),E(0),P(null),X()},children:[(0,i.jsx)(`option`,{value:`all`,children:e(`allKinds`)}),s.map(t=>(0,i.jsx)(`option`,{value:t,children:m(e,t)},t))]}),(0,i.jsxs)(`select`,{className:o.input,value:p,onChange:e=>{h(e.target.value),E(0),P(null),X()},children:[(0,i.jsx)(`option`,{value:`all`,children:e(`redactedAll`)}),(0,i.jsx)(`option`,{value:`true`,children:e(`redactedOnly`)}),(0,i.jsx)(`option`,{value:`false`,children:e(`redactedNone`)})]}),(0,i.jsx)(`input`,{className:o.input,placeholder:e(`searchPlaceholder`),value:g,onChange:e=>{S(e.target.value.trim()),E(0),P(null),X()}})]}),L.size>0&&(0,i.jsxs)(`div`,{className:o.batchBar,children:[(0,i.jsx)(`span`,{children:e(`selectedCount`,{n:L.size})}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:Z,children:e(J?`deselectAll`:`selectAll`)}),(0,i.jsx)(`button`,{type:`button`,className:o.button,disabled:q===0,onClick:()=>Q(`restore`),children:e(`batchRestore`,{n:q})}),(0,i.jsx)(`button`,{type:`button`,className:z?`${o.button} ${o.danger}`:o.button,disabled:K===0,onClick:$,children:e(z?`batchForgetConfirm`:`batchForget`,{n:K})}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:X,children:e(`clearSelection`)})]}),j!==null&&(0,i.jsx)(`div`,{className:o.empty,children:e(`loadFailed`,{msg:j})}),j===null&&D===null&&[0,1,2].map(e=>(0,i.jsxs)(`div`,{className:o.skeleton,children:[(0,i.jsx)(`i`,{}),(0,i.jsx)(`i`,{}),(0,i.jsx)(`i`,{})]},e)),j===null&&D!==null&&D.records.length===0&&(0,i.jsx)(`div`,{className:o.empty,children:e(`empty`)}),(D?.records??[]).map((t,n)=>(0,i.jsxs)(`div`,{className:L.has(t.id)?`${o.item} ${o.itemSelected}`:o.item,style:{animationDelay:`${String(Math.min(n,12)*28)}ms`},children:[(0,i.jsxs)(`div`,{className:o.row1,children:[(0,i.jsx)(`input`,{type:`checkbox`,className:o.itemCheck,checked:L.has(t.id),"aria-label":t.content.slice(0,24),onChange:()=>Y(t.id)}),(0,i.jsx)(`span`,{className:`${o.statusWrap} ${o[t.status]}`,children:e(c[t.status])}),(0,i.jsx)(`span`,{className:o.chip,children:m(e,t.kind)}),t.content.includes(`[REDACTED:`)&&(0,i.jsx)(`span`,{className:`${o.chip} ${o.redactedChip}`,children:e(`tagRedacted`)}),(0,i.jsx)(`span`,{className:o.scopeTag,children:e(u[t.scope])}),(0,i.jsx)(`span`,{className:o.timeTag,title:y(t.createdAt),children:b(e,t.createdAt)})]}),(0,i.jsx)(`div`,{className:o.content,children:t.content}),(0,i.jsxs)(`div`,{className:o.meta,children:[(0,i.jsxs)(`span`,{className:o.meterField,children:[e(`importance`),(0,i.jsx)(x,{value:t.importance}),t.importance.toFixed(2)]}),(0,i.jsxs)(`span`,{className:o.meterField,children:[e(`confidence`),(0,i.jsx)(x,{value:t.confidence,conf:!0}),t.confidence.toFixed(2)]}),(0,i.jsx)(`span`,{children:e(`accessCount`,{n:t.accessCount})}),(0,i.jsx)(`span`,{children:_(e,t)})]}),(0,i.jsxs)(`div`,{className:o.ops,children:[(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{U(`review`,t)},children:e(`detail`)}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{U(`edit`,t)},children:e(`edit`)}),t.status===`active`?(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{H(`forget`,t)},children:e(`forget`)}):(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{H(`restore`,t)},children:e(`restore`)})]}),N!==null&&N.record.id===t.id&&(0,i.jsx)(`div`,{className:o.expand,children:N.kind===`review`?(0,i.jsx)(C,{t:e,recordId:t.id,scope:t.scope}):(0,i.jsx)(w,{t:e,record:t,onClose:()=>{P(null)},onSaved:()=>{P(null),V()}})})]},t.id)),(0,i.jsxs)(`div`,{className:o.pager,children:[(0,i.jsx)(`button`,{type:`button`,className:o.button,disabled:T===0,onClick:()=>{E(Math.max(0,T-20)),P(null),X()},children:e(`prevPage`)}),(0,i.jsx)(`span`,{children:e(`pagerInfo`,{page:ee,pages:te,total:D?.total??0})}),(0,i.jsx)(`button`,{type:`button`,className:o.button,disabled:D===null||T+20>=D.total,onClick:()=>{E(T+20),P(null),X()},children:e(`nextPage`)})]})]})}let E=`engram`,D={nav:`记忆库`,scopeUser:`用户级`,scopeProject:`项目级`,refresh:`刷新`,exportMd:`导出 MD`,exportJson:`导出 JSON`,allStatuses:`全部状态`,allKinds:`全部种类`,redactedAll:`全部脱敏`,redactedOnly:`含脱敏标记`,redactedNone:`无脱敏标记`,tagRedacted:`已脱敏`,searchPlaceholder:`按内容搜索…`,statusActive:`生效中`,statusArchived:`已归档`,statusForgotten:`已遗忘`,kindFact:`事实`,kindPreference:`偏好`,kindDecision:`决策`,kindEpisode:`事件`,kindSkill:`技能`,labelContent:`内容`,labelKind:`种类`,labelStatus:`状态`,labelScope:`作用域`,importance:`重要性`,confidence:`置信`,accessCount:`访问 {n} 次`,labelCreated:`创建时间`,timeJustNow:`刚刚`,timeMinutesAgo:`{n} 分钟前`,timeHoursAgo:`{n} 小时前`,timeDaysAgo:`{n} 天前`,sourceExplicit:`显式保存`,sourceSession:`来源 {id}`,round:`第 {n} 轮`,cardActive:`生效 {n}`,signalRatio:`信噪比 {n}%`,detail:`详情`,edit:`编辑`,forget:`遗忘`,restore:`恢复`,empty:`没有符合条件的记忆`,loadFailed:`加载失败:{msg}`,loading:`加载中…`,pagerInfo:`第 {page} / {pages} 页 · 共 {total} 条`,prevPage:`上一页`,nextPage:`下一页`,cancel:`取消`,saveWithHint:`保存(旧条目归档)`,detailAttributes:`属性`,detailSource:`来源`,detailRelations:`关系`,detailOperations:`最近操作`,relSupersededBy:`被取代`,relSupersedes:`取代`,relContradicts:`矛盾`,relRelated:`关联`,opWrite:`写入`,opUpdate:`更新`,opForget:`遗忘`,opRestore:`恢复`,opDecay:`衰减归档`,opSuperseded:`被取代`,opIngestRequest:`摄取请求`,opDistillRequest:`蒸馏请求`,selectAll:`全选本页`,deselectAll:`取消全选`,selectedCount:`已选 {n} 条`,batchForget:`批量遗忘({n})`,batchForgetConfirm:`确认遗忘 {n} 条?`,batchRestore:`批量恢复({n})`,clearSelection:`取消选择`},O={nav:`Memory Library`,scopeUser:`User`,scopeProject:`Project`,refresh:`Refresh`,exportMd:`Export MD`,exportJson:`Export JSON`,allStatuses:`All statuses`,allKinds:`All kinds`,redactedAll:`All redaction`,redactedOnly:`Redacted only`,redactedNone:`Not redacted`,tagRedacted:`redacted`,searchPlaceholder:`Search content…`,statusActive:`active`,statusArchived:`archived`,statusForgotten:`forgotten`,kindFact:`fact`,kindPreference:`preference`,kindDecision:`decision`,kindEpisode:`episode`,kindSkill:`skill`,labelContent:`Content`,labelKind:`Kind`,labelStatus:`Status`,labelScope:`Scope`,importance:`Importance`,confidence:`Confidence`,accessCount:`{n}× accessed`,labelCreated:`Created`,timeJustNow:`just now`,timeMinutesAgo:`{n} min ago`,timeHoursAgo:`{n} hr ago`,timeDaysAgo:`{n} d ago`,sourceExplicit:`Explicitly saved`,sourceSession:`Source {id}`,round:`round {n}`,cardActive:`{n} active`,signalRatio:`signal {n}%`,detail:`Details`,edit:`Edit`,forget:`Forget`,restore:`Restore`,empty:`No matching memories`,loadFailed:`Failed to load: {msg}`,loading:`Loading…`,pagerInfo:`Page {page} / {pages} · {total} records`,prevPage:`Prev`,nextPage:`Next`,cancel:`Cancel`,saveWithHint:`Save (archives old entry)`,detailAttributes:`Attributes`,detailSource:`Source`,detailRelations:`Relations`,detailOperations:`Recent operations`,relSupersededBy:`Superseded by`,relSupersedes:`Supersedes`,relContradicts:`Contradicts`,relRelated:`Related`,opWrite:`write`,opUpdate:`update`,opForget:`forget`,opRestore:`restore`,opDecay:`decay`,opSuperseded:`superseded`,opIngestRequest:`ingest-request`,opDistillRequest:`distill-request`,selectAll:`Select all on page`,deselectAll:`Deselect all`,selectedCount:`{n} selected`,batchForget:`Forget selected ({n})`,batchForgetConfirm:`Forget {n} entries?`,batchRestore:`Restore selected ({n})`,clearSelection:`Clear selection`},k=[`slots`,`locale`];function A(e){e.effect(()=>e.locale.register(E,{zh:D,en:O}),`dsh-engram: dictionaries`);let t=e.locale.bind(E);e.slots.inject(`settings.section`,()=>e.slots.register({name:`settings.section`,id:`engram`,order:20,label:()=>t(`nav`),locale:E},T))}return n.apply=A,n.inject=k,t.exports}});
|
|
1
|
+
window.__ModuleLoader__.load({id:`@kenz1117/dsh-engram`,factory:e=>{var t={exports:{}},n=t.exports;Object.defineProperty(n,Symbol.toStringTag,{value:`Module`});let r=e("react"),i=e("react/jsx-runtime"),a=`@kenz1117/dsh-engram/panel.module.css`;if(typeof document<`u`&&document.querySelector(`style[data-plugin-css=`+JSON.stringify(a)+`]`)===null){let e=document.createElement(`style`);e.dataset.plugin=`@kenz1117/dsh-engram`,e.dataset.pluginCss=a,e.textContent=`:root{--ease-spring:cubic-bezier(.32, .72, 0, 1);--ease-out:cubic-bezier(.16, 1, .3, 1);--ease-in-out:cubic-bezier(.65, 0, .35, 1);--dur-fast:.14s;--dur-base:.22s;--dur-slow:.36s;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--radius-control:8px;--radius-card:12px;--fs-micro:11px;--fs-body:12px;--fs-ctrl:13px;--fs-display:14px;--fs-tag:10px}.bWwFiW_panel{max-width:1240px;animation:bWwFiW_panelIn var(--dur-slow) var(--ease-out) both;margin:0 auto;position:relative}@keyframes bWwFiW_panelIn{0%{opacity:0;filter:blur(2px);transform:translateY(6px)}to{opacity:1;filter:blur();transform:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.bWwFiW_header{justify-content:space-between;align-items:center;gap:var(--space-5);row-gap:var(--space-2);margin-bottom:var(--space-5);flex-wrap:wrap;display:flex}.bWwFiW_headerBrand{align-items:center;gap:var(--space-3);flex:1;min-width:0;display:flex}.bWwFiW_headerLogo{border-radius:var(--radius-control);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, var(--dsw-alias-bg-layer-1));border:1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 30%, var(--dsw-alias-border-l2));width:36px;height:36px;color:var(--dsw-alias-brand-primary);transition:transform var(--dur-base) var(--ease-spring), background var(--dur-base) var(--ease-spring);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.bWwFiW_headerLogo:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, var(--dsw-alias-bg-layer-1));transform:rotate(-6deg)}.bWwFiW_headerLogo svg{transition:transform var(--dur-slow) var(--ease-spring);display:block}.bWwFiW_headerLogo:hover svg{transform:rotate(6deg)}.bWwFiW_headerTitle{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}.bWwFiW_headerTitle h2{letter-spacing:-.01em;color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:16px;font-weight:600;overflow:hidden}.bWwFiW_headerTitle p{font-size:var(--fs-body);color:var(--dsw-alias-label-tertiary);margin:0;line-height:1.5}.bWwFiW_headerActions{gap:var(--space-2);flex-shrink:0;align-items:center;display:flex}.bWwFiW_tabs{align-items:flex-end;gap:var(--space-5);border-bottom:1px solid var(--dsw-alias-border-l2);margin-bottom:var(--space-4);display:flex;position:relative}.bWwFiW_tabs:after{content:"";background:var(--dsw-alias-border-l2);height:1px;position:absolute;bottom:-1px;left:0;right:0}.bWwFiW_tabItem{padding:var(--space-2) 0 var(--space-3);color:var(--dsw-alias-label-tertiary);font-size:var(--fs-ctrl);cursor:pointer;transition:color var(--dur-fast) var(--ease-spring);background:0 0;border:0;font-weight:500;position:relative}.bWwFiW_tabItem:hover{color:var(--dsw-alias-label-secondary)}.bWwFiW_tabItem.bWwFiW_on{color:var(--dsw-alias-label-primary)}.bWwFiW_tabItem.bWwFiW_on:after{content:"";background:var(--dsw-alias-brand-primary);height:2px;animation:bWwFiW_tabUnderline var(--dur-base) var(--ease-spring) both;border-radius:2px 2px 0 0;position:absolute;bottom:-1px;left:0;right:0}@keyframes bWwFiW_tabUnderline{0%{opacity:0;transform:scaleX(.4)}to{opacity:1;transform:scaleX(1)}}.bWwFiW_tabItem small{margin-left:var(--space-2);font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.bWwFiW_tabPanel{animation:bWwFiW_fadeSoft var(--dur-base) var(--ease-spring) both}.bWwFiW_drawerScrim{background:color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent);border-radius:inherit;z-index:40;animation:bWwFiW_scrimIn var(--dur-base) var(--ease-spring) both;position:absolute;inset:0}@keyframes bWwFiW_scrimIn{0%{opacity:0}to{opacity:1}}.bWwFiW_drawer{background:var(--dsw-alias-bg-base);border-left:1px solid var(--dsw-alias-border-l2);width:100%;box-shadow:-16px 0 40px -16px color-mix(in srgb, var(--dsw-alias-label-primary) 25%, transparent);z-index:41;animation:bWwFiW_drawerIn var(--dur-slow) var(--ease-spring) both;border-radius:inherit;flex-direction:column;display:flex;position:absolute;top:0;bottom:0;right:0;overflow:hidden}@keyframes bWwFiW_drawerIn{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:none}}.bWwFiW_drawerHead{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--dsw-alias-border-l2);flex-shrink:0;display:flex}.bWwFiW_drawerTitle{align-items:baseline;gap:var(--space-2);flex:1;min-width:0;display:flex}.bWwFiW_drawerTitle h3{font-size:var(--fs-display);color:var(--dsw-alias-label-primary);margin:0;font-weight:600}.bWwFiW_drawerTitle span{font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:240px;font-family:ui-monospace,SF Mono,Menlo,monospace;overflow:hidden}.bWwFiW_drawerClose{border-radius:var(--radius-control);width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;transition:background var(--dur-fast) var(--ease-spring), color var(--dur-fast) var(--ease-spring), border-color var(--dur-fast) var(--ease-spring);background:0 0;border:1px solid #0000;justify-content:center;align-items:center;display:inline-flex}.bWwFiW_drawerClose:hover{background:var(--dsw-alias-fill-tsp-secondary);border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary)}.bWwFiW_drawerClose svg{display:block}.bWwFiW_drawerBody{min-height:0;padding:var(--space-4);flex:1;overflow-y:auto}.bWwFiW_reviewGrid{gap:var(--space-5);grid-template-columns:minmax(0,1fr) minmax(0,1fr);display:grid}@media (width<=720px){.bWwFiW_reviewGrid{grid-template-columns:1fr}}.bWwFiW_button{height:28px;padding:0 var(--space-3);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--radius-control);cursor:pointer;font-size:var(--fs-body);transition:color var(--dur-fast) var(--ease-spring), border-color var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-spring), transform 80ms var(--ease-spring);justify-content:center;align-items:center;gap:5px;line-height:1;display:inline-flex}.bWwFiW_button:hover{color:var(--dsw-alias-label-primary);border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 55%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-brand-primary) 5%, var(--dsw-alias-bg-layer-1))}.bWwFiW_button:active{transform:scale(.96)}.bWwFiW_button:disabled{opacity:.45;cursor:default;transform:none}.bWwFiW_button.bWwFiW_danger{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 35%, var(--dsw-alias-border-l2))}.bWwFiW_button.bWwFiW_danger:hover{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 6%, var(--dsw-alias-bg-layer-1))}.bWwFiW_button.bWwFiW_primary{background:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary-foreground)}.bWwFiW_button.bWwFiW_primary:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, transparent);border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, transparent);color:var(--dsw-alias-label-primary-foreground);filter:brightness(1.05)}.bWwFiW_button.bWwFiW_primary:disabled{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);opacity:.6;border-color:#0000}.bWwFiW_input{background:var(--dsw-alias-bg-layer-1);height:28px;color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);transition:border-color var(--dur-fast) var(--ease-spring), box-shadow var(--dur-fast) var(--ease-spring);border-radius:8px;padding:0 10px;font-size:12px;line-height:1}.bWwFiW_input::placeholder{color:var(--dsw-alias-label-tertiary)}.bWwFiW_input:hover{border-color:color-mix(in srgb, var(--dsw-alias-label-primary) 22%, var(--dsw-alias-border-l2))}.bWwFiW_input:focus-visible{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, transparent);outline:none}.bWwFiW_search{flex:1;min-width:120px}select.bWwFiW_input{appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--dsw-alias-label-tertiary) 50%), linear-gradient(135deg, var(--dsw-alias-label-tertiary) 50%, transparent 50%);transition:background-position var(--dur-fast) var(--ease-spring);background-position:calc(100% - 13px) 12px,calc(100% - 8px) 12px;background-repeat:no-repeat;background-size:5px 5px;padding-right:24px}.bWwFiW_segGroup{background:var(--dsw-alias-fill-tsp-secondary);border-radius:9px;gap:2px;padding:2px;display:inline-flex;position:relative}.bWwFiW_segItem{height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;font-size:var(--fs-body);transition:color var(--dur-fast) var(--ease-spring), transform 80ms var(--ease-spring);z-index:1;white-space:nowrap;background:0 0;border:0;border-radius:7px;align-items:center;padding:0 12px;line-height:1;display:inline-flex;position:relative}.bWwFiW_segItem:hover{color:var(--dsw-alias-label-secondary)}.bWwFiW_segItem:active{transform:scale(.96)}.bWwFiW_segItem.bWwFiW_on{color:var(--dsw-alias-label-primary)}.bWwFiW_segIndicator{z-index:0;background:var(--dsw-alias-bg-layer-1);box-shadow:0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 10%, transparent), inset 0 0 0 1px color-mix(in srgb, var(--dsw-alias-border-l2) 60%, transparent);transition:left var(--dur-base) var(--ease-spring), width var(--dur-base) var(--ease-spring), opacity var(--dur-fast) var(--ease-spring);pointer-events:none;border-radius:7px;position:absolute;top:2px;bottom:2px}.bWwFiW_segScope{border-radius:10px;padding:3px}.bWwFiW_layout{gap:var(--space-5);grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;display:grid}.bWwFiW_mainCol{gap:var(--space-4);flex-direction:column;min-width:0;display:flex}.bWwFiW_sideCol{gap:var(--space-4);min-width:0;top:var(--space-3);flex-direction:column;display:flex;position:sticky}@media (width<=960px){.bWwFiW_layout{gap:var(--space-4);grid-template-columns:1fr}.bWwFiW_sideCol{position:static}.bWwFiW_teleBar{flex-wrap:wrap}}.bWwFiW_filters{gap:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}.bWwFiW_filters .bWwFiW_segGroup{flex:none}.bWwFiW_filters .bWwFiW_search{flex:1;min-width:160px}.bWwFiW_exportWrap{display:inline-flex;position:relative}.bWwFiW_exportCaret{opacity:.7;transition:transform var(--dur-fast) var(--ease-spring);margin-left:4px;font-size:9px}.bWwFiW_exportWrap button[aria-expanded=true] .bWwFiW_exportCaret{transform:rotate(180deg)}.bWwFiW_exportMenu{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);min-width:220px;box-shadow:0 8px 24px -10px color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);z-index:30;animation:bWwFiW_drawerIn var(--dur-base) var(--ease-spring) both;border-radius:10px;padding:4px;position:absolute;top:calc(100% + 4px);right:0}.bWwFiW_exportItem{color:var(--dsw-alias-label-primary);transition:background var(--dur-fast) var(--ease-spring);border-radius:7px;flex-direction:column;gap:2px;padding:8px 10px;text-decoration:none;display:flex}.bWwFiW_exportItem:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 8%, var(--dsw-alias-bg-layer-1))}.bWwFiW_exportItemLabel{font-size:13px;font-weight:500;line-height:1.2}.bWwFiW_exportItemHint{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.3}.bWwFiW_batchBar{bottom:var(--space-3);z-index:5;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 88%, transparent);-webkit-backdrop-filter:blur(10px);border:1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, var(--dsw-alias-border-l2));border-radius:var(--radius-card);box-shadow:0 8px 24px -12px color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);animation:bWwFiW_barUp var(--dur-base) var(--ease-spring) both;flex-wrap:wrap;align-items:center;display:flex;position:sticky}@keyframes bWwFiW_barUp{0%{opacity:0;transform:translateY(12px)scale(.98)}to{opacity:1;transform:none}}.bWwFiW_batchBar>span{color:var(--dsw-alias-label-primary);font-size:var(--fs-body);font-variant-numeric:tabular-nums;margin-right:auto}.bWwFiW_batchBar .bWwFiW_button{height:26px;padding:0 var(--space-2);font-size:var(--fs-micro)}.bWwFiW_itemList{gap:var(--space-2);flex-direction:column;display:flex}.bWwFiW_item{gap:var(--space-3);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--radius-control);padding:var(--space-2) var(--space-3);transform-origin:top;transition:border-color var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-spring), transform var(--dur-fast) var(--ease-spring), box-shadow var(--dur-base) var(--ease-spring);animation:bWwFiW_itemIn var(--dur-base) var(--ease-spring) both;grid-template-columns:24px minmax(0,1fr) auto;align-items:start;display:grid}@keyframes bWwFiW_itemIn{0%{opacity:0;transform:translateY(4px)scale(.995)}to{opacity:1;transform:none}}.bWwFiW_item:hover{border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, var(--dsw-alias-border-l2));box-shadow:0 4px 14px -8px color-mix(in srgb, var(--dsw-alias-brand-primary) 30%, transparent);transform:translateY(-1px)}.bWwFiW_item.bWwFiW_selected{border-color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 4%, var(--dsw-alias-bg-layer-1))}.bWwFiW_itemCheck{width:14px;height:14px;accent-color:var(--dsw-alias-brand-primary);cursor:pointer;transition:transform 80ms var(--ease-spring);margin-top:3px}.bWwFiW_itemCheck:active{transform:scale(.85)}.bWwFiW_itemBody{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}.bWwFiW_itemTags{gap:var(--space-1);flex-wrap:wrap;align-items:center;display:flex}.bWwFiW_content{white-space:pre-wrap;word-break:break-word;color:var(--dsw-alias-label-primary);font-size:var(--fs-ctrl);-webkit-line-clamp:4;-webkit-box-orient:vertical;line-height:1.65;display:-webkit-box;overflow:hidden}.bWwFiW_itemMeta{gap:var(--space-2);font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;display:flex}.bWwFiW_itemMeta b{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-weight:500}.bWwFiW_itemOps{gap:var(--space-1);flex-direction:column;flex-shrink:0;align-items:stretch;display:flex}.bWwFiW_itemOps .bWwFiW_button{height:24px;padding:0 var(--space-2);font-size:var(--fs-micro)}.bWwFiW_pill{height:18px;font-size:var(--fs-tag);background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 14%, transparent);color:var(--dsw-alias-label-secondary);white-space:nowrap;animation:bWwFiW_pillIn var(--dur-base) var(--ease-spring) both;transition:transform var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-spring);border-radius:999px;align-items:center;padding:0 7px;line-height:1;display:inline-flex}@keyframes bWwFiW_pillIn{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:none}}.bWwFiW_pill:hover{transform:translateY(-1px)}.bWwFiW_pill.bWwFiW_kind{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent);color:var(--dsw-alias-brand-primary)}.bWwFiW_pill.bWwFiW_statusActive{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);color:var(--dsw-alias-state-success-primary)}.bWwFiW_pill.bWwFiW_statusArchived{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);color:var(--dsw-alias-state-warn-primary)}.bWwFiW_pill.bWwFiW_statusForgotten{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);color:var(--dsw-alias-state-error-primary)}.bWwFiW_pill.bWwFiW_outcomeSuccess{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);color:var(--dsw-alias-state-success-primary)}.bWwFiW_pill.bWwFiW_outcomeFailure{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);color:var(--dsw-alias-state-error-primary)}.bWwFiW_pill.bWwFiW_redacted{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);color:var(--dsw-alias-state-warn-primary)}.bWwFiW_expand{border-top:1px dashed var(--dsw-alias-border-l2);animation:bWwFiW_expandIn var(--dur-slow) var(--ease-spring) both;grid-column:1/-1;margin-top:4px;padding-top:10px;overflow:hidden}@keyframes bWwFiW_expandIn{0%{opacity:0;max-height:0;transform:translateY(-4px)}to{opacity:1;max-height:1200px;transform:none}}.bWwFiW_expandLoading{color:var(--dsw-alias-label-tertiary);animation:bWwFiW_fadeSoft var(--dur-base) var(--ease-spring) both;padding:6px 0;font-size:12px}@keyframes bWwFiW_fadeSoft{0%{opacity:0}to{opacity:1}}.bWwFiW_attrGrid{grid-template-columns:max-content 1fr;align-items:center;gap:6px 14px;font-size:12px;display:grid}.bWwFiW_attrGrid>dt{color:var(--dsw-alias-label-tertiary);margin:0;font-size:11px}.bWwFiW_attrGrid>dd{color:var(--dsw-alias-label-primary);flex-wrap:wrap;align-items:center;gap:6px;margin:0;display:flex}.bWwFiW_relBlock{margin-top:10px}.bWwFiW_relBlock>h5{color:var(--dsw-alias-label-tertiary);letter-spacing:.04em;text-transform:uppercase;margin:0 0 4px;font-size:11px;font-weight:500}.bWwFiW_relChips{flex-wrap:wrap;gap:4px;display:flex}.bWwFiW_relChip{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-base);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;max-width:100%;padding:2px 6px;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:10px;overflow:hidden}.bWwFiW_timeline{margin:var(--space-2) 0 0;padding:0 0 0 var(--space-3);list-style:none;position:relative}.bWwFiW_timeline:before{background:var(--dsw-alias-border-l2);content:"";width:1px;position:absolute;top:6px;bottom:6px;left:3px}.bWwFiW_timeline li{padding:var(--space-1) 0 var(--space-1) var(--space-3);font-size:var(--fs-micro);color:var(--dsw-alias-label-secondary);line-height:1.55;position:relative}.bWwFiW_timeline li:before{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-brand-primary);content:"";border-radius:50%;width:6px;height:6px;position:absolute;top:8px;left:-10px}.bWwFiW_editForm{flex-direction:column;gap:10px;display:flex}.bWwFiW_editForm .bWwFiW_input{box-sizing:border-box;width:100%}.bWwFiW_editForm textarea.bWwFiW_input{resize:vertical;height:auto;min-height:64px;padding:8px 10px;line-height:1.55}.bWwFiW_fieldLabel{color:var(--dsw-alias-label-secondary);margin-bottom:4px;font-size:11px;display:block}.bWwFiW_fieldRow{flex-wrap:wrap;align-items:flex-start;gap:12px;display:flex}.bWwFiW_fieldRow .bWwFiW_fieldLabel{flex:1;min-width:120px}.bWwFiW_fieldRow input[type=range]{accent-color:var(--dsw-alias-brand-primary);width:100%}.bWwFiW_modalFoot{justify-content:flex-end;gap:8px;margin-top:6px;display:flex}.bWwFiW_pager{gap:var(--space-3);margin-top:var(--space-4);padding:var(--space-1) 0;color:var(--dsw-alias-label-secondary);font-size:var(--fs-body);font-variant-numeric:tabular-nums;animation:bWwFiW_fadeSoft var(--dur-base) var(--ease-spring) both;justify-content:center;align-items:center;display:flex}.bWwFiW_pager .bWwFiW_button{width:28px;transition:transform var(--dur-fast) var(--ease-spring), opacity var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-spring);padding:0}.bWwFiW_pager .bWwFiW_button:not(:disabled):hover{transform:translateY(-1px)}.bWwFiW_pager .bWwFiW_button:disabled{opacity:.3}.bWwFiW_skeletonList{gap:var(--space-2);flex-direction:column;display:flex}.bWwFiW_skeleton{border-radius:var(--radius-control);border:1px solid var(--dsw-alias-border-l2);padding:var(--space-2) var(--space-3);background:var(--dsw-alias-bg-layer-1);gap:var(--space-2);animation:bWwFiW_itemIn var(--dur-base) var(--ease-spring) both;flex-direction:column;display:flex}.bWwFiW_skeleton i{background:linear-gradient(90deg, color-mix(in srgb, var(--dsw-alias-label-tertiary) 10%, transparent) 25%, color-mix(in srgb, var(--dsw-alias-label-tertiary) 22%, transparent) 50%, color-mix(in srgb, var(--dsw-alias-label-tertiary) 10%, transparent) 75%);background-size:200% 100%;border-radius:4px;height:10px;animation:1.6s linear infinite bWwFiW_shimmer;display:block}.bWwFiW_skeleton i:first-child{width:30%}.bWwFiW_skeleton i:nth-child(2){width:80%;animation-delay:80ms}.bWwFiW_skeleton i:last-child{width:55%;animation-delay:.16s}@keyframes bWwFiW_shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.bWwFiW_empty{text-align:center;color:var(--dsw-alias-label-secondary);font-size:var(--fs-ctrl);animation:bWwFiW_fadeSoft var(--dur-slow) var(--ease-spring) both;padding:56px 16px}.bWwFiW_empty b{color:var(--dsw-alias-label-primary);font-size:var(--fs-display);margin-bottom:var(--space-1);font-weight:500;display:block}.bWwFiW_empty span{color:var(--dsw-alias-label-tertiary);font-size:var(--fs-body)}.bWwFiW_empty:before{content:"";border:1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 35%, var(--dsw-alias-border-l2));background:linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, transparent), transparent 70%);width:36px;height:36px;animation:bWwFiW_floaty 6s var(--ease-in-out) infinite;border-radius:10px;margin:0 auto 14px;display:block}@keyframes bWwFiW_floaty{0%,to{transform:translateY(0)rotate(0)}50%{transform:translateY(-3px)rotate(2deg)}}.bWwFiW_panelCard{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--radius-card);padding:var(--space-4);animation:bWwFiW_cardIn var(--dur-slow) var(--ease-spring) both;transition:border-color var(--dur-base) var(--ease-spring);position:relative}@keyframes bWwFiW_cardIn{0%{opacity:0;transform:scale(.99)}to{opacity:1;transform:none}}.bWwFiW_panelCard:hover{border-color:color-mix(in srgb, var(--dsw-alias-label-primary) 18%, var(--dsw-alias-border-l2))}.bWwFiW_panelCard+.bWwFiW_panelCard{animation-delay:60ms}.bWwFiW_panelCardTitle{justify-content:space-between;align-items:center;gap:var(--space-2);margin:0 0 var(--space-3);padding-left:var(--space-3);border-left:2px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 60%, var(--dsw-alias-border-l2));font-size:var(--fs-body);letter-spacing:-.005em;color:var(--dsw-alias-label-primary);font-weight:600;display:flex}.bWwFiW_panelCardTitle h4{font-size:inherit;font-weight:inherit;margin:0}.bWwFiW_panelCardTitle:after{display:none}.bWwFiW_benchBar{gap:var(--space-2);margin-bottom:var(--space-3);display:flex}.bWwFiW_benchBar .bWwFiW_search{flex:1;min-width:0}.bWwFiW_benchBar .bWwFiW_button{flex:none}.bWwFiW_benchMeta{gap:var(--space-3);margin-bottom:var(--space-2);color:var(--dsw-alias-label-tertiary);font-size:var(--fs-micro);flex-wrap:wrap;align-items:baseline;display:flex}.bWwFiW_degradedNote{color:var(--dsw-alias-state-warn-primary)}.bWwFiW_benchEmpty{color:var(--dsw-alias-label-tertiary);font-size:var(--fs-body);padding:var(--space-2) 0}.bWwFiW_benchList{gap:var(--space-2);flex-direction:column;display:flex}.bWwFiW_benchRow{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--radius-control);padding:var(--space-2) var(--space-3);background:var(--dsw-alias-bg-base);transition:border-color var(--dur-fast) var(--ease-spring), transform var(--dur-fast) var(--ease-spring);animation:bWwFiW_itemIn var(--dur-base) var(--ease-spring) both}.bWwFiW_benchRow:hover{border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, var(--dsw-alias-border-l2));transform:translate(2px)}.bWwFiW_benchHead{gap:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}.bWwFiW_benchHead .bWwFiW_pill{font-size:var(--fs-tag);height:16px;padding:0 6px}.bWwFiW_viaChip{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-tsp-secondary);font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:var(--fs-tag);border-radius:4px;height:16px;padding:0 6px;line-height:16px}.bWwFiW_benchScore{color:var(--dsw-alias-label-tertiary);font-size:var(--fs-micro);font-variant-numeric:tabular-nums;margin-left:auto}.bWwFiW_benchContent{margin:var(--space-2) 0;color:var(--dsw-alias-label-primary);font-size:var(--fs-body);word-break:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;line-height:1.55;display:-webkit-box;overflow:hidden}.bWwFiW_benchId{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.bWwFiW_actScope{margin-right:var(--space-1);font-size:var(--fs-tag);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-fill-tsp-secondary);border-radius:4px;flex:none;padding:0 6px;line-height:14px}.bWwFiW_actTime{color:var(--dsw-alias-label-tertiary);font-size:var(--fs-micro);font-variant-numeric:tabular-nums;margin-right:var(--space-2);flex:none}.bWwFiW_actBody{color:var(--dsw-alias-label-secondary);font-size:var(--fs-micro);-webkit-line-clamp:3;word-break:break-word;-webkit-box-orient:vertical;line-height:1.5;display:-webkit-box;overflow:hidden}.bWwFiW_activityList{max-height:280px;padding-right:var(--space-2);scrollbar-width:thin;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 35%, transparent) transparent;padding-bottom:16px;overflow-y:auto;-webkit-mask-image:linear-gradient(#000 calc(100% - 16px),#0000);mask-image:linear-gradient(#000 calc(100% - 16px),#0000)}.bWwFiW_activityList::-webkit-scrollbar{width:6px}.bWwFiW_activityList::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 35%, transparent);border-radius:3px}.bWwFiW_activityList::-webkit-scrollbar-track{background:0 0}.bWwFiW_mapWrap{gap:var(--space-3);flex-direction:column;display:flex}.bWwFiW_map{background:color-mix(in srgb, var(--dsw-alias-bg-base) 70%, transparent);border-radius:var(--radius-control);border:1px solid var(--dsw-alias-border-l2);user-select:none;width:100%;height:auto;display:block}.bWwFiW_node{cursor:grab;transition:transform var(--dur-fast) var(--ease-spring)}.bWwFiW_node:active{cursor:grabbing}.bWwFiW_tooltip{pointer-events:none}.bWwFiW_legend{gap:var(--space-3);font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;display:flex}.bWwFiW_legendItem{align-items:center;gap:var(--space-1);display:inline-flex}.bWwFiW_legendDot{border-radius:50%;width:8px;height:8px;display:inline-block}.bWwFiW_node,.bWwFiW_edgeFade{animation:bWwFiW_corridorFadeIn var(--dur-slow) var(--ease-spring) backwards}@keyframes bWwFiW_corridorFadeIn{0%{opacity:0;filter:blur(2px)}to{opacity:1;filter:none}}.bWwFiW_health{gap:var(--space-4);align-items:center;display:flex}.bWwFiW_healthScore{align-items:baseline;gap:var(--space-1);padding:var(--space-2) var(--space-3);border-radius:var(--radius-control);font-variant-numeric:tabular-nums;flex-shrink:0;display:flex}.bWwFiW_healthScore b{letter-spacing:-.02em;font-size:24px;font-weight:600;line-height:1}.bWwFiW_healthScore span{font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary)}.bWwFiW_healthScoreGood{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, var(--dsw-alias-bg-layer-1));color:var(--dsw-alias-state-success-primary)}.bWwFiW_healthScoreGood span{color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 70%, var(--dsw-alias-label-tertiary))}.bWwFiW_healthScoreMid{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, var(--dsw-alias-bg-layer-1));color:var(--dsw-alias-state-warn-primary)}.bWwFiW_healthScoreMid span{color:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 70%, var(--dsw-alias-label-tertiary))}.bWwFiW_healthScoreLow{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, var(--dsw-alias-bg-layer-1));color:var(--dsw-alias-state-error-primary)}.bWwFiW_healthScoreLow span{color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 70%, var(--dsw-alias-label-tertiary))}.bWwFiW_healthMetrics{gap:var(--space-2) var(--space-4);flex:1;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));min-width:0;display:grid}.bWwFiW_healthMetric{min-width:0}.bWwFiW_healthMetricHead{font-size:var(--fs-micro);margin-bottom:var(--space-1);color:var(--dsw-alias-label-tertiary);justify-content:space-between;align-items:baseline;display:flex}.bWwFiW_healthMetricHead b{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:500}.bWwFiW_healthMetricBar{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 18%, transparent);border-radius:2px;height:4px;overflow:hidden}.bWwFiW_healthMetricBar i{background:var(--dsw-alias-brand-primary);height:100%;transition:width var(--dur-slow) var(--ease-out);border-radius:2px;display:block}.bWwFiW_teleBar{gap:var(--space-5);flex-wrap:wrap;align-items:stretch;display:flex}.bWwFiW_teleCol{gap:var(--space-2);flex-direction:column;flex:1 1 0;min-width:0;display:flex}.bWwFiW_teleColLabel{font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);letter-spacing:.02em}.bWwFiW_teleGrid{gap:var(--space-3) var(--space-5);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.bWwFiW_teleGridRecent{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-flow:dense}.bWwFiW_teleStat{align-items:baseline;gap:var(--space-1);min-width:0;display:flex}.bWwFiW_teleStat b{letter-spacing:-.02em;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:20px;line-height:1.15}.bWwFiW_teleStat span{font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);white-space:nowrap}.bWwFiW_telePrivacy{align-items:center;gap:var(--space-1);border-radius:var(--radius-control);font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);cursor:help;transition:background var(--dur-fast) var(--ease-spring), color var(--dur-fast) var(--ease-spring), border-color var(--dur-fast) var(--ease-spring);background:0 0;border:1px solid #0000;outline:none;align-self:center;padding:4px 8px;display:inline-flex;position:relative}.bWwFiW_telePrivacy:hover,.bWwFiW_telePrivacy:focus-visible{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-fill-tsp-secondary);border-color:var(--dsw-alias-border-l2)}.bWwFiW_telePrivacy svg{opacity:.85;flex:none}.bWwFiW_telePrivacyHint{white-space:nowrap}.bWwFiW_telePrivacyTip{min-width:260px;max-width:320px;padding:var(--space-2) var(--space-3);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--radius-control);box-shadow:0 6px 18px -8px color-mix(in srgb, var(--dsw-alias-label-primary) 24%, transparent);font-size:var(--fs-body);color:var(--dsw-alias-label-primary);white-space:normal;pointer-events:none;opacity:0;transition:opacity var(--dur-fast) var(--ease-spring), transform var(--dur-fast) var(--ease-spring);z-index:5;text-align:left;line-height:1.5;position:absolute;top:calc(100% + 6px);right:0;transform:translateY(-2px)}.bWwFiW_telePrivacy:hover .bWwFiW_telePrivacyTip,.bWwFiW_telePrivacy:focus-visible .bWwFiW_telePrivacyTip{opacity:1;transform:translateY(0)}.bWwFiW_timeline li{animation:bWwFiW_itemIn var(--dur-base) var(--ease-spring) both}.bWwFiW_timeline li:nth-child(2){animation-delay:40ms}.bWwFiW_timeline li:nth-child(3){animation-delay:80ms}.bWwFiW_timeline li:nth-child(4){animation-delay:.12s}.bWwFiW_timeline li:nth-child(5){animation-delay:.16s}.bWwFiW_timeline li:nth-child(n+6){animation-delay:.2s}.bWwFiW_tourProposal{gap:var(--space-3);flex-direction:column;display:flex}.bWwFiW_tourFocusRow{gap:var(--space-1);padding-bottom:var(--space-2);border-bottom:1px dashed var(--dsw-alias-border-l2);flex-wrap:wrap;display:flex}.bWwFiW_tourFocusChip{font-size:var(--fs-micro);letter-spacing:.04em;padding:3px var(--space-2);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);cursor:pointer;transition:background var(--dur-fast) var(--ease-spring), border-color var(--dur-fast) var(--ease-spring), color var(--dur-fast) var(--ease-spring);background:0 0;border-radius:999px}.bWwFiW_tourFocusChip:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 6%, var(--dsw-alias-bg-layer-1));color:var(--dsw-alias-label-secondary)}.bWwFiW_tourFocusChipOn{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, var(--dsw-alias-bg-layer-1));border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary)}.bWwFiW_tourFocusChipOn:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, var(--dsw-alias-bg-layer-1))}.bWwFiW_tourGreeting{font-size:var(--fs-body);color:var(--dsw-alias-label-secondary);margin:0;line-height:1.55}.bWwFiW_tourStops{gap:var(--space-1);counter-reset:tour;flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.bWwFiW_tourStops li{animation:bWwFiW_tourItemIn var(--dur-base) var(--ease-spring) backwards}.bWwFiW_tourStops li:nth-child(2){animation-delay:40ms}.bWwFiW_tourStops li:nth-child(3){animation-delay:80ms}.bWwFiW_tourStops li:nth-child(4){animation-delay:.12s}.bWwFiW_tourStops li:nth-child(n+5){animation-delay:.16s}.bWwFiW_tourStop{align-items:center;gap:var(--space-2);width:100%;padding:var(--space-2);border-radius:var(--radius-control);color:inherit;text-align:left;cursor:pointer;transition:background var(--dur-fast) var(--ease-spring), border-color var(--dur-fast) var(--ease-spring), transform var(--dur-fast) var(--ease-spring);background:0 0;border:1px solid #0000;display:flex}.bWwFiW_tourStop:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 6%, var(--dsw-alias-bg-layer-1));border-color:color-mix(in srgb, var(--dsw-alias-brand-primary) 28%, var(--dsw-alias-border-l2));transform:translate(2px)}.bWwFiW_tourStop:active{transform:translate(2px)scale(.99)}@keyframes bWwFiW_tourItemIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:none}}.bWwFiW_tourStopIndex{width:20px;height:20px;font-size:var(--fs-micro);color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-brand-primary);font-variant-numeric:tabular-nums;border-radius:50%;flex:none;justify-content:center;align-items:center;font-weight:600;display:inline-flex}.bWwFiW_tourStopBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.bWwFiW_tourStopKind{font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);letter-spacing:.04em;text-transform:uppercase}.bWwFiW_tourStopText{font-size:var(--fs-body);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;line-height:1.4;overflow:hidden}.bWwFiW_tourHint{margin:var(--space-1) 0 0;font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);line-height:1.4}.bWwFiW_refurb{gap:var(--space-3);flex-direction:column;display:flex}.bWwFiW_refurbHead{justify-content:space-between;align-items:center;gap:var(--space-2);display:flex}.bWwFiW_refurbHead .bWwFiW_button{height:24px;padding:0 var(--space-2);font-size:var(--fs-micro)}.bWwFiW_refurbCount{font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.bWwFiW_refurbList{gap:var(--space-1);animation:bWwFiW_refurbReflow var(--dur-slow) var(--ease-spring) backwards;flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.bWwFiW_refurbItem{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--dsw-alias-fill-tsp-secondary);border-radius:var(--radius-control);font-size:var(--fs-body);color:var(--dsw-alias-label-secondary);animation:bWwFiW_refurbItemIn var(--dur-base) var(--ease-spring) backwards;flex-wrap:wrap;display:flex}.bWwFiW_refurbItem:nth-child(2){animation-delay:40ms}.bWwFiW_refurbItem:nth-child(3){animation-delay:80ms}.bWwFiW_refurbItem:nth-child(4){animation-delay:.12s}.bWwFiW_refurbItem:nth-child(n+5){animation-delay:.16s}@keyframes bWwFiW_refurbReflow{0%{opacity:0;filter:blur(2px)}to{opacity:1;filter:none}}@keyframes bWwFiW_refurbItemIn{0%{opacity:0;transform:scale(.94)}to{opacity:1;transform:none}}.bWwFiW_refurbBadge{padding:2px var(--space-2);font-size:var(--fs-micro);letter-spacing:.04em;background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, var(--dsw-alias-bg-layer-1));border:1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 30%, var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);cursor:pointer;transition:background var(--dur-fast) var(--ease-spring);border-radius:999px;flex:none;font-weight:600}.bWwFiW_refurbBadge:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 22%, var(--dsw-alias-bg-layer-1))}.bWwFiW_refurbReason{text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical;flex:1;min-width:120px;line-height:1.45;display:-webkit-box;overflow:hidden}.bWwFiW_refurbConfidence{font-size:var(--fs-micro);color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none}.bWwFiW_refurbExec{height:24px;padding:0 var(--space-2);font-size:var(--fs-micro);flex:none;line-height:1}.bWwFiW_toastViewport{top:var(--space-4);right:var(--space-4);z-index:9999;gap:var(--space-2);pointer-events:none;flex-direction:column;max-width:min(360px,100vw - 32px);display:flex;position:fixed}.bWwFiW_toast{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-card);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);box-shadow:0 6px 18px -8px color-mix(in srgb, var(--dsw-alias-label-primary) 24%, transparent);font-size:var(--fs-body);color:var(--dsw-alias-label-primary);pointer-events:auto;animation:bWwFiW_toastIn var(--dur-base) var(--ease-spring) both;line-height:1.5;display:flex}.bWwFiW_toastBody{word-break:break-word;flex:1;min-width:0}.bWwFiW_toastDismiss{color:var(--dsw-alias-label-tertiary);cursor:pointer;padding:0 var(--space-1);transition:color var(--dur-fast) var(--ease-spring);background:0 0;border:none;font-size:16px;line-height:1}.bWwFiW_toastDismiss:hover{color:var(--dsw-alias-label-primary)}.bWwFiW_toastInfo{border-left:3px solid var(--dsw-alias-brand-primary)}.bWwFiW_toastSuccess{border-left:3px solid color-mix(in srgb, var(--dsw-alias-state-success-primary,#2da44e) 80%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#2da44e) 6%, var(--dsw-alias-bg-layer-1))}.bWwFiW_toastError{border-left:3px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 80%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 6%, var(--dsw-alias-bg-layer-1))}.bWwFiW_toastWarning{border-left:3px solid color-mix(in srgb, #d4a017 80%, var(--dsw-alias-border-l2));background:color-mix(in srgb, #d4a017 6%, var(--dsw-alias-bg-layer-1))}@keyframes bWwFiW_toastIn{0%{opacity:0;transform:translate(8px)scale(.98)}to{opacity:1;transform:none}}`,document.head.appendChild(e)}var o={tabs:`bWwFiW_tabs`,tabPanel:`bWwFiW_tabPanel`,exportItemHint:`bWwFiW_exportItemHint`,headerActions:`bWwFiW_headerActions`,healthMetrics:`bWwFiW_healthMetrics`,refurbConfidence:`bWwFiW_refurbConfidence`,benchScore:`bWwFiW_benchScore`,segGroup:`bWwFiW_segGroup`,segIndicator:`bWwFiW_segIndicator`,telePrivacyTip:`bWwFiW_telePrivacyTip`,tooltip:`bWwFiW_tooltip`,legendItem:`bWwFiW_legendItem`,tourHint:`bWwFiW_tourHint`,benchId:`bWwFiW_benchId`,actBody:`bWwFiW_actBody`,sideCol:`bWwFiW_sideCol`,tourStop:`bWwFiW_tourStop`,tourProposal:`bWwFiW_tourProposal`,tabUnderline:`bWwFiW_tabUnderline`,drawerHead:`bWwFiW_drawerHead`,exportItem:`bWwFiW_exportItem`,content:`bWwFiW_content`,expand:`bWwFiW_expand`,skeleton:`bWwFiW_skeleton`,relBlock:`bWwFiW_relBlock`,actScope:`bWwFiW_actScope`,teleGridRecent:`bWwFiW_teleGridRecent`,tourFocusChipOn:`bWwFiW_tourFocusChipOn`,tourStops:`bWwFiW_tourStops`,refurbReason:`bWwFiW_refurbReason`,itemList:`bWwFiW_itemList`,refurbItem:`bWwFiW_refurbItem`,pill:`bWwFiW_pill`,timeline:`bWwFiW_timeline`,tourItemIn:`bWwFiW_tourItemIn`,toast:`bWwFiW_toast`,statusForgotten:`bWwFiW_statusForgotten`,drawerBody:`bWwFiW_drawerBody`,refurbExec:`bWwFiW_refurbExec`,layout:`bWwFiW_layout`,modalFoot:`bWwFiW_modalFoot`,empty:`bWwFiW_empty`,health:`bWwFiW_health`,viaChip:`bWwFiW_viaChip`,healthScoreMid:`bWwFiW_healthScoreMid`,itemCheck:`bWwFiW_itemCheck`,mainCol:`bWwFiW_mainCol`,healthScore:`bWwFiW_healthScore`,healthMetric:`bWwFiW_healthMetric`,fadeSoft:`bWwFiW_fadeSoft`,relChip:`bWwFiW_relChip`,edgeFade:`bWwFiW_edgeFade`,refurbBadge:`bWwFiW_refurbBadge`,outcomeFailure:`bWwFiW_outcomeFailure`,exportCaret:`bWwFiW_exportCaret`,selected:`bWwFiW_selected`,itemBody:`bWwFiW_itemBody`,item:`bWwFiW_item`,headerBrand:`bWwFiW_headerBrand`,itemOps:`bWwFiW_itemOps`,exportItemLabel:`bWwFiW_exportItemLabel`,tourFocusRow:`bWwFiW_tourFocusRow`,teleStat:`bWwFiW_teleStat`,corridorFadeIn:`bWwFiW_corridorFadeIn`,outcomeSuccess:`bWwFiW_outcomeSuccess`,tourFocusChip:`bWwFiW_tourFocusChip`,expandLoading:`bWwFiW_expandLoading`,refurbCount:`bWwFiW_refurbCount`,tourStopBody:`bWwFiW_tourStopBody`,button:`bWwFiW_button`,tourStopText:`bWwFiW_tourStopText`,editForm:`bWwFiW_editForm`,input:`bWwFiW_input`,drawerTitle:`bWwFiW_drawerTitle`,shimmer:`bWwFiW_shimmer`,toastIn:`bWwFiW_toastIn`,filters:`bWwFiW_filters`,refurbHead:`bWwFiW_refurbHead`,telePrivacyHint:`bWwFiW_telePrivacyHint`,panel:`bWwFiW_panel`,actTime:`bWwFiW_actTime`,refurbItemIn:`bWwFiW_refurbItemIn`,pillIn:`bWwFiW_pillIn`,exportWrap:`bWwFiW_exportWrap`,healthScoreGood:`bWwFiW_healthScoreGood`,attrGrid:`bWwFiW_attrGrid`,benchRow:`bWwFiW_benchRow`,map:`bWwFiW_map`,refurb:`bWwFiW_refurb`,node:`bWwFiW_node`,exportMenu:`bWwFiW_exportMenu`,refurbList:`bWwFiW_refurbList`,segItem:`bWwFiW_segItem`,primary:`bWwFiW_primary`,itemIn:`bWwFiW_itemIn`,itemMeta:`bWwFiW_itemMeta`,batchBar:`bWwFiW_batchBar`,benchBar:`bWwFiW_benchBar`,tabItem:`bWwFiW_tabItem`,drawerClose:`bWwFiW_drawerClose`,redacted:`bWwFiW_redacted`,headerTitle:`bWwFiW_headerTitle`,activityList:`bWwFiW_activityList`,tourStopIndex:`bWwFiW_tourStopIndex`,floaty:`bWwFiW_floaty`,benchHead:`bWwFiW_benchHead`,statusActive:`bWwFiW_statusActive`,drawerScrim:`bWwFiW_drawerScrim`,teleColLabel:`bWwFiW_teleColLabel`,headerLogo:`bWwFiW_headerLogo`,teleBar:`bWwFiW_teleBar`,teleCol:`bWwFiW_teleCol`,tourStopKind:`bWwFiW_tourStopKind`,panelIn:`bWwFiW_panelIn`,skeletonList:`bWwFiW_skeletonList`,benchList:`bWwFiW_benchList`,fieldLabel:`bWwFiW_fieldLabel`,benchMeta:`bWwFiW_benchMeta`,drawerIn:`bWwFiW_drawerIn`,pager:`bWwFiW_pager`,drawer:`bWwFiW_drawer`,healthMetricHead:`bWwFiW_healthMetricHead`,toastDismiss:`bWwFiW_toastDismiss`,relChips:`bWwFiW_relChips`,toastInfo:`bWwFiW_toastInfo`,benchEmpty:`bWwFiW_benchEmpty`,legend:`bWwFiW_legend`,on:`bWwFiW_on`,expandIn:`bWwFiW_expandIn`,mapWrap:`bWwFiW_mapWrap`,benchContent:`bWwFiW_benchContent`,scrimIn:`bWwFiW_scrimIn`,panelCard:`bWwFiW_panelCard`,kind:`bWwFiW_kind`,legendDot:`bWwFiW_legendDot`,healthMetricBar:`bWwFiW_healthMetricBar`,header:`bWwFiW_header`,telePrivacy:`bWwFiW_telePrivacy`,toastBody:`bWwFiW_toastBody`,toastWarning:`bWwFiW_toastWarning`,degradedNote:`bWwFiW_degradedNote`,danger:`bWwFiW_danger`,statusArchived:`bWwFiW_statusArchived`,panelCardTitle:`bWwFiW_panelCardTitle`,teleGrid:`bWwFiW_teleGrid`,segScope:`bWwFiW_segScope`,toastSuccess:`bWwFiW_toastSuccess`,fieldRow:`bWwFiW_fieldRow`,refurbReflow:`bWwFiW_refurbReflow`,itemTags:`bWwFiW_itemTags`,search:`bWwFiW_search`,barUp:`bWwFiW_barUp`,cardIn:`bWwFiW_cardIn`,reviewGrid:`bWwFiW_reviewGrid`,tourGreeting:`bWwFiW_tourGreeting`,toastViewport:`bWwFiW_toastViewport`,toastError:`bWwFiW_toastError`,healthScoreLow:`bWwFiW_healthScoreLow`};let s={fact:`#5b8def`,preference:`#f0a85c`,decision:`#9b6bd9`,episode:`#3cb489`,skill:`#e26b86`},c={fact:`事实层`,preference:`偏好层`,decision:`决策层`,episode:`事件层`,skill:`技能层`},l={related:{color:`rgba(120, 130, 150, 0.6)`,dash:void 0,width:1},refines:{color:`rgba(120, 130, 150, 0.6)`,dash:void 0,width:1},supports:{color:`rgba(120, 130, 150, 0.6)`,dash:void 0,width:1},supersedes:{color:`rgba(91, 141, 239, 0.85)`,dash:void 0,width:1.8},contradicts:{color:`rgba(226, 107, 134, 0.9)`,dash:`4 4`,width:1.4}};function u(e){return Math.max(4,Math.min(14,4+10*e.importance*e.confidence))}function d(e,t,n,r,i){let a=.003;for(let t=0;t<e.length;t+=1){let n=e[t];for(let r=t+1;r<e.length;r+=1){let t=e[r],a=n.x-t.x,o=n.y-t.y,s=Math.sqrt(a*a+o*o)+.01,c=4800*i/(s*s),l=a/s*c,u=o/s*c;n.vx+=l,n.vy+=u,t.vx-=l,t.vy-=u}}let o=new Map(e.map(e=>[e.id,e]));for(let e of t){let t=o.get(e.from),n=o.get(e.to);if(t===void 0||n===void 0)continue;let r=n.x-t.x,a=n.y-t.y,s=Math.sqrt(r*r+a*a)+.01,c=(s-64)*.04*i,l=r/s*c,u=a/s*c;t.vx+=l,t.vy+=u,n.vx-=l,n.vy-=u}let s=[...new Set(e.map(e=>e.kind))],c=n/Math.max(s.length,1);for(let t of e){if(t.fixed)continue;t.vx+=(n/2-t.x)*a*i,t.vy+=(r/2-t.y)*a*i;let e=s.indexOf(t.kind);if(e>=0){let n=c*(e+.5);t.vx+=(n-t.x)*.005*i}}let l=.82;for(let t of e){if(t.fixed){t.vx=0,t.vy=0;continue}t.vx*=l,t.vy*=l,t.x=Math.max(20,Math.min(n-20,t.x+t.vx)),t.y=Math.max(20,Math.min(r-20,t.y+t.vy))}}function f(e){let{scope:t,nodes:n,edges:a,onSelect:f,selectedId:p}=e,m=(0,r.useMemo)(()=>{let e=new Map;for(let t of n)e.set(t.id,new Set);for(let t of a)e.has(t.from)||e.set(t.from,new Set),e.has(t.to)||e.set(t.to,new Set),e.get(t.from).add(t.to),e.get(t.to).add(t.from);return e},[n,a]),h=(0,r.useMemo)(()=>{let e=[...new Set(n.map(e=>e.kind))],t=560/Math.max(e.length,1);return n.map((n,r)=>({...n,x:e.indexOf(n.kind)>=0?t*(e.indexOf(n.kind)+.5):280,y:30+r*47%260,vx:0,vy:0,r:u(n),fixed:!1}))},[n,560,320]),g=(0,r.useRef)(h.map(e=>({...e}))),[,_]=(0,r.useState)(0),v=(0,r.useRef)(null),y=(0,r.useRef)(0);(0,r.useEffect)(()=>{g.current=h.map(e=>({...e})),y.current=0,_(e=>e+1)},[h]),(0,r.useEffect)(()=>{let e=()=>{let t=g.current;y.current+=1;let n=Math.max(.1,1-y.current/280*.9);d(t,a,560,320,n),g.current=t.map(e=>({...e})),_(e=>e+1),y.current<280&&(v.current=requestAnimationFrame(e))};return v.current=requestAnimationFrame(e),()=>{v.current!==null&&cancelAnimationFrame(v.current)}},[h,a]);let b=g.current,x=(0,r.useMemo)(()=>new Map(b.map(e=>[e.id,e])),[b]),S=(0,r.useMemo)(()=>[...new Set(n.map(e=>e.kind))],[n]),[C,w]=(0,r.useState)(null),T=(0,r.useMemo)(()=>C===null?null:m.get(C)??new Set,[C,m]),E=e=>C!==null&&e!==C&&!(T?.has(e)??!1),D=e=>C===null?!1:e.from===C||e.to===C,O=(0,r.useRef)(null),k=(0,r.useRef)(null),A=(e,t)=>{let n=O.current;if(n===null)return null;let r=n.getBoundingClientRect(),i=560/r.width,a=320/r.height;return{x:(e-r.left)*i,y:(t-r.top)*a}},j=(e,t)=>{e.preventDefault(),k.current=t;let n=g.current.find(e=>e.id===t);n!==void 0&&(n.fixed=!0)};return(0,r.useEffect)(()=>{let e=e=>{let t=k.current;if(t===null)return;let n=A(e.clientX,e.clientY);if(n===null)return;let r=g.current.find(e=>e.id===t);r!==void 0&&(r.x=Math.max(20,Math.min(540,n.x)),r.y=Math.max(20,Math.min(300,n.y)),r.vx=0,r.vy=0,_(e=>e+1))},t=()=>{let e=k.current;if(e===null)return;let t=g.current.find(t=>t.id===e);t!==void 0&&(t.fixed=!1),k.current=null};return window.addEventListener(`mousemove`,e),window.addEventListener(`mouseup`,t),()=>{window.removeEventListener(`mousemove`,e),window.removeEventListener(`mouseup`,t)}},[]),n.length===0?(0,i.jsx)(`div`,{className:o.empty,children:`走廊空空如也,落成几间房间后这里会出现鸟瞰图。`}):(0,i.jsxs)(`div`,{className:o.mapWrap,children:[(0,i.jsxs)(`svg`,{ref:O,viewBox:`0 0 560 320`,className:o.map,preserveAspectRatio:`xMidYMid meet`,role:`img`,"aria-label":`走廊鸟瞰图`,children:[S.map((e,t)=>{let n=560/Math.max(S.length,1);return(0,i.jsx)(`rect`,{x:n*t,y:0,width:n,height:320,fill:t%2==0?`rgba(127,127,127,0.04)`:`transparent`},e)}),S.map((e,t)=>{let n=560/Math.max(S.length,1);return(0,i.jsx)(`text`,{x:n*(t+.5),y:14,textAnchor:`middle`,fill:`rgba(127,127,127,0.7)`,fontSize:`10`,fontFamily:`ui-sans-serif, system-ui`,children:c[e]??e},`${e}-label`)}),a.map((e,t)=>{let n=x.get(e.from),r=x.get(e.to);if(n===void 0||r===void 0)return null;let a=l[e.type]??l.related,s=D(e),c=C!==null&&!s;if(s){let t=(n.x+r.x)/2,o=(n.y+r.y)/2,s=r.x-n.x,c=r.y-n.y,l=Math.sqrt(s*s+c*c)||1,u=-c/l*6,d=s/l*6;return(0,i.jsx)(`path`,{d:`M ${String(n.x)} ${String(n.y)} Q ${String(t+u)} ${String(o+d)} ${String(r.x)} ${String(r.y)}`,fill:`none`,stroke:a.color,strokeWidth:a.width+1.2,strokeDasharray:a.dash,style:{transition:`stroke-width 200ms ease, d 240ms ease`},children:(0,i.jsx)(`title`,{children:`${n.title} --${e.type}--> ${r.title}`})},e.id)}return(0,i.jsx)(`line`,{x1:n.x,y1:n.y,x2:r.x,y2:r.y,stroke:a.color,strokeWidth:a.width,strokeDasharray:a.dash,opacity:c?.1:1,className:o.edgeFade,style:{transition:`opacity 200ms ease, stroke-width 200ms ease`,animationDelay:`${String(Math.min(t,24)*24)}ms`},children:(0,i.jsx)(`title`,{children:`${n.title} --${e.type}--> ${r.title}`})},e.id)}),b.map((e,t)=>{let n=s[e.kind]??`#7d8590`,r=p===e.id,a=C===e.id,c=E(e.id);return(0,i.jsxs)(`g`,{className:o.node,transform:`translate(${String(e.x)} ${String(e.y)})`,style:{cursor:k.current===e.id?`grabbing`:`grab`,opacity:c?.15:1,transition:`opacity 200ms ease`,animationDelay:`${String(Math.min(t,24)*24)}ms`},onMouseEnter:()=>{w(e.id)},onMouseLeave:()=>{w(t=>t===e.id?null:t)},onMouseDown:t=>j(t,e.id),onClick:()=>f?.(e.id),children:[(a||r)&&(0,i.jsx)(`circle`,{r:String(e.r+6),fill:n,fillOpacity:.18}),(0,i.jsx)(`circle`,{r:String(e.r),fill:n,fillOpacity:e.status===`active`?.88:.42,stroke:r?`var(--dsw-alias-brand-primary)`:a?n:`rgba(255,255,255,0.9)`,strokeWidth:r?2:a?1.5:1,style:{transition:`stroke 160ms ease, stroke-width 160ms ease`},children:(0,i.jsx)(`title`,{children:`${e.title}(${e.kind}/${e.status})`})}),r&&(0,i.jsx)(`circle`,{r:String(e.r+4),fill:`none`,stroke:n,strokeOpacity:.4,strokeWidth:1})]},e.id)}),C!==null&&(()=>{let e=x.get(C);if(e===void 0)return null;let t=Math.min(380,Math.max(8,e.x+14)),n=Math.min(260,Math.max(28,e.y-16)),r=(e.content??e.title).slice(0,120);return(0,i.jsxs)(`g`,{className:o.tooltip,transform:`translate(${String(t)} ${String(n)})`,children:[(0,i.jsx)(`rect`,{x:0,y:0,width:176,height:48,rx:6,ry:6,fill:`var(--dsw-alias-bg-base)`,stroke:`var(--dsw-alias-border-l2)`,strokeWidth:1,opacity:.96}),(0,i.jsx)(`text`,{x:8,y:16,fill:`var(--dsw-alias-label-primary)`,fontSize:`11`,fontWeight:600,fontFamily:`ui-sans-serif, system-ui`,children:c[e.kind]??e.kind}),(0,i.jsx)(`text`,{x:8,y:32,fill:`var(--dsw-alias-label-secondary)`,fontSize:`10`,fontFamily:`ui-sans-serif, system-ui`,children:`${r}${(e.content??e.title).length>120?`…`:``}`})]})})()]},t),(0,i.jsxs)(`div`,{className:o.legend,children:[S.map(e=>(0,i.jsxs)(`span`,{className:o.legendItem,children:[(0,i.jsx)(`span`,{className:o.legendDot,style:{background:s[e]??`#7d8590`}}),c[e]??e]},e)),(0,i.jsxs)(`span`,{className:o.legendItem,children:[n.length,` 间 · `,a.length,` 条走廊`]})]}),(0,i.jsx)(`div`,{className:o.legend,style:{marginTop:2},children:Object.entries(l).map(([e,t])=>(0,i.jsxs)(`span`,{className:o.legendItem,children:[(0,i.jsx)(`svg`,{width:20,height:6,"aria-hidden":`true`,children:(0,i.jsx)(`line`,{x1:0,y1:3,x2:20,y2:3,stroke:t.color,strokeWidth:t.width,strokeDasharray:t.dash})}),(0,i.jsx)(`span`,{children:e===`supersedes`?`推陈出新`:e===`contradicts`?`互斥`:`相邻 / 支持 / 提炼`})]},e))})]})}let p={info:3e3,success:3e3,warning:5e3,error:5e3},m=0;function h({items:e,onDismiss:t}){return(0,i.jsx)(`div`,{className:o.toastViewport,role:`region`,"aria-live":`polite`,"aria-label":`notifications`,children:e.map(e=>{let n=e.kind===`success`?o.toastSuccess:e.kind===`error`?o.toastError:e.kind===`warning`?o.toastWarning:o.toastInfo;return(0,i.jsxs)(`div`,{className:`${o.toast} ${n}`,role:e.kind===`error`||e.kind===`warning`?`alert`:`status`,children:[(0,i.jsx)(`span`,{className:o.toastBody,children:e.message}),(0,i.jsx)(`button`,{type:`button`,className:o.toastDismiss,"aria-label":`dismiss`,onClick:()=>{t(e.id)},children:`×`})]},e.id)})})}function g(){let[e,t]=(0,r.useState)([]),n=(0,r.useRef)(new Map),a=(0,r.useCallback)(e=>{t(t=>t.filter(t=>t.id!==e));let r=n.current.get(e);r!==void 0&&(clearTimeout(r),n.current.delete(e))},[]),o=(0,r.useCallback)((e,r,i)=>{m+=1;let o=m,s=i??p[e],c={id:o,kind:e,message:r,duration:s};t(e=>[...e,c]);let l=setTimeout(()=>{a(o)},s);n.current.set(o,l)},[a]);return(0,r.useEffect)(()=>()=>{for(let e of n.current.values())clearTimeout(e);n.current.clear()},[]),{toasts:e,push:o,dismiss:a,viewport:(0,i.jsx)(h,{items:e,onDismiss:a})}}let _=`dsh-engram.ui`;function v(e){try{return window.localStorage.getItem(e)??void 0}catch{return}}function y(e,t){try{window.localStorage.setItem(e,t)}catch{}}function b(e,t){return e!==void 0&&t.includes(e)}function x(e,t,n){let i=`${_}.${e}`,[a,o]=(0,r.useState)(()=>{let e=v(i);return b(e,n)?e:t});return(0,r.useEffect)(()=>{y(i,a)},[i,a]),[a,(0,r.useCallback)(e=>{o(e)},[])]}function S(e,t){let n=`${_}.${e}`,[i,a]=(0,r.useState)(()=>v(n)??t);return(0,r.useEffect)(()=>{y(n,i)},[n,i]),[i,(0,r.useCallback)(e=>{a(e)},[])]}let C=[`fact`,`preference`,`decision`,`episode`,`skill`],w={active:`statusActive`,archived:`statusArchived`,forgotten:`statusForgotten`},T={fact:`kindFact`,preference:`kindPreference`,decision:`kindDecision`,episode:`kindEpisode`,skill:`kindSkill`},E={user:`scopeUser`,project:`scopeProject`,shared:`scopeShared`},D={write:`opWrite`,update:`opUpdate`,forget:`opForget`,restore:`opRestore`,decay:`opDecay`,superseded:`opSuperseded`,"ingest-request":`opIngestRequest`,"ingest-done":`opIngestDone`,"outcome-report":`opOutcomeReport`,"search-rewrite-request":`opSearchRewrite`,"compress-request":`opCompressRequest`,"distill-request":`opDistillRequest`},O={supersededBy:`relSupersededBy`,supersedes:`relSupersedes`,contradicts:`relContradicts`,related:`relRelated`},k={kind:`labelKind`,scope:`labelScope`,status:`labelStatus`};function A(e,t){let n=T[t];return n===void 0?t:e(n)}function j(e,t){let n=D[t];return n===void 0?t:e(n)}function M(e,t,n){if(n===null)return``;if(t!==`write`&&t!==`update`&&t!==`superseded`)return` ${n}`;try{let t=JSON.parse(n),r=Object.entries(t);return r.length===0?` ${n}`:` `+r.map(([t,n])=>{let r=k[t];return r===void 0?`${t}=${String(n)}`:t===`kind`&&typeof n==`string`?`${e(r)}=${A(e,n)}`:t===`scope`&&(n===`user`||n===`project`)?`${e(r)}=${e(E[n])}`:`${e(r)}=${String(n)}`}).join(` · `)}catch{return` ${n}`}}function N(e,t){if(t.sourceSessionId===null)return e(`sourceExplicit`);let n=`${t.sourceSessionId.slice(0,16)}…`;return e(`sourceSession`,{id:t.sourceRound===null?n:`${n} ${e(`round`,{n:t.sourceRound})}`})}async function P(e,t){let n=await fetch(`/api/engram/${e}`,t),r=await n.json();if(!n.ok)throw Error(r.error??`HTTP ${String(n.status)}`);return r}function F(e){return new Date(e).toLocaleString(navigator.language||`zh-CN`,{hour12:!1})}function I(e,t){let n=Math.max(0,Date.now()-t),r=Math.floor(n/6e4);if(r<1)return e(`timeJustNow`);if(r<60)return e(`timeMinutesAgo`,{n:r});let i=Math.floor(r/60);return i<48?e(`timeHoursAgo`,{n:i}):e(`timeDaysAgo`,{n:Math.floor(i/24)})}function L({value:e,conf:t}){return(0,i.jsx)(`span`,{className:t===!0?`${o.meter} ${o.conf}`:o.meter,children:(0,i.jsx)(`i`,{style:{width:`${String(Math.round(Math.min(1,Math.max(0,e))*100))}%`}})})}function R({ids:e}){return(0,i.jsx)(`div`,{className:o.relChips,children:e.map(e=>(0,i.jsx)(`span`,{className:o.relChip,title:e,children:e.slice(0,18)},e))})}function ee({t:e,recordId:t,scope:n}){let[a,s]=(0,r.useState)(null),[c,l]=(0,r.useState)(null);if((0,r.useEffect)(()=>{let e=!1;return P(`review?scope=${n}&id=${encodeURIComponent(t)}`).then(t=>{e||s(t)}).catch(t=>{e||l(t.message)}),()=>{e=!0}},[t,n,e]),c!==null)return(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loadFailed`,{msg:c})});if(a===null)return(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loading`)});let{record:u}=a,d=[`supersededBy`,`supersedes`,`contradicts`,`related`].map(e=>({key:e,label:O[e],ids:a[e]??[]})).filter(e=>e.ids.length>0),f=a.operations??[];return(0,i.jsxs)(`div`,{className:o.reviewGrid,children:[(0,i.jsxs)(`div`,{children:[(0,i.jsxs)(`dl`,{className:o.attrGrid,children:[(0,i.jsx)(`dt`,{children:e(`labelContent`)}),(0,i.jsx)(`dd`,{children:u.content}),(0,i.jsx)(`dt`,{children:e(`labelKind`)}),(0,i.jsx)(`dd`,{children:(0,i.jsx)(`span`,{className:`${o.pill} ${o.kind}`,children:A(e,u.kind)})}),(0,i.jsx)(`dt`,{children:e(`labelStatus`)}),(0,i.jsx)(`dd`,{children:(0,i.jsx)(`span`,{className:`${o.pill} ${o[`status${u.status.charAt(0).toUpperCase()}${u.status.slice(1)}`]??``}`,children:e(w[u.status])})}),(0,i.jsx)(`dt`,{children:e(`importance`)}),(0,i.jsxs)(`dd`,{children:[u.importance.toFixed(2),(0,i.jsx)(L,{value:u.importance})]}),(0,i.jsx)(`dt`,{children:e(`confidence`)}),(0,i.jsxs)(`dd`,{children:[u.confidence.toFixed(2),(0,i.jsx)(L,{value:u.confidence,conf:!0})]}),(0,i.jsx)(`dt`,{children:e(`detailSource`)}),(0,i.jsx)(`dd`,{children:N(e,u)}),(0,i.jsx)(`dt`,{children:e(`labelCreated`)}),(0,i.jsx)(`dd`,{children:F(u.createdAt)})]}),d.map(({key:t,label:n,ids:r})=>(0,i.jsxs)(`div`,{className:o.relBlock,children:[(0,i.jsx)(`h5`,{children:n===void 0?t:e(n)}),(0,i.jsx)(R,{ids:r})]},t))]}),(0,i.jsxs)(`div`,{children:[(a.revisions??[]).length>0&&(0,i.jsxs)(`div`,{className:o.relBlock,children:[(0,i.jsx)(`h5`,{children:e(`detailRevisions`)}),(0,i.jsx)(`ul`,{className:o.timeline,children:a.revisions.map((t,n)=>(0,i.jsxs)(`li`,{children:[(0,i.jsx)(`time`,{children:F(t.supersededAt)}),(0,i.jsx)(`b`,{children:A(e,t.kind)}),` `,t.content]},n))})]}),f.length>0&&(0,i.jsxs)(`div`,{className:o.relBlock,children:[(0,i.jsx)(`h5`,{children:e(`detailOperations`)}),(0,i.jsx)(`ul`,{className:o.timeline,children:f.map((t,n)=>(0,i.jsxs)(`li`,{children:[(0,i.jsx)(`time`,{children:F(t.at)}),(0,i.jsx)(`b`,{children:j(e,t.op)}),M(e,t.op,t.detail)]},n))})]})]})]})}function te({t:e,record:t,onClose:n,onSaved:a,toast:s}){let[c,l]=(0,r.useState)(t.content),[u,d]=(0,r.useState)(t.kind),[f,p]=(0,r.useState)(t.importance);return(0,i.jsxs)(`div`,{className:o.editForm,children:[(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`label`,{className:o.fieldLabel,children:e(`labelContent`)}),(0,i.jsx)(`textarea`,{className:o.input,rows:3,value:c,onChange:e=>l(e.target.value)})]}),(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`label`,{className:o.fieldLabel,children:e(`labelKind`)}),(0,i.jsx)(`select`,{className:o.input,value:u,onChange:e=>d(e.target.value),children:C.map(t=>(0,i.jsx)(`option`,{value:t,children:A(e,t)},t))})]}),(0,i.jsx)(`div`,{className:o.fieldRow,children:(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`label`,{className:o.fieldLabel,children:`${e(`importance`)} ${f.toFixed(2)}`}),(0,i.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:f,onChange:e=>p(Number(e.target.value))})]})}),(0,i.jsxs)(`div`,{className:o.modalFoot,children:[(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:n,children:e(`cancel`)}),(0,i.jsx)(`button`,{type:`button`,className:`${o.button} ${o.primary}`,onClick:()=>{P(`update`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,scope:t.scope,content:c,kind:u,importance:f})}).then(a).catch(e=>{s.push(`error`,e.message)})},children:e(`saveWithHint`)})]})]})}let z={fts:`viaFts`,vec:`viaVec`,both:`viaBoth`};function ne({t:e,scope:t}){let[n,a]=(0,r.useState)(``),[s,c]=(0,r.useState)(t),[l,u]=(0,r.useState)(null),[d,f]=(0,r.useState)(!1),[p,m]=(0,r.useState)(null);(0,r.useEffect)(()=>{c(t)},[t]);let h=()=>{n.trim()===``||d||(f(!0),P(`search-test?q=${encodeURIComponent(n.trim())}&scope=${s}`).then(e=>{u(e),m(null)}).catch(e=>m(e.message)).finally(()=>f(!1)))},g=l?.hits??[];return(0,i.jsxs)(`div`,{children:[(0,i.jsxs)(`div`,{className:o.benchBar,children:[(0,i.jsx)(`input`,{className:`${o.input} ${o.search}`,placeholder:e(`benchPlaceholder`),value:n,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`Enter`&&h()}}),(0,i.jsxs)(`select`,{className:o.input,value:s,onChange:e=>c(e.target.value),children:[(0,i.jsx)(`option`,{value:`all`,children:e(`benchScopeAll`)}),(0,i.jsx)(`option`,{value:`user`,children:e(`scopeUser`)}),(0,i.jsx)(`option`,{value:`project`,children:e(`scopeProject`)}),(0,i.jsx)(`option`,{value:`shared`,children:e(`scopeShared`)})]}),(0,i.jsx)(`button`,{type:`button`,className:`${o.button} ${o.primary}`,disabled:d||n.trim()===``,onClick:h,children:e(`benchRun`)})]}),p!==null&&(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loadFailed`,{msg:p})}),l!==null&&p===null&&(0,i.jsxs)(`div`,{className:o.benchMeta,children:[(0,i.jsx)(`span`,{children:e(`benchHits`,{n:g.length})}),l.degraded&&(0,i.jsx)(`span`,{className:o.degradedNote,children:e(`benchDegraded`)})]}),(0,i.jsx)(`div`,{className:o.benchList,children:g.map(t=>(0,i.jsxs)(`div`,{className:o.benchRow,children:[(0,i.jsxs)(`div`,{className:o.benchHead,children:[(0,i.jsx)(`span`,{className:o.viaChip,children:e(z[t.via])}),t.viaEdge!==void 0&&(0,i.jsxs)(`span`,{className:o.viaChip,title:`${t.viaEdge.type} ${t.viaEdge.from}`,children:[e(`viaEdgeLabel`),` · `,t.viaEdge.type]}),(0,i.jsx)(`span`,{className:`${o.pill} ${o.kind}`,children:A(e,t.kind)}),(0,i.jsx)(`span`,{className:o.benchScore,children:t.score.toFixed(4)})]}),(0,i.jsx)(`div`,{className:o.benchContent,children:t.content}),(0,i.jsx)(`span`,{className:o.benchId,title:t.id,children:t.id})]},t.id))}),l!==null&&g.length===0&&p===null&&(0,i.jsx)(`div`,{className:o.benchEmpty,children:e(`benchEmpty`)})]})}function B(e,t){if(t===null)return``;try{let n=JSON.parse(t);if(typeof n.round==`number`&&typeof n.userText==`string`){let t=typeof n.mode==`string`?` · ${n.mode}`:``;return`${e(`round`,{n:n.round})}${t} · ${n.userText.slice(0,48)}`}if(typeof n.query==`string`&&Array.isArray(n.queries))return`${e(`benchRewrite`,{n:n.queries.length})} · ${n.query.slice(0,36)}`;if(typeof n.count==`number`&&Object.keys(n).length===1)return e(`benchCompress`,{n:n.count})}catch{}return t.length>56?`${t.slice(0,56)}…`:t}function re({t:e}){let[t,n]=(0,r.useState)(null);return(0,r.useEffect)(()=>{let e=!1;return P(`activity?limit=20`).then(t=>{e||n(t.operations)}).catch(()=>{e||n([])}),()=>{e=!0}},[]),t===null?(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loading`)}):t.length===0?(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`activityEmpty`)}):(0,i.jsx)(`ul`,{className:`${o.timeline} ${o.activityList}`,children:t.map((t,n)=>(0,i.jsxs)(`li`,{children:[(0,i.jsx)(`span`,{className:o.actTime,children:I(e,t.at)}),(0,i.jsx)(`b`,{children:j(e,t.op)}),(0,i.jsx)(`span`,{className:o.actScope,children:t.scope===`user`?e(`scopeUser`):e(`scopeProject`)}),(0,i.jsx)(`div`,{className:o.actBody,title:t.detail??``,children:B(e,t.detail)})]},n))})}function ie({t:e,scope:t,onSelect:n}){let a=[``,`fact`,`preference`,`decision`,`episode`,`skill`],[s,c]=x(`tour.focusKind`,``,a),[l,u]=(0,r.useState)(null);(0,r.useEffect)(()=>{let n=!1;return P(s===``?`tour-proposal?scope=${t}`:`tour-proposal?scope=${t}&focusKind=${s}`).then(e=>{n||u(e)}).catch(()=>{n||u({greeting:e(`tourProposalEmpty`),activeCount:0,empty:!0,suggestedStops:[]})}),()=>{n=!0}},[e,t,s]);let d=t=>{if(t===``)return e(`tourFocusAll`);let n=T[t];return n===void 0?t:e(n)};return l===null?(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loading`)}):(0,i.jsxs)(`div`,{className:o.tourProposal,children:[(0,i.jsx)(`div`,{className:o.tourFocusRow,role:`tablist`,"aria-label":`focus-kind`,children:a.map(e=>(0,i.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":s===e,className:s===e?`${o.tourFocusChip} ${o.tourFocusChipOn}`:o.tourFocusChip,onClick:()=>{c(e)},children:d(e)},e||`all`))}),l.empty?(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`tourProposalEmpty`)}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`p`,{className:o.tourGreeting,children:l.greeting}),(0,i.jsx)(`ol`,{className:o.tourStops,children:l.suggestedStops.map((e,t)=>(0,i.jsx)(`li`,{children:(0,i.jsxs)(`button`,{type:`button`,className:o.tourStop,onClick:()=>{n(e.id)},children:[(0,i.jsx)(`span`,{className:o.tourStopIndex,children:t+1}),(0,i.jsxs)(`span`,{className:o.tourStopBody,children:[(0,i.jsx)(`span`,{className:o.tourStopKind,children:e.kind}),(0,i.jsx)(`span`,{className:o.tourStopText,children:e.content.length>60?`${e.content.slice(0,60)}…`:e.content})]})]})},e.id))}),(0,i.jsx)(`p`,{className:o.tourHint,children:e(`tourProposalHint`)})]})]})}function ae({t:e,scope:t,onSelect:n,onAfterAction:a,toast:s}){let[c,l]=(0,r.useState)(null),[u,d]=(0,r.useState)(!1),f=(0,r.useCallback)(()=>{d(!0),P(`refurb?scope=${t}`).then(e=>{l(e)}).catch(()=>{l({count:0,suggestions:[]})}).finally(()=>{d(!1)})},[t]);(0,r.useEffect)(()=>{f()},[f]);let p=t=>{switch(t){case`demote`:return e(`refurbActionDemote`);case`merge`:return e(`refurbActionMerge`);case`review`:return e(`refurbActionReview`);case`split`:return e(`refurbActionSplit`)}},m=(0,r.useCallback)(r=>{if(r.action===`review`||r.action===`split`){n(r.primaryId);return}if(r.action===`demote`){if(!window.confirm(e(`refurbConfirmDemote`)))return;d(!0),P(`forget`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:r.primaryId,scope:t,reason:`翻新清单降级`,affects:`无`,stillUseful:`可经 engram_restore 复原`})}).then(()=>{f(),a(),s.push(`success`,e(`refurbDemoteDone`))}).catch(t=>{s.push(`error`,e(`refurbActionFailed`,{msg:t.message}))}).finally(()=>{d(!1)});return}if(r.action===`merge`){let n=r.candidates.length+1;if(n<2){s.push(`warning`,e(`refurbMergeEmpty`));return}if(!window.confirm(e(`refurbConfirmMerge`,{n})))return;d(!0);let i=[r.primaryId,...r.candidates];P(`consolidate`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({scope:t,candidates:i})}).then(()=>{f(),a(),s.push(`success`,e(`refurbMergeDone`))}).catch(t=>{s.push(`error`,e(`refurbActionFailed`,{msg:t.message}))}).finally(()=>{d(!1)})}},[f,n,a,s,e,t]);return c===null?(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`loading`)}):(0,i.jsxs)(`div`,{className:o.refurb,children:[(0,i.jsxs)(`div`,{className:o.refurbHead,children:[(0,i.jsx)(`span`,{className:o.refurbCount,children:e(`refurbCount`,{n:c.count})}),(0,i.jsx)(`button`,{type:`button`,className:o.button,disabled:u,onClick:f,children:e(`refurbRun`)})]}),c.count===0?(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`refurbEmpty`)}):(0,i.jsx)(`ul`,{className:o.refurbList,children:c.suggestions.map((t,r)=>(0,i.jsxs)(`li`,{className:o.refurbItem,children:[(0,i.jsx)(`button`,{type:`button`,className:o.refurbBadge,onClick:()=>{n(t.primaryId)},children:p(t.action)}),(0,i.jsx)(`div`,{className:o.refurbReason,children:t.reason}),(0,i.jsxs)(`span`,{className:o.refurbConfidence,children:[(t.confidence*100).toFixed(0),`%`]}),(0,i.jsx)(`button`,{type:`button`,className:`${o.refurbExec} ${o.button}`,disabled:u,onClick:()=>{m(t)},children:e(`refurbExecute`)})]},`${t.action}-${t.primaryId}-${r}`))})]})}function oe({t:e,scope:t,onSelect:n}){let[a,s]=(0,r.useState)(null),[c,l]=(0,r.useState)(null);return(0,r.useEffect)(()=>{let e=!1;return P(`corridor?status=active,archived&scope=${t}`).then(t=>{e||s(t),l(null)}).catch(t=>{e||l(t.message)}),()=>{e=!0}},[t]),c===null?a===null?(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`corridorLoad`)}):a.nodes.length===0?(0,i.jsx)(`div`,{className:o.empty,children:e(`corridorEmpty`)}):(0,i.jsx)(f,{scope:t,nodes:a.nodes,edges:a.edges,onSelect:n}):(0,i.jsxs)(`div`,{className:o.expandLoading,children:[e(`corridorFailed`),`:`,c]})}function se({t:e,scope:t}){let[n,a]=(0,r.useState)(null),[s,c]=(0,r.useState)(null);if((0,r.useEffect)(()=>{let e=!1;return P(`health?scope=${t}`).then(t=>{e||a(t),c(null)}).catch(t=>{e||c(t.message)}),()=>{e=!0}},[t]),s!==null)return(0,i.jsxs)(`div`,{className:o.expandLoading,children:[e(`healthFailed`),`:`,s]});if(n===null)return(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`healthLoading`)});let l=n.overall>=80?`good`:n.overall>=50?`mid`:`low`;return(0,i.jsxs)(`div`,{className:o.health,children:[(0,i.jsxs)(`div`,{className:`${o.healthScore} ${l===`good`?o.healthScoreGood:l===`mid`?o.healthScoreMid:o.healthScoreLow}`,children:[(0,i.jsx)(`b`,{children:n.overall}),(0,i.jsx)(`span`,{children:`/ 100`})]}),(0,i.jsx)(`div`,{className:o.healthMetrics,children:n.parts.map(t=>(0,i.jsxs)(`div`,{className:o.healthMetric,children:[(0,i.jsxs)(`div`,{className:o.healthMetricHead,children:[(0,i.jsx)(`span`,{children:t.scope===`user`?e(`scopeUser`):t.scope===`project`?e(`scopeProject`):e(`scopeShared`)}),(0,i.jsx)(`b`,{children:t.score})]}),(0,i.jsx)(`div`,{className:o.healthMetricBar,children:(0,i.jsx)(`i`,{style:{width:`${String(t.score)}%`}})})]},t.scope))})]})}function ce({t:e,scope:t}){let[n,a]=(0,r.useState)(null),[s,c]=(0,r.useState)(null),[l,u]=(0,r.useState)(null);if((0,r.useEffect)(()=>{let e=!1;return Promise.all([P(`telemetry?days=7&scope=${t}`),P(`stats`)]).then(([n,r])=>{e||(a(n),c(r.parts.find(e=>e.scope===t)?.stats??null),u(null))}).catch(t=>{e||u(t.message)}),()=>{e=!0}},[t]),l!==null)return(0,i.jsxs)(`div`,{className:o.expandLoading,children:[e(`teleFailed`),`:`,l]});if(n===null)return(0,i.jsx)(`div`,{className:o.expandLoading,children:e(`teleLoading`)});let d=[[e(`teleWrites`),n.counts.writes],[e(`teleForgets`),n.counts.forgets],[e(`teleIngest`),n.counts.ingestRequests],[e(`teleDistill`),n.counts.distillRequests],[e(`teleConsolidate`),n.counts.consolidations]];return(0,i.jsxs)(`section`,{className:o.panelCard,children:[(0,i.jsxs)(`div`,{className:o.panelCardTitle,children:[(0,i.jsx)(`h4`,{children:e(`teleTitle`)}),(0,i.jsxs)(`span`,{className:o.telePrivacy,role:`note`,"aria-label":e(`telePrivacyHint`),tabIndex:0,children:[(0,i.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,"aria-hidden":`true`,children:[(0,i.jsx)(`circle`,{cx:`7`,cy:`7`,r:`5.5`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,i.jsx)(`line`,{x1:`7`,y1:`6`,x2:`7`,y2:`10.5`,stroke:`currentColor`,strokeWidth:`1.4`,strokeLinecap:`round`}),(0,i.jsx)(`circle`,{cx:`7`,cy:`4.2`,r:`0.7`,fill:`currentColor`})]}),(0,i.jsx)(`span`,{className:o.telePrivacyHint,children:e(`telePrivacyHint`)}),(0,i.jsx)(`span`,{className:o.telePrivacyTip,role:`tooltip`,children:e(`telePrivacyTip`)})]})]}),(0,i.jsxs)(`div`,{className:o.teleBar,children:[(0,i.jsxs)(`div`,{className:o.teleCol,children:[(0,i.jsx)(`span`,{className:o.teleColLabel,children:e(`teleGroupScale`)}),(0,i.jsxs)(`div`,{className:o.teleGrid,children:[(0,i.jsxs)(`div`,{className:o.teleStat,children:[(0,i.jsx)(`b`,{children:s?.total??0}),(0,i.jsx)(`span`,{children:e(`kpiTotal`)})]}),(0,i.jsxs)(`div`,{className:o.teleStat,children:[(0,i.jsx)(`b`,{children:s?.active??0}),(0,i.jsx)(`span`,{children:e(`kpiActive`)})]}),(0,i.jsxs)(`div`,{className:o.teleStat,children:[(0,i.jsx)(`b`,{children:s?.forgotten??0}),(0,i.jsx)(`span`,{children:e(`kpiForgotten`)})]}),(0,i.jsxs)(`div`,{className:o.teleStat,role:`meter`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round((s?.signalRatio??0)*100),"aria-label":e(`kpiSignal`),children:[(0,i.jsx)(`b`,{children:`${String(Math.round((s?.signalRatio??0)*100))}%`}),(0,i.jsx)(`span`,{children:e(`kpiSignal`)})]})]})]}),(0,i.jsxs)(`div`,{className:o.teleCol,children:[(0,i.jsx)(`span`,{className:o.teleColLabel,children:e(`teleGroupRecent`)}),(0,i.jsx)(`div`,{className:`${o.teleGrid} ${o.teleGridRecent}`,children:d.map(([e,t])=>(0,i.jsxs)(`div`,{className:o.teleStat,children:[(0,i.jsx)(`b`,{children:t}),(0,i.jsx)(`span`,{children:e})]},e))})]})]})]})}function le({t:e,scope:t}){let[n,a]=(0,r.useState)(!1),s=(0,r.useRef)(null);(0,r.useEffect)(()=>{if(!n)return;let e=e=>{(s.current===null||!s.current.contains(e.target))&&a(!1)};return window.addEventListener(`mousedown`,e),()=>{window.removeEventListener(`mousedown`,e)}},[n]);let c=[{label:e(`exportMd`),hint:e(`exportMdHint`),href:`/api/engram/export?scope=${t}&format=markdown`},{label:e(`exportJson`),hint:e(`exportJsonHint`),href:`/api/engram/export?scope=${t}&format=json`},{label:e(`exportMirror`),hint:e(`exportMirrorHint`),href:`/api/engram/mirror?scope=${t}`}];return(0,i.jsxs)(`div`,{className:o.exportWrap,ref:s,children:[(0,i.jsxs)(`button`,{type:`button`,className:o.button,"aria-haspopup":`menu`,"aria-expanded":n,onClick:()=>{a(e=>!e)},children:[e(`export`),(0,i.jsx)(`span`,{className:o.exportCaret,"aria-hidden":`true`,children:`▾`})]}),n&&(0,i.jsx)(`div`,{className:o.exportMenu,role:`menu`,children:c.map(e=>(0,i.jsxs)(`a`,{role:`menuitem`,className:o.exportItem,href:e.href,onClick:()=>{a(!1)},children:[(0,i.jsx)(`span`,{className:o.exportItemLabel,children:e.label}),(0,i.jsx)(`span`,{className:o.exportItemHint,children:e.hint})]},e.href))})]})}function V({t:e}){let t=g(),[n,a]=x(`library.scope`,`user`,[`user`,`project`,`shared`]),[s,c]=x(`library.status`,`all`,[`all`,`active`,`archived`,`forgotten`]),[l,u]=x(`library.kind`,`all`,[`all`,`fact`,`preference`,`decision`,`episode`,`skill`]),[d,f]=S(`library.q`,``),[p]=(0,r.useState)(`all`),[m,h]=(0,r.useState)(0),[_,v]=(0,r.useState)(null),[y,b]=(0,r.useState)(null),[T,D]=(0,r.useState)(null),[O,k]=(0,r.useState)(0),[j,M]=(0,r.useState)(new Set),[L,R]=(0,r.useState)(!1),[z,B]=(0,r.useState)(`observability`),V=(0,r.useCallback)(()=>{k(e=>e+1)},[]);(0,r.useEffect)(()=>{let e=!1,t=new URLSearchParams({scope:n,status:s,kind:l,redacted:p,limit:`20`,offset:String(m)});return d!==``&&t.set(`q`,d),P(`list?${t.toString()}`).then(t=>{e||(v(t),b(null))}).catch(t=>{e||b(t.message)}),()=>{e=!0}},[n,s,l,p,d,m,O]);let H=(e,n)=>{P(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n.id,scope:n.scope})}).then(V).catch(e=>{t.push(`error`,e.message)})},U=(e,t)=>{D(n=>n!==null&&n.kind===e&&n.record.id===t.id?null:{kind:e,record:t})},W=_?.records??[],G=W.filter(e=>j.has(e.id)),K=G.filter(e=>e.status===`active`).length,q=G.length-K,J=W.length>0&&W.every(e=>j.has(e.id)),ue=e=>{M(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},Y=()=>{M(new Set),R(!1)},de=()=>{M(e=>{let t=new Set(e);return J?W.forEach(e=>t.delete(e.id)):W.forEach(e=>t.add(e.id)),t})},X=e=>{let t=e===`forget`?G.filter(e=>e.status===`active`):G.filter(e=>e.status!==`active`);t.length!==0&&Promise.allSettled(t.map(t=>P(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,scope:t.scope})}))).then(()=>{Y(),V()})},fe=()=>{if(L){X(`forget`);return}R(!0)},pe=Math.floor(m/20)+1,me=_===null?1:Math.max(1,Math.ceil(_.total/20)),Z=(0,r.useRef)(new Map),[Q,he]=(0,r.useState)({left:0,width:0,opacity:0}),$=(0,r.useCallback)(()=>{let e=Z.current.get(n);e!=null&&he({left:e.offsetLeft,width:e.offsetWidth,opacity:1})},[n]);return(0,r.useEffect)(()=>{$();let e=()=>$();return window.addEventListener(`resize`,e),()=>{window.removeEventListener(`resize`,e)}},[$]),(0,i.jsxs)(`div`,{className:o.panel,children:[(0,i.jsxs)(`div`,{className:o.header,children:[(0,i.jsxs)(`div`,{className:o.headerBrand,children:[(0,i.jsx)(`span`,{className:o.headerLogo,"aria-hidden":`true`,children:(0,i.jsxs)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 48 48`,fill:`none`,children:[(0,i.jsx)(`path`,{d:`M6 20 L24 7 L42 20 Z`,fill:`currentColor`,fillOpacity:`0.9`}),(0,i.jsx)(`rect`,{x:`9`,y:`20`,width:`30`,height:`18`,rx:`1.5`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`}),(0,i.jsx)(`rect`,{x:`13`,y:`24`,width:`6`,height:`6`,rx:`1`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`}),(0,i.jsx)(`line`,{x1:`16`,y1:`24`,x2:`16`,y2:`30`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,i.jsx)(`line`,{x1:`13`,y1:`27`,x2:`19`,y2:`27`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,i.jsx)(`path`,{d:`M21 38 L21 28 Q21 25 24 25 Q27 25 27 28 L27 38`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`}),(0,i.jsx)(`rect`,{x:`29`,y:`24`,width:`6`,height:`6`,rx:`1`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`}),(0,i.jsx)(`line`,{x1:`32`,y1:`24`,x2:`32`,y2:`30`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,i.jsx)(`line`,{x1:`29`,y1:`27`,x2:`35`,y2:`27`,stroke:`currentColor`,strokeWidth:`1.2`})]})}),(0,i.jsxs)(`div`,{className:o.headerTitle,children:[(0,i.jsx)(`h2`,{children:e(`headerTitle`)}),(0,i.jsx)(`p`,{children:e(`headerSubtitle`)})]})]}),(0,i.jsxs)(`div`,{className:o.headerActions,children:[(0,i.jsxs)(`div`,{className:`${o.segGroup} ${o.segScope}`,children:[(0,i.jsx)(`span`,{className:o.segIndicator,style:{left:`${String(Q.left)}px`,width:`${String(Q.width)}px`,opacity:Q.opacity}}),[`user`,`project`,`shared`].map(t=>(0,i.jsx)(`button`,{type:`button`,ref:e=>{Z.current.set(t,e)},className:n===t?`${o.segItem} ${o.on}`:o.segItem,onClick:()=>{a(t),h(0),D(null),Y()},children:e(E[t])},t))]}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:V,children:e(`refresh`)}),(0,i.jsx)(le,{t:e,scope:n})]})]}),(0,i.jsx)(ce,{t:e,scope:n}),(0,i.jsxs)(`div`,{className:o.tabs,role:`tablist`,children:[(0,i.jsx)(`button`,{type:`button`,role:`tab`,className:z===`observability`?`${o.tabItem} ${o.on}`:o.tabItem,"aria-selected":z===`observability`,onClick:()=>{B(`observability`)},children:e(`tabObservability`)}),(0,i.jsxs)(`button`,{type:`button`,role:`tab`,className:z===`library`?`${o.tabItem} ${o.on}`:o.tabItem,"aria-selected":z===`library`,onClick:()=>{B(`library`)},children:[e(`tabLibrary`),(0,i.jsx)(`small`,{children:e(`tabLibraryCount`,{n:_?.total??0})})]})]}),z===`library`&&(0,i.jsxs)(`div`,{className:o.tabPanel,children:[(0,i.jsxs)(`div`,{className:o.filters,children:[(0,i.jsx)(`div`,{className:o.segGroup,children:[[`all`,e(`allStatuses`)],[`active`,e(`statusActive`)],[`archived`,e(`statusArchived`)],[`forgotten`,e(`statusForgotten`)]].map(([e,t])=>(0,i.jsx)(`button`,{type:`button`,className:s===e?`${o.segItem} ${o.on}`:o.segItem,onClick:()=>{c(e),h(0),D(null),Y()},children:t},e))}),(0,i.jsx)(`div`,{className:o.segGroup,children:[[`all`,e(`allKinds`)],...C.map(t=>[t,A(e,t)])].map(([e,t])=>(0,i.jsx)(`button`,{type:`button`,className:l===e?`${o.segItem} ${o.on}`:o.segItem,onClick:()=>{u(e),h(0),D(null),Y()},children:t},e))}),(0,i.jsx)(`input`,{className:`${o.input} ${o.search}`,placeholder:e(`searchPlaceholder`),value:d,onChange:e=>{f(e.target.value.trim()),h(0),D(null),Y()}})]}),j.size>0&&(0,i.jsxs)(`div`,{className:o.batchBar,children:[(0,i.jsx)(`span`,{children:e(`selectedCount`,{n:j.size})}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:de,children:e(J?`deselectAll`:`selectAll`)}),(0,i.jsx)(`button`,{type:`button`,className:o.button,disabled:q===0,onClick:()=>X(`restore`),children:e(`batchRestore`,{n:q})}),(0,i.jsx)(`button`,{type:`button`,className:L?`${o.button} ${o.danger}`:o.button,disabled:K===0,onClick:fe,children:e(L?`batchForgetConfirm`:`batchForget`,{n:K})}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:Y,children:e(`clearSelection`)})]}),y!==null&&(0,i.jsxs)(`div`,{className:o.empty,children:[(0,i.jsx)(`b`,{children:e(`loadFailed`,{msg:y})}),(0,i.jsx)(`span`,{children:e(`emptyHint`)})]}),y===null&&_===null&&(0,i.jsx)(`div`,{className:o.skeletonList,children:[0,1,2,3].map(e=>(0,i.jsxs)(`div`,{className:o.skeleton,style:{animationDelay:`${String(e*60)}ms`},children:[(0,i.jsx)(`i`,{}),(0,i.jsx)(`i`,{}),(0,i.jsx)(`i`,{})]},e))}),y===null&&_!==null&&_.records.length===0&&(0,i.jsxs)(`div`,{className:o.empty,children:[(0,i.jsx)(`b`,{children:e(`empty`)}),(0,i.jsx)(`span`,{children:e(`emptyHint`)})]}),(_?.records??[]).length>0&&(0,i.jsx)(`div`,{className:o.itemList,children:(_?.records??[]).map((t,n)=>(0,i.jsxs)(`div`,{className:j.has(t.id)?`${o.item} ${o.selected}`:o.item,style:{animationDelay:`${String(Math.min(n,12)*36)}ms`},children:[(0,i.jsx)(`input`,{type:`checkbox`,className:o.itemCheck,checked:j.has(t.id),"aria-label":t.content.slice(0,24),onChange:()=>ue(t.id)}),(0,i.jsxs)(`div`,{className:o.itemBody,children:[(0,i.jsxs)(`div`,{className:o.itemTags,children:[(0,i.jsx)(`span`,{className:`${o.pill} ${o[`status${t.status.charAt(0).toUpperCase()}${t.status.slice(1)}`]??``}`,children:e(w[t.status])}),(0,i.jsx)(`span`,{className:`${o.pill} ${o.kind}`,children:A(e,t.kind)}),t.content.includes(`[REDACTED:`)&&(0,i.jsx)(`span`,{className:`${o.pill} ${o.redacted}`,children:e(`tagRedacted`)}),t.outcome!==void 0&&(0,i.jsx)(`span`,{className:`${o.pill} ${t.outcome===`success`?o.outcomeSuccess:o.outcomeFailure}`,children:t.outcome===`success`?e(`tagOutcomeSuccess`):e(`tagOutcomeFailure`)}),(0,i.jsxs)(`span`,{className:o.pill,title:F(t.createdAt),style:{marginLeft:`auto`},children:[e(E[t.scope]),` · `,I(e,t.createdAt)]})]}),(0,i.jsx)(`div`,{className:o.content,children:t.content}),(0,i.jsxs)(`div`,{className:o.itemMeta,children:[(0,i.jsxs)(`span`,{children:[(0,i.jsx)(`b`,{children:e(`importance`)}),` `,t.importance.toFixed(2)]}),(0,i.jsxs)(`span`,{children:[(0,i.jsx)(`b`,{children:e(`confidence`)}),` `,t.confidence.toFixed(2)]}),(0,i.jsx)(`span`,{children:e(`accessCount`,{n:t.accessCount})}),(0,i.jsx)(`span`,{children:N(e,t)})]})]}),(0,i.jsxs)(`div`,{className:o.itemOps,children:[(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{U(`review`,t)},children:e(`detail`)}),(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{U(`edit`,t)},children:e(`edit`)}),t.status===`active`?(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{H(`forget`,t)},children:e(`forget`)}):(0,i.jsx)(`button`,{type:`button`,className:o.button,onClick:()=>{H(`restore`,t)},children:e(`restore`)})]})]},t.id))}),(0,i.jsxs)(`div`,{className:o.pager,children:[(0,i.jsx)(`button`,{type:`button`,className:o.button,disabled:m===0,"aria-label":e(`prevPage`),onClick:()=>{h(Math.max(0,m-20)),D(null),Y()},children:`‹`}),(0,i.jsx)(`span`,{children:e(`pagerInfo`,{page:pe,pages:me,total:_?.total??0})}),(0,i.jsx)(`button`,{type:`button`,className:o.button,disabled:_===null||m+20>=_.total,"aria-label":e(`nextPage`),onClick:()=>{h(m+20),D(null),Y()},children:`›`})]})]}),z===`observability`&&(0,i.jsx)(`div`,{className:o.tabPanel,children:(0,i.jsxs)(`div`,{className:o.layout,children:[(0,i.jsxs)(`div`,{className:o.mainCol,children:[(0,i.jsxs)(`section`,{className:o.panelCard,children:[(0,i.jsx)(`h4`,{className:o.panelCardTitle,children:e(`healthTitle`)}),(0,i.jsx)(se,{t:e,scope:n})]}),(0,i.jsxs)(`section`,{className:o.panelCard,children:[(0,i.jsx)(`h4`,{className:o.panelCardTitle,children:e(`sectionCorridor`)}),(0,i.jsx)(oe,{t:e,scope:n,onSelect:e=>{D({kind:`review`,record:_?.records.find(t=>t.id===e)??{id:e,scope:n,kind:`fact`,content:``,importance:.5,confidence:.5,status:`active`,createdAt:Date.now(),accessCount:0,sourceSessionId:null,sourceRound:null}})}})]}),(0,i.jsxs)(`section`,{className:o.panelCard,children:[(0,i.jsx)(`h4`,{className:o.panelCardTitle,children:e(`sectionBench`)}),(0,i.jsx)(ne,{t:e,scope:n})]}),(0,i.jsxs)(`section`,{className:o.panelCard,children:[(0,i.jsx)(`h4`,{className:o.panelCardTitle,children:e(`refurbTitle`)}),(0,i.jsx)(ae,{t:e,scope:n,onSelect:e=>{D({kind:`review`,record:_?.records.find(t=>t.id===e)??{id:e,scope:n,kind:`fact`,content:``,importance:.5,confidence:.5,status:`active`,createdAt:Date.now(),accessCount:0,sourceSessionId:null,sourceRound:null}})},onAfterAction:V,toast:t})]})]}),(0,i.jsxs)(`aside`,{className:o.sideCol,children:[(0,i.jsxs)(`section`,{className:o.panelCard,children:[(0,i.jsx)(`h4`,{className:o.panelCardTitle,children:e(`tourProposalTitle`)}),(0,i.jsx)(ie,{t:e,scope:n,onSelect:e=>{D({kind:`review`,record:_?.records.find(t=>t.id===e)??{id:e,scope:n,kind:`fact`,content:``,importance:.5,confidence:.5,status:`active`,createdAt:Date.now(),accessCount:0,sourceSessionId:null,sourceRound:null}})}})]}),(0,i.jsxs)(`section`,{className:o.panelCard,children:[(0,i.jsx)(`h4`,{className:o.panelCardTitle,children:e(`sectionActivity`)}),(0,i.jsx)(re,{t:e})]})]})]})}),T!==null&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`div`,{className:o.drawerScrim,onClick:()=>{D(null)}}),(0,i.jsxs)(`aside`,{className:o.drawer,role:`dialog`,"aria-label":e(`drawerTitle`),children:[(0,i.jsxs)(`header`,{className:o.drawerHead,children:[(0,i.jsxs)(`div`,{className:o.drawerTitle,children:[(0,i.jsx)(`h3`,{children:e(`drawerTitle`)}),(0,i.jsx)(`span`,{title:T.record.id,children:`#${T.record.id.slice(0,8)}…`})]}),(0,i.jsx)(`button`,{type:`button`,className:o.drawerClose,"aria-label":e(`drawerClose`),onClick:()=>{D(null)},children:(0,i.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,"aria-hidden":`true`,children:(0,i.jsx)(`path`,{d:`M2 2 L12 12 M12 2 L2 12`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`})})})]}),(0,i.jsx)(`div`,{className:o.drawerBody,children:T.kind===`review`?(0,i.jsx)(ee,{t:e,recordId:T.record.id,scope:T.record.scope}):(0,i.jsx)(te,{t:e,record:T.record,onClose:()=>{D(null)},onSaved:()=>{D(null),V()},toast:t})})]})]}),t.viewport]})}let H=`engram`,U={nav:`记忆宫殿`,scopeUser:`私人宫殿`,scopeProject:`项目宫殿`,scopeShared:`共享宫殿`,refresh:`重访`,exportMd:`导出 MD`,exportJson:`导出 JSON`,export:`导出`,exportMirror:`镜像目录`,exportMdHint:`单文件,可直接分享`,exportJsonHint:`结构化全文,便于程序处理`,exportMirrorHint:`每房间一个 .md,可用 Obsidian 漫游`,allStatuses:`全部房间`,allKinds:`全部楼层`,redactedAll:`全部铭牌`,redactedOnly:`含涂改`,redactedNone:`无涂改`,tagRedacted:`已涂改`,tagOutcomeSuccess:`管家验证·有效`,tagOutcomeFailure:`管家验证·失效`,searchPlaceholder:`在宫殿里寻找…`,statusActive:`对外开放`,statusArchived:`展厅陈列`,statusForgotten:`已闭馆`,kindFact:`事实层`,kindPreference:`偏好层`,kindDecision:`决策层`,kindEpisode:`事件层`,kindSkill:`技能层`,labelContent:`铭牌`,labelKind:`楼层`,labelStatus:`房门状态`,labelScope:`宫殿归属`,importance:`地标亮度`,confidence:`考据可靠度`,accessCount:`参观 {n} 人次`,labelCreated:`开馆时间`,timeJustNow:`方才`,timeMinutesAgo:`{n} 分钟前`,timeHoursAgo:`{n} 小时前`,timeDaysAgo:`{n} 天前`,sourceExplicit:`管理员添置`,sourceSession:`发掘地 {id}`,round:`第 {n} 趟`,cardActive:`开放 {n}`,cardRedacted:`涂改 {n}`,signalRatio:`走廊清晰度 {n}%`,detail:`参观`,edit:`修缮`,forget:`封门`,restore:`重开`,empty:`宫殿暂无可陈展的房间`,emptyHint:`试试调整楼层筛选,或新添一间`,loadFailed:`访客受挫:{msg}`,loading:`导览中…`,pagerInfo:`第 {page} / {pages} 层 · 共 {total} 间`,prevPage:`上层`,nextPage:`下层`,cancel:`作罢`,saveWithHint:`修缮(旧铭牌归展厅)`,detailAttributes:`铭牌`,detailSource:`发掘地`,detailRelations:`邻接走廊`,detailOperations:`管家日志`,relSupersededBy:`被替代`,relSupersedes:`替代`,relContradicts:`互斥`,relRelated:`相邻`,headerTitle:`记忆宫殿`,headerSubtitle:`跨会话长期记忆宫殿`,tabLibrary:`宫殿陈展`,tabObservability:`导览管家`,tabLibraryCount:`{n} 间`,drawerClose:`归殿`,drawerTitle:`房间铭牌`,kpiTotal:`房间`,kpiActive:`开放`,kpiForgotten:`闭馆`,kpiSignal:`清晰度`,opWrite:`落成`,opUpdate:`修缮`,opForget:`封门`,opRestore:`重开`,opDecay:`闭门陈列`,opSuperseded:`被替代`,opIngestRequest:`发掘请求`,opIngestDone:`发掘完成`,opOutcomeReport:`管家验证`,opSearchRewrite:`路线改写`,opCompressRequest:`导览压缩`,opDistillRequest:`重塑楼层`,selectAll:`本页全选`,deselectAll:`取消全选`,selectedCount:`已选 {n} 间`,batchForget:`批量封门({n})`,batchForgetConfirm:`确认封门 {n} 间?`,batchRestore:`批量重开({n})`,clearSelection:`清空所选`,sectionBench:`试走一遍`,sectionCorridor:`走廊鸟瞰`,corridorEmpty:`走廊空空如也,落成几间房间后这里会出现鸟瞰图。`,corridorFailed:`走廊加载失败`,corridorLoad:`加载走廊鸟瞰…`,healthTitle:`宫殿健康分`,healthLoading:`正在诊脉…`,healthFailed:`诊脉失败`,healthMetricSignal:`走廊清晰度`,healthMetricActive:`对外开放率`,healthMetricCorridors:`走廊密度`,healthMetricRedaction:`涂改缓解`,healthMetricDecay:`衰减覆盖`,teleTitle:`管家日报`,teleFailed:`遥测加载失败`,teleLoading:`聚合管家记录中…`,teleGroupScale:`规模`,teleGroupRecent:`近 7 天`,telePrivacyHint:`数据仅在本机聚合 · 不外传`,telePrivacyTip:`所有 op_log 与遥测计数只在当前进程的 SQLite 里聚合,从未发送至任何外部服务;本机重启或卸载插件即清空。`,teleWrites:`落成`,teleForgets:`闭馆`,teleIngest:`发掘`,teleDistill:`蒸馏`,teleConsolidate:`整理`,benchPlaceholder:`说出要找的房间关键词或语义…`,benchRun:`出发`,benchScopeAll:`全部宫殿`,benchHits:`到访 {n} 间`,benchDegraded:`语义灯熄,仅关键词引路`,benchEmpty:`此路不通`,benchNote:`试走与正式导览共用同一张地图,会计入参观人次`,viaFts:`关键词`,viaVec:`语义`,viaBoth:`双路`,viaEdgeLabel:`邻接走廊`,benchRewrite:`路线改写为 {n} 段`,benchCompress:`铭牌压缩 {n} 条`,sectionActivity:`管家日志`,activityEmpty:`暂无管家活动`,detailRevisions:`陈展沿革`,tourProposalTitle:`入殿导航`,tourProposalEmpty:`宫殿尚空,建议先放第一段记忆(调用 engram_save)`,tourProposalHint:`点击房间可展开抽屉查看铭牌`,tourFocusAll:`全部`,refurbTitle:`翻新清单`,refurbEmpty:`所有房间状态健康,无翻新建议`,refurbRun:`重新扫描`,refurbActionDemote:`降级`,refurbActionMerge:`合并`,refurbActionReview:`复习`,refurbActionSplit:`拆分`,refurbCount:`{n} 条建议`,refurbExecute:`执行`,refurbConfirmDemote:`确认降级此房间?执行后状态转 archived,可在统计页恢复。`,refurbConfirmMerge:`确认合并 {n} 间相似房间?将触发 engram_distill 把多间归纳为 1 条高层规律。`,refurbDemoteDone:`已降级`,refurbMergeDone:`合并任务已派发`,refurbActionFailed:`执行失败:{msg}`,refurbMergeEmpty:`无可合并的候选条目`},W={nav:`Memory Palace`,scopeUser:`Private Palace`,scopeProject:`Project Palace`,scopeShared:`Shared Palace`,refresh:`Revisit`,exportMd:`Export MD`,exportJson:`Export JSON`,export:`Export`,exportMirror:`Mirror tree`,exportMdHint:`Single file, easy to share`,exportJsonHint:`Structured full dump for scripts`,exportMirrorHint:`One .md per room, roamable in Obsidian`,allStatuses:`All rooms`,allKinds:`All floors`,redactedAll:`All placards`,redactedOnly:`Redacted`,redactedNone:`Unredacted`,tagRedacted:`redacted`,tagOutcomeSuccess:`curator: worked`,tagOutcomeFailure:`curator: failed`,searchPlaceholder:`Wander the palace…`,statusActive:`open to public`,statusArchived:`on display`,statusForgotten:`closed`,kindFact:`Fact Floor`,kindPreference:`Preference Floor`,kindDecision:`Decision Floor`,kindEpisode:`Episode Floor`,kindSkill:`Skill Floor`,labelContent:`Placard`,labelKind:`Floor`,labelStatus:`Door`,labelScope:`Palace`,importance:`Beacon`,confidence:`Provenance`,accessCount:`{n} visits`,labelCreated:`Opened`,timeJustNow:`just now`,timeMinutesAgo:`{n} min ago`,timeHoursAgo:`{n} hr ago`,timeDaysAgo:`{n} d ago`,sourceExplicit:`Curator placed`,sourceSession:`Excavated at {id}`,round:`pass {n}`,cardActive:`{n} open`,cardRedacted:`{n} redacted`,signalRatio:`corridor clarity {n}%`,detail:`Tour`,edit:`Renovate`,forget:`Close`,restore:`Reopen`,empty:`No exhibits to display`,emptyHint:`Adjust the floors above, or place a new room`,loadFailed:`Tour halted: {msg}`,loading:`Guiding…`,pagerInfo:`Floor {page} / {pages} · {total} rooms`,prevPage:`Floor up`,nextPage:`Floor down`,cancel:`Cancel`,saveWithHint:`Renovate (archive old placard)`,detailAttributes:`Placard`,detailSource:`Excavation`,detailRelations:`Corridors`,detailOperations:`Curator log`,relSupersededBy:`Superseded by`,relSupersedes:`Supersedes`,relContradicts:`Contradicts`,relRelated:`Adjacent`,headerTitle:`Memory Palace`,headerSubtitle:`Cross-session long-term memory palace`,tabLibrary:`Palace`,tabObservability:`Tour butler`,tabLibraryCount:`{n} rooms`,drawerClose:`Return`,drawerTitle:`Room placard`,kpiTotal:`Rooms`,kpiActive:`Open`,kpiForgotten:`Closed`,kpiSignal:`Clarity`,opWrite:`opened`,opUpdate:`renovated`,opForget:`closed`,opRestore:`reopened`,opDecay:`archived`,opSuperseded:`superseded`,opIngestRequest:`excavation requested`,opIngestDone:`excavated`,opOutcomeReport:`curator report`,opSearchRewrite:`route rewritten`,opCompressRequest:`placard compressed`,opDistillRequest:`floor remodelled`,selectAll:`Select all on floor`,deselectAll:`Deselect all`,selectedCount:`{n} rooms`,batchForget:`Close selected ({n})`,batchForgetConfirm:`Close {n} rooms?`,batchRestore:`Reopen selected ({n})`,clearSelection:`Clear selection`,sectionBench:`Take a walk`,sectionCorridor:`Corridor overview`,corridorEmpty:`No rooms yet — the bird’s-eye view appears after a few rooms open.`,corridorFailed:`Failed to load corridor`,corridorLoad:`Loading corridor overview…`,healthTitle:`Palace health`,healthLoading:`Taking pulse…`,healthFailed:`Pulse failed`,healthMetricSignal:`Corridor clarity`,healthMetricActive:`Open ratio`,healthMetricCorridors:`Corridor density`,healthMetricRedaction:`Redaction relief`,healthMetricDecay:`Decay coverage`,teleTitle:`Curator log`,teleFailed:`Telemetry failed`,teleLoading:`Aggregating curator events…`,teleGroupScale:`Scale`,teleGroupRecent:`Last 7 days`,telePrivacyHint:`Local aggregation only · never transmitted`,telePrivacyTip:`All op_log and telemetry counters are aggregated in this process’s SQLite only; nothing is sent to any external service. Clearing the plugin or restarting the host wipes the data.`,teleWrites:`Opened`,teleForgets:`Closed`,teleIngest:`Excavated`,teleDistill:`Distilled`,teleConsolidate:`Consolidated`,benchPlaceholder:`Name a room by keyword or meaning…`,benchRun:`Walk`,benchScopeAll:`All palaces`,benchHits:`{n} rooms found`,benchDegraded:`Beacon dark · keyword lane only`,benchEmpty:`No route found`,benchNote:`Walk uses the same map as the guided tour and counts as a visit`,viaFts:`keyword`,viaVec:`semantic`,viaBoth:`dual`,viaEdgeLabel:`corridor`,benchRewrite:`route split into {n}`,benchCompress:`compressed {n} overflow placards`,sectionActivity:`Curator log`,activityEmpty:`No curator activity yet`,detailRevisions:`Exhibit history`,tourProposalTitle:`Tour proposal`,tourProposalEmpty:`The palace is empty — place a first room via engram_save`,tourProposalHint:`Click a room to open its placard`,tourFocusAll:`All`,refurbTitle:`Refurb suggestions`,refurbEmpty:`All rooms are healthy — no suggestions`,refurbRun:`Re-scan`,refurbActionDemote:`demote`,refurbActionMerge:`merge`,refurbActionReview:`review`,refurbActionSplit:`split`,refurbCount:`{n} suggestions`,refurbExecute:`Apply`,refurbConfirmDemote:`Demote this room? Status will become archived; you can reopen it later.`,refurbConfirmMerge:`Merge {n} similar rooms? This triggers engram_distill to fold them into one higher-level pattern.`,refurbDemoteDone:`Demoted`,refurbMergeDone:`Merge dispatched`,refurbActionFailed:`Action failed: {msg}`,refurbMergeEmpty:`No merge candidates`},G=[`slots`,`locale`];function K(e){e.effect(()=>e.locale.register(H,{zh:U,en:W}),`dsh-engram: dictionaries`);let t=e.locale.bind(H);e.slots.inject(`settings.section`,()=>e.slots.register({name:`settings.section`,id:`engram`,order:20,label:()=>t(`nav`),locale:H},V))}return n.apply=K,n.inject=G,t.exports}});
|
|
2
2
|
//# sourceMappingURL=client.js.map
|