@kenz1117/dsh-engram 0.7.12 → 0.7.14
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 +8 -2
- package/README.md +8 -2
- package/lib/client.js +2 -2
- package/lib/client.js.map +1 -1
- package/lib/index.js +501 -18
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["useMemo","useRef","useState","styles","styles","useState","useRef","useCallback","useState","useCallback","styles","useCallback","useSyncExternalStore","useState","useRef"],"sources":["../src/client/locales.ts","../src/client/CorridorMap.tsx","../src/client/Toast.tsx","../src/client/UiStorage.ts","../src/client/EngramPanel.tsx","../src/client/index.ts"],"sourcesContent":["/**\n * 「记忆库」client 词典:zh/en 键并集必须完全一致(类型化注册的编译约束)。\n * 数据层英文枚举(status/kind/op 等)只在显示层映射,存储值保持英文不变。\n * @module @kenz1117/dsh-engram/client/locales\n */\n\n/** 词典命名空间(同时用作 LocaleNamespaceMap 的声明合并键)。 */\nexport const NS = 'engram'\n\n/** 「记忆库」全部界面文案键。 */\nexport type EngramKey =\n | 'nav'\n | 'scopeUser'\n | 'scopeProject'\n | 'scopeShared'\n | 'projectFollow'\n | 'projectFollowNamed'\n | 'projectFollowHint'\n | 'projectPinned'\n | 'projectUnregistered'\n | 'projectNoWorkspace'\n | 'projectSwitch'\n | 'projectMemories'\n | 'projectProcessDefault'\n | 'refresh'\n | 'exportMd'\n | 'exportJson'\n | 'export'\n | 'exportMirror'\n | 'exportMdHint'\n | 'exportJsonHint'\n | 'exportMirrorHint'\n | 'allStatuses'\n | 'allKinds'\n | 'redactedAll'\n | 'redactedOnly'\n | 'redactedNone'\n | 'tagRedacted'\n | 'tagOutcomeSuccess'\n | 'tagOutcomeFailure'\n | 'searchPlaceholder'\n | 'statusActive'\n | 'statusArchived'\n | 'statusForgotten'\n | 'kindFact'\n | 'kindPreference'\n | 'kindDecision'\n | 'kindEpisode'\n | 'kindSkill'\n | 'labelContent'\n | 'labelKind'\n | 'labelStatus'\n | 'labelScope'\n | 'importance'\n | 'confidence'\n | 'accessCount'\n | 'labelCreated'\n | 'timeJustNow'\n | 'timeMinutesAgo'\n | 'timeHoursAgo'\n | 'timeDaysAgo'\n | 'sourceExplicit'\n | 'sourceSession'\n | 'round'\n | 'cardRedacted'\n | 'detail'\n | 'edit'\n | 'forget'\n | 'restore'\n | 'empty'\n | 'loadFailed'\n | 'loading'\n | 'pagerInfo'\n | 'prevPage'\n | 'nextPage'\n | 'cancel'\n | 'saveWithHint'\n | 'detailAttributes'\n | 'detailSource'\n | 'detailRelations'\n | 'detailOperations'\n | 'headerTitle'\n | 'headerSubtitle'\n | 'tabToday'\n | 'tabLibrary'\n | 'tabCorridor'\n | 'tabLog'\n | 'tabLibraryCount'\n | 'roomsTitle'\n | 'roomsHint'\n | 'healthEvaluatedAt'\n | 'logFilterAll'\n | 'logFilterWrite'\n | 'logFilterIngest'\n | 'logFilterRetrieve'\n | 'logFilterOrganize'\n | 'logCount'\n | 'benchTitle'\n | 'drawerClose'\n | 'drawerTitle'\n | 'kpiTotal'\n | 'kpiActive'\n | 'kpiForgotten'\n | 'kpiSignal'\n | 'emptyHint'\n | 'relSupersededBy'\n | 'relSupersedes'\n | 'relContradicts'\n | 'relRelated'\n | 'opWrite'\n | 'opWriteMerge'\n | 'opUpdate'\n | 'opForget'\n | 'opRestore'\n | 'opDecay'\n | 'opSuperseded'\n | 'opIngestRequest'\n | 'opIngestDone'\n | 'opOutcomeReport'\n | 'opAssess'\n | 'opConsolidation'\n | 'opReviewAnswer'\n | 'opSlotAssign'\n | 'opSlotBackfill'\n | 'opRoomOpen'\n | 'consolidateArchived'\n | 'consolidateMerged'\n | 'consolidateSkipped'\n | 'decayArchived'\n | 'slotBackfilled'\n | 'roomOpened'\n | 'reviewAnswered'\n | 'assessAdequate'\n | 'assessInadequate'\n | 'assessRefs'\n | 'opSearchRewrite'\n | 'opCompressRequest'\n | 'opDistillRequest'\n | 'selectAll'\n | 'deselectAll'\n | 'selectedCount'\n | 'batchForget'\n | 'batchForgetConfirm'\n | 'batchRestore'\n | 'clearSelection'\n | 'sectionCorridor'\n | 'corridorEmpty'\n | 'corridorFailed'\n | 'corridorLoad'\n | 'corridorAria'\n | 'corridorSummary'\n | 'edgeSupersedes'\n | 'edgeContradicts'\n | 'edgeOther'\n | 'healthLoading'\n | 'teleFailed'\n | 'teleLoading'\n | 'teleGroupRecent'\n | 'telePrivacyHint'\n | 'telePrivacyTip'\n | 'teleWrites'\n | 'teleIngest'\n | 'teleConsolidate'\n | 'benchPlaceholder'\n | 'benchRun'\n | 'benchScopeAll'\n | 'benchHits'\n | 'benchDegraded'\n | 'benchEmpty'\n | 'benchNote'\n | 'viaFts'\n | 'viaVec'\n | 'viaBoth'\n | 'viaEdgeLabel'\n | 'benchRewrite'\n | 'benchCompress'\n | 'activityEmpty'\n | 'detailRevisions'\n | 'tourProposalTitle'\n | 'tourProposalEmpty'\n | 'tourProposalHint'\n | 'tourFocusAll'\n | 'refurbTitle'\n | 'refurbEmpty'\n | 'refurbRun'\n | 'refurbActionDemote'\n | 'refurbActionMerge'\n | 'refurbActionReview'\n | 'refurbActionSplit'\n | 'refurbCount'\n | 'refurbExecute'\n | 'refurbConfirmDemote'\n | 'refurbConfirmMerge'\n | 'refurbDemoteDone'\n | 'refurbMergeDone'\n | 'refurbActionFailed'\n | 'refurbMergeEmpty'\n | 'heroDue'\n | 'filterDueToday'\n | 'sortTime'\n | 'sortTour'\n | 'dueBadgeLabel'\n | 'tabBackfill'\n | 'backfillIntro'\n | 'backfillRulesTitle'\n | 'backfillDays'\n | 'backfillDaysAll'\n | 'backfillDaysUnit'\n | 'backfillMaxTurns'\n | 'backfillMaxTotal'\n | 'backfillModel'\n | 'backfillModelAuto'\n | 'backfillIncludeSubagents'\n | 'backfillIncludeSeeded'\n | 'backfillIncludeNoCwd'\n | 'backfillReestimate'\n | 'backfillEstimateTitle'\n | 'backfillCandidates'\n | 'backfillPendingTurns'\n | 'backfillAlready'\n | 'backfillSkippedDetail'\n | 'backfillTruncated'\n | 'backfillStart'\n | 'backfillPause'\n | 'backfillStateRunning'\n | 'backfillStateDone'\n | 'backfillStateCancelled'\n | 'backfillStateFailed'\n | 'backfillProgressSessions'\n | 'backfillProgressTurns'\n | 'backfillWritten'\n | 'backfillTurnsSkipped'\n | 'backfillTurnsFailed'\n | 'backfillFailures'\n | 'backfillEstimating'\n | 'backfillSkipReasons'\n | 'backfillRouteHint'\n | 'skipLowActivity'\n | 'skipChitchat'\n | 'skipForbidden'\n | 'skipNoContent'\n | 'skipAlready'\n | 'skipNoTurn'\n | 'skipNoRoute'\n | 'skipUnparsable'\n | 'opProfileEdit'\n | 'profileOpCreate'\n | 'profileOpEdit'\n | 'profileOpRollback'\n | 'profileTitle'\n | 'profileEmpty'\n | 'profileEmptyHint'\n | 'profileCurrent'\n | 'profileHistory'\n | 'profileSourceEdit'\n | 'profileSourceRollback'\n | 'profileDiffBase'\n | 'profileDiffTarget'\n | 'profileDiffNone'\n | 'profileLoadFailed'\n | 'tabEpisodes'\n | 'episodeSince'\n | 'episodeUntil'\n | 'episodeSessionId'\n | 'episodeApply'\n | 'episodeReset'\n | 'episodeHint'\n | 'episodeNoGroups'\n | 'episodeNoSession'\n | 'episodeSummaryMissing'\n | 'episodeEntries'\n | 'episodeNearby'\n | 'episodeAroundTitle'\n | 'episodeAroundEmpty'\n | 'episodeClose'\n | 'tabEntities'\n | 'entityHint'\n | 'entityKindAll'\n | 'entityKindPerson'\n | 'entityKindProject'\n | 'entityKindTool'\n | 'entityKindConcept'\n | 'entityKindOther'\n | 'entitySearchPlaceholder'\n | 'entityCount'\n | 'entityMemories'\n | 'entityOpen'\n | 'entityAliases'\n | 'entityNoMemories'\n | 'entityEmpty'\n | 'factSection'\n | 'factEmpty'\n | 'factValid'\n | 'factInvalid'\n | 'tabJev'\n | 'jevIntro'\n | 'jevEnabled'\n | 'jevStatusOn'\n | 'jevStatusOff'\n | 'jevApiKey'\n | 'jevApiKeyHint'\n | 'jevApiKeyUnset'\n | 'jevClearKey'\n | 'jevKeyCleared'\n | 'jevBaseUrl'\n | 'jevModel'\n | 'jevTimeoutMs'\n | 'jevThresholdsTitle'\n | 'jevThresholdLine'\n | 'jevSave'\n | 'jevSaved'\n | 'jevLoadFailed'\n | 'jevTest'\n | 'jevTestOk'\n | 'jevTestFail'\n | 'jevObsTitle'\n | 'jevObsEmpty'\n | 'jevObsLoadFailed'\n | 'jevObsSiteBand'\n | 'jevObsSiteContradiction'\n | 'jevObsVerdictMerge'\n | 'jevObsVerdictAccept'\n | 'jevObsVerdictDefer'\n | 'jevObsVerdictConfirm'\n | 'jevObsVerdictReject'\n | 'jevObsVerdictFallback'\n | 'jevObsNoAnswer'\n | 'jevObsErrorLine'\n\n/** kind 数据值 → 词典键(面板与走廊图共用一份,避免两处各自硬编码房间名)。 */\nexport const KIND_KEY: Readonly<Record<string, EngramKey>> = {\n fact: 'kindFact',\n preference: 'kindPreference',\n decision: 'kindDecision',\n episode: 'kindEpisode',\n skill: 'kindSkill',\n}\n\n/** 中文词典(宿主默认语言)。整页采用「记忆宫殿」语言:宫殿 / 房间(kind 分组)/ 记忆 / 铭牌 / 参观 / 管家 / 走廊。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定以保证编译约束。 */\nexport const zh: Record<EngramKey, string> = {\n nav: '记忆宫殿',\n scopeUser: '私人宫殿',\n scopeProject: '项目宫殿',\n scopeShared: '共享宫殿',\n projectFollow: '跟随当前工作区',\n projectFollowNamed: '项目 · 跟随 {name}',\n projectFollowHint: '项目宫殿跟随 GUI 当前选中的工作区(按会话归属判定)',\n projectPinned: '项目 · {name}',\n projectUnregistered: '未注册工作区',\n projectNoWorkspace: '无工作区信息(进程默认)',\n projectSwitch: '项目宫殿来源',\n projectMemories: '{n} 条记忆',\n projectProcessDefault: '进程默认目录',\n refresh: '重访',\n exportMd: '导出 MD',\n exportJson: '导出 JSON',\n export: '导出',\n exportMirror: '镜像目录',\n exportMdHint: '单文件,可直接分享',\n exportJsonHint: '结构化全文,便于程序处理',\n exportMirrorHint: '每条记忆一个 .md,可用 Obsidian 漫游',\n allStatuses: '全部状态',\n allKinds: '全部房间',\n redactedAll: '全部铭牌',\n redactedOnly: '含涂改',\n redactedNone: '无涂改',\n tagRedacted: '已涂改',\n tagOutcomeSuccess: '管家验证·有效',\n tagOutcomeFailure: '管家验证·失效',\n searchPlaceholder: '在宫殿里寻找…',\n statusActive: '对外开放',\n statusArchived: '展厅陈列',\n statusForgotten: '已闭馆',\n kindFact: '事实厅',\n kindPreference: '偏好阁',\n kindDecision: '决策堂',\n kindEpisode: '往事廊',\n kindSkill: '技法坊',\n labelContent: '铭牌',\n labelKind: '房间',\n labelStatus: '状态',\n labelScope: '宫殿归属',\n importance: '地标亮度',\n confidence: '考据可靠度',\n accessCount: '参观 {n} 人次',\n labelCreated: '开馆时间',\n timeJustNow: '方才',\n timeMinutesAgo: '{n} 分钟前',\n timeHoursAgo: '{n} 小时前',\n timeDaysAgo: '{n} 天前',\n sourceExplicit: '管理员添置',\n sourceSession: '发掘地 {id}',\n round: '第 {n} 趟',\n cardRedacted: '涂改 {n}',\n detail: '参观',\n edit: '修缮',\n forget: '封门',\n restore: '重开',\n empty: '宫殿暂无可陈展的记忆',\n emptyHint: '试试调整房间筛选,或新添一条',\n loadFailed: '访客受挫:{msg}',\n loading: '导览中…',\n pagerInfo: '第 {page} / {pages} 页 · 共 {total} 条',\n prevPage: '上一页',\n nextPage: '下一页',\n cancel: '作罢',\n saveWithHint: '修缮(旧铭牌归展厅)',\n detailAttributes: '铭牌',\n detailSource: '发掘地',\n detailRelations: '邻接走廊',\n detailOperations: '管家日志',\n relSupersededBy: '被替代',\n relSupersedes: '替代',\n relContradicts: '互斥',\n relRelated: '相邻',\n headerTitle: '记忆宫殿',\n headerSubtitle: '跨会话长期记忆宫殿',\n tabToday: '今日',\n tabLibrary: '陈展',\n tabCorridor: '走廊',\n tabLog: '日志',\n tabLibraryCount: '{n} 条',\n roomsTitle: '房间目录',\n roomsHint: '每间满 9 个桩位后开新间',\n healthEvaluatedAt: '诊脉于 {time}',\n logFilterAll: '全部',\n logFilterWrite: '落成类',\n logFilterIngest: '发掘',\n logFilterRetrieve: '检索',\n logFilterOrganize: '整理',\n logCount: '{n} 条 · 两库合并倒序',\n benchTitle: '检索实验台',\n drawerClose: '归殿',\n drawerTitle: '记忆铭牌',\n kpiTotal: '记忆',\n kpiActive: '开放',\n kpiForgotten: '闭馆',\n kpiSignal: '清晰度',\n opWrite: '落成',\n opWriteMerge: '落成·并入',\n opUpdate: '修缮',\n opForget: '封门',\n opRestore: '重开',\n opDecay: '闭门陈列',\n opSuperseded: '被替代',\n opIngestRequest: '发掘请求',\n opIngestDone: '发掘完成',\n opOutcomeReport: '管家验证',\n opAssess: '证据判定',\n opConsolidation: '闭馆整理',\n opReviewAnswer: '复习答题',\n opSlotAssign: '排桩',\n opSlotBackfill: '批量排桩',\n opRoomOpen: '开新房',\n consolidateArchived: '归档 {n}',\n consolidateMerged: '合并 {n}',\n consolidateSkipped: '跳过 {n}',\n decayArchived: '归档 {n}',\n slotBackfilled: '新排 {n} 个桩位',\n roomOpened: '开新房 {room}',\n reviewAnswered: '评分 {grade} · 下次 {days} 天后',\n assessAdequate: '证据充足',\n assessInadequate: '证据不足',\n assessRefs: '{n} 条证据',\n opSearchRewrite: '路线改写',\n opCompressRequest: '导览压缩',\n opDistillRequest: '合并房间',\n selectAll: '本页全选',\n deselectAll: '取消全选',\n selectedCount: '已选 {n} 条',\n batchForget: '批量封门({n})',\n batchForgetConfirm: '确认封门 {n} 条?',\n batchRestore: '批量重开({n})',\n clearSelection: '清空所选',\n sectionCorridor: '走廊鸟瞰',\n corridorEmpty: '走廊空空如也,落成几条记忆后这里会出现鸟瞰图。',\n corridorFailed: '走廊加载失败',\n corridorLoad: '加载走廊鸟瞰…',\n corridorAria: '走廊鸟瞰图',\n corridorSummary: '{nodes} 条记忆 · {edges} 条走廊',\n edgeSupersedes: '推陈出新',\n edgeContradicts: '互斥',\n edgeOther: '相邻 / 支持 / 提炼',\n healthLoading: '正在诊脉…',\n teleFailed: '遥测加载失败',\n teleLoading: '聚合管家记录中…',\n teleGroupRecent: '近 7 天',\n telePrivacyHint: '数据仅在本机聚合 · 不外传',\n telePrivacyTip: '所有 op_log 与遥测计数只在当前进程的 SQLite 里聚合,从未发送至任何外部服务;本机重启或卸载插件即清空。',\n teleWrites: '落成',\n teleIngest: '发掘',\n teleConsolidate: '整理',\n benchPlaceholder: '说出要找的房间关键词或语义…',\n benchRun: '出发',\n benchScopeAll: '全部宫殿',\n benchHits: '到访 {n} 间',\n benchDegraded: '语义灯熄,仅关键词引路',\n benchEmpty: '此路不通',\n benchNote: '试走与正式导览共用同一张地图,会计入参观人次',\n viaFts: '关键词',\n viaVec: '语义',\n viaBoth: '双路',\n viaEdgeLabel: '邻接走廊',\n benchRewrite: '路线改写为 {n} 段',\n benchCompress: '铭牌压缩 {n} 条',\n activityEmpty: '暂无管家活动',\n detailRevisions: '陈展沿革',\n tourProposalTitle: '入殿导航',\n tourProposalEmpty: '宫殿尚空,建议先放第一段记忆(调用 engram_save)',\n tourProposalHint: '点击记忆可展开抽屉查看铭牌',\n tourFocusAll: '全部',\n refurbTitle: '翻新清单',\n refurbEmpty: '所有房间状态健康,无翻新建议',\n refurbRun: '重新扫描',\n refurbActionDemote: '降级',\n refurbActionMerge: '合并',\n refurbActionReview: '复习',\n refurbActionSplit: '拆分',\n refurbCount: '{n} 条建议',\n refurbExecute: '执行',\n refurbConfirmDemote: '确认降级这条记忆?执行后状态转 archived,可在统计页恢复。',\n refurbConfirmMerge: '确认合并 {n} 条相似记忆?将触发 engram_distill 把它们归纳为 1 条高层规律。',\n refurbDemoteDone: '已降级',\n refurbMergeDone: '合并任务已派发',\n refurbActionFailed: '执行失败:{msg}',\n refurbMergeEmpty: '无可合并的候选条目',\n heroDue: '今日到期',\n filterDueToday: '今日到期',\n sortTime: '按时间',\n sortTour: '按巡游路线',\n dueBadgeLabel: '今日到期 {n} 条,点击在陈展中筛选',\n tabBackfill: '回填',\n backfillIntro: '把 dsh 的历史会话逐轮提炼进宫殿:每条会话写进它自己 cwd 对应的项目库;已摄取过的轮次按幂等键自动跳过,中断后再次开始即可续做。回填的条目不会进入今日复习队列。',\n backfillRulesTitle: '导入规则',\n backfillDays: '时间窗',\n backfillDaysAll: '不限',\n backfillDaysUnit: '{n} 天',\n backfillMaxTurns: '单会话最多轮数',\n backfillMaxTotal: '本次总轮数上限',\n backfillModel: '辅助模型',\n backfillModelAuto: '自动(用当前在用的模型)',\n backfillIncludeSubagents: '包含子代理会话',\n backfillIncludeSeeded: '包含种子会话',\n backfillIncludeNoCwd: '包含无 cwd 会话(只能进私人宫殿)',\n backfillReestimate: '重新估算',\n backfillEstimateTitle: '估算',\n backfillCandidates: '候选会话 {n}',\n backfillPendingTurns: '待处理 {n} 轮',\n backfillAlready: '已摄取跳过 {n} 轮',\n backfillSkippedDetail: '已排除:子代理 {subagent} · 种子 {seeded} · 无 cwd {noCwd} · 超时间窗 {tooOld} · 日志不可读 {unreadable}',\n backfillTruncated: '候选超出总轮数上限:本次只处理最近的一部分会话,可调大上限或分几次跑',\n backfillStart: '开始回填',\n backfillPause: '暂停',\n backfillStateRunning: '回填中…',\n backfillStateDone: '已完成',\n backfillStateCancelled: '已中止(可再次开始续做)',\n backfillStateFailed: '失败',\n backfillProgressSessions: '会话 {done}/{total}',\n backfillProgressTurns: '轮次 {done}/{total}',\n backfillWritten: '写入 {n} 条',\n backfillTurnsSkipped: '跳过 {n} 轮',\n backfillTurnsFailed: '失败 {n} 轮',\n backfillFailures: '失败明细',\n backfillEstimating: '正在估算…',\n backfillSkipReasons: '跳过原因',\n backfillRouteHint: '失败多半是因为历史会话当时用的模型在当前环境不可用:可在 cordis.yml 配置 provider/model,或先用目标模型跑一轮会话(回填会复用当前在用的模型)再重试——已完成的轮次会自动跳过。',\n skipLowActivity: '低活动轮',\n skipChitchat: '寒暄轮',\n skipForbidden: '显式禁记',\n skipNoContent: '无用户内容',\n skipAlready: '已摄取',\n skipNoTurn: '无此轮',\n skipNoRoute: '日志无路由',\n skipUnparsable: '提炼输出不可解析',\n opProfileEdit: '画像修订',\n profileOpCreate: '创建 v{to} · {chars} 字',\n profileOpEdit: '编辑 v{from}→v{to} · {chars} 字',\n profileOpRollback: '回滚 v{from}→v{to}(还原 v{restored})· {chars} 字',\n profileTitle: '画像 curated block',\n profileEmpty: '尚无 curated 画像',\n profileEmptyHint: '在会话里让 agent 调 engram_profile_edit 创建;创建后会话开始时优先于自动派生画像注入。',\n profileCurrent: '当前内容 · v{n}',\n profileHistory: '版本历史(新→旧)',\n profileSourceEdit: '编辑',\n profileSourceRollback: '回滚',\n profileDiffBase: '基准版本',\n profileDiffTarget: '对比版本',\n profileDiffNone: '两个版本内容相同',\n profileLoadFailed: '画像加载失败',\n tabEpisodes: '往事',\n episodeSince: '开始日期',\n episodeUntil: '结束日期',\n episodeSessionId: '会话 id(可选)',\n episodeApply: '应用',\n episodeReset: '重置',\n episodeHint: '按会话分组浏览经历;组头是摄取时生成的一句话摘要,点条目的「邻近」看当时前后还发生了什么',\n episodeNoGroups: '该范围内没有情景记忆',\n episodeNoSession: '无会话来源',\n episodeSummaryMissing: '(该会话尚未生成摘要:跑一次历史回填即可补上)',\n episodeEntries: '{n} 条情景',\n episodeNearby: '邻近',\n episodeAroundTitle: '时间邻近扩展',\n episodeAroundEmpty: '邻近窗口内没有其他情景',\n episodeClose: '收起',\n tabEntities: '实体',\n entityHint: '从记忆中抽取的人物、项目、工具与概念;点「查看」看一条实体牵出的所有记忆',\n entityKindAll: '全部类别',\n entityKindPerson: '人物',\n entityKindProject: '项目',\n entityKindTool: '工具',\n entityKindConcept: '概念',\n entityKindOther: '其他',\n entitySearchPlaceholder: '搜索实体名或别名',\n entityCount: '{n} 个实体',\n entityMemories: '{n} 条关联记忆',\n entityOpen: '查看',\n entityAliases: '别名',\n entityNoMemories: '暂无关联记忆',\n entityEmpty: '该宫殿还没有实体;保存带实体提及的记忆后会自动出现',\n factSection: '事实链({n} 条)',\n factEmpty: '暂无事实;摄取时从记忆抽取的实体事实会出现在这里',\n factValid: '生效',\n factInvalid: '已失效',\n tabJev: '裁决',\n jevIntro: 'Jev 系统一裁决:写入落库前对模糊记忆做三路判定(合并 / 接受 / 搁置)并确认矛盾边。密钥保存在本机数据目录(0600 文件),保存后立即生效,无需重启;Jev 不可用时自动回落纯规则四态。',\n jevEnabled: '启用 Jev 裁决',\n jevStatusOn: 'Jev 裁决已生效',\n jevStatusOff: 'Jev 裁决未生效(纯规则四态)',\n jevApiKey: 'API 密钥',\n jevApiKeyHint: '留空表示保留现有密钥;要清除已存密钥(回落 cordis.yml 配置)点「清除已存密钥」。',\n jevApiKeyUnset: '未配置',\n jevClearKey: '清除已存密钥',\n jevKeyCleared: '已清除面板密钥,回落部署配置',\n jevBaseUrl: '端点',\n jevModel: '判决模型',\n jevTimeoutMs: '超时(毫秒,1000-60000)',\n jevThresholdsTitle: '裁决阈值(cordis.yml 高级配置,此处只读)',\n jevThresholdLine: '判同一条 ≥{merge} · 判不同条 ≤{accept} · 矛盾确认 ≥{contradict}',\n jevSave: '保存',\n jevSaved: '已保存,配置即时生效',\n jevLoadFailed: '加载失败',\n jevTest: '测试连接',\n jevTestOk: '连接正常:{ms} 毫秒,ping 概率 {p}',\n jevTestFail: '连接失败:{error}',\n jevObsTitle: '近期裁决(本进程,最多 50 条,重启清空)',\n jevObsEmpty: '暂无记录;启用 Jev 后发生写入裁决时出现',\n jevObsLoadFailed: '裁决记录加载失败',\n jevObsSiteBand: '模糊带',\n jevObsSiteContradiction: '矛盾确认',\n jevObsVerdictMerge: '并入',\n jevObsVerdictAccept: '放行',\n jevObsVerdictDefer: '搁置',\n jevObsVerdictConfirm: '确认矛盾',\n jevObsVerdictReject: '非矛盾',\n jevObsVerdictFallback: '回落',\n jevObsNoAnswer: '无答案',\n jevObsErrorLine: '错误:{error}',\n}\n\n/** 英文词典。整页采用「Memory Palace」语言:palace / room (kind group) / memory / placard / tour / curator / corridor。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定。 */\nexport const en: Record<EngramKey, string> = {\n nav: 'Memory Palace',\n scopeUser: 'Private Palace',\n scopeProject: 'Project Palace',\n scopeShared: 'Shared Palace',\n projectFollow: 'Follow the active workspace',\n projectFollowNamed: 'Project · following {name}',\n projectFollowHint: 'The project palace follows the workspace selected in the GUI (by session ownership)',\n projectPinned: 'Project · {name}',\n projectUnregistered: 'unregistered workspace',\n projectNoWorkspace: 'No workspace info (process default)',\n projectSwitch: 'Project palace source',\n projectMemories: '{n} memories',\n projectProcessDefault: 'Process default directory',\n refresh: 'Revisit',\n exportMd: 'Export MD',\n exportJson: 'Export JSON',\n export: 'Export',\n exportMirror: 'Mirror tree',\n exportMdHint: 'Single file, easy to share',\n exportJsonHint: 'Structured full dump for scripts',\n exportMirrorHint: 'One .md per memory, roamable in Obsidian',\n allStatuses: 'All statuses',\n allKinds: 'All rooms',\n redactedAll: 'All placards',\n redactedOnly: 'Redacted',\n redactedNone: 'Unredacted',\n tagRedacted: 'redacted',\n tagOutcomeSuccess: 'curator: worked',\n tagOutcomeFailure: 'curator: failed',\n searchPlaceholder: 'Wander the palace…',\n statusActive: 'open to public',\n statusArchived: 'on display',\n statusForgotten: 'closed',\n kindFact: 'Fact Hall',\n kindPreference: 'Preference Pavilion',\n kindDecision: 'Decision Chamber',\n kindEpisode: 'Episode Gallery',\n kindSkill: 'Skill Workshop',\n labelContent: 'Placard',\n labelKind: 'Room',\n labelStatus: 'Status',\n labelScope: 'Palace',\n importance: 'Beacon',\n confidence: 'Provenance',\n accessCount: '{n} visits',\n labelCreated: 'Opened',\n timeJustNow: 'just now',\n timeMinutesAgo: '{n} min ago',\n timeHoursAgo: '{n} hr ago',\n timeDaysAgo: '{n} d ago',\n sourceExplicit: 'Curator placed',\n sourceSession: 'Excavated at {id}',\n round: 'pass {n}',\n cardRedacted: '{n} redacted',\n detail: 'Tour',\n edit: 'Renovate',\n forget: 'Close',\n restore: 'Reopen',\n empty: 'No memories to display',\n emptyHint: 'Adjust the rooms above, or place a new memory',\n loadFailed: 'Tour halted: {msg}',\n loading: 'Guiding…',\n pagerInfo: 'Page {page} / {pages} · {total} memories',\n prevPage: 'Previous page',\n nextPage: 'Next page',\n cancel: 'Cancel',\n saveWithHint: 'Renovate (archive old placard)',\n detailAttributes: 'Placard',\n detailSource: 'Excavation',\n detailRelations: 'Corridors',\n detailOperations: 'Curator log',\n relSupersededBy: 'Superseded by',\n relSupersedes: 'Supersedes',\n relContradicts: 'Contradicts',\n relRelated: 'Adjacent',\n headerTitle: 'Memory Palace',\n headerSubtitle: 'Cross-session long-term memory palace',\n tabToday: 'Today',\n tabLibrary: 'Palace',\n tabCorridor: 'Corridor',\n tabLog: 'Log',\n tabLibraryCount: '{n} memories',\n roomsTitle: 'Room directory',\n roomsHint: 'A new room opens once 9 slots fill',\n healthEvaluatedAt: 'Scored {time}',\n logFilterAll: 'All',\n logFilterWrite: 'Writes',\n logFilterIngest: 'Capture',\n logFilterRetrieve: 'Retrieval',\n logFilterOrganize: 'Organize',\n logCount: '{n} entries · both stores merged, newest first',\n benchTitle: 'Retrieval bench',\n drawerClose: 'Return',\n drawerTitle: 'Memory placard',\n kpiTotal: 'Memories',\n kpiActive: 'Open',\n kpiForgotten: 'Closed',\n kpiSignal: 'Clarity',\n opWrite: 'opened',\n opWriteMerge: 'merged in',\n opUpdate: 'renovated',\n opForget: 'closed',\n opRestore: 'reopened',\n opDecay: 'archived',\n opSuperseded: 'superseded',\n opIngestRequest: 'excavation requested',\n opIngestDone: 'excavated',\n opOutcomeReport: 'curator report',\n opAssess: 'evidence check',\n opConsolidation: 'consolidation',\n opReviewAnswer: 'review answer',\n opSlotAssign: 'slot assigned',\n opSlotBackfill: 'slots backfilled',\n opRoomOpen: 'room opened',\n consolidateArchived: 'archived {n}',\n consolidateMerged: 'merged {n}',\n consolidateSkipped: 'skipped {n}',\n decayArchived: 'archived {n}',\n slotBackfilled: '{n} slots assigned',\n roomOpened: 'opened room {room}',\n reviewAnswered: 'grade {grade} · next in {days}d',\n assessAdequate: 'evidence adequate',\n assessInadequate: 'evidence insufficient',\n assessRefs: '{n} refs',\n opSearchRewrite: 'route rewritten',\n opCompressRequest: 'placard compressed',\n opDistillRequest: 'rooms merged',\n selectAll: 'Select all on page',\n deselectAll: 'Deselect all',\n selectedCount: '{n} memories',\n batchForget: 'Close selected ({n})',\n batchForgetConfirm: 'Close {n} memories?',\n batchRestore: 'Reopen selected ({n})',\n clearSelection: 'Clear selection',\n sectionCorridor: 'Corridor overview',\n corridorEmpty: 'No memories yet — the bird’s-eye view appears after a few memories arrive.',\n corridorFailed: 'Failed to load corridor',\n corridorLoad: 'Loading corridor overview…',\n corridorAria: 'Corridor overview map',\n corridorSummary: '{nodes} memories · {edges} corridors',\n edgeSupersedes: 'supersedes',\n edgeContradicts: 'contradicts',\n edgeOther: 'related / supports / refines',\n healthLoading: 'Taking pulse…',\n teleFailed: 'Telemetry failed',\n teleLoading: 'Aggregating curator events…',\n teleGroupRecent: 'Last 7 days',\n telePrivacyHint: 'Local aggregation only · never transmitted',\n telePrivacyTip: 'All op_log and telemetry counters are aggregated in this process\\u2019s SQLite only; nothing is sent to any external service. Clearing the plugin or restarting the host wipes the data.',\n teleWrites: 'Opened',\n teleIngest: 'Excavated',\n teleConsolidate: 'Consolidated',\n benchPlaceholder: 'Name a room by keyword or meaning…',\n benchRun: 'Walk',\n benchScopeAll: 'All palaces',\n benchHits: '{n} rooms found',\n benchDegraded: 'Beacon dark · keyword lane only',\n benchEmpty: 'No route found',\n benchNote: 'Walk uses the same map as the guided tour and counts as a visit',\n viaFts: 'keyword',\n viaVec: 'semantic',\n viaBoth: 'dual',\n viaEdgeLabel: 'corridor',\n benchRewrite: 'route split into {n}',\n benchCompress: 'compressed {n} overflow placards',\n activityEmpty: 'No curator activity yet',\n detailRevisions: 'Exhibit history',\n tourProposalTitle: 'Tour proposal',\n tourProposalEmpty: 'The palace is empty — place a first memory via engram_save',\n tourProposalHint: 'Click a memory to open its placard',\n tourFocusAll: 'All',\n refurbTitle: 'Refurb suggestions',\n refurbEmpty: 'All rooms are healthy — no suggestions',\n refurbRun: 'Re-scan',\n refurbActionDemote: 'demote',\n refurbActionMerge: 'merge',\n refurbActionReview: 'review',\n refurbActionSplit: 'split',\n refurbCount: '{n} suggestions',\n refurbExecute: 'Apply',\n refurbConfirmDemote: 'Demote this memory? Status will become archived; you can reopen it later.',\n refurbConfirmMerge: 'Merge {n} similar memories? This triggers engram_distill to fold them into one higher-level pattern.',\n refurbDemoteDone: 'Demoted',\n refurbMergeDone: 'Merge dispatched',\n refurbActionFailed: 'Action failed: {msg}',\n refurbMergeEmpty: 'No merge candidates',\n heroDue: 'Due today',\n filterDueToday: 'Due today',\n sortTime: 'By time',\n sortTour: 'By tour route',\n dueBadgeLabel: '{n} due today — click to filter in the library',\n tabBackfill: 'Backfill',\n backfillIntro: 'Distils past dsh sessions into the palace, turn by turn: each session is written into the project store matching its own cwd. Turns already captured are skipped by idempotency key, so starting again resumes where it stopped. Backfilled memories never enter the due-today queue.',\n backfillRulesTitle: 'Import rules',\n backfillDays: 'Time window',\n backfillDaysAll: 'All',\n backfillDaysUnit: '{n} days',\n backfillMaxTurns: 'Max turns per session',\n backfillMaxTotal: 'Total turn budget',\n backfillModel: 'Auxiliary model',\n backfillModelAuto: 'Auto (model currently in use)',\n backfillIncludeSubagents: 'Include subagent sessions',\n backfillIncludeSeeded: 'Include seeded sessions',\n backfillIncludeNoCwd: 'Include sessions without cwd (private palace only)',\n backfillReestimate: 'Re-estimate',\n backfillEstimateTitle: 'Estimate',\n backfillCandidates: '{n} candidate sessions',\n backfillPendingTurns: '{n} turns pending',\n backfillAlready: '{n} turns already captured',\n backfillSkippedDetail: 'Excluded: subagent {subagent} · seeded {seeded} · no cwd {noCwd} · outside window {tooOld} · unreadable {unreadable}',\n backfillTruncated: 'Candidates exceed the total turn budget: only the most recent sessions run this time — raise the budget or run in batches',\n backfillStart: 'Start backfill',\n backfillPause: 'Pause',\n backfillStateRunning: 'Running…',\n backfillStateDone: 'Finished',\n backfillStateCancelled: 'Stopped (start again to resume)',\n backfillStateFailed: 'Failed',\n backfillProgressSessions: 'Sessions {done}/{total}',\n backfillProgressTurns: 'Turns {done}/{total}',\n backfillWritten: '{n} memories written',\n backfillTurnsSkipped: '{n} turns skipped',\n backfillTurnsFailed: '{n} turns failed',\n backfillFailures: 'Failures',\n backfillEstimating: 'Estimating…',\n backfillSkipReasons: 'Skipped',\n backfillRouteHint: 'Failures are usually because the model a past session used is not available here: set provider/model in cordis.yml, or run one turn with the target model first (backfill reuses the model currently in use) and retry — finished turns are skipped automatically.',\n skipLowActivity: 'low activity',\n skipChitchat: 'chitchat',\n skipForbidden: 'capture forbidden',\n skipNoContent: 'no user content',\n skipAlready: 'already captured',\n skipNoTurn: 'no such turn',\n skipNoRoute: 'no route in log',\n skipUnparsable: 'unparsable output',\n opProfileEdit: 'profile revised',\n profileOpCreate: 'created v{to} · {chars} chars',\n profileOpEdit: 'edited v{from}→v{to} · {chars} chars',\n profileOpRollback: 'rolled back v{from}→v{to} (restored v{restored}) · {chars} chars',\n profileTitle: 'Curated profile block',\n profileEmpty: 'No curated profile yet',\n profileEmptyHint: 'Ask the agent to call engram_profile_edit in a session; once created it is injected ahead of the derived profile at session start.',\n profileCurrent: 'Current content · v{n}',\n profileHistory: 'Version history (newest first)',\n profileSourceEdit: 'edited',\n profileSourceRollback: 'rollback',\n profileDiffBase: 'Base version',\n profileDiffTarget: 'Compare version',\n profileDiffNone: 'The two versions are identical',\n profileLoadFailed: 'Failed to load profile',\n tabEpisodes: 'Episodes',\n episodeSince: 'From date',\n episodeUntil: 'To date',\n episodeSessionId: 'Session id (optional)',\n episodeApply: 'Apply',\n episodeReset: 'Reset',\n episodeHint: 'Browse experiences grouped by session; group heads carry a one-line summary generated at ingest. Click \"Nearby\" on an entry to see what else happened around that moment',\n episodeNoGroups: 'No episodes in this range',\n episodeNoSession: 'No session origin',\n episodeSummaryMissing: '(No summary yet for this session: run a history backfill to add one)',\n episodeEntries: '{n} episodes',\n episodeNearby: 'Nearby',\n episodeAroundTitle: 'Time proximity expansion',\n episodeAroundEmpty: 'No other episodes within the proximity window',\n episodeClose: 'Collapse',\n tabEntities: 'Entities',\n entityHint: 'People, projects, tools and concepts extracted from memories; open one to see every memory that mentions it',\n entityKindAll: 'All kinds',\n entityKindPerson: 'People',\n entityKindProject: 'Projects',\n entityKindTool: 'Tools',\n entityKindConcept: 'Concepts',\n entityKindOther: 'Other',\n entitySearchPlaceholder: 'Search names or aliases',\n entityCount: '{n} entities',\n entityMemories: '{n} linked memories',\n entityOpen: 'View',\n entityAliases: 'Aliases',\n entityNoMemories: 'No linked memories',\n entityEmpty: 'No entities in this palace yet; they appear after you save memories that mention them',\n factSection: 'Facts ({n})',\n factEmpty: 'No facts yet; facts extracted from memories during ingestion will appear here',\n factValid: 'active',\n factInvalid: 'superseded',\n tabJev: 'Jev',\n jevIntro: 'Jev System-One adjudication: three-way ruling (merge / accept / defer) for ambiguous memories before they are written, plus contradiction confirmation. The key is stored in the local data directory (0600 file) and takes effect immediately after saving, no restart; when Jev is unavailable the plugin falls back to the pure four-rule disposition.',\n jevEnabled: 'Enable Jev adjudication',\n jevStatusOn: 'Jev adjudication active',\n jevStatusOff: 'Jev adjudication inactive (pure rule-based dispositions)',\n jevApiKey: 'API key',\n jevApiKeyHint: 'Leave empty to keep the stored key; click \"Clear stored key\" to remove it (falls back to cordis.yml).',\n jevApiKeyUnset: 'not configured',\n jevClearKey: 'Clear stored key',\n jevKeyCleared: 'Panel key cleared; falling back to deployment config',\n jevBaseUrl: 'Endpoint',\n jevModel: 'Adjudication model',\n jevTimeoutMs: 'Timeout (ms, 1000-60000)',\n jevThresholdsTitle: 'Adjudication thresholds (advanced cordis.yml config, read-only here)',\n jevThresholdLine: 'same memory ≥{merge} · new memory ≤{accept} · contradiction ≥{contradict}',\n jevSave: 'Save',\n jevSaved: 'Saved; config takes effect immediately',\n jevLoadFailed: 'Failed to load',\n jevTest: 'Test connection',\n jevTestOk: 'Connection OK: {ms} ms, ping probability {p}',\n jevTestFail: 'Connection failed: {error}',\n jevObsTitle: 'Recent adjudications (this process, up to 50, cleared on restart)',\n jevObsEmpty: 'No records yet; they appear when Jev adjudicates a write after being enabled',\n jevObsLoadFailed: 'Failed to load adjudication records',\n jevObsSiteBand: 'band',\n jevObsSiteContradiction: 'contradiction',\n jevObsVerdictMerge: 'merge',\n jevObsVerdictAccept: 'accept',\n jevObsVerdictDefer: 'defer',\n jevObsVerdictConfirm: 'confirm',\n jevObsVerdictReject: 'reject',\n jevObsVerdictFallback: 'fallback',\n jevObsNoAnswer: 'no answer',\n jevObsErrorLine: 'error: {error}',\n}\n","/**\n * 走廊鸟瞰图:中度版力导向 + 拖拽 + hover 邻居高亮 + 响应式 viewBox。\n *\n * 设计要点:\n * 1. 冷却调度 alpha 1.0 → 0.1(240 tick),保证收敛不抖。\n * 2. drag 节点:mousedown 抓住 → mousemove 改写 vx/vy 为 0(吸附鼠标)→ mouseup 释放。\n * 3. hover 节点:该节点 + 一跳邻居 + 关联边高亮,其他 0.15 透明。\n * 4. tooltip 显示完整铭牌(沿用 SVG <title> 标签 + 自定义 <foreignObject> HTML tooltip 增强可读性)。\n * 5. viewBox 自适应容器宽度(preserveAspectRatio=\"xMidYMid meet\"),固定 560x320 逻辑坐标。\n *\n * @module @kenz1117/dsh-engram/client/CorridorMap\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport styles from './panel.module.css'\nimport { KIND_KEY, type EngramKey } from './locales.ts'\n\n/** 走廊图使用的翻译函数(渲染器合成的窄签名)。 */\ntype CorridorT = (key: EngramKey, params?: Record<string, unknown>) => string\n\n/** kind → 本地化房间名(词典缺失时回退数据值)。 */\nfunction roomLabel(t: CorridorT, kind: string): string {\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key as EngramKey)\n}\n\ninterface CorridorNode {\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n /** 后端可选字段:完整铭牌(用于 tooltip)。 */\n readonly content?: string\n}\ninterface CorridorEdge {\n readonly id: string\n readonly from: string\n readonly to: string\n readonly type: string\n}\n\n/** 房间色板:5 个语义色相(按 kind 分组)。 */\nconst KIND_PALETTE: Readonly<Record<string, string>> = {\n fact: '#5b8def',\n preference: '#f0a85c',\n decision: '#9b6bd9',\n episode: '#3cb489',\n skill: '#e26b86',\n}\n\n/** 边视觉语义。dash 显式允许 undefined:exactOptionalPropertyTypes 下字面量表无需逐项删键。 */\ntype EdgeStyle = { color: string; dash?: string | undefined; width: number }\nconst EDGE_STYLE: Readonly<Record<string, EdgeStyle>> = {\n related: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n refines: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supports: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supersedes:{ color: 'rgba(91, 141, 239, 0.85)', dash: undefined, width: 1.8 },\n contradicts:{ color: 'rgba(226, 107, 134, 0.9)', dash: '4 4', width: 1.4 },\n}\n\ninterface PositionedNode extends CorridorNode {\n x: number\n y: number\n vx: number\n vy: number\n r: number\n /** 是否被用户拖拽中(拖拽时禁用 tick 力更新)。 */\n fixed: boolean\n}\n\ninterface CorridorMapProps {\n readonly scope: 'user' | 'project' | 'shared'\n readonly nodes: readonly CorridorNode[]\n readonly edges: readonly CorridorEdge[]\n readonly onSelect?: (id: string) => void\n readonly selectedId?: string\n /** 界面文案(房间名与图例走宿主 locale 词典)。 */\n readonly t: CorridorT\n}\n\n/** 节点半径。 */\nfunction nodeRadius(n: CorridorNode): number {\n return Math.max(4, Math.min(14, 4 + 10 * n.importance * n.confidence))\n}\n\n/** 单步力更新(带冷却 alpha)。 */\nfunction step(nodes: PositionedNode[], edges: readonly CorridorEdge[], width: number, height: number, alpha: number): void {\n const REPLUSION = 4800\n const SPRING_LEN = 64\n const SPRING_K = 0.04\n const CENTER_K = 0.003\n const FLOOR_K = 0.005\n // 排斥力:平方反比(带 alpha 冷却)。\n for (let i = 0; i < nodes.length; i += 1) {\n const a = nodes[i]!\n for (let j = i + 1; j < nodes.length; j += 1) {\n const b = nodes[j]!\n const dx = a.x - b.x\n const dy = a.y - b.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (REPLUSION * alpha) / (dist * dist)\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n }\n // 弹簧力。\n const nodeMap = new Map<string, PositionedNode>(nodes.map(n => [n.id, n]))\n for (const edge of edges) {\n const a = nodeMap.get(edge.from)\n const b = nodeMap.get(edge.to)\n if (a === undefined || b === undefined) continue\n const dx = b.x - a.x\n const dy = b.y - a.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (dist - SPRING_LEN) * SPRING_K * alpha\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n // 中心引力 + 房间水平分簇。\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n for (const n of nodes) {\n if (n.fixed) continue\n n.vx += (width / 2 - n.x) * CENTER_K * alpha\n n.vy += (height / 2 - n.y) * CENTER_K * alpha\n const idx = kinds.indexOf(n.kind)\n if (idx >= 0) {\n const target = band * (idx + 0.5)\n n.vx += (target - n.x) * FLOOR_K * alpha\n }\n }\n // 阻尼 + 边界。\n const DAMPING = 0.82\n for (const n of nodes) {\n if (n.fixed) { n.vx = 0; n.vy = 0; continue }\n n.vx *= DAMPING\n n.vy *= DAMPING\n n.x = Math.max(20, Math.min(width - 20, n.x + n.vx))\n n.y = Math.max(20, Math.min(height - 20, n.y + n.vy))\n }\n}\n\n/** 走廊鸟瞰组件。 */\nexport function CorridorMap(props: CorridorMapProps): ReactElement {\n const { scope, nodes, edges, onSelect, selectedId, t } = props\n const width = 560\n const height = 320\n /** 邻居表:node id → 邻居 id 集合(含一跳)。 */\n const neighborMap = useMemo(() => {\n const map = new Map<string, Set<string>>()\n for (const n of nodes) map.set(n.id, new Set())\n for (const e of edges) {\n if (!map.has(e.from)) map.set(e.from, new Set())\n if (!map.has(e.to)) map.set(e.to, new Set())\n map.get(e.from)!.add(e.to)\n map.get(e.to)!.add(e.from)\n }\n return map\n }, [nodes, edges])\n /** 起始布局:按房间水平均分带,垂直随机抖动。 */\n const initialNodes = useMemo<PositionedNode[]>(() => {\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n return nodes.map((n, index) => ({\n ...n,\n x: kinds.indexOf(n.kind) >= 0 ? band * (kinds.indexOf(n.kind) + 0.5) : width / 2,\n y: 30 + ((index * 47) % (height - 60)),\n vx: 0, vy: 0,\n r: nodeRadius(n),\n fixed: false,\n }))\n }, [nodes, width, height])\n const positionsRef = useRef<PositionedNode[]>(initialNodes.map(n => ({ ...n })))\n const [, forceRender] = useState(0)\n const animRef = useRef<number | null>(null)\n const tickRef = useRef(0)\n const totalTicks = 280\n // 初始化 / 重置:拷贝新布局并清零 tick。\n useEffect(() => {\n positionsRef.current = initialNodes.map(n => ({ ...n }))\n tickRef.current = 0\n forceRender(value => value + 1)\n }, [initialNodes])\n // 力导向主循环:requestAnimationFrame,alpha 1.0 → 0.1。\n useEffect(() => {\n const tick = (): void => {\n const nodesArr = positionsRef.current\n tickRef.current += 1\n const alpha = Math.max(0.1, 1 - (tickRef.current / totalTicks) * 0.9)\n step(nodesArr, edges, width, height, alpha)\n // 触发 React 重渲染(不可变快照:拷贝一次引用)。\n positionsRef.current = nodesArr.map(n => ({ ...n }))\n forceRender(value => value + 1)\n if (tickRef.current < totalTicks) animRef.current = requestAnimationFrame(tick)\n }\n animRef.current = requestAnimationFrame(tick)\n return () => { if (animRef.current !== null) cancelAnimationFrame(animRef.current) }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- tick 仅在新 nodes/edges 时重启\n }, [initialNodes, edges])\n const positions = positionsRef.current\n const posMap = useMemo(() => new Map(positions.map(p => [p.id, p])), [positions])\n const roomKinds = useMemo(() => [...new Set(nodes.map(n => n.kind))], [nodes])\n /** hover 高亮:当前节点 id → 邻居 id 集合;null = 不高亮。 */\n const [hoverId, setHoverId] = useState<string | null>(null)\n const hoverNeighbors = useMemo(() => {\n if (hoverId === null) return null\n return neighborMap.get(hoverId) ?? new Set<string>()\n }, [hoverId, neighborMap])\n const isFaded = (nId: string): boolean => hoverId !== null && nId !== hoverId && !(hoverNeighbors?.has(nId) ?? false)\n const isEdgeHighlighted = (e: CorridorEdge): boolean => {\n if (hoverId === null) return false\n return e.from === hoverId || e.to === hoverId\n }\n /** drag:mousedown 抓住节点 → mousemove 改 vx/vy 为 0 → mouseup 释放。 */\n const svgRef = useRef<SVGSVGElement | null>(null)\n const dragIdRef = useRef<string | null>(null)\n const svgToScreen = (clientX: number, clientY: number): { x: number; y: number } | null => {\n const svg = svgRef.current\n if (svg === null) return null\n const rect = svg.getBoundingClientRect()\n // viewBox 0 0 width height,preserveAspectRatio meet → 等比缩放,逻辑坐标 = 屏幕坐标 * (width / rect.width)\n const scaleX = width / rect.width\n const scaleY = height / rect.height\n return { x: (clientX - rect.left) * scaleX, y: (clientY - rect.top) * scaleY }\n }\n const onNodeMouseDown = (event: React.MouseEvent<SVGGElement>, nodeId: string): void => {\n event.preventDefault()\n dragIdRef.current = nodeId\n const node = positionsRef.current.find(n => n.id === nodeId)\n if (node !== undefined) node.fixed = true\n }\n useEffect(() => {\n const handleMove = (event: MouseEvent): void => {\n const id = dragIdRef.current\n if (id === null) return\n const pos = svgToScreen(event.clientX, event.clientY)\n if (pos === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node === undefined) return\n node.x = Math.max(20, Math.min(width - 20, pos.x))\n node.y = Math.max(20, Math.min(height - 20, pos.y))\n node.vx = 0\n node.vy = 0\n forceRender(value => value + 1)\n }\n const handleUp = (): void => {\n const id = dragIdRef.current\n if (id === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node !== undefined) node.fixed = false\n dragIdRef.current = null\n }\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleUp)\n return () => {\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleUp)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n if (nodes.length === 0) {\n return <div className={styles.empty}>{t('corridorEmpty')}</div>\n }\n\n return (\n <div className={styles.mapWrap}>\n <svg ref={svgRef} viewBox={`0 0 ${String(width)} ${String(height)}`} className={styles.map}\n preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label={t('corridorAria')} key={scope}>\n {/* 房间背景带(斑马纹区隔)。scope 切换通过父 svg key 重挂载触发 fade-in。 */}\n {roomKinds.map((kind, idx) => {\n const band = width / Math.max(roomKinds.length, 1)\n return <rect key={kind} x={band * idx} y={0} width={band} height={height} fill={idx % 2 === 0 ? 'rgba(127,127,127,0.04)' : 'transparent'} />\n })}\n {/* 房间标签条顶部。 */}\n {roomKinds.map((kind, idx) => {\n const band = width / Math.max(roomKinds.length, 1)\n return (\n <text key={`${kind}-label`} x={band * (idx + 0.5)} y={14} textAnchor=\"middle\"\n fill=\"rgba(127,127,127,0.7)\" fontSize=\"10\" fontFamily=\"ui-sans-serif, system-ui\">\n {roomLabel(t, kind)}\n </text>\n )\n })}\n {/* 走廊边:高亮时画弹簧弧线(quadratic 曲线 + 垂直凸起 6px),其他边保持直线。\n 用 stagger-delay 让边按 from 节点索引依次淡入,强化「地图刷新」感。 */}\n {edges.map((edge, idx) => {\n const a = posMap.get(edge.from)\n const b = posMap.get(edge.to)\n if (a === undefined || b === undefined) return null\n const style = EDGE_STYLE[edge.type] ?? EDGE_STYLE.related!\n const highlighted = isEdgeHighlighted(edge)\n const faded = hoverId !== null && !highlighted\n if (highlighted) {\n // 垂直中点偏移:构造弹簧视觉。\n const mx = (a.x + b.x) / 2\n const my = (a.y + b.y) / 2\n const dx = b.x - a.x\n const dy = b.y - a.y\n const length = Math.sqrt(dx * dx + dy * dy) || 1\n const offsetX = (-dy / length) * 6\n const offsetY = (dx / length) * 6\n return (\n <path key={edge.id} d={`M ${String(a.x)} ${String(a.y)} Q ${String(mx + offsetX)} ${String(my + offsetY)} ${String(b.x)} ${String(b.y)}`}\n fill=\"none\" stroke={style.color}\n strokeWidth={style.width + 1.2} strokeDasharray={style.dash}\n style={{ transition: 'stroke-width 200ms ease, d 240ms ease' }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </path>\n )\n }\n return (\n <line key={edge.id} x1={a.x} y1={a.y} x2={b.x} y2={b.y}\n stroke={style.color} strokeWidth={style.width}\n strokeDasharray={style.dash} opacity={faded ? 0.1 : 1}\n className={styles.edgeFade}\n style={{ transition: 'opacity 200ms ease, stroke-width 200ms ease', animationDelay: `${String(Math.min(idx, 24) * 24)}ms` }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </line>\n )\n })}\n {/* 房间节点。 */}\n {positions.map((n, index) => {\n const color = KIND_PALETTE[n.kind] ?? '#7d8590'\n const isSelected = selectedId === n.id\n const isHovered = hoverId === n.id\n const faded = isFaded(n.id)\n return (\n <g key={n.id} className={styles.node} transform={`translate(${String(n.x)} ${String(n.y)})`}\n style={{ cursor: dragIdRef.current === n.id ? 'grabbing' : 'grab', opacity: faded ? 0.15 : 1, transition: 'opacity 200ms ease', animationDelay: `${String(Math.min(index, 24) * 24)}ms` }}\n onMouseEnter={() => { setHoverId(n.id) }}\n onMouseLeave={() => { setHoverId(prev => prev === n.id ? null : prev) }}\n onMouseDown={event => onNodeMouseDown(event, n.id)}\n onClick={() => onSelect?.(n.id)}>\n {/* hover 时画一圈柔光外晕。 */}\n {(isHovered || isSelected) && (\n <circle r={String(n.r + 6)} fill={color} fillOpacity={0.18} />\n )}\n <circle r={String(n.r)} fill={color} fillOpacity={n.status === 'active' ? 0.88 : 0.42}\n stroke={isSelected ? 'var(--dsw-alias-brand-primary)' : isHovered ? color : 'rgba(255,255,255,0.9)'}\n strokeWidth={isSelected ? 2 : isHovered ? 1.5 : 1}\n style={{ transition: 'stroke 160ms ease, stroke-width 160ms ease' }}>\n <title>{`${n.title}(${n.kind}/${n.status})`}</title>\n </circle>\n {isSelected && <circle r={String(n.r + 4)} fill=\"none\" stroke={color} strokeOpacity={0.4} strokeWidth={1} />}\n </g>\n )\n })}\n {/* hover tooltip:HTML 浮层,显示完整铭牌(用 SVG <text> 简易渲染)。 */}\n {hoverId !== null && (() => {\n const node = posMap.get(hoverId)\n if (node === undefined) return null\n const tx = Math.min(width - 180, Math.max(8, node.x + 14))\n const ty = Math.min(height - 60, Math.max(28, node.y - 16))\n const fullContent = (node.content ?? node.title).slice(0, 120)\n return (\n <g className={styles.tooltip} transform={`translate(${String(tx)} ${String(ty)})`}>\n <rect x={0} y={0} width={176} height={48} rx={6} ry={6}\n fill=\"var(--dsw-alias-bg-base)\" stroke=\"var(--dsw-alias-border-l2)\" strokeWidth={1} opacity={0.96} />\n <text x={8} y={16} fill=\"var(--dsw-alias-label-primary)\" fontSize=\"11\" fontWeight={600}\n fontFamily=\"ui-sans-serif, system-ui\">{roomLabel(t, node.kind)}</text>\n <text x={8} y={32} fill=\"var(--dsw-alias-label-secondary)\" fontSize=\"10\"\n fontFamily=\"ui-sans-serif, system-ui\">{`${fullContent}${(node.content ?? node.title).length > 120 ? '…' : ''}`}</text>\n </g>\n )\n })()}\n </svg>\n <div className={styles.legend}>\n {roomKinds.map(kind => (\n <span key={kind} className={styles.legendItem}>\n <span className={styles.legendDot} style={{ background: KIND_PALETTE[kind] ?? '#7d8590' }} />\n {roomLabel(t, kind)}\n </span>\n ))}\n <span className={styles.legendItem}>{t('corridorSummary', { nodes: nodes.length, edges: edges.length })}</span>\n </div>\n <div className={styles.legend} style={{ marginTop: 2 }}>\n {Object.entries(EDGE_STYLE).map(([type, style]) => (\n <span key={type} className={styles.legendItem}>\n <svg width={20} height={6} aria-hidden=\"true\">\n <line x1={0} y1={3} x2={20} y2={3} stroke={style.color} strokeWidth={style.width} strokeDasharray={style.dash} />\n </svg>\n <span>{type === 'supersedes' ? t('edgeSupersedes') : type === 'contradicts' ? t('edgeContradicts') : t('edgeOther')}</span>\n </span>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * 轻量 Toast:右上角叠层通知,3 秒自动消失,hover 暂停。\n * 4 种语义:info / success / error / warning(图标与配色由样式表决定,文案一律走调用方传入的字符串)。\n * confirm 不归本 hook 管——那是对话框决策,保留 window.confirm 以免破坏流程语义。\n * @module @kenz1117/dsh-engram/client/Toast\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport styles from './panel.module.css'\n\n/** Toast 语义类型。 */\nexport type ToastKind = 'info' | 'success' | 'error' | 'warning'\n\n/** 单条 Toast。 */\ninterface ToastItem {\n readonly id: number\n readonly kind: ToastKind\n readonly message: string\n readonly duration: number\n}\n\nconst DEFAULT_DURATION: Record<ToastKind, number> = {\n info: 3000,\n success: 3000,\n warning: 5000,\n error: 5000,\n}\n\n/** 顺序自增 id 源(避免 useEffect 依赖 Date.now)。 */\nlet toastIdCursor = 0\n\n/**\n * 把 toasts 数组渲染为右上角浮层。每帧返回新 ReactElement,调用方挂在面板根节点末尾。\n * hover 期间不消失(由 useToast 内部维护 timers 控制)。\n */\nfunction ToastViewport({ items, onDismiss }: {\n readonly items: readonly ToastItem[]\n readonly onDismiss: (id: number) => void\n}): React.ReactElement {\n return (\n <div className={styles.toastViewport} role=\"region\" aria-live=\"polite\" aria-label=\"notifications\">\n {items.map(toast => {\n const kindClass = toast.kind === 'success' ? styles.toastSuccess\n : toast.kind === 'error' ? styles.toastError\n : toast.kind === 'warning' ? styles.toastWarning\n : styles.toastInfo\n return (\n <div key={toast.id}\n className={`${styles.toast} ${kindClass}`}\n role={toast.kind === 'error' || toast.kind === 'warning' ? 'alert' : 'status'}>\n <span className={styles.toastBody}>{toast.message}</span>\n <button type=\"button\" className={styles.toastDismiss} aria-label=\"dismiss\"\n onClick={() => { onDismiss(toast.id) }}>×</button>\n </div>\n )\n })}\n </div>\n )\n}\n\n/** Toast hook 返回:toasts 列表 + push 函数 + 渲染节点。 */\nexport interface ToastController {\n readonly toasts: readonly ToastItem[]\n readonly push: (kind: ToastKind, message: string, duration?: number) => void\n readonly dismiss: (id: number) => void\n readonly viewport: React.ReactElement\n}\n\nexport function useToast(): ToastController {\n const [toasts, setToasts] = useState<readonly ToastItem[]>([])\n // 计时器表:id → setTimeout handle,方便 dismiss 取消。\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map())\n\n const dismiss = useCallback((id: number) => {\n setToasts(current => current.filter(toast => toast.id !== id))\n const timer = timersRef.current.get(id)\n if (timer !== undefined) {\n clearTimeout(timer)\n timersRef.current.delete(id)\n }\n }, [])\n\n const push = useCallback((kind: ToastKind, message: string, duration?: number) => {\n toastIdCursor += 1\n const id = toastIdCursor\n const ms = duration ?? DEFAULT_DURATION[kind]\n const item: ToastItem = { id, kind, message, duration: ms }\n setToasts(current => [...current, item])\n const timer = setTimeout(() => { dismiss(id) }, ms)\n timersRef.current.set(id, timer)\n }, [dismiss])\n\n useEffect(() => () => {\n for (const timer of timersRef.current.values()) clearTimeout(timer)\n timersRef.current.clear()\n }, [])\n\n const viewport = (\n <ToastViewport items={toasts} onDismiss={dismiss} />\n )\n\n return { toasts, push, dismiss, viewport }\n}","/**\n * UI 偏好持久化 hook:把任意 React state 同步到 localStorage,统一包名空间 dsh-engram.ui.*,\n * 隐私模式或存储失败时回退到默认值;非法值也降级默认。\n * 设计:包名空间 + key 后缀,避免与宿主/其它插件冲突。\n * @module @kenz1117/dsh-engram/client/UiStorage\n */\n\nimport { useCallback, useEffect, useState } from 'react'\n\n/** 命名空间:所有 key 都加此前缀。 */\nconst NAMESPACE = 'dsh-engram.ui'\n\n/** 防御性读:localStorage 抛错(隐私模式 / 禁用)返回 undefined。 */\nfunction safeGet(key: string): string | undefined {\n try { return window.localStorage.getItem(key) ?? undefined } catch { return undefined }\n}\n\n/** 防御性写:失败静默(UI 状态本身不依赖写回成功)。 */\nfunction safeSet(key: string, value: string): void {\n try { window.localStorage.setItem(key, value) } catch { /* 静默 */ }\n}\n\n/** 类型守卫:判断 raw 是否为合法值集合中的某一项。 */\nfunction isValid<T>(raw: string | undefined, allow: readonly T[]): raw is string & T {\n if (raw === undefined) return false\n return (allow as readonly unknown[]).includes(raw)\n}\n\n/**\n * 持久化 state:与 useState 同语义,初值惰性从 localStorage 读取,变更时同步写回。\n * @param suffix - localStorage key 后缀(不含包名空间)。\n * @param fallback - 默认值(首次进入或读取失败时使用)。\n * @param allow - 合法值白名单;同时用于入参校验与持久化校验。\n */\nexport function usePersistedState<T extends string>(\n suffix: string,\n fallback: T,\n allow: readonly T[],\n): [T, (next: T) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<T>(() => {\n const raw = safeGet(key)\n return isValid<T>(raw, allow) ? raw : fallback\n })\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: T) => { setValue(next) }, [])\n return [value, update]\n}\n\n/** 任意字符串持久化:无 allow 白名单,q 这种自由输入适用。 */\nexport function usePersistedString(\n suffix: string,\n fallback: string,\n): [string, (next: string) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<string>(() => safeGet(key) ?? fallback)\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: string) => { setValue(next) }, [])\n return [value, update]\n}","/**\n * 记忆库设置面板:统计卡片、过滤列表、批量操作、编辑(取代链)、遗忘/恢复、导出。\n * 数据经回环 API(/api/engram/*)读写;详情与编辑为条目下方行内展开\n * (不嵌套弹窗);文案全部走宿主 locale 词典(zh/en),语言切换自动\n * 重渲染;数据层英文枚举(status/kind/op)只在显示层映射;内容节点\n * 一律 DOM/JSX 构建(防 XSS)。\n * @module @kenz1117/dsh-engram/client/EngramPanel\n */\n\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport styles from './panel.module.css'\nimport { KIND_KEY, NS, type EngramKey } from './locales.ts'\nimport { CorridorMap } from './CorridorMap.tsx'\nimport { useToast, type ToastController } from './Toast.tsx'\nimport { usePersistedState, usePersistedString } from './UiStorage.ts'\n\n/** 列表/详情用的记忆视图(宿主 /api/engram/list 的行结构)。 */\ninterface MemoryRow {\n readonly id: string\n readonly scope: 'user' | 'project' | 'shared'\n readonly kind: string\n readonly content: string\n readonly importance: number\n readonly confidence: number\n readonly status: 'active' | 'archived' | 'forgotten'\n /** 最近一次使用效果回报(engram_report 写入;未回报过缺省)。 */\n readonly outcome?: 'success' | 'failure'\n readonly createdAt: number\n readonly accessCount: number\n readonly sourceSessionId: string | null\n readonly sourceRound: number | null\n /** 桩位(v0.7.2 起;未排桩时缺省)。 */\n readonly slot?: { readonly room: string; readonly index: number }\n}\n\ninterface ListResult {\n readonly records: MemoryRow[]\n readonly total: number\n}\n\ninterface StatsPart {\n readonly scope: 'user' | 'project' | 'shared'\n readonly stats: {\n readonly total: number\n readonly active: number\n readonly archived: number\n readonly forgotten: number\n readonly redacted: number\n readonly signalRatio: number\n /** 各房间(kind)条目数;stats 路由的 byKind 字段(房间目录数据源)。 */\n readonly byKind?: Readonly<Record<string, number>>\n }\n}\n\n/** review API 的返回结构(详情行内展开区的数据源)。 */\ninterface ReviewView {\n readonly record: MemoryRow\n readonly supersededBy?: readonly string[]\n readonly supersedes?: readonly string[]\n readonly contradicts?: readonly string[]\n readonly related?: readonly string[]\n /** 修订历史(旧内容快照,按被取代时间倒序)。 */\n readonly revisions?: readonly { content: string; kind: string; importance: number; supersededAt: number }[]\n readonly operations?: readonly { at: number; op: string; detail: string | null }[]\n}\n\n/** 面板内部传递的翻译函数(渲染器按注册的 locale 声明合成的 t 的窄化签名)。 */\ntype T = (key: EngramKey, params?: Record<string, unknown>) => string\n\n/** kind 数据值(存储层英文枚举,编辑表单下拉的 value 保持英文)。 */\nconst KINDS = ['fact', 'preference', 'decision', 'episode', 'skill'] as const\nconst PAGE_SIZE = 20\n\n/** 数据层枚举 → 词典键映射(显示层本地化,存储值不变)。 */\nconst STATUS_KEY: Record<MemoryRow['status'], EngramKey> = {\n active: 'statusActive',\n archived: 'statusArchived',\n forgotten: 'statusForgotten',\n}\nconst SCOPE_KEY: Record<MemoryRow['scope'], EngramKey> = {\n user: 'scopeUser',\n project: 'scopeProject',\n shared: 'scopeShared',\n}\n/** 房间色相类(panel.module.css 的 .roomFact 等);未知 kind 回退通用的 .kind。 */\nconst ROOM_CLASS: Record<string, string> = {\n fact: 'roomFact',\n preference: 'roomPreference',\n decision: 'roomDecision',\n episode: 'roomEpisode',\n skill: 'roomSkill',\n}\nconst OP_KEY: Record<string, EngramKey> = {\n write: 'opWrite',\n 'write-merge': 'opWriteMerge',\n update: 'opUpdate',\n forget: 'opForget',\n restore: 'opRestore',\n decay: 'opDecay',\n superseded: 'opSuperseded',\n 'ingest-request': 'opIngestRequest',\n 'ingest-done': 'opIngestDone',\n 'outcome-report': 'opOutcomeReport',\n assess: 'opAssess',\n consolidation: 'opConsolidation',\n 'review-answer': 'opReviewAnswer',\n 'slot-assign': 'opSlotAssign',\n 'slot-backfill': 'opSlotBackfill',\n 'room-open': 'opRoomOpen',\n 'search-rewrite-request': 'opSearchRewrite',\n 'compress-request': 'opCompressRequest',\n 'distill-request': 'opDistillRequest',\n 'profile-edit': 'opProfileEdit',\n}\nconst REL_KEY: Record<string, EngramKey> = {\n supersededBy: 'relSupersededBy',\n supersedes: 'relSupersedes',\n contradicts: 'relContradicts',\n related: 'relRelated',\n}\n/** 操作日志 detail JSON 的已知键 → 词典键(write/update/superseded 的小对象)。 */\nconst DETAIL_KEY: Record<string, EngramKey> = {\n kind: 'labelKind',\n scope: 'labelScope',\n status: 'labelStatus',\n}\n\n/** kind 数据值 → 本地化标签(未知值回退原文)。 */\nfunction kindLabel(t: T, kind: string): string {\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n}\n\n/** 房间 pill 的类名:按 kind 取色相类,未知 kind 回退通用品牌色。 */\nfunction roomPillClass(kind: string): string {\n return `${styles.pill} ${styles[ROOM_CLASS[kind] ?? 'kind'] ?? ''}`\n}\n\n/** op 数据值 → 本地化标签(未知值回退原文)。 */\nfunction opLabel(t: T, op: string): string {\n const key = OP_KEY[op]\n return key === undefined ? op : t(key)\n}\n\n/** 操作日志 detail 的本地化:write/update/superseded 的小对象转中文键值;摄取/蒸馏请求的完整 JSON 保持原样(审计诚实性优先)。 */\nfunction formatOpDetail(t: T, op: string, detail: string | null): string {\n if (detail === null) return ''\n // 画像修订的小对象转成语义句(创建/编辑/回滚三式,与工具的 audit detail 键对齐)。\n if (op === 'profile-edit') {\n try {\n const parsed = JSON.parse(detail) as { action?: unknown; fromVersion?: unknown; toVersion?: unknown; restoredFrom?: unknown; chars?: unknown }\n const to = Number(parsed.toVersion)\n const chars = Number(parsed.chars)\n if (parsed.action === 'edit' && parsed.fromVersion === null) {\n return ' ' + t('profileOpCreate', { to, chars })\n }\n const from = Number(parsed.fromVersion)\n if (parsed.action === 'edit') return ' ' + t('profileOpEdit', { from, to, chars })\n const restored = Number(parsed.restoredFrom)\n if (parsed.action === 'rollback' && Number.isInteger(from) && Number.isInteger(to) && Number.isInteger(restored)) {\n return ' ' + t('profileOpRollback', { from, to, restored, chars })\n }\n } catch {\n // detail 不是预期的 JSON:落到底部原样展示。\n }\n return ` ${detail}`\n }\n if (op !== 'write' && op !== 'update' && op !== 'superseded') return ` ${detail}`\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n const entries = Object.entries(parsed)\n if (entries.length === 0) return ` ${detail}`\n return ' ' + entries.map(([key, value]) => {\n const label = DETAIL_KEY[key]\n if (label === undefined) return `${key}=${String(value)}`\n if (key === 'kind' && typeof value === 'string') return `${t(label)}=${kindLabel(t, value)}`\n if (key === 'scope' && (value === 'user' || value === 'project')) return `${t(label)}=${t(SCOPE_KEY[value])}`\n return `${t(label)}=${String(value)}`\n }).join(' · ')\n } catch {\n return ` ${detail}`\n }\n}\n\n/** 来源会话展示片段:截短的会话 id + 可选轮次。 */\nfunction sourceLabel(t: T, record: Pick<MemoryRow, 'sourceSessionId' | 'sourceRound'>): string {\n if (record.sourceSessionId === null) return t('sourceExplicit')\n const id = `${record.sourceSessionId.slice(0, 16)}…`\n const withRound = record.sourceRound === null\n ? id\n : `${id} ${t('round', { n: record.sourceRound })}`\n return t('sourceSession', { id: withRound })\n}\n\n/**\n * 当前项目宫殿的选择器(host 的项目分库 dbName);null = 不注入,服务端走进程默认库。\n * 由 EngramSection 在**渲染期**赋值:父组件先于子组件渲染,保证子组件 effect 里的首批\n * 请求就带上选择器(放进 useEffect 会因「子 effect 先跑」而漏掉首帧那批请求)。\n */\nlet activeProjectSelector: string | null = null\n\n/**\n * 固定的项目选择器失效时的自愈入口(host 回 404 unknown project):\n * EngramSection 挂载时注册、卸载时清空——清掉固定的 library.project 回到 follow 并重载。\n */\nlet healDeadProject: (() => void) | null = null\n\n/** 请求是否属于 project 作用域:URL 里的 scope=project,或 POST JSON body 的 scope === 'project'。 */\nfunction isProjectScoped(path: string, init?: RequestInit): boolean {\n if (/(?:^|[?&])scope=project(?:&|$)/.test(path)) return true\n const body = init?.body\n if (typeof body !== 'string' || body === '') return false\n try {\n const parsed = JSON.parse(body) as { scope?: unknown } | null\n return typeof parsed === 'object' && parsed !== null && parsed.scope === 'project'\n } catch {\n // body 不是 JSON:按「非 project 作用域」处理,不抛错(偏好类请求可能带自由文本)。\n return false\n }\n}\n\n/** 往 JSON 对象 body 里加 project 字段;不可解析或非对象时返回 undefined(调用方退回 query 兜底)。 */\nfunction withProjectField(body: string, selector: string): string | undefined {\n try {\n const parsed = JSON.parse(body) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return undefined\n return JSON.stringify({ ...(parsed as Record<string, unknown>), project: selector })\n } catch {\n return undefined\n }\n}\n\n/** 追加 project 查询参数(GET,以及无法改写 body 时的兜底路径)。 */\nfunction withProjectParam(path: string, selector: string): string {\n return `${path}${path.includes('?') ? '&' : '?'}project=${encodeURIComponent(selector)}`\n}\n\n/**\n * 唯一的请求出口:project 作用域的请求统一注入当前项目宫殿选择器。\n * POST 优先写进 JSON body(host 契约:POST 经 body 传选择器),body 不可解析时退回 query。\n * project 请求收到 404 unknown project 时触发一次自愈(清固定值回到 follow),随后照常抛错。\n * @param path - `/api/engram/` 之后的路径(含 query);不要以 `/` 开头。\n * @param init - fetch 参数。\n * @param forceProject - 显式要求注入(合并视图如管家日志:user 侧照旧、project 侧跟随选择器)。\n * @returns 解析后的响应体;非 2xx 抛错(错误文案取 body.error)。\n */\nasync function api<T>(path: string, init?: RequestInit, forceProject = false): Promise<T> {\n const selector = activeProjectSelector\n let target = path\n let requestInit = init\n const projectScoped = selector !== null && (forceProject || isProjectScoped(path, init))\n if (projectScoped) {\n const body = init?.body\n const fromBody = typeof body === 'string' && body !== '' ? withProjectField(body, selector) : undefined\n if (fromBody !== undefined && init !== undefined) requestInit = { ...init, body: fromBody }\n else target = withProjectParam(path, selector)\n }\n const response = await fetch(`/api/engram/${target}`, requestInit)\n const parsed = (await response.json()) as T & { error?: string }\n if (!response.ok) {\n // 自愈:固定的分库已失效(工作区被删/改名)→ 回到跟随并重载,避免面板卡在错误态。\n if (projectScoped && response.status === 404 && parsed.error === 'unknown project') healDeadProject?.()\n throw new Error(parsed.error ?? `HTTP ${String(response.status)}`)\n }\n return parsed\n}\n\n/** host 项目宫殿清单的行(GET /api/engram/workspaces)。 */\ninterface EngramProjectItem {\n readonly dbName: string\n /** 工作区标题;host 给不出时为 null(显示回退路径末段 / dbName 短写)。 */\n readonly title?: string | null | undefined\n /** 该分库归属的工作目录;无法归属时 host 给 null 或直接省略该键。 */\n readonly path?: string | null | undefined\n /** workspace = 宿主注册表里的工作区;session = 只从会话 cwd 见到;process = 进程目录兜底。 */\n readonly kind: 'workspace' | 'session' | 'process'\n /** 项目标识来源(origin = git 仓库;cwd = 目录编码兜底)。 */\n readonly source: 'origin' | 'cwd'\n /** 宿主注册表里的工作区 id;对不上时 null(此时跟随只能按路径匹配)。 */\n readonly workspaceId?: string | null | undefined\n /** 库文件是否已存在(不存在时 memories 为 null)。 */\n readonly exists: boolean\n /** 库内记忆条数;库还不存在时为 null。 */\n readonly memories: number | null\n}\n\n/** GET /api/engram/workspaces 的返回(processDefault = 进程目录兜底库;缺席时 null)。 */\ninterface EngramWorkspacesView {\n readonly items: readonly EngramProjectItem[]\n readonly processDefault: { readonly dbName: string; readonly path: string | null; readonly title: string | null } | null\n}\n\n/** 宿主工作区视图(@deepseek-ai/dsh-api-workspace-controller/client 的 WorkspaceView 窄视图)。 */\nexport interface HostWorkspaceView {\n readonly workspaceId: string\n readonly path: string\n readonly title: string\n readonly sessionIds: readonly string[]\n}\n\n/** 宿主可观察快照的窄视图(getSnapshot + subscribe;与 useSyncExternalStore 兼容)。 */\ninterface ObservableLike<T> {\n getSnapshot(): T\n subscribe(listener: () => void): () => void\n}\n\n/** 宿主工作区服务窄视图(可选注入;缺席时面板其余功能照常)。 */\nexport interface WorkspacesLike {\n readonly list: ObservableLike<{ readonly items: readonly HostWorkspaceView[] }>\n}\n\n/** 宿主会话清单服务窄视图(可选注入;判定当前工作区只看当前会话 id)。 */\nexport interface SessionsLike {\n readonly list: ObservableLike<{ readonly current?: string | undefined }>\n}\n\n/** 空清单常量:useSyncExternalStore 的 getSnapshot 必须返回稳定引用。 */\nconst NO_WORKSPACES: readonly HostWorkspaceView[] = []\n\n/** 服务缺席时的空订阅(保持 hook 调用形状一致)。 */\nfunction noopUnsubscribe(): void { /* 无订阅可退 */ }\n\n/**\n * 订阅宿主快照(useSyncExternalStore 的 subscribe 席位)。\n * 契约上返回退订函数;个别实现若返回 void,则退化为「不卸载」而不是抛错。\n */\nfunction subscribeSnapshot<T>(source: ObservableLike<T> | undefined, onChange: () => void): () => void {\n if (source === undefined) return noopUnsubscribe\n const off = source.subscribe(onChange)\n return typeof off === 'function' ? off : noopUnsubscribe\n}\n\n/**\n * 当前 GUI 工作区:与侧边栏 WorkspacePicker 同一判定(工作区的 sessionIds 含当前会话)。\n * 两个宿主服务都可选:任一缺席时 available=false,chip 显示「无工作区信息(进程默认)」。\n * @param workspaces - 可选取用的宿主工作区服务。\n * @param sessions - 可选取用的宿主会话清单服务。\n * @returns 当前工作区(判定不出为 null)与服务是否齐备。\n */\nfunction useCurrentWorkspace(workspaces: WorkspacesLike | undefined, sessions: SessionsLike | undefined): {\n workspace: HostWorkspaceView | null\n available: boolean\n} {\n const subscribeWorkspaces = useCallback(\n (onChange: () => void): (() => void) => subscribeSnapshot(workspaces?.list, onChange),\n [workspaces],\n )\n const subscribeSessions = useCallback(\n (onChange: () => void): (() => void) => subscribeSnapshot(sessions?.list, onChange),\n [sessions],\n )\n const currentSessionId = useSyncExternalStore(subscribeSessions, () => sessions?.list.getSnapshot().current ?? null)\n const items = useSyncExternalStore(subscribeWorkspaces, () => workspaces?.list.getSnapshot().items ?? NO_WORKSPACES)\n const available = workspaces !== undefined && sessions !== undefined\n if (!available || currentSessionId === null) return { workspace: null, available }\n return { workspace: items.find(item => item.sessionIds.includes(currentSessionId)) ?? null, available }\n}\n\n/** 路径比较键:统一分隔符、去尾斜杠、小写(GUI 与 host 的路径书写可能不一致,Windows 大小写不敏感)。 */\nfunction pathKey(path: string): string {\n return path.replace(/\\//g, '\\\\').replace(/\\\\+$/, '').toLowerCase()\n}\n\n/** 路径末段(title 缺失时的回退显示名)。 */\nfunction lastSegment(path: string): string {\n const normalized = path.replace(/[/\\\\]+$/, '')\n const at = Math.max(normalized.lastIndexOf('\\\\'), normalized.lastIndexOf('/'))\n return at < 0 ? normalized : normalized.slice(at + 1)\n}\n\n/** dbName 短写:project-<hash>.db → project-<前 8 位>…(不符合该命名时按长度截断)。 */\nfunction shortDbName(dbName: string): string {\n const match = /^project-([0-9a-f]+)\\.db$/i.exec(dbName)\n return match === null ? dbName.slice(0, 14) : `project-${match[1]!.slice(0, 8)}…`\n}\n\n/** 项目库的显示名与「未注册工作区」标记:无法归属目录 → dbName 短写;否则 title > 路径末段。 */\nfunction projectLabel(item: EngramProjectItem): { name: string; unregistered: boolean } {\n if (typeof item.path !== 'string' || item.path === '') return { name: shortDbName(item.dbName), unregistered: true }\n const title = item.title?.trim() ?? ''\n if (title !== '') return { name: title, unregistered: item.kind !== 'workspace' }\n return { name: lastSegment(item.path), unregistered: item.kind !== 'workspace' }\n}\n\n/** 下拉项文案:显示名(含未注册标记)· 记忆条数(库未建时给「—」,不显示 0)。 */\nfunction projectOptionLabel(t: T, item: EngramProjectItem): string {\n const label = projectLabel(item)\n const parts = [label.unregistered ? `${label.name} · ${t('projectUnregistered')}` : label.name]\n parts.push(item.memories === null ? '—' : t('projectMemories', { n: item.memories }))\n return parts.join(' · ')\n}\n\n/** 跟随模式的目标:先按宿主工作区 id 匹配(最稳),对不上再按路径匹配;都匹配不到 → 进程默认库。 */\nfunction matchFollowTarget(list: EngramWorkspacesView | null, workspace: HostWorkspaceView | null): EngramProjectItem | undefined {\n if (list === null || workspace === null) return undefined\n const byId = list.items.find(item => item.workspaceId === workspace.workspaceId)\n if (byId !== undefined) return byId\n const key = pathKey(workspace.path)\n return list.items.find(item => typeof item.path === 'string' && pathKey(item.path) === key)\n}\n\n/**\n * 项目宫殿 chip 的文案与 hover 说明:固定 / 跟随 / 未注册 / 无工作区信息四态。\n * 固定优先判定(host 清单不依赖客户端服务,固定态在缺服务时依然准确)。\n */\nfunction projectChip(t: T, state: {\n mode: string\n available: boolean\n items: readonly EngramProjectItem[]\n followed: EngramProjectItem | undefined\n processDefaultPath: string | null\n}): { label: string; title: string; tone: 'pinned' | 'follow' | 'muted' } {\n if (state.mode !== 'follow') {\n const item = state.items.find(entry => entry.dbName === state.mode)\n if (item === undefined) {\n return {\n label: t('projectPinned', { name: `${shortDbName(state.mode)} · ${t('projectUnregistered')}` }),\n title: state.mode,\n tone: 'pinned',\n }\n }\n const label = projectLabel(item)\n return {\n label: t('projectPinned', { name: label.unregistered ? `${label.name} · ${t('projectUnregistered')}` : label.name }),\n title: item.path ?? item.dbName,\n tone: 'pinned',\n }\n }\n if (!state.available) return { label: t('projectNoWorkspace'), title: t('projectFollowHint'), tone: 'muted' }\n if (state.followed === undefined) {\n return {\n label: t('projectPinned', { name: t('projectProcessDefault') }),\n title: state.processDefaultPath ?? t('projectFollowHint'),\n tone: 'pinned',\n }\n }\n const label = projectLabel(state.followed)\n return {\n label: t('projectFollowNamed', { name: label.unregistered ? `${label.name} · ${t('projectUnregistered')}` : label.name }),\n title: state.followed.path ?? t('projectFollowHint'),\n tone: 'follow',\n }\n}\n\n/** 绝对时间(审计时间线等需要精确时刻的位置)。 */\nfunction fmtTime(ms: number): string {\n // 时间格式跟随浏览器环境语言(宿主界面语言通常与浏览器一致)。\n return new Date(ms).toLocaleString(navigator.language || 'zh-CN', { hour12: false })\n}\n\n/** 列表用的相对时间:1 分钟内「刚刚」,其后按分钟/小时/天取整。 */\nfunction relTime(t: T, ms: number): string {\n const diff = Math.max(0, Date.now() - ms)\n const minutes = Math.floor(diff / 60_000)\n if (minutes < 1) return t('timeJustNow')\n if (minutes < 60) return t('timeMinutesAgo', { n: minutes })\n const hours = Math.floor(minutes / 60)\n if (hours < 48) return t('timeHoursAgo', { n: hours })\n return t('timeDaysAgo', { n: Math.floor(hours / 24) })\n}\n\n/** 速览指标:大数 + 小标签 + 可选尾注;secondary 用于并排的次级计数。 */\nfunction Metric({ label, value, tail, secondary }: {\n label: string\n value: string | number\n tail?: string | undefined\n secondary?: boolean\n}): React.ReactElement {\n return (\n <div className={styles.metric}>\n <span className={styles.metricLabel}>{label}</span>\n <b className={secondary === true ? `${styles.metricValue} ${styles.metricValueSecondary}` : styles.metricValue}>{value}</b>\n {tail !== undefined && <span className={styles.metricTail}>{tail}</span>}\n </div>\n )\n}\n\n/** 健康分环:SVG 描边进度(0-100),颜色随分数分档。 */\nfunction HealthRing({ score }: { score: number }): React.ReactElement {\n const radius = 24\n const circumference = 2 * Math.PI * radius\n const filled = circumference * (Math.min(100, Math.max(0, score)) / 100)\n const tone = score >= 80 ? 'var(--dsw-alias-state-success-primary)'\n : score >= 50 ? 'var(--dsw-alias-state-warn-primary)'\n : 'var(--dsw-alias-state-error-primary)'\n return (\n <div className={styles.ring} role=\"meter\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={score}>\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" aria-hidden=\"true\">\n <circle cx=\"28\" cy=\"28\" r={radius} fill=\"none\" stroke=\"var(--dsw-alias-border-l2)\" strokeWidth=\"4\" />\n <circle cx=\"28\" cy=\"28\" r={radius} fill=\"none\" stroke={tone} strokeWidth=\"4\" strokeLinecap=\"round\"\n strokeDasharray={`${filled.toFixed(1)} ${circumference.toFixed(1)}`} />\n </svg>\n <b>{score}</b>\n </div>\n )\n}\n\n/** 细仪表条:重要性(品牌色)与置信(成功色)共用,conf 变体换色。 */\nfunction Meter({ value, conf }: { value: number; conf?: boolean }): React.ReactElement {\n return (\n <span className={conf === true ? `${styles.meter} ${styles.conf}` : styles.meter}>\n <i style={{ width: `${String(Math.round(Math.min(1, Math.max(0, value)) * 100))}%` }} />\n </span>\n )\n}\n\n/** 关系 id 列表 → 等宽字体 chips(完整 id 放 title)。 */\nfunction RelChips({ ids }: { ids: readonly string[] }): React.ReactElement {\n return (\n <div className={styles.relChips}>\n {ids.map(id => <span key={id} className={styles.relChip} title={id}>{id.slice(0, 18)}</span>)}\n </div>\n )\n}\n\n/** 行内审计区:属性网格 + 关系 chips + 操作时间线(review API)。 */\nfunction ReviewBody({ t, recordId, scope, project }: {\n t: T\n recordId: string\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n}): React.ReactElement {\n const [view, setView] = useState<ReviewView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<ReviewView>(`review?scope=${scope}&id=${encodeURIComponent(recordId)}`)\n .then((data) => { if (!cancelled) setView(data) })\n .catch((error: Error) => { if (!cancelled) setFailed(error.message) })\n return () => { cancelled = true }\n }, [recordId, scope, project, t])\n if (failed !== null) return <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>\n if (view === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n const { record } = view\n const relations = (['supersededBy', 'supersedes', 'contradicts', 'related'] as const)\n .map(key => ({ key, label: REL_KEY[key], ids: view[key] ?? [] }))\n .filter(entry => entry.ids.length > 0)\n const operations = view.operations ?? []\n return (\n <div className={styles.reviewGrid}>\n <div>\n <dl className={styles.attrGrid}>\n <dt>{t('labelContent')}</dt>\n <dd>{record.content}</dd>\n <dt>{t('labelKind')}</dt>\n <dd><span className={roomPillClass(record.kind)}>{kindLabel(t, record.kind)}</span></dd>\n <dt>{t('labelStatus')}</dt>\n <dd><span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span></dd>\n <dt>{t('importance')}</dt>\n <dd>{record.importance.toFixed(2)}<Meter value={record.importance} /></dd>\n <dt>{t('confidence')}</dt>\n <dd>{record.confidence.toFixed(2)}<Meter value={record.confidence} conf /></dd>\n <dt>{t('detailSource')}</dt>\n <dd>{sourceLabel(t, record)}</dd>\n <dt>{t('labelCreated')}</dt>\n <dd>{fmtTime(record.createdAt)}</dd>\n </dl>\n {relations.map(({ key, label, ids }) => (\n <div key={key} className={styles.relBlock}>\n <h5>{label === undefined ? key : t(label)}</h5>\n <RelChips ids={ids} />\n </div>\n ))}\n </div>\n <div>\n {(view.revisions ?? []).length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailRevisions')}</h5>\n <ul className={styles.timeline}>\n {view.revisions!.map((rev, index) => (\n <li key={index}>\n <time>{fmtTime(rev.supersededAt)}</time>\n <b>{kindLabel(t, rev.kind)}</b>\n {' '}{rev.content}\n </li>\n ))}\n </ul>\n </div>\n )}\n {operations.length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailOperations')}</h5>\n <ul className={styles.timeline}>\n {operations.map((op, index) => (\n <li key={index}>\n <time>{fmtTime(op.at)}</time>\n <b>{opLabel(t, op.op)}</b>\n {formatOpDetail(t, op.op, op.detail)}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/** 行内编辑表单:内容/种类/重要性 → POST update(旧条目归档,取代链保留)。 */\nfunction EditForm({ t, record, onClose, onSaved, toast }: {\n t: T\n record: MemoryRow\n onClose: () => void\n onSaved: () => void\n toast: ToastController\n}): React.ReactElement {\n const [content, setContent] = useState(record.content)\n const [kind, setKind] = useState(record.kind)\n const [importance, setImportance] = useState(record.importance)\n const save = (): void => {\n api('update', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope, content, kind, importance }),\n })\n .then(onSaved)\n .catch((error: Error) => { toast.push('error', error.message) })\n }\n return (\n <div className={styles.editForm}>\n <div>\n <label className={styles.fieldLabel}>{t('labelContent')}</label>\n <textarea className={styles.input} rows={3} value={content} onChange={event => setContent(event.target.value)} />\n </div>\n <div>\n <label className={styles.fieldLabel}>{t('labelKind')}</label>\n {/* option 的 value 保持数据层英文枚举,仅显示文本本地化。 */}\n <select className={styles.input} value={kind} onChange={event => setKind(event.target.value)}>\n {KINDS.map(option => <option key={option} value={option}>{kindLabel(t, option)}</option>)}\n </select>\n </div>\n <div className={styles.fieldRow}>\n <div>\n <label className={styles.fieldLabel}>{`${t('importance')} ${importance.toFixed(2)}`}</label>\n <input type=\"range\" min={0} max={1} step={0.05} value={importance}\n onChange={event => setImportance(Number(event.target.value))} />\n </div>\n </div>\n <div className={styles.modalFoot}>\n <button type=\"button\" className={styles.button} onClick={onClose}>{t('cancel')}</button>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`} onClick={save}>{t('saveWithHint')}</button>\n </div>\n </div>\n )\n}\n\n/** search-test API 的命中行。 */\ninterface BenchHit {\n readonly id: string\n readonly score: number\n readonly via: 'fts' | 'vec' | 'both'\n readonly viaEdge?: { readonly from: string; readonly type: string }\n readonly scope: string\n readonly kind: string\n readonly content: string\n}\n\n/** search-test API 的返回结构。 */\ninterface BenchResult {\n readonly degraded: boolean\n readonly hits: readonly BenchHit[]\n}\n\n/** activity API 的行结构(两库 op_log 合并)。 */\ninterface ActivityRow {\n readonly at: number\n readonly op: string\n readonly targetId: string\n readonly detail: string | null\n readonly scope: 'user' | 'project'\n}\n\n/** 命中道 → 词典键。 */\nconst VIA_KEY: Record<BenchHit['via'], EngramKey> = { fts: 'viaFts', vec: 'viaVec', both: 'viaBoth' }\n\n/** 召回测试台:输入查询跑真实检索,展示得分、命中原委(关键词/语义/边扩展)与内容。 */\nfunction RecallBench({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [query, setQuery] = useState('')\n /** 默认随观察 scope,但用户可在 select 内手动切换 'all' / 其它;切换观察 scope 时重置。 */\n const [benchScope, setBenchScope] = useState<string>(scope)\n const [result, setResult] = useState<BenchResult | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // 观察 scope 变化时同步 benchScope(用户在 select 里改过的「all」会被覆盖——刻意保持一致性)。\n useEffect(() => { setBenchScope(scope) }, [scope])\n const run = (): void => {\n if (query.trim() === '' || busy) return\n setBusy(true)\n // forceProject:'all' 模式(user + project)与 project 模式都要用当前选中的项目分库。\n api<BenchResult>(`search-test?q=${encodeURIComponent(query.trim())}&scope=${benchScope}`, undefined, true)\n .then((data) => { setResult(data); setError(null) })\n .catch((benchError: Error) => setError(benchError.message))\n .finally(() => setBusy(false))\n }\n const hits = result?.hits ?? []\n return (\n <div>\n <div className={styles.benchBar}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('benchPlaceholder')} value={query}\n onChange={event => setQuery(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter') run() }} />\n <select className={styles.input} value={benchScope}\n onChange={event => setBenchScope(event.target.value)}>\n <option value=\"all\">{t('benchScopeAll')}</option>\n <option value=\"user\">{t('scopeUser')}</option>\n <option value=\"project\">{t('scopeProject')}</option>\n <option value=\"shared\">{t('scopeShared')}</option>\n </select>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n disabled={busy || query.trim() === ''} onClick={run}>{t('benchRun')}</button>\n </div>\n {error !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: error })}</div>}\n {result !== null && error === null && (\n <div className={styles.benchMeta}>\n <span>{t('benchHits', { n: hits.length })}</span>\n {result.degraded && <span className={styles.degradedNote}>{t('benchDegraded')}</span>}\n </div>\n )}\n <div className={styles.benchList}>\n {hits.map(hit => (\n <div key={hit.id} className={styles.benchRow}>\n <div className={styles.benchHead}>\n <span className={styles.viaChip}>{t(VIA_KEY[hit.via])}</span>\n {hit.viaEdge !== undefined && (\n <span className={styles.viaChip}\n title={`${hit.viaEdge.type} ${hit.viaEdge.from}`}>{t('viaEdgeLabel')} · {hit.viaEdge.type}</span>\n )}\n <span className={roomPillClass(hit.kind)}>{kindLabel(t, hit.kind)}</span>\n <span className={styles.benchScore}>{hit.score.toFixed(4)}</span>\n </div>\n <div className={styles.benchContent}>{hit.content}</div>\n <span className={styles.benchId} title={hit.id}>{hit.id}</span>\n </div>\n ))}\n </div>\n {result !== null && hits.length === 0 && error === null && (\n <div className={styles.benchEmpty}>{t('benchEmpty')}</div>\n )}\n </div>\n )\n}\n\n/** 活动日志 detail 的摘要:摄取/改写/压缩请求解析 JSON 字段,其余原样截断。\n 窄侧栏下文本应尽量短,长详情交给 title 悬浮展示。 */\nfunction activityDetail(t: T, detail: string | null): string {\n if (detail === null) return ''\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n if (typeof parsed.round === 'number' && typeof parsed.userText === 'string') {\n const mode = typeof parsed.mode === 'string' ? ` · ${parsed.mode}` : ''\n return `${t('round', { n: parsed.round })}${mode} · ${parsed.userText.slice(0, 48)}`\n }\n if (typeof parsed.query === 'string' && Array.isArray(parsed.queries)) {\n return `${t('benchRewrite', { n: parsed.queries.length })} · ${parsed.query.slice(0, 36)}`\n }\n if (typeof parsed.count === 'number' && Object.keys(parsed).length === 1) {\n return t('benchCompress', { n: parsed.count })\n }\n if (typeof parsed.batchId === 'string' && typeof parsed.sufficient === 'boolean') {\n const refs = Array.isArray(parsed.refs) ? parsed.refs.length : 0\n return `${parsed.batchId} · ${t(parsed.sufficient ? 'assessAdequate' : 'assessInadequate')} · ${t('assessRefs', { n: refs })}`\n }\n // 闭馆整理汇总:scope + 归档 / 合并 / 跳过三项计数。\n if (typeof parsed.archived === 'number' && typeof parsed.merged === 'number' && typeof parsed.skipped === 'number') {\n const scope = parsed.scope === 'project' ? t('scopeProject') : t('scopeUser')\n return `${scope} · ${t('consolidateArchived', { n: parsed.archived })} · ${t('consolidateMerged', { n: parsed.merged })} · ${t('consolidateSkipped', { n: parsed.skipped })}`\n }\n // 衰减归档:只有 archived 计数。\n if (typeof parsed.archived === 'number' && parsed.merged === undefined) {\n return t('decayArchived', { n: parsed.archived })\n }\n if (typeof parsed.assigned === 'number') return t('slotBackfilled', { n: parsed.assigned })\n if (typeof parsed.room === 'string') return t('roomOpened', { room: parsed.room })\n if (typeof parsed.grade === 'number' && typeof parsed.nextIntervalDays === 'number') {\n return t('reviewAnswered', { grade: parsed.grade, days: parsed.nextIntervalDays })\n }\n } catch {\n // 非 JSON(outcome 值等):走末尾原样截断。\n }\n return detail.length > 56 ? `${detail.slice(0, 56)}…` : detail\n}\n\n/** 日志筛选分组:op 枚举 → 分组(数据层英文枚举只在显示层映射)。 */\ntype LogFilter = 'all' | 'write' | 'ingest' | 'retrieve' | 'organize'\nconst LOG_GROUPS: Readonly<Record<LogFilter, readonly string[] | null>> = {\n all: null,\n write: ['write', 'update', 'forget', 'restore', 'decay', 'superseded', 'outcome-report'],\n ingest: ['ingest-request', 'ingest-done'],\n retrieve: ['search-rewrite-request', 'compress-request', 'assess'],\n organize: ['distill-request', 'consolidation', 'slot-assign', 'slot-backfill', 'room-open', 'review-answer', 'profile-edit'],\n}\nconst LOG_FILTER_KEY: Readonly<Record<LogFilter, EngramKey>> = {\n all: 'logFilterAll',\n write: 'logFilterWrite',\n ingest: 'logFilterIngest',\n retrieve: 'logFilterRetrieve',\n organize: 'logFilterOrganize',\n}\n/** 分组 → 行首色点类(与工具条计数、筛选分组同色)。 */\nconst LOG_DOT: Readonly<Record<'write' | 'ingest' | 'retrieve' | 'organize', string>> = {\n write: 'logDotWrite',\n ingest: 'logDotIngest',\n retrieve: 'logDotRetrieve',\n organize: 'logDotOrganize',\n}\n/** op 枚举 → 所属筛选分组(未归类返回 all)。 */\nfunction logGroupOf(op: string): LogFilter {\n for (const group of ['write', 'ingest', 'retrieve', 'organize'] as const) {\n if (LOG_GROUPS[group]?.includes(op) === true) return group\n }\n return 'all'\n}\n/** 行首色点类名:未归类的 op 用中性灰点,避免出现无颜色的空列。 */\nfunction logDotClass(op: string): string {\n const group = logGroupOf(op)\n const base = styles.logDot ?? ''\n return group === 'all' ? base : `${base} ${styles[LOG_DOT[group]] ?? ''}`\n}\n\n/** 行级 LCS 对齐:把两段文本按行 diff,输出 same/add/del 序列(行数少,O(n·m) DP 足够)。 */\nfunction lineDiff(oldText: string, newText: string): readonly { kind: 'same' | 'add' | 'del'; text: string }[] {\n const a = oldText.split('\\n')\n const b = newText.split('\\n')\n const m = a.length\n const n = b.length\n // dp[i][j] = a[i..] 与 b[j..] 的最长公共子序列长度(末行/末列补 0)。\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0))\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!)\n }\n }\n const rows: { kind: 'same' | 'add' | 'del'; text: string }[] = []\n let i = 0\n let j = 0\n while (i < m && j < n) {\n if (a[i] === b[j]) { rows.push({ kind: 'same', text: a[i]! }); i += 1; j += 1 }\n else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) { rows.push({ kind: 'del', text: a[i]! }); i += 1 }\n else { rows.push({ kind: 'add', text: b[j]! }); j += 1 }\n }\n while (i < m) { rows.push({ kind: 'del', text: a[i]! }); i += 1 }\n while (j < n) { rows.push({ kind: 'add', text: b[j]! }); j += 1 }\n return rows\n}\n\n/** profile-block 路由的响应体(block 为 null = 该 scope 尚未创建 curated block)。 */\ninterface ProfileBlockView {\n scope: string\n block: { content: string; version: number; updatedAt: number } | null\n versions: readonly { version: number; content: string; source: string; at: number }[]\n}\n\n/**\n * 画像 curated block 审计卡:当前内容 + 版本历史 + 任意两版本的行级 diff。\n * 只读视图(编辑走 engram_profile_edit 工具,乐观锁在存储层);scope/project 变化时重载。\n */\nfunction ProfileCard({ t, scope, project }: { t: T; scope: 'user' | 'project' | 'shared'; project: string | null }): React.ReactElement {\n const [data, setData] = useState<ProfileBlockView | null>(null)\n const [failed, setFailed] = useState(false)\n const [baseVersion, setBaseVersion] = useState<number | null>(null)\n const [targetVersion, setTargetVersion] = useState<number | null>(null)\n useEffect(() => {\n let cancelled = false\n api<ProfileBlockView>(`profile-block?scope=${scope}`, undefined, true)\n .then((view) => {\n if (cancelled) return\n setData(view)\n setFailed(false)\n // 默认对比:基准 = 上一版,目标 = 当前版(仅一版时不启用 diff)。\n setBaseVersion(view.versions.length > 1 ? view.versions[1]!.version : null)\n setTargetVersion(view.versions.length > 0 ? view.versions[0]!.version : null)\n })\n .catch(() => { if (!cancelled) setFailed(true) })\n return () => { cancelled = true }\n }, [scope, project])\n if (failed) {\n return <div className={styles.expandLoading}>{t('profileLoadFailed')}</div>\n }\n if (data === null) {\n return <div className={styles.expandLoading}>{t('loading')}</div>\n }\n if (data.block === null) {\n return (\n <div className={styles.expandLoading}>\n <p>{t('profileEmpty')}</p>\n <p className={styles.sectionHint}>{t('profileEmptyHint')}</p>\n </div>\n )\n }\n const versions = data.versions\n const byVersion = new Map(versions.map(version => [version.version, version]))\n const base = baseVersion === null ? undefined : byVersion.get(baseVersion)\n const target = targetVersion === null ? undefined : byVersion.get(targetVersion)\n const diffRows = base !== undefined && target !== undefined ? lineDiff(base.content, target.content) : []\n const hasDiff = diffRows.some(row => row.kind !== 'same')\n return (\n <div className={styles.profileCard}>\n <h5 className={styles.profileHeading}>{t('profileCurrent', { n: data.block.version })}</h5>\n <pre className={styles.profileContent}>{data.block.content}</pre>\n {versions.length > 1 && (\n <>\n <h5 className={styles.profileHeading}>{t('profileHistory')}</h5>\n <div className={styles.profilePickerRow}>\n <label>\n <span className={styles.sectionHint}>{t('profileDiffBase')}</span>\n <select className={styles.profileSelect} value={baseVersion ?? undefined}\n onChange={event => { setBaseVersion(Number(event.target.value)) }}>\n {versions.map(version => (\n <option key={version.version} value={version.version}>\n v{version.version} · {version.source === 'rollback' ? t('profileSourceRollback') : t('profileSourceEdit')}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span className={styles.sectionHint}>{t('profileDiffTarget')}</span>\n <select className={styles.profileSelect} value={targetVersion ?? undefined}\n onChange={event => { setTargetVersion(Number(event.target.value)) }}>\n {versions.map(version => (\n <option key={version.version} value={version.version}>\n v{version.version} · {version.source === 'rollback' ? t('profileSourceRollback') : t('profileSourceEdit')}\n </option>\n ))}\n </select>\n </label>\n </div>\n {base !== undefined && target !== undefined && (\n <div className={styles.profileDiff}>\n {hasDiff\n ? diffRows.map((row, index) => (\n <div key={index} className={\n row.kind === 'add' ? styles.profileDiffAdd : row.kind === 'del' ? styles.profileDiffDel : styles.profileDiffSame\n }>{row.kind === 'add' ? '+ ' : row.kind === 'del' ? '- ' : ' '}{row.text}</div>\n ))\n : <div className={styles.sectionHint}>{t('profileDiffNone')}</div>}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n\n/**\n * 管家日志整页视图:顶部近 7 天三个计数,下面是两库合并的完整 op_log\n * (时间 · 操作 · 宫殿 · 摘要),可按操作类别筛选;不再限高裁切,供逐条审计。\n * user 侧照旧合并,project 侧跟随项目宫殿选择器(api 的 forceProject)。\n */\nfunction LogPanel({ t, telemetry, project }: {\n t: T\n telemetry: TelemetrySnapshot | null\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n}): React.ReactElement {\n const [rows, setRows] = useState<ActivityRow[] | null>(null)\n const [filter, setFilter] = useState<LogFilter>('all')\n useEffect(() => {\n let cancelled = false\n api<{ operations: ActivityRow[] }>('activity?limit=50', undefined, true)\n .then((data) => { if (!cancelled) setRows(data.operations) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [project])\n const allow = LOG_GROUPS[filter]\n const visible = (rows ?? []).filter(row => allow === null || allow.includes(row.op))\n const counts = telemetry?.counts\n return (\n <section className={styles.section}>\n {/* 一条工具条:标题 + 条数 + 近 7 天三类计数(带类别色点)+ 类别筛选,\n 取代原先「独立计数卡 + 筛选行」两段式。 */}\n <div className={styles.logToolbar}>\n <h4 className={styles.sectionTitle}>{t('tabLog')}</h4>\n <span className={styles.sectionHint}>{t('logCount', { n: visible.length })}</span>\n <span className={styles.logCounts}>\n <span><i className={`${styles.logDot} ${styles.logDotWrite}`} aria-hidden=\"true\" />{t('teleWrites')} <b>{counts?.writes ?? 0}</b></span>\n <span><i className={`${styles.logDot} ${styles.logDotIngest}`} aria-hidden=\"true\" />{t('teleIngest')} <b>{counts?.ingestDones ?? 0}</b></span>\n <span><i className={`${styles.logDot} ${styles.logDotOrganize}`} aria-hidden=\"true\" />{t('teleConsolidate')} <b>{counts?.consolidations ?? 0}</b></span>\n </span>\n <div className={styles.segGroup} role=\"tablist\">\n {(['all', 'write', 'ingest', 'retrieve', 'organize'] as const).map(option => (\n <button key={option} type=\"button\" role=\"tab\" aria-selected={filter === option}\n className={filter === option ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setFilter(option) }}>{t(LOG_FILTER_KEY[option])}</button>\n ))}\n </div>\n </div>\n <div className={styles.panelCard}>\n {rows === null\n ? <div className={styles.expandLoading}>{t('loading')}</div>\n : visible.length === 0\n ? <div className={styles.expandLoading}>{t('activityEmpty')}</div>\n : (\n <div className={styles.logList}>\n {visible.map((op, index) => (\n <div key={index} className={styles.logRow}>\n <i className={logDotClass(op.op)} aria-hidden=\"true\" />\n <span className={styles.logTime}>{relTime(t, op.at)}</span>\n <span className={styles.logOp}>{opLabel(t, op.op)}</span>\n <span className={styles.logScope}>{op.scope === 'user' ? t('scopeUser') : t('scopeProject')}</span>\n <span className={styles.logDetail} title={op.detail ?? ''}>{activityDetail(t, op.detail)}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n )\n}\n\n/** 入殿导航:根据当前 scope 的 active 记忆给出开场邀请 + 候选记忆列表;点击可展开抽屉。\n * 顶部 kind chip(全部 / fact / preference / decision / episode / skill)切换 focusKind,\n * 触发后端按该 kind 优先选前 N 条作为开场建议。 */\nfunction TourProposalCard({ t, scope, project, onSelect }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n onSelect: (id: string) => void\n}): React.ReactElement {\n interface Stop { id: string; kind: string; content: string; importance: number; confidence: number }\n interface Proposal { greeting: string; activeCount: number; empty: boolean; suggestedStops: readonly Stop[] }\n const KINDS_FOCUS = ['', 'fact', 'preference', 'decision', 'episode', 'skill'] as const\n const [focusKind, setFocusKind] = usePersistedState<string>('tour.focusKind', '', KINDS_FOCUS)\n const [proposal, setProposal] = useState<Proposal | null>(null)\n useEffect(() => {\n let cancelled = false\n const path = focusKind === ''\n ? `tour-proposal?scope=${scope}`\n : `tour-proposal?scope=${scope}&focusKind=${focusKind}`\n api<Proposal>(path)\n .then((data) => { if (!cancelled) setProposal(data) })\n .catch(() => { if (!cancelled) setProposal({ greeting: t('tourProposalEmpty'), activeCount: 0, empty: true, suggestedStops: [] }) })\n return () => { cancelled = true }\n }, [t, scope, project, focusKind])\n const labelKind = (kind: string): string => {\n if (kind === '') return t('tourFocusAll')\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n }\n if (proposal === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.tourProposal}>\n <div className={styles.chipRow} role=\"tablist\" aria-label=\"focus-kind\">\n {KINDS_FOCUS.map(kind => (\n <button key={kind || 'all'} type=\"button\" role=\"tab\"\n aria-selected={focusKind === kind}\n className={focusKind === kind ? `${styles.chip} ${styles.chipOn}` : styles.chip}\n onClick={() => { setFocusKind(kind) }}>\n {labelKind(kind)}\n </button>\n ))}\n </div>\n {proposal.empty\n ? <div className={styles.expandLoading}>{t('tourProposalEmpty')}</div>\n : (\n <>\n <p className={styles.tourGreeting}>{proposal.greeting}</p>\n <ol className={styles.tourStops}>\n {proposal.suggestedStops.map((stop, index) => (\n <li key={stop.id}>\n <button type=\"button\" className={styles.tourStop} onClick={() => { onSelect(stop.id) }}>\n <span className={styles.tourStopIndex}>{index + 1}</span>\n <span className={styles.tourStopBody}>\n <span className={styles.tourStopKind}>{kindLabel(t, stop.kind)}</span>\n <span className={styles.tourStopText}>{stop.content.length > 60 ? `${stop.content.slice(0, 60)}…` : stop.content}</span>\n </span>\n </button>\n </li>\n ))}\n </ol>\n <p className={styles.tourHint}>{t('tourProposalHint')}</p>\n </>\n )}\n </div>\n )\n}\n\n/** 翻新清单:扫描 active 条目,给出 merge / demote / review / split 四类建议;带手动刷新 + 写回按钮。\n * - review / split:跳到对应记忆抽屉查看(无副作用)。\n * - demote:调用 engram_forget(带三问墓志铭),记忆转 archived。\n * - merge:触发当前 scope 的 engram_distill(用户级闭馆整理),把多条相似记忆蒸馏为一条高层规律。 */\nfunction RefurbCard({ t, scope, project, onSelect, onAfterAction, toast }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n onSelect: (id: string) => void\n onAfterAction: () => void\n toast: ToastController\n}): React.ReactElement {\n interface Suggestion { action: 'merge' | 'demote' | 'review' | 'split'; primaryId: string; candidates: readonly string[]; reason: string; confidence: number }\n interface RefurbReport { count: number; suggestions: readonly Suggestion[] }\n const [report, setReport] = useState<RefurbReport | null>(null)\n const [busy, setBusy] = useState(false)\n const reload = useCallback(() => {\n setBusy(true)\n api<RefurbReport>(`refurb?scope=${scope}`)\n .then((data) => { setReport(data) })\n .catch(() => { setReport({ count: 0, suggestions: [] }) })\n .finally(() => { setBusy(false) })\n }, [scope, project])\n useEffect(() => { reload() }, [reload])\n const labelOf = (action: Suggestion['action']): string => {\n switch (action) {\n case 'demote': return t('refurbActionDemote')\n case 'merge': return t('refurbActionMerge')\n case 'review': return t('refurbActionReview')\n case 'split': return t('refurbActionSplit')\n }\n }\n /** 执行建议:review/split 仅跳转;demote/merge 调写接口。 */\n const execute = useCallback((suggestion: Suggestion) => {\n if (suggestion.action === 'review' || suggestion.action === 'split') {\n onSelect(suggestion.primaryId)\n return\n }\n if (suggestion.action === 'demote') {\n if (!window.confirm(t('refurbConfirmDemote'))) return\n setBusy(true)\n api<{ id: string }>('forget', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n id: suggestion.primaryId,\n scope,\n reason: '翻新清单降级',\n affects: '无',\n stillUseful: '可经 engram_restore 复原',\n }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbDemoteDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n return\n }\n if (suggestion.action === 'merge') {\n const n = suggestion.candidates.length + 1\n if (n < 2) {\n toast.push('warning', t('refurbMergeEmpty'))\n return\n }\n if (!window.confirm(t('refurbConfirmMerge', { n }))) return\n setBusy(true)\n // 透传 candidates:后端 runConsolidation 仅把这些 ids 当合并种子,其它条目仅在与种子相似时被并入。\n const candidates = [suggestion.primaryId, ...suggestion.candidates]\n api<Record<string, unknown>>('consolidate', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ scope, candidates }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbMergeDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n }\n }, [reload, onSelect, onAfterAction, toast, t, scope])\n if (report === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.refurb}>\n <div className={styles.refurbHead}>\n <span className={styles.refurbCount}>{t('refurbCount', { n: report.count })}</span>\n <button type=\"button\" className={styles.button} disabled={busy} onClick={reload}>{t('refurbRun')}</button>\n </div>\n {report.count === 0\n ? <div className={styles.expandLoading}>{t('refurbEmpty')}</div>\n : (\n <ul className={styles.refurbList}>\n {report.suggestions.map((suggestion, index) => (\n <li key={`${suggestion.action}-${suggestion.primaryId}-${index}`} className={styles.refurbItem}>\n <button type=\"button\" className={styles.refurbBadge} onClick={() => { onSelect(suggestion.primaryId) }}>\n {labelOf(suggestion.action)}\n </button>\n <div className={styles.refurbReason}>{suggestion.reason}</div>\n <span className={styles.refurbConfidence}>{(suggestion.confidence * 100).toFixed(0)}%</span>\n <button type=\"button\" className={`${styles.refurbExec} ${styles.button}`} disabled={busy}\n onClick={() => { execute(suggestion) }}>{t('refurbExecute')}</button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/** 走廊鸟瞰数据拉取与节点/边状态(命中 active + archived,forgotten 默认隐藏)。 */\ninterface CorridorGraph {\n readonly nodes: ReadonlyArray<{\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n readonly content?: string\n }>\n readonly edges: ReadonlyArray<{ readonly id: string; readonly from: string; readonly to: string; readonly type: string }>\n}\n\nfunction CorridorPanel({ t, scope, project, onSelect }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n onSelect: (id: string) => void\n}): React.ReactElement {\n const [graph, setGraph] = useState<CorridorGraph | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<CorridorGraph>(`corridor?status=active,archived&scope=${scope}`)\n .then(data => { if (!cancelled) setGraph(data); setFailed(null) })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope, project])\n if (failed !== null) return <div className={styles.expandLoading}>{t('corridorFailed')}:{failed}</div>\n if (graph === null) return <div className={styles.expandLoading}>{t('corridorLoad')}</div>\n if (graph.nodes.length === 0) return <div className={styles.empty}>{t('corridorEmpty')}</div>\n return <CorridorMap scope={scope} nodes={graph.nodes} edges={graph.edges} onSelect={onSelect} t={t} />\n}\n\n/** GET /api/engram/episode-timeline 的情景行(host 已精简为四字段)。 */\ninterface EpisodeRowView {\n readonly id: string\n readonly kind: string\n readonly content: string\n readonly createdAt: number\n}\n\n/** GET /api/engram/episode-timeline 的组模式返回(组头带摄取期生成的会话摘要)。 */\ninterface EpisodeGroupsView {\n readonly groups: ReadonlyArray<{\n readonly sessionId: string | null\n readonly summary?: string | undefined\n readonly startedAt: number\n readonly endedAt: number\n readonly episodes: readonly EpisodeRowView[]\n }>\n}\n\n/** 邻近扩展(around 模式)返回:锚点条目 + 窗口内的情景邻居。 */\ninterface EpisodeAroundView {\n readonly anchor: EpisodeRowView\n readonly neighbors: readonly EpisodeRowView[]\n}\n\n/**\n * 情景时间线视图:按会话分组浏览 episode 往事,组头展示摄取期生成的一句话摘要;\n * 条目点「邻近」展开该时刻 ± 窗口的时间邻近扩展卡(回答「当时前后还发生了什么」)。\n */\nfunction EpisodeTimelineView({ t, scope, project, reloadTick }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n reloadTick: number\n}): React.ReactElement {\n const [sinceDate, setSinceDate] = useState('')\n const [untilDate, setUntilDate] = useState('')\n const [sessionIdInput, setSessionIdInput] = useState('')\n /** 已应用的过滤条件:date/文本输入不即时触发请求,点「应用」才生效。 */\n const [applied, setApplied] = useState<{ readonly since: string; readonly until: string; readonly sessionId: string }>({ since: '', until: '', sessionId: '' })\n const [data, setData] = useState<EpisodeGroupsView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n /** 邻近扩展卡(null = 未展开);busy 防重复点击。 */\n const [around, setAround] = useState<EpisodeAroundView | null>(null)\n const [aroundBusy, setAroundBusy] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n const params = new URLSearchParams({ scope })\n // date input 值按本地时区折算成当天首尾毫秒(T00:00:00 / T23:59:59.999)。\n if (applied.since !== '') params.set('since', String(new Date(`${applied.since}T00:00:00`).getTime()))\n if (applied.until !== '') params.set('until', String(new Date(`${applied.until}T23:59:59.999`).getTime()))\n if (applied.sessionId !== '') params.set('sessionId', applied.sessionId)\n api<EpisodeGroupsView>(`episode-timeline?${params.toString()}`)\n .then(d => { if (!cancelled) { setData(d); setFailed(null) } })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope, project, applied, reloadTick])\n\n /** 展开邻近扩展:以该条目为锚点查同库 ±60 分钟窗口内的情景(窗口由 host 缺省)。 */\n const openAround = (id: string): void => {\n setAroundBusy(true)\n api<EpisodeAroundView>(`episode-timeline?scope=${scope}&around=${encodeURIComponent(id)}`)\n .then(d => { setAround(d); setAroundBusy(false); setFailed(null) })\n .catch((err: Error) => { setFailed(err.message); setAroundBusy(false) })\n }\n\n /** 条目行:时刻 + 房间 + 内容 + 邻近按钮;id 放 title 便于复制。 */\n const renderRow = (row: EpisodeRowView): React.ReactElement => (\n <div key={row.id} className={styles.episodeRow} title={row.id}>\n <time className={styles.episodeRowTime}>{fmtTime(row.createdAt)}</time>\n <span className={styles.episodeRowKind}>{kindLabel(t, row.kind)}</span>\n <span className={styles.episodeRowText}>{row.content}</span>\n <button type=\"button\" className={styles.button} disabled={aroundBusy}\n onClick={() => { openAround(row.id) }}>\n {t('episodeNearby')}\n </button>\n </div>\n )\n\n return (\n <>\n {/* 过滤行:日期范围 + 可选会话 id;「应用」后生效,「重置」回到全量。 */}\n <div className={styles.toolbarRow}>\n <input type=\"date\" className={styles.input} value={sinceDate} aria-label={t('episodeSince')}\n onChange={event => { setSinceDate(event.target.value) }} />\n <span className={styles.episodeRangeSep} aria-hidden=\"true\">–</span>\n <input type=\"date\" className={styles.input} value={untilDate} aria-label={t('episodeUntil')}\n onChange={event => { setUntilDate(event.target.value) }} />\n <input className={`${styles.input} ${styles.search}`} placeholder={t('episodeSessionId')} value={sessionIdInput}\n onChange={event => { setSessionIdInput(event.target.value) }} />\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n onClick={() => { setApplied({ since: sinceDate, until: untilDate, sessionId: sessionIdInput.trim() }); setAround(null) }}>\n {t('episodeApply')}\n </button>\n <button type=\"button\" className={styles.button}\n onClick={() => {\n setSinceDate(''); setUntilDate(''); setSessionIdInput('')\n setApplied({ since: '', until: '', sessionId: '' }); setAround(null)\n }}>\n {t('episodeReset')}\n </button>\n </div>\n {failed !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>}\n {around !== null && (\n <section className={`${styles.panelCard} ${styles.episodeAround}`}>\n <header className={styles.episodeAroundHead}>\n <b>{t('episodeAroundTitle')}</b>\n <button type=\"button\" className={styles.button} onClick={() => { setAround(null) }}>\n {t('episodeClose')}\n </button>\n </header>\n {renderRow(around.anchor)}\n {around.neighbors.length === 0\n ? <p className={styles.sectionHint}>{t('episodeAroundEmpty')}</p>\n : around.neighbors.map(renderRow)}\n </section>\n )}\n {data === null && failed === null && <div className={styles.expandLoading}>{t('loading')}</div>}\n {data !== null && data.groups.length === 0 && <div className={styles.empty}>{t('episodeNoGroups')}</div>}\n {data?.groups.map(group => (\n <section key={group.sessionId ?? 'none'} className={styles.panelCard}>\n <header className={styles.episodeHead}>\n {group.summary === undefined\n ? <p className={`${styles.episodeSummary} ${styles.episodeSummaryMissing}`}>{t('episodeSummaryMissing')}</p>\n : <p className={styles.episodeSummary}>{group.summary}</p>}\n <span className={styles.episodeHeadMeta}>\n {group.sessionId === null ? t('episodeNoSession') : `#${group.sessionId}`}\n {' · '}\n {new Date(group.startedAt).toLocaleDateString()} ~ {new Date(group.endedAt).toLocaleDateString()}\n {' · '}\n {t('episodeEntries', { n: group.episodes.length })}\n </span>\n </header>\n <div>{group.episodes.map(renderRow)}</div>\n </section>\n ))}\n </>\n )\n}\n\n/** GET /api/engram/entities 的行(host 返回 { entity, memoryCount },entity 为实体记录的显示字段)。 */\ninterface EntityListItemView {\n readonly entity: {\n readonly id: string\n readonly name: string\n readonly kind: string\n readonly aliases: readonly string[]\n }\n readonly memoryCount: number\n}\n\n/** GET /api/engram/entities 返回(updated_at 倒序,附总数)。 */\ninterface EntityListView {\n readonly items: readonly EntityListItemView[]\n readonly total: number\n}\n\n/** GET /api/engram/entity 返回:实体 + 关联 active 记忆(创建时间倒序)。 */\ninterface EntityDetailView {\n readonly entity: EntityListItemView['entity']\n readonly memories: readonly MemoryRow[]\n}\n\n/** GET /api/engram/facts 返回的单条事实(面板只读显示所需字段)。 */\ninterface FactView {\n readonly id: string\n readonly content: string\n readonly validAt: number\n readonly invalidAt: number | null\n readonly replacedBy: string | null\n}\n\n/** GET /api/engram/facts 返回(valid_at 倒序,附总数)。 */\ninterface EntityFactsView {\n readonly items: readonly FactView[]\n readonly total: number\n}\n\n/** 实体类别数据值 → 词典键(筛选 chips、列表行与详情卡共用一份映射)。 */\nconst ENTITY_KIND_KEY: Record<string, EngramKey> = {\n person: 'entityKindPerson',\n project: 'entityKindProject',\n tool: 'entityKindTool',\n concept: 'entityKindConcept',\n other: 'entityKindOther',\n}\nconst ENTITY_KINDS = ['person', 'project', 'tool', 'concept', 'other'] as const\n\n/** 实体行的类别标签(未知 kind 回退「其他」)。 */\nfunction entityKindLabel(t: T, kind: string): string {\n return t(ENTITY_KIND_KEY[kind] ?? 'entityKindOther')\n}\n\n/**\n * 实体词典视图:浏览摄取期从记忆中抽取的实体(人物/项目/工具/概念),\n * 类别 chips + 名称/别名子串过滤;点「查看」展开该实体牵出的关联记忆卡。\n */\nfunction EntityView({ t, scope, project, reloadTick }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n reloadTick: number\n}): React.ReactElement {\n const [kind, setKind] = useState<'all' | (typeof ENTITY_KINDS)[number]>('all')\n const [q, setQ] = useState('')\n const [data, setData] = useState<EntityListView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n /** 展开的实体详情卡(null = 未展开);busy 防重复点击。 */\n const [detail, setDetail] = useState<EntityDetailView | null>(null)\n const [facts, setFacts] = useState<EntityFactsView | null>(null)\n const [detailBusy, setDetailBusy] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n const params = new URLSearchParams({ scope })\n if (kind !== 'all') params.set('kind', kind)\n if (q !== '') params.set('q', q)\n api<EntityListView>(`entities?${params.toString()}`)\n .then(d => { if (!cancelled) { setData(d); setFailed(null) } })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope, project, kind, q, reloadTick])\n\n /** 展开实体详情:实体记录 + 关联记忆 + 事实链全貌(含已失效,看事实如何演变)。 */\n const openDetail = (id: string): void => {\n setDetailBusy(true)\n Promise.all([\n api<EntityDetailView>(`entity?scope=${scope}&id=${encodeURIComponent(id)}`),\n api<EntityFactsView>(`facts?scope=${scope}&entityId=${encodeURIComponent(id)}&includeInvalid=1`),\n ])\n .then(([d, f]) => { setDetail(d); setFacts(f); setDetailBusy(false); setFailed(null) })\n .catch((err: Error) => { setFailed(err.message); setDetailBusy(false) })\n }\n\n /** 详情卡里的关联记忆行:时刻 + 房间 + 内容(只读观测,不提供编辑入口)。 */\n const renderMemory = (row: MemoryRow): React.ReactElement => (\n <div key={row.id} className={styles.episodeRow} title={row.id}>\n <time className={styles.episodeRowTime}>{fmtTime(row.createdAt)}</time>\n <span className={styles.episodeRowKind}>{kindLabel(t, row.kind)}</span>\n <span className={styles.episodeRowText}>{row.content}</span>\n </div>\n )\n\n /** 详情卡里的事实行:生效日期 + 状态标签 + 陈述;失效行标「已失效」。 */\n const renderFact = (fact: FactView): React.ReactElement => (\n <div key={fact.id} className={styles.episodeRow} title={fact.id}>\n <time className={styles.episodeRowTime}>{new Date(fact.validAt).toLocaleDateString()}</time>\n <span className={styles.episodeRowKind}>{fact.invalidAt === null ? t('factValid') : t('factInvalid')}</span>\n <span className={styles.episodeRowText}>{fact.content}</span>\n </div>\n )\n\n return (\n <>\n {/* 过滤行:类别 chips;切换过滤时收起已展开的详情卡,避免与新列表错位。 */}\n <div className={styles.chipRow}>\n {([\n ['all', t('entityKindAll')],\n ...ENTITY_KINDS.map(option => [option, t(ENTITY_KIND_KEY[option] ?? 'entityKindOther')] as const),\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\" aria-pressed={kind === value}\n className={kind === value ? `${styles.chip} ${styles.chipOn}` : styles.chip}\n onClick={() => { setKind(value); setDetail(null); setFacts(null) }}>\n {label}\n </button>\n ))}\n </div>\n <div className={styles.toolbarRow}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('entitySearchPlaceholder')} value={q}\n onChange={event => { setQ(event.target.value.trim()); setDetail(null); setFacts(null) }} />\n {data !== null && <span className={styles.sectionHint}>{t('entityCount', { n: data.total })}</span>}\n </div>\n {failed !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>}\n {detail !== null && (\n <section className={`${styles.panelCard} ${styles.episodeAround}`}>\n <header className={styles.episodeAroundHead}>\n <b>{detail.entity.name}</b>\n <span className={styles.episodeRowKind}>{entityKindLabel(t, detail.entity.kind)}</span>\n <button type=\"button\" className={styles.button} onClick={() => { setDetail(null); setFacts(null) }}>\n {t('episodeClose')}\n </button>\n </header>\n {detail.entity.aliases.length > 0 && (\n <p className={styles.sectionHint}>{`${t('entityAliases')}:${detail.entity.aliases.join('、')}`}</p>\n )}\n {detail.memories.length === 0\n ? <p className={styles.sectionHint}>{t('entityNoMemories')}</p>\n : <div>{detail.memories.map(renderMemory)}</div>}\n {facts !== null && (\n <>\n <p className={styles.sectionHint}>{t('factSection', { n: facts.total })}</p>\n {facts.items.length === 0\n ? <p className={styles.sectionHint}>{t('factEmpty')}</p>\n : <div>{facts.items.map(renderFact)}</div>}\n </>\n )}\n </section>\n )}\n {data === null && failed === null && <div className={styles.expandLoading}>{t('loading')}</div>}\n {data !== null && data.items.length === 0 && <div className={styles.empty}>{t('entityEmpty')}</div>}\n {data !== null && data.items.map(item => (\n <div key={item.entity.id} className={styles.episodeRow} title={item.entity.id}>\n <span className={styles.episodeRowKind}>{entityKindLabel(t, item.entity.kind)}</span>\n <span className={styles.episodeRowText}>\n {item.entity.name}\n {item.entity.aliases.length > 0 && (\n <small className={styles.sectionHint}>{`(${item.entity.aliases.join('、')})`}</small>\n )}\n </span>\n <span className={styles.episodeRowTime}>{t('entityMemories', { n: item.memoryCount })}</span>\n <button type=\"button\" className={styles.button} disabled={detailBusy}\n onClick={() => { openDetail(item.entity.id) }}>\n {t('entityOpen')}\n </button>\n </div>\n ))}\n </>\n )\n}\n\n/** 宫殿健康分卡:5 维 0-100 + 总分 + 每维度进度条。 */\ninterface HealthReport {\n readonly overall: number\n readonly parts: ReadonlyArray<{\n readonly scope: string\n readonly score: number\n readonly signal: number\n readonly activeRatio: number\n readonly edgeCount: number\n readonly redacted: number\n readonly archivedRatio: number\n }>\n readonly evaluatedAt: number\n}\n\n/** 房间目录:kind → 条目数(stats.byKind);色块与房间 pill 同色相。 */\nfunction RoomDirectory({ t, byKind }: { t: T; byKind: Readonly<Record<string, number>> }): React.ReactElement {\n return (\n <div className={styles.roomList}>\n {KINDS.map(kind => (\n <div key={kind} className={styles.roomRow}>\n <span className={`${styles.roomSwatch} ${styles[ROOM_CLASS[kind] ?? ''] ?? ''}`} aria-hidden=\"true\" />\n <span>{kindLabel(t, kind)}</span>\n <b className={styles.roomCount}>{byKind[kind] ?? 0}</b>\n </div>\n ))}\n </div>\n )\n}\n\n/** 宫殿遥测:最近 7 天 op_log 聚合(写 / 摄取 / 整理 / 闭环等计数)。 */\ninterface TelemetrySnapshot {\n readonly windowDays: number\n readonly counts: {\n readonly writes: number\n readonly forgets: number\n readonly ingestRequests: number\n readonly ingestDones: number\n readonly distillRequests: number\n readonly consolidations: number\n }\n}\n\n/**\n * 宫殿总览取数:规模(stats,含房间分布)+ 近 7 天活动(telemetry)+ 健康分(health)\n * 一次并行拉齐,供今日速览、健康分构成与房间目录共用(同一路由不重复请求)。\n * @param scope - 当前观察的宫殿(跟随 Header 三宫格)。\n * @param project - 项目宫殿选择器(仅用于选择器变化时重载;实际注入在 api() 里做)。\n * @returns 各段数据与取数失败原因(失败时保留上一次成功值)。\n */\nfunction usePalaceOverview(scope: 'user' | 'project' | 'shared', project: string | null): {\n stats: StatsPart['stats'] | null\n byKind: Readonly<Record<string, number>>\n telemetry: TelemetrySnapshot | null\n health: HealthReport | null\n failed: string | null\n} {\n const [state, setState] = useState<{\n stats: StatsPart['stats'] | null\n byKind: Readonly<Record<string, number>>\n telemetry: TelemetrySnapshot | null\n health: HealthReport | null\n failed: string | null\n }>({ stats: null, byKind: {}, telemetry: null, health: null, failed: null })\n useEffect(() => {\n let cancelled = false\n Promise.all([\n // stats 带 scope:project 时经 api() 注入选择器,host 让 project 段按选择器解析(缺省行为不变)。\n api<{ parts: StatsPart[] }>(`stats?scope=${scope}`),\n api<TelemetrySnapshot>(`telemetry?days=7&scope=${scope}`),\n api<HealthReport>(`health?scope=${scope}`),\n ])\n .then(([statRes, tele, health]) => {\n if (cancelled) return\n const stats = statRes.parts.find(part => part.scope === scope)?.stats ?? null\n setState({ stats, byKind: stats?.byKind ?? {}, telemetry: tele, health, failed: null })\n })\n .catch((error: Error) => {\n if (!cancelled) setState(current => ({ ...current, failed: error.message }))\n })\n return () => { cancelled = true }\n }, [scope, project])\n return state\n}\n\n/**\n * 今日速览:三个主指标(记忆 / 开放 / 清晰度)+ 近 7 天三个次级计数 + 健康分环。\n * 取代原先常驻的九格日报条——主次分层,其余计数下沉到「管家日志」tab。\n */\nfunction TodayHero({ t, overview, dueCount }: { t: T; overview: ReturnType<typeof usePalaceOverview>; dueCount: number }): React.ReactElement {\n const { stats, telemetry, health, failed } = overview\n if (failed !== null) {\n return <section className={styles.panelCard}><div className={styles.expandLoading}>{t('teleFailed')}:{failed}</div></section>\n }\n if (telemetry === null) {\n return <section className={styles.panelCard}><div className={styles.expandLoading}>{t('teleLoading')}</div></section>\n }\n const counts = telemetry.counts\n return (\n <section className={styles.panelCard}>\n <div className={styles.hero}>\n <div className={styles.heroMetrics}>\n <Metric label={t('kpiTotal')} value={stats?.total ?? 0}\n tail={`${t('teleGroupRecent')} +${String(counts.writes)}`} />\n <Metric label={t('kpiActive')} value={stats?.active ?? 0}\n tail={`${t('kpiForgotten')} ${String(stats?.forgotten ?? 0)}`} />\n <Metric label={t('kpiSignal')} value={`${String(Math.round((stats?.signalRatio ?? 0) * 100))}%`}\n tail={t('cardRedacted', { n: stats?.redacted ?? 0 })} />\n </div>\n <div className={styles.heroSide}>\n <Metric label={t('teleWrites')} value={counts.writes} secondary />\n <Metric label={t('teleIngest')} value={counts.ingestRequests} secondary />\n <Metric label={t('teleConsolidate')} value={counts.consolidations} secondary />\n {/* 今日到期:复习调度的消费者是 agent,这里只给观测计数(角标/陈展筛选可达)。 */}\n <Metric label={t('heroDue')} value={dueCount} secondary />\n <HealthRing score={health?.overall ?? 0} />\n </div>\n </div>\n <div className={styles.heroFoot}>\n <span className={styles.sectionHint}>\n {health === null ? t('healthLoading') : t('healthEvaluatedAt', { time: relTime(t, health.evaluatedAt) })}\n </span>\n {/* 隐私元数据:叹号图标 + 短标签 + hover/聚焦弹出长说明。 */}\n <span className={styles.telePrivacy} role=\"note\" aria-label={t('telePrivacyHint')} tabIndex={0}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"7\" y1=\"6\" x2=\"7\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\"/>\n <circle cx=\"7\" cy=\"4.2\" r=\"0.7\" fill=\"currentColor\"/>\n </svg>\n <span className={styles.telePrivacyHint}>{t('telePrivacyHint')}</span>\n <span className={styles.telePrivacyTip} role=\"tooltip\">{t('telePrivacyTip')}</span>\n </span>\n </div>\n </section>\n )\n}\n\n/** 历史回填 API 的估算结构(GET /api/engram/history-backfill)。 */\ninterface BackfillEstimateView {\n readonly rules: {\n readonly days: number\n readonly maxTurnsPerSession: number\n readonly maxTotalTurns: number\n readonly includeSubagents: boolean\n readonly includeSeeded: boolean\n readonly includeNoCwd: boolean\n }\n readonly candidates: number\n readonly eligibleTurns: number\n readonly pendingTurns: number\n readonly alreadyIngested: number\n readonly skipped: {\n readonly subagent: number\n readonly seeded: number\n readonly noCwd: number\n readonly tooOld: number\n readonly unreadable: number\n }\n readonly truncated: boolean\n readonly unavailable?: string\n}\n\n/** 宿主已注册的 provider 与模型清单(GET /api/engram/models)。 */\ninterface ModelsView {\n readonly providers: readonly { readonly id: string; readonly name: string; readonly models: readonly { readonly id: string; readonly name: string }[] }[]\n readonly failures: readonly string[]\n}\n\n/** 历史回填任务状态(GET /api/engram/history-backfill/status)。 */\ninterface BackfillStatusView {\n readonly progress: {\n readonly state: 'running' | 'done' | 'cancelled' | 'failed'\n readonly sessionsTotal: number\n readonly sessionsDone: number\n readonly turnsPlanned: number\n readonly turnsDone: number\n readonly memoriesWritten: number\n readonly turnsSkipped: number\n readonly turnsFailed: number\n readonly skipReasons: Readonly<Record<string, number>>\n readonly currentSession?: string\n }\n readonly failures: readonly { readonly sessionId: string; readonly turn: number; readonly reason: string }[]\n readonly error?: string\n}\n\n/** 跳过原因(摄取管线的英文枚举)→ 词典键。 */\nconst SKIP_KEY: Record<string, EngramKey> = {\n 'low-activity': 'skipLowActivity',\n chitchat: 'skipChitchat',\n 'capture-forbidden': 'skipForbidden',\n 'no-user-content': 'skipNoContent',\n 'already-ingested': 'skipAlready',\n 'no-such-turn': 'skipNoTurn',\n 'no-previous-turn': 'skipNoTurn',\n 'no-route-in-log': 'skipNoRoute',\n unparsable: 'skipUnparsable',\n}\n\n/** 跳过原因的本地化标签(未知枚举回退原值)。 */\nfunction skipLabel(t: T, reason: string): string {\n const key = SKIP_KEY[reason]\n return key === undefined ? reason : t(key)\n}\n\n/**\n * 历史回填:导入规则由用户选择(时间窗 / 轮数上限 / 三类会话过滤),\n * 先估算(零成本)再执行;运行中每 1.5 秒轮询进度,可暂停续做。\n */\nfunction HistoryBackfillCard({ t, toast }: { t: T; toast: ToastController }): React.ReactElement {\n /** 规则(持久化):时间窗与过滤开关以字符串存,便于 localStorage 往返。 */\n const [days, setDays] = usePersistedState<string>('backfill.days', '7', ['7', '30', '90', '0'])\n const [maxTurns, setMaxTurns] = usePersistedString('backfill.maxTurns', '20')\n const [maxTotal, setMaxTotal] = usePersistedString('backfill.maxTotal', '200')\n const [subagents, setSubagents] = usePersistedState<string>('backfill.subagents', 'false', ['false', 'true'])\n const [seeded, setSeeded] = usePersistedState<string>('backfill.seeded', 'false', ['false', 'true'])\n const [noCwd, setNoCwd] = usePersistedState<string>('backfill.noCwd', 'false', ['false', 'true'])\n /** 辅助模型选择:'' = 自动(用当前在用的模型);否则 `provider::model`。 */\n const [modelChoice, setModelChoice] = usePersistedString('backfill.model', '')\n const [models, setModels] = useState<ModelsView | null>(null)\n const [estimate, setEstimate] = useState<BackfillEstimateView | null>(null)\n const [status, setStatus] = useState<BackfillStatusView | null>(null)\n const [busy, setBusy] = useState(false)\n\n // 已注册模型清单:只拉一次(模型注册表变化不频繁,切换 tab 会重新挂载)。\n useEffect(() => {\n let cancelled = false\n api<ModelsView>('models')\n .then((data) => { if (!cancelled) setModels(data) })\n .catch(() => { if (!cancelled) setModels({ providers: [], failures: [] }) })\n return () => { cancelled = true }\n }, [])\n\n /** 显式选中的辅助模型(未选 = 交给后端用当前在用的模型)。 */\n const selection = ((): { provider: string; model: string } | undefined => {\n if (modelChoice === '') return undefined\n const separator = modelChoice.indexOf('::')\n if (separator <= 0) return undefined\n return { provider: modelChoice.slice(0, separator), model: modelChoice.slice(separator + 2) }\n })()\n\n const params = new URLSearchParams({\n days, maxTurnsPerSession: maxTurns, maxTotalTurns: maxTotal,\n includeSubagents: subagents, includeSeeded: seeded, includeNoCwd: noCwd,\n })\n if (selection !== undefined) {\n params.set('provider', selection.provider)\n params.set('model', selection.model)\n }\n const query = params.toString()\n\n const reload = useCallback((): void => {\n setBusy(true)\n api<{ estimate: BackfillEstimateView }>(`history-backfill?${query}`)\n .then((data) => { setEstimate(data.estimate) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }, [query, toast])\n useEffect(() => { reload() }, [reload])\n\n // 进度轮询:运行中每 1.5 秒一次;空闲只拉一次拿最终态。\n const running = status?.progress.state === 'running'\n useEffect(() => {\n let cancelled = false\n const poll = (): void => {\n api<BackfillStatusView>('history-backfill/status')\n .then((data) => { if (!cancelled) setStatus(data) })\n .catch(() => { /* 轮询失败静默重试,不打断面板 */ })\n }\n poll()\n if (!running) return () => { cancelled = true }\n const timer = window.setInterval(poll, 1500)\n return () => { cancelled = true; window.clearInterval(timer) }\n }, [running])\n\n const start = (): void => {\n setBusy(true)\n api<{ ok: boolean; status: BackfillStatusView }>('history-backfill/start', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n days: Number(days), maxTurnsPerSession: Number(maxTurns), maxTotalTurns: Number(maxTotal),\n includeSubagents: subagents === 'true', includeSeeded: seeded === 'true', includeNoCwd: noCwd === 'true',\n ...(selection === undefined ? {} : { provider: selection.provider, model: selection.model }),\n }),\n })\n .then((data) => { setStatus(data.status) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }\n const pause = (): void => {\n api<{ status: BackfillStatusView }>('history-backfill/cancel', {\n method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}',\n })\n .then((data) => { setStatus(data.status) })\n .catch((error: Error) => { toast.push('error', error.message) })\n }\n\n const progress = status?.progress\n const stateLabel = progress === undefined\n ? ''\n : progress.state === 'running' ? t('backfillStateRunning')\n : progress.state === 'done' ? t('backfillStateDone')\n : progress.state === 'cancelled' ? t('backfillStateCancelled')\n : t('backfillStateFailed')\n const percent = progress === undefined || progress.turnsPlanned === 0\n ? 0\n : Math.min(100, Math.round((progress.turnsDone / progress.turnsPlanned) * 100))\n\n return (\n <div className={styles.backfill}>\n <p className={styles.backfillIntro}>{t('backfillIntro')}</p>\n\n {/* 导入规则:全部由用户选择(持久化,下次进来沿用)。 */}\n <div className={styles.backfillRules}>\n <label className={styles.backfillRule}>\n <span>{t('backfillDays')}</span>\n <select className={styles.input} value={days} onChange={event => { setDays(event.target.value) }}>\n <option value=\"7\">{t('backfillDaysUnit', { n: 7 })}</option>\n <option value=\"30\">{t('backfillDaysUnit', { n: 30 })}</option>\n <option value=\"90\">{t('backfillDaysUnit', { n: 90 })}</option>\n <option value=\"0\">{t('backfillDaysAll')}</option>\n </select>\n </label>\n <label className={styles.backfillRule}>\n <span>{t('backfillMaxTurns')}</span>\n <input className={styles.input} type=\"number\" min={1} max={500} value={maxTurns}\n onChange={event => { setMaxTurns(event.target.value) }} />\n </label>\n <label className={styles.backfillRule}>\n <span>{t('backfillMaxTotal')}</span>\n <input className={styles.input} type=\"number\" min={1} max={5000} value={maxTotal}\n onChange={event => { setMaxTotal(event.target.value) }} />\n </label>\n {/* 辅助模型:默认「自动」= 回填时用你当前在用的模型(历史日志里的旧模型可能已不可用)。 */}\n <label className={styles.backfillRule}>\n <span>{t('backfillModel')}</span>\n <select className={styles.input} value={modelChoice}\n onChange={event => { setModelChoice(event.target.value) }}>\n <option value=\"\">{t('backfillModelAuto')}</option>\n {(models?.providers ?? []).map(provider => (\n <optgroup key={provider.id} label={provider.name}>\n {provider.models.map(model => (\n <option key={`${provider.id}::${model.id}`} value={`${provider.id}::${model.id}`}>{model.name}</option>\n ))}\n </optgroup>\n ))}\n </select>\n </label>\n </div>\n <div className={styles.backfillToggles}>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={subagents === 'true'}\n onChange={event => { setSubagents(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeSubagents')}\n </label>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={seeded === 'true'}\n onChange={event => { setSeeded(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeSeeded')}\n </label>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={noCwd === 'true'}\n onChange={event => { setNoCwd(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeNoCwd')}\n </label>\n </div>\n\n {/* 估算:零成本先看数(不写库、不调 LLM)。 */}\n <div className={styles.backfillEstimate}>\n {estimate === null\n ? <span className={styles.backfillMuted}>{t('backfillEstimating')}</span>\n : estimate.unavailable !== undefined\n ? <span className={styles.backfillMuted}>{estimate.unavailable}</span>\n : (\n <>\n <div className={styles.backfillNumbers}>\n <span className={styles.backfillMetric}>{t('backfillCandidates', { n: estimate.candidates })}</span>\n <span className={styles.backfillMetric}>{t('backfillPendingTurns', { n: estimate.pendingTurns })}</span>\n <span className={styles.backfillMetric}>{t('backfillAlready', { n: estimate.alreadyIngested })}</span>\n </div>\n <div className={styles.backfillMuted}>\n {t('backfillSkippedDetail', {\n subagent: estimate.skipped.subagent,\n seeded: estimate.skipped.seeded,\n noCwd: estimate.skipped.noCwd,\n tooOld: estimate.skipped.tooOld,\n unreadable: estimate.skipped.unreadable,\n })}\n </div>\n {estimate.truncated && <div className={styles.backfillMuted}>{t('backfillTruncated')}</div>}\n </>\n )}\n </div>\n\n <div className={styles.backfillActions}>\n <button type=\"button\" className={styles.button} disabled={busy} onClick={reload}>{t('backfillReestimate')}</button>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n disabled={busy || running || estimate === null || estimate.unavailable !== undefined || estimate.pendingTurns === 0}\n onClick={start}>{t('backfillStart')}</button>\n <button type=\"button\" className={styles.button} disabled={!running} onClick={pause}>{t('backfillPause')}</button>\n </div>\n {progress !== undefined && (\n <div className={styles.backfillProgress}>\n <div className={styles.backfillProgressHead}>\n <span>{stateLabel}</span>\n <span>{t('backfillProgressTurns', { done: progress.turnsDone, total: progress.turnsPlanned })}</span>\n </div>\n <div className={styles.progressBar}><i style={{ width: `${String(percent)}%` }} /></div>\n <div className={styles.backfillMeta}>\n <span>{t('backfillProgressSessions', { done: progress.sessionsDone, total: progress.sessionsTotal })}</span>\n <span>{t('backfillWritten', { n: progress.memoriesWritten })}</span>\n <span>{t('backfillTurnsSkipped', { n: progress.turnsSkipped })}</span>\n <span>{t('backfillTurnsFailed', { n: progress.turnsFailed })}</span>\n </div>\n {/* 跳过原因分布:让「写入很少」可解释(多为节流跳过而非失败)。 */}\n {Object.keys(progress.skipReasons).length > 0 && (\n <div className={styles.backfillMeta}>\n <span>{t('backfillSkipReasons')}</span>\n {Object.entries(progress.skipReasons).sort(([, a], [, b]) => b - a).map(([reason, count]) => (\n <span key={reason}>{`${skipLabel(t, reason)} ${String(count)}`}</span>\n ))}\n </div>\n )}\n {(status?.failures ?? []).length > 0 && (\n <ul className={styles.backfillFailures}>\n <li className={styles.backfillMuted}>{t('backfillFailures')}</li>\n {status!.failures.slice(0, 3).map((failure, index) => (\n <li key={`${failure.sessionId}-${String(failure.turn)}-${String(index)}`}>\n {`${failure.sessionId.slice(-12)} · ${String(failure.turn)} · ${failure.reason}`}\n </li>\n ))}\n </ul>\n )}\n {(status?.failures ?? []).length > 0 && (\n <div className={styles.backfillMuted}>{t('backfillRouteHint')}</div>\n )}\n {status?.error !== undefined && <div className={styles.backfillMuted}>{status.error}</div>}\n </div>\n )}\n </div>\n )\n}\n\n/** Jev 面板视图(GET/POST /api/engram/jev-config 的响应体;密钥只有掩码,明文不出进程)。 */\ninterface JevPanelView {\n readonly enabled: boolean\n readonly apiKeySet: boolean\n readonly apiKeyMask: string | null\n readonly baseUrl: string\n readonly model: string\n readonly timeoutMs: number\n readonly deferMergeAbove: number\n readonly deferAcceptBelow: number\n readonly contradictMinProbability: number\n}\n\n/**\n * Jev 裁决配置:面板覆盖 cordis.yml 的连接字段(开关 / 密钥 / 端点 / 模型 / 超时),\n * 保存进 `<dbDir>/jev-config.json`(0600)后立即生效,无需重启。密钥输入框只进不出\n * (placeholder 回显掩码);留空 = 保留现有覆盖,清除走「清除已存密钥」。\n */\nfunction JevConfigCard({ t, toast }: { t: T; toast: ToastController }): React.ReactElement {\n const [view, setView] = useState<JevPanelView | null>(null)\n const [enabled, setEnabled] = useState(false)\n const [apiKey, setApiKey] = useState('')\n const [baseUrl, setBaseUrl] = useState('')\n const [model, setModel] = useState('')\n const [timeoutMs, setTimeoutMs] = useState('3000')\n const [busy, setBusy] = useState(false)\n const [testing, setTesting] = useState(false)\n\n // 初载:视图只读展示 + 表单初始值;密钥不回填输入框(保持空 = 不改动)。\n useEffect(() => {\n let cancelled = false\n api<JevPanelView>('jev-config')\n .then((data) => {\n if (cancelled) return\n setView(data)\n setEnabled(data.enabled)\n setBaseUrl(data.baseUrl)\n setModel(data.model)\n setTimeoutMs(String(data.timeoutMs))\n })\n .catch((error: Error) => { if (!cancelled) toast.push('error', `${t('jevLoadFailed')}: ${error.message}`) })\n return () => { cancelled = true }\n }, [t, toast])\n\n const save = (): void => {\n setBusy(true)\n api<{ ok: boolean; view: JevPanelView }>('jev-config', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n // 密钥留空 = 不发送该字段(保留现有覆盖);清空语义走 clearKey。\n body: JSON.stringify({\n enabled,\n baseUrl: baseUrl.trim(),\n model: model.trim(),\n timeoutMs: Number(timeoutMs),\n ...(apiKey.trim() === '' ? {} : { apiKey: apiKey.trim() }),\n }),\n })\n .then((data) => {\n setView(data.view)\n setApiKey('')\n toast.push('success', t('jevSaved'))\n })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }\n\n const clearKey = (): void => {\n setBusy(true)\n api<{ ok: boolean; view: JevPanelView }>('jev-config', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n // 空串 = 清除面板密钥覆盖,回落 cordis.yml 的值。\n body: JSON.stringify({ apiKey: '' }),\n })\n .then((data) => { setView(data.view); toast.push('success', t('jevKeyCleared')) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }\n\n // 连接测试:用当前输入值(不落覆盖文件)发最小 ping 问题;密钥留空 = 测已存值。\n const testConnection = (): void => {\n setTesting(true)\n api<{ ok: boolean; elapsedMs: number; probability: number | undefined; error: string | undefined }>('jev-test', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n baseUrl: baseUrl.trim(),\n model: model.trim(),\n ...(apiKey.trim() === '' ? {} : { apiKey: apiKey.trim() }),\n }),\n })\n .then((result) => {\n if (result.ok) toast.push('success', t('jevTestOk', { ms: result.elapsedMs, p: result.probability }))\n else toast.push('error', t('jevTestFail', { error: result.error ?? '' }))\n })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setTesting(false) })\n }\n\n if (view === null) return <span className={styles.jevMuted}>{t('loading')}</span>\n\n return (\n <div className={styles.jev}>\n <p className={styles.jevIntro}>{t('jevIntro')}</p>\n <div className={styles.jevToggleRow}>\n <label className={styles.jevToggle}>\n <input type=\"checkbox\" checked={enabled} onChange={event => setEnabled(event.target.checked)} />\n {t('jevEnabled')}\n </label>\n <span className={styles.jevStatus}>{view.enabled ? t('jevStatusOn') : t('jevStatusOff')}</span>\n </div>\n <div className={styles.jevForm}>\n <label className={styles.jevField}>\n <span>{t('jevApiKey')}</span>\n <input className={styles.input} type=\"password\" value={apiKey} autoComplete=\"off\"\n placeholder={view.apiKeyMask ?? t('jevApiKeyUnset')}\n onChange={event => setApiKey(event.target.value)} />\n <span className={styles.jevMuted}>{t('jevApiKeyHint')}</span>\n </label>\n <label className={styles.jevField}>\n <span>{t('jevBaseUrl')}</span>\n <input className={styles.input} value={baseUrl} onChange={event => setBaseUrl(event.target.value)} />\n </label>\n <label className={styles.jevField}>\n <span>{t('jevModel')}</span>\n <input className={styles.input} value={model} onChange={event => setModel(event.target.value)} />\n </label>\n <label className={styles.jevField}>\n <span>{t('jevTimeoutMs')}</span>\n <input className={styles.input} type=\"number\" min={1000} max={60000} value={timeoutMs}\n onChange={event => setTimeoutMs(event.target.value)} />\n </label>\n </div>\n <div className={styles.jevMuted}>{t('jevThresholdsTitle')}</div>\n <div className={styles.jevMuted}>{t('jevThresholdLine', {\n merge: view.deferMergeAbove,\n accept: view.deferAcceptBelow,\n contradict: view.contradictMinProbability,\n })}</div>\n <div className={styles.jevActions}>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`} disabled={busy} onClick={save}>\n {t('jevSave')}\n </button>\n <button type=\"button\" className={styles.button} disabled={busy || testing} onClick={testConnection}>\n {t('jevTest')}\n </button>\n {view.apiKeySet && (\n <button type=\"button\" className={styles.button} disabled={busy} onClick={clearKey}>\n {t('jevClearKey')}\n </button>\n )}\n </div>\n </div>\n )\n}\n\n/** 近期裁决观测行视图(GET /api/engram/jev-observations 的 items 元素)。 */\ninterface JevObservationView {\n readonly at: number\n readonly site: 'band' | 'contradiction'\n readonly question: string\n readonly answered: boolean\n readonly probability: number | undefined\n readonly elapsedMs: number\n readonly error: string | undefined\n readonly verdict: 'merge' | 'accept' | 'defer' | 'confirm' | 'reject' | 'fallback'\n}\n\n/** verdict → 徽标文案键(动态模板字符串在 EngramKey union 下不可静态检查,改用映射表)。 */\nconst VERDICT_KEY: Readonly<Record<JevObservationView['verdict'], EngramKey>> = {\n merge: 'jevObsVerdictMerge',\n accept: 'jevObsVerdictAccept',\n defer: 'jevObsVerdictDefer',\n confirm: 'jevObsVerdictConfirm',\n reject: 'jevObsVerdictReject',\n fallback: 'jevObsVerdictFallback',\n}\n\n/**\n * 近期裁决观测:轮询 /api/engram/jev-observations(1.5s),展示判定结果 / Jev 是否给出答案 /\n * 耗时 / 回落原因,帮助排查「这条为什么被搁置」。数据只存进程内存,重启清空。\n */\nfunction JevObservationsCard({ t, toast }: { t: T; toast: ToastController }): React.ReactElement {\n const [items, setItems] = useState<readonly JevObservationView[] | null>(null)\n\n useEffect(() => {\n let cancelled = false\n // 初载失败弹 toast;轮询失败静默重试(观测卡不值得刷屏打扰)。\n const reload = (reportFailure: boolean): void => {\n api<{ items: readonly JevObservationView[] }>('jev-observations')\n .then((data) => { if (!cancelled) setItems(data.items) })\n .catch((error: Error) => {\n if (cancelled) return\n setItems(previous => previous ?? [])\n if (reportFailure) toast.push('error', `${t('jevObsLoadFailed')}: ${error.message}`)\n })\n }\n reload(true)\n const timer = window.setInterval(() => reload(false), 1500)\n return () => { cancelled = true; window.clearInterval(timer) }\n }, [t, toast])\n\n if (items === null) return <span className={styles.jevMuted}>{t('loading')}</span>\n if (items.length === 0) return <span className={styles.jevMuted}>{t('jevObsEmpty')}</span>\n\n return (\n <div className={styles.jevObs}>\n <div className={styles.jevObsHead}>{t('jevObsTitle')}</div>\n {items.map((item, index) => (\n <div key={`${item.at}-${item.site}-${index}`} className={styles.jevObsItem}>\n <span className={styles.jevObsTime}>{new Date(item.at).toLocaleTimeString()}</span>\n <span>{item.site === 'band' ? t('jevObsSiteBand') : t('jevObsSiteContradiction')}</span>\n <span className={item.verdict === 'fallback'\n ? styles.jevObsBadgeWarn\n : item.verdict === 'confirm' || item.verdict === 'merge' ? styles.jevObsBadgeGood : styles.jevObsBadge}>\n {t(VERDICT_KEY[item.verdict])}\n </span>\n <span>{item.answered ? `p=${item.probability?.toFixed(3)}` : t('jevObsNoAnswer')}</span>\n <span>{item.elapsedMs}ms</span>\n {item.error !== undefined && <span className={styles.jevObsError}>{t('jevObsErrorLine', { error: item.error })}</span>}\n </div>\n ))}\n </div>\n )\n}\n\n/** 导出下拉:把三种格式(Markdown / JSON / 镜像目录)合并成一个按钮 + 弹出列表。\n * 链接是浏览器直连的 GET(不走 api()),故这里显式拼接项目宫殿选择器。 */\nfunction ExportMenu({ t, scope, project }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器:仅在 project 作用域拼接(null = 服务端走进程默认库)。 */\n project: string | null\n}): React.ReactElement {\n const [open, setOpen] = useState(false)\n const wrapRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n if (!open) return\n const handler = (event: MouseEvent): void => {\n if (wrapRef.current === null || !wrapRef.current.contains(event.target as Node)) setOpen(false)\n }\n window.addEventListener('mousedown', handler)\n return () => { window.removeEventListener('mousedown', handler) }\n }, [open])\n const projectQuery = scope === 'project' && project !== null ? `&project=${encodeURIComponent(project)}` : ''\n const options: Array<{ label: string; hint: string; href: string }> = [\n { label: t('exportMd'), hint: t('exportMdHint'), href: `/api/engram/export?scope=${scope}${projectQuery}&format=markdown` },\n { label: t('exportJson'), hint: t('exportJsonHint'), href: `/api/engram/export?scope=${scope}${projectQuery}&format=json` },\n { label: t('exportMirror'), hint: t('exportMirrorHint'), href: `/api/engram/mirror?scope=${scope}${projectQuery}` },\n ]\n return (\n <div className={styles.exportWrap} ref={wrapRef}>\n <button type=\"button\" className={styles.button} aria-haspopup=\"menu\" aria-expanded={open}\n onClick={() => { setOpen(value => !value) }}>\n {t('export')}\n <span className={styles.exportCaret} aria-hidden=\"true\">▾</span>\n </button>\n {open && (\n <div className={styles.exportMenu} role=\"menu\">\n {options.map(option => (\n <a key={option.href} role=\"menuitem\" className={styles.exportItem} href={option.href}\n onClick={() => { setOpen(false) }}>\n <span className={styles.exportItemLabel}>{option.label}</span>\n <span className={styles.exportItemHint}>{option.hint}</span>\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** EngramSection 的 props:渲染器给的 t(locale 席位)+ 可选取用的宿主服务。 */\nexport type EngramSectionProps = PropsLocale<typeof NS> & {\n /** 宿主工作区服务(缺席时 chip 显示「无工作区信息」,面板其余功能照常)。 */\n readonly workspaces?: WorkspacesLike | undefined\n /** 宿主会话清单服务(用于判定当前会话所属工作区)。 */\n readonly sessions?: SessionsLike | undefined\n}\n\n/** 设置页「记忆库」section 主组件(t 由渲染器按 locale: NS 声明合成)。 */\nexport function EngramSection({ t, workspaces, sessions }: EngramSectionProps): React.ReactElement {\n const toast = useToast()\n /** 全局 scope(持久化):Header 三宫格是唯一切换器,驱动今日速览、各视图卡片、陈展列表与导出。 */\n const [scope, setScope] = usePersistedState<'user' | 'project' | 'shared'>('library.scope', 'user', ['user', 'project', 'shared'])\n /** 库顶 status / kind / q 过滤器(持久化)。 */\n const [status, setStatus] = usePersistedState<string>('library.status', 'all', ['all', 'active', 'archived', 'forgotten'])\n const [kind, setKind] = usePersistedState<string>('library.kind', 'all', ['all', 'fact', 'preference', 'decision', 'episode', 'skill'])\n const [q, setQ] = usePersistedString('library.q', '')\n /** 陈展列表排序(持久化):time = 开馆时间倒序;tour = 固定巡游路线桩位顺序。 */\n const [sort, setSort] = usePersistedState<'time' | 'tour'>('library.sort', 'time', ['time', 'tour'])\n /** 今日到期条数与 id 集合(Header 角标 + 陈展「今日到期」筛选共用同一次拉取)。 */\n const [dueCount, setDueCount] = useState(0)\n const [dueIds, setDueIds] = useState<ReadonlySet<string>>(new Set())\n /** 陈展「今日到期」筛选:只显示复习调度今天到期的条目。 */\n const [dueOnly, setDueOnly] = useState(false)\n /** 脱敏筛选已合并到顶部 KPI 与 tag 视觉,不再作为过滤器。 */\n const [redacted] = useState('all')\n const [offset, setOffset] = useState(0)\n const [list, setList] = useState<ListResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n /** 行内展开态:互斥的唯一展开条目(review 或 edit)。 */\n const [expanded, setExpanded] = useState<{ kind: 'review' | 'edit'; record: MemoryRow } | null>(null)\n const [reloadTick, setReloadTick] = useState(0)\n /** 批量选择:条目 id 集合(scope/过滤/翻页/搜索变更时清空)。 */\n const [selected, setSelected] = useState<ReadonlySet<string>>(new Set())\n /** 批量遗忘的两段式确认。 */\n const [confirmForget, setConfirmForget] = useState(false)\n /** Tab 视图:today 今日速览 / library 陈展列表 / corridor 走廊与检索 / episodes 往事时间线 / entities 实体词典 / log 管家日志 / backfill 历史回填 / jev Jev 裁决配置。 */\n const [activeTab, setActiveTab] = useState<'today' | 'library' | 'corridor' | 'episodes' | 'entities' | 'log' | 'backfill' | 'jev'>('today')\n /** 项目宫殿来源(持久化):'follow' = 跟随 GUI 当前工作区;其它值 = 固定的 host 分库 dbName。 */\n const [projectMode, setProjectMode] = usePersistedString('library.project', 'follow')\n /** GUI 当前工作区(与侧边栏同一判定)与 host 的项目宫殿清单。 */\n const currentWorkspace = useCurrentWorkspace(workspaces, sessions)\n const [workspaceList, setWorkspaceList] = useState<EngramWorkspacesView | null>(null)\n const workspaceId = currentWorkspace.workspace?.workspaceId ?? ''\n\n /** 拉取 host 项目宫殿清单(挂载 / 工作区切换 / 固定值变化 / 手动重访):失败静默,只影响标签与下拉。 */\n useEffect(() => {\n let cancelled = false\n api<EngramWorkspacesView>('workspaces')\n .then((data) => { if (!cancelled) setWorkspaceList(data) })\n .catch(() => { /* 清单失败保持上一次:选择器本身仍可工作(跟随退化为进程默认) */ })\n return () => { cancelled = true }\n }, [workspaceId, projectMode, reloadTick])\n\n /** 跟随目标:GUI 当前工作区在 host 清单里对应的项目库(匹配不到 = 进程默认库)。 */\n const followedProject = matchFollowTarget(workspaceList, currentWorkspace.workspace)\n /** 实际选择器:follow + 已知工作区 → 该工作区分库;follow + 未知 → null(不注入)。 */\n const projectSelector = projectMode === 'follow' ? followedProject?.dbName ?? null : projectMode\n // 渲染期挂到 api() 的注入点:父先渲染,保证子组件 effect 的首批请求已带上选择器。\n activeProjectSelector = projectSelector\n /** Header chip 的四态文案(固定 / 跟随 / 未注册 / 无工作区信息)。 */\n const chip = projectChip(t, {\n mode: projectMode,\n available: currentWorkspace.available,\n items: workspaceList?.items ?? [],\n followed: followedProject,\n processDefaultPath: workspaceList?.processDefault?.path ?? null,\n })\n /** 固定的 dbName 不在 host 清单里(工作区被删除 / 只从会话 cwd 见过):下拉补一项避免选中态丢失。 */\n const pinnedMissing = projectMode !== 'follow'\n && !(workspaceList?.items ?? []).some(item => item.dbName === projectMode)\n\n /** 今日速览、健康分构成与房间目录共用一份总览数据(同一路由不重复请求)。 */\n const overview = usePalaceOverview(scope, projectSelector)\n\n const reload = useCallback((): void => { setReloadTick(tick => tick + 1) }, [])\n\n /** 失效选择器的自愈:同一轮只触发一次,回到 follow 后复位(见 api() 的 404 分支)。 */\n const healingRef = useRef(false)\n useEffect(() => {\n healDeadProject = (): void => {\n // 只在「固定到某个已失效分库」时自愈;跟随态 404 说明 host 清单与分库不一致,回退只会抖动。\n if (healingRef.current || projectMode === 'follow') return\n healingRef.current = true\n setProjectMode('follow')\n setOffset(0)\n setExpanded(null)\n setSelected(new Set())\n reload()\n }\n return () => { healDeadProject = null }\n }, [projectMode, reload])\n useEffect(() => {\n if (projectMode === 'follow') healingRef.current = false\n }, [projectMode])\n\n /** 刷新今日到期计数与 id 集合(本地回环毫秒级;失败静默归零,不打断面板)。 */\n const refreshDue = useCallback((): void => {\n api<{ items: readonly { id: string }[] }>(`review-due?scope=${scope}&limit=50`)\n .then(data => {\n setDueCount(data.items.length)\n setDueIds(new Set(data.items.map(item => item.id)))\n })\n .catch(() => { setDueCount(0); setDueIds(new Set()) })\n }, [scope, projectSelector])\n useEffect(() => { refreshDue() }, [refreshDue])\n\n /** 角标点击:切到宫殿陈展并启用「今日到期」筛选(复习调度的消费者是 agent,面板只做观测)。 */\n const goToDue = (): void => {\n setActiveTab('library')\n setDueOnly(true)\n }\n\n /** 打开详情抽屉:陈展列表已有该行时复用真实行,只有 id 的列表用最小占位行(抽屉自行拉 review)。 */\n const openReview = useCallback((id: string): void => {\n const record = list?.records.find(row => row.id === id)\n setExpanded({\n kind: 'review',\n record: record ?? ({\n id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5,\n status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null,\n } as MemoryRow),\n })\n }, [list, scope])\n\n useEffect(() => {\n let cancelled = false\n const qs = new URLSearchParams({\n scope, status, kind, redacted, limit: String(PAGE_SIZE), offset: String(offset),\n })\n if (q !== '') qs.set('q', q)\n if (sort === 'tour') qs.set('sort', 'tour')\n api<ListResult>(`list?${qs.toString()}`)\n .then((data) => { if (!cancelled) { setList(data); setError(null) } })\n .catch((loadError: Error) => { if (!cancelled) setError(loadError.message) })\n return () => { cancelled = true }\n }, [scope, status, kind, redacted, q, sort, offset, reloadTick, projectSelector])\n\n /** 项目宫殿切换(工作区切换 / 手动固定):回到第 1 页并清掉跨库无意义的展开与选择态。 */\n const lastProject = useRef(projectSelector)\n useEffect(() => {\n if (lastProject.current === projectSelector) return\n lastProject.current = projectSelector\n setOffset(0)\n setExpanded(null)\n setSelected(new Set())\n }, [projectSelector])\n\n const act = (route: string, record: MemoryRow): void => {\n api(route, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope }),\n })\n .then(reload)\n .catch((actError: Error) => { toast.push('error', actError.message) })\n }\n\n const toggle = (expandKind: 'review' | 'edit', record: MemoryRow): void => {\n setExpanded(current => (current !== null && current.kind === expandKind && current.record.id === record.id)\n ? null\n : { kind: expandKind, record })\n }\n\n const allRecords = list?.records ?? []\n // 「今日到期」筛选是页内视图过滤(复习调度今天到期的 id 白名单);分页仍按库内全量计算。\n const pageRecords = dueOnly ? allRecords.filter(record => dueIds.has(record.id)) : allRecords\n const selectedRecords = pageRecords.filter(record => selected.has(record.id))\n const forgetable = selectedRecords.filter(record => record.status === 'active').length\n const restorable = selectedRecords.length - forgetable\n const allSelected = pageRecords.length > 0 && pageRecords.every(record => selected.has(record.id))\n\n const toggleSelect = (id: string): void => {\n setSelected(current => {\n const next = new Set(current)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n const clearSelection = (): void => { setSelected(new Set()); setConfirmForget(false) }\n\n const toggleAllPage = (): void => {\n setSelected(current => {\n const next = new Set(current)\n if (allSelected) pageRecords.forEach(record => next.delete(record.id))\n else pageRecords.forEach(record => next.add(record.id))\n return next\n })\n }\n\n /** 批量执行:逐条调单条 API(回环毫秒级),单条失败不阻塞其余;完成即刷新并清空选择。 */\n const runBatch = (mode: 'forget' | 'restore'): void => {\n const targets = mode === 'forget'\n ? selectedRecords.filter(record => record.status === 'active')\n : selectedRecords.filter(record => record.status !== 'active')\n if (targets.length === 0) return\n void Promise.allSettled(targets.map(target => api(mode, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: target.id, scope: target.scope }),\n }))).then(() => { clearSelection(); reload() })\n }\n\n const armBatchForget = (): void => {\n // 确认态保持到用户点击确认执行或清空选择,不做自动复位(3 秒窗口曾导致执行落空)。\n if (confirmForget) { runBatch('forget'); return }\n setConfirmForget(true)\n }\n\n const page = Math.floor(offset / PAGE_SIZE) + 1\n const pages = list === null ? 1 : Math.max(1, Math.ceil(list.total / PAGE_SIZE))\n /** Segmented Control 玻璃指示器位置:根据选中按钮 DOM 测量。 */\n const segRefs = useRef<Map<string, HTMLButtonElement | null>>(new Map())\n const [segIndicator, setSegIndicator] = useState<{ left: number; width: number; opacity: number }>({ left: 0, width: 0, opacity: 0 })\n const measureSeg = useCallback((): void => {\n const node = segRefs.current.get(scope)\n if (node === null || node === undefined) return\n setSegIndicator({ left: node.offsetLeft, width: node.offsetWidth, opacity: 1 })\n }, [scope])\n useEffect(() => {\n measureSeg()\n const onResize = (): void => measureSeg()\n window.addEventListener('resize', onResize)\n return () => { window.removeEventListener('resize', onResize) }\n }, [measureSeg])\n\n return (\n <div className={styles.panel}>\n {/* Header:宫殿 Logo + 标题 + 简介 + 右侧动作按钮组。 */}\n <div className={styles.header}>\n <div className={styles.headerBrand}>\n <span className={styles.headerLogo} aria-hidden=\"true\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 48 48\" fill=\"none\">\n <path d=\"M6 20 L24 7 L42 20 Z\" fill=\"currentColor\" fillOpacity=\"0.9\"/>\n <rect x=\"9\" y=\"20\" width=\"30\" height=\"18\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"/>\n <rect x=\"13\" y=\"24\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <line x1=\"16\" y1=\"24\" x2=\"16\" y2=\"30\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"13\" y1=\"27\" x2=\"19\" y2=\"27\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M21 38 L21 28 Q21 25 24 25 Q27 25 27 28 L27 38\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\"/>\n <rect x=\"29\" y=\"24\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <line x1=\"32\" y1=\"24\" x2=\"32\" y2=\"30\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"29\" y1=\"27\" x2=\"35\" y2=\"27\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n </span>\n <div className={styles.headerTitle}>\n <h2>{t('headerTitle')}</h2>\n <p>{t('headerSubtitle')}</p>\n </div>\n </div>\n <div className={styles.headerActions}>\n <div className={`${styles.segGroup} ${styles.segScope}`}>\n <span className={styles.segIndicator}\n style={{ left: `${String(segIndicator.left)}px`, width: `${String(segIndicator.width)}px`, opacity: segIndicator.opacity }} />\n {(['user', 'project', 'shared'] as const).map(option => (\n <button key={option} type=\"button\" ref={node => { segRefs.current.set(option, node) }}\n className={scope === option ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setScope(option); setOffset(0); setExpanded(null); clearSelection() }}>\n {t(SCOPE_KEY[option])}\n </button>\n ))}\n </div>\n {/* 今日待回忆角标:有待回忆时在 Header 一眼可见,点击直达今日视图的待回忆卡。 */}\n {dueCount > 0 && (\n <button type=\"button\" className={styles.dueBadge}\n title={t('dueBadgeLabel', { n: dueCount })} aria-label={t('dueBadgeLabel', { n: dueCount })}\n onClick={goToDue}>\n <span className={styles.dueDot} aria-hidden=\"true\" />\n {dueCount}\n </button>\n )}\n <button type=\"button\" className={styles.button} onClick={() => { reload(); refreshDue() }}>{t('refresh')}</button>\n <ExportMenu t={t} scope={scope} project={projectSelector} />\n </div>\n {/* 项目宫殿来源:独占一行(flex-basis: 100%),紧贴作用域三宫格下方、Tab 栏之上——\n 只在 project 作用域显示(私人/共享宫殿没有工作区概念)。chip 显示当前落在哪个工作区分库\n (跟随 / 固定 / 未注册 / 无工作区信息)、hover 给完整路径,旁边下拉可临时固定到别的项目库。 */}\n {scope === 'project' && (\n <div className={styles.wsBar}>\n <span\n className={`${styles.wsChip}${chip.tone === 'follow' ? ` ${styles.wsFollow}` : chip.tone === 'muted' ? ` ${styles.wsMuted}` : ''}`}\n title={chip.title}>\n {chip.label}\n </span>\n <select className={`${styles.input} ${styles.wsSelect}`} value={projectMode}\n aria-label={t('projectSwitch')} title={t('projectSwitch')}\n onChange={event => { setProjectMode(event.target.value); setOffset(0); setExpanded(null); clearSelection() }}>\n <option value=\"follow\">{t('projectFollow')}</option>\n {(workspaceList?.items ?? []).map(item => (\n <option key={item.dbName} value={item.dbName}>{projectOptionLabel(t, item)}</option>\n ))}\n {pinnedMissing && (\n <option value={projectMode}>{`${shortDbName(projectMode)} · ${t('projectUnregistered')}`}</option>\n )}\n </select>\n </div>\n )}\n </div>\n\n {/* 顶部 Tab Bar:八个视图(今日 / 宫殿 / 走廊 / 往事 / 实体 / 日志 / 回填 / Jev;按「先管家后陈展与配置」语义排序)。\n 原常驻管家日报条已收进「今日」视图的速览卡,其余计数移入「日志」。 */}\n <div className={styles.tabs} role=\"tablist\">\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'today' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'today'}\n onClick={() => { setActiveTab('today') }}>\n {t('tabToday')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'library' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'library'}\n onClick={() => { setActiveTab('library') }}>\n {t('tabLibrary')}\n <small>{t('tabLibraryCount', { n: list?.total ?? 0 })}</small>\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'corridor' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'corridor'}\n onClick={() => { setActiveTab('corridor') }}>\n {t('tabCorridor')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'episodes' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'episodes'}\n onClick={() => { setActiveTab('episodes') }}>\n {t('tabEpisodes')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'entities' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'entities'}\n onClick={() => { setActiveTab('entities') }}>\n {t('tabEntities')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'log' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'log'}\n onClick={() => { setActiveTab('log') }}>\n {t('tabLog')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'backfill' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'backfill'}\n onClick={() => { setActiveTab('backfill') }}>\n {t('tabBackfill')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'jev' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'jev'}\n onClick={() => { setActiveTab('jev') }}>\n {t('tabJev')}\n </button>\n </div>\n\n {activeTab === 'library' && (\n <div className={styles.tabPanel}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabLibrary')}</h4>\n </div>\n {/* 工具行:搜索占主宽,状态与排序靠右;房间筛选另起一行 chips,避免六项分段挤断换行。 */}\n <div className={styles.toolbarRow}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('searchPlaceholder')} value={q}\n onChange={event => { setQ(event.target.value.trim()); setOffset(0); setExpanded(null); clearSelection() }} />\n <div className={styles.segGroup}>\n {([\n ['all', t('allStatuses')],\n ['active', t('statusActive')],\n ['archived', t('statusArchived')],\n ['forgotten', t('statusForgotten')],\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={status === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setStatus(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n {/* 今日到期:复习调度今天到期的条目(消费者是 agent,这里只做观测筛选)。 */}\n <div className={styles.segGroup}>\n <button type=\"button\" aria-pressed={dueOnly}\n className={dueOnly ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setDueOnly(!dueOnly); setOffset(0); setExpanded(null); clearSelection() }}>\n {t('filterDueToday')}\n </button>\n </div>\n <div className={styles.segGroup}>\n {([['time', t('sortTime')], ['tour', t('sortTour')]] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={sort === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setSort(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n </div>\n <div className={styles.chipRow}>\n {([\n ['all', t('allKinds')],\n ...KINDS.map(option => [option, kindLabel(t, option)] as const),\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\" aria-pressed={kind === value}\n className={kind === value ? `${styles.chip} ${styles.chipOn}` : styles.chip}\n onClick={() => { setKind(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n\n {selected.size > 0 && (\n <div className={styles.batchBar}>\n <span>{t('selectedCount', { n: selected.size })}</span>\n <button type=\"button\" className={styles.button} onClick={toggleAllPage}>\n {allSelected ? t('deselectAll') : t('selectAll')}\n </button>\n <button type=\"button\" className={styles.button} disabled={restorable === 0}\n onClick={() => runBatch('restore')}>{t('batchRestore', { n: restorable })}</button>\n <button type=\"button\"\n className={confirmForget ? `${styles.button} ${styles.danger}` : styles.button}\n disabled={forgetable === 0}\n onClick={armBatchForget}>\n {confirmForget ? t('batchForgetConfirm', { n: forgetable }) : t('batchForget', { n: forgetable })}\n </button>\n <button type=\"button\" className={styles.button} onClick={clearSelection}>{t('clearSelection')}</button>\n </div>\n )}\n\n {error !== null && (\n <div className={styles.empty}>\n <b>{t('loadFailed', { msg: error })}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n {error === null && list === null && (\n <div className={styles.skeletonList}>\n {[0, 1, 2, 3].map(index => (\n <div key={index} className={styles.skeleton} style={{ animationDelay: `${String(index * 60)}ms` }}><i /><i /><i /></div>\n ))}\n </div>\n )}\n {error === null && list !== null && pageRecords.length === 0 && (\n <div className={styles.empty}>\n <b>{t('empty')}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n\n {pageRecords.length > 0 && (\n <div className={styles.itemList}>\n {pageRecords.map((record, index) => (\n <div key={record.id}\n className={selected.has(record.id) ? `${styles.item} ${styles.selected}` : styles.item}\n style={{ animationDelay: `${String(Math.min(index, 12) * 36)}ms` }}>\n <input type=\"checkbox\" className={styles.itemCheck} checked={selected.has(record.id)}\n aria-label={record.content.slice(0, 24)} onChange={() => toggleSelect(record.id)} />\n <div className={styles.itemBody}>\n <div className={styles.itemTags}>\n <span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span>\n <span className={roomPillClass(record.kind)}>{kindLabel(t, record.kind)}</span>\n {record.slot !== undefined && (\n <span className={styles.pill}>{record.slot.room}#{record.slot.index}</span>\n )}\n {record.content.includes('[REDACTED:') && (\n <span className={`${styles.pill} ${styles.redacted}`}>{t('tagRedacted')}</span>\n )}\n {record.outcome !== undefined && (\n <span className={`${styles.pill} ${record.outcome === 'success' ? styles.outcomeSuccess : styles.outcomeFailure}`}>\n {record.outcome === 'success' ? t('tagOutcomeSuccess') : t('tagOutcomeFailure')}\n </span>\n )}\n <span className={styles.itemStamp} title={fmtTime(record.createdAt)}>\n {t(SCOPE_KEY[record.scope])} · {relTime(t, record.createdAt)}\n </span>\n </div>\n <div className={styles.content}>{record.content}</div>\n <div className={styles.itemMeta}>\n <span><b>{t('importance')}</b> {record.importance.toFixed(2)}</span>\n <span><b>{t('confidence')}</b> {record.confidence.toFixed(2)}</span>\n <span>{t('accessCount', { n: record.accessCount })}</span>\n <span>{sourceLabel(t, record)}</span>\n </div>\n </div>\n <div className={styles.itemOps}>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('review', record) }}>{t('detail')}</button>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('edit', record) }}>{t('edit')}</button>\n {record.status === 'active'\n ? <button type=\"button\" className={styles.button}\n onClick={() => { act('forget', record) }}>{t('forget')}</button>\n : <button type=\"button\" className={styles.button}\n onClick={() => { act('restore', record) }}>{t('restore')}</button>}\n </div>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.pager}>\n <button type=\"button\" className={styles.button} disabled={offset === 0} aria-label={t('prevPage')}\n onClick={() => { setOffset(Math.max(0, offset - PAGE_SIZE)); setExpanded(null); clearSelection() }}>‹</button>\n <span>{t('pagerInfo', { page, pages, total: list?.total ?? 0 })}</span>\n <button type=\"button\" className={styles.button} disabled={list === null || offset + PAGE_SIZE >= list.total}\n aria-label={t('nextPage')}\n onClick={() => { setOffset(offset + PAGE_SIZE); setExpanded(null); clearSelection() }}>›</button>\n </div>\n </div>\n )}\n\n {activeTab === 'today' && (\n <div className={styles.tabPanel}>\n {/* 今日速览:主指标 + 健康环,替代原常驻日报条。 */}\n <TodayHero t={t} overview={overview} dueCount={dueCount} />\n <div className={styles.layout}>\n {/* 左:入殿导航(进宫的入口);右:房间目录 + 翻新清单(要看的与要做的)。\n 今日到期不再单独成卡:消费者是 agent(review 工具链),面板只在速览条显示计数、在陈展提供筛选。 */}\n <div className={styles.mainCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tourProposalTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <TourProposalCard t={t} scope={scope} project={projectSelector} onSelect={openReview} />\n </div>\n </section>\n </div>\n <aside className={styles.sideCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('profileTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <ProfileCard t={t} scope={scope} project={projectSelector} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('roomsTitle')}</h4>\n <span className={styles.sectionHint}>{t('roomsHint')}</span>\n </div>\n <div className={styles.panelCard}>\n <RoomDirectory t={t} byKind={overview.byKind} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('refurbTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <RefurbCard t={t} scope={scope} project={projectSelector} onSelect={openReview} onAfterAction={reload} toast={toast} />\n </div>\n </section>\n </aside>\n </div>\n </div>\n )}\n\n {activeTab === 'corridor' && (\n <div className={styles.tabPanel}>\n {/* 纵向堆叠:先看走廊结构(鸟瞰),再进检索实验台;两块都吃满宽度,图与命中行不被压窄。 */}\n <div className={styles.mainCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('sectionCorridor')}</h4>\n </div>\n <div className={styles.panelCard}>\n <CorridorPanel t={t} scope={scope} project={projectSelector} onSelect={openReview} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('benchTitle')}</h4>\n <span className={styles.sectionHint}>{t('benchNote')}</span>\n </div>\n <div className={styles.panelCard}>\n <RecallBench t={t} scope={scope} />\n </div>\n </section>\n </div>\n </div>\n )}\n\n {activeTab === 'episodes' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabEpisodes')}</h4>\n <span className={styles.sectionHint}>{t('episodeHint')}</span>\n </div>\n <EpisodeTimelineView t={t} scope={scope} project={projectSelector} reloadTick={reloadTick} />\n </section>\n </div>\n )}\n\n {activeTab === 'entities' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabEntities')}</h4>\n <span className={styles.sectionHint}>{t('entityHint')}</span>\n </div>\n <EntityView t={t} scope={scope} project={projectSelector} reloadTick={reloadTick} />\n </section>\n </div>\n )}\n\n {activeTab === 'log' && (\n <div className={styles.tabPanel}>\n <LogPanel t={t} telemetry={overview.telemetry} project={projectSelector} />\n </div>\n )}\n\n {activeTab === 'backfill' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('backfillRulesTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <HistoryBackfillCard t={t} toast={toast} />\n </div>\n </section>\n </div>\n )}\n\n {activeTab === 'jev' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabJev')}</h4>\n </div>\n <div className={styles.panelCard}>\n <JevConfigCard t={t} toast={toast} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.panelCard}>\n <JevObservationsCard t={t} toast={toast} />\n </div>\n </section>\n </div>\n )}\n\n {/* Drawer:行内展开升级为右滑入聚焦态,避免列表被展开压塌。 */}\n {expanded !== null && (\n <>\n <div className={styles.drawerScrim} onClick={() => { setExpanded(null) }} />\n <aside className={styles.drawer} role=\"dialog\" aria-label={t('drawerTitle')}>\n <header className={styles.drawerHead}>\n <div className={styles.drawerTitle}>\n <h3>{t('drawerTitle')}</h3>\n <span title={expanded.record.id}>\n {`#${expanded.record.id.slice(0, 8)}…`}\n </span>\n </div>\n <button type=\"button\" className={styles.drawerClose} aria-label={t('drawerClose')}\n onClick={() => { setExpanded(null) }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 2 L12 12 M12 2 L2 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\n </svg>\n </button>\n </header>\n <div className={styles.drawerBody}>\n {expanded.kind === 'review'\n ? <ReviewBody t={t} recordId={expanded.record.id} scope={expanded.record.scope} project={projectSelector} />\n : <EditForm t={t} record={expanded.record} onClose={() => { setExpanded(null) }}\n onSaved={() => { setExpanded(null); reload() }} toast={toast} />}\n </div>\n </aside>\n </>\n )}\n {/* Toast 叠层(右上角,position:fixed 脱离 panel 容器)。 */}\n {toast.viewport}\n </div>\n )\n}\n\n/**\n * 注册用的薄包装:把**可选取用**的宿主服务经闭包带进 props。\n * 放在 .tsx 里是因为 index.ts 不能写 JSX;服务缺席时照常渲染(chip 显示「无工作区信息」)。\n * 服务按**渲染期现取**(getter 而非实例):宿主工作区/会话服务可能在插件 apply 之后才挂载。\n * @param services - 取宿主服务的 getter(workspaces / sessions,均可缺席)。\n * @returns 与注册席位兼容的组件(只吃 locale 的 t,其余 props 原样忽略)。\n */\nexport function bindEngramSection(services: {\n readonly workspaces: () => WorkspacesLike | undefined\n readonly sessions: () => SessionsLike | undefined\n}): (props: PropsLocale<typeof NS>) => React.ReactElement {\n return function EngramSectionBound(props: PropsLocale<typeof NS>): React.ReactElement {\n return <EngramSection {...props} workspaces={services.workspaces()} sessions={services.sessions()} />\n }\n}\n","/**\n * dsh-engram client half: 注册设置页「记忆库」section。\n * 数据经回环 API(/api/engram/*)读取与操作,与 host 半的路由对齐。\n * 文案经宿主 locale 服务(zh/en 词典,语言切换由渲染器自动重渲染)。\n * @module @kenz1117/dsh-engram/client\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\n// Type-only: ctx.locale 服务声明(宿主 locale 插件的 Context merge)。\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: ctx.slots(renderer 的 SlotMap 渲染接线)。\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\n// Type-only: settings.section 槽位的 SlotMap merge(ui-settings 契约)。\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\n// Type-only: LocaleNamespaceMap 声明合并目标(t 席位的键类型检查)。\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport { bindEngramSection } from './EngramPanel.tsx'\nimport type { SessionsLike, WorkspacesLike } from './EngramPanel.tsx'\nimport { NS, en, zh, type EngramKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n [NS]: EngramKey\n }\n}\n\n/** 必需服务:slots 渲染接线 + locale 词典注册。 */\nexport const inject = ['slots', 'locale']\n\n/**\n * Client plugin body: 注册 zh/en 词典与设置页「记忆库」section(order 20,\n * 排在 general/models/plugins 之后)。\n *\n * 面板的「项目宫殿」跟随 GUI 当前工作区,需要宿主的工作区/会话清单服务;\n * 两者都**可选取用**(`ctx.get`,不写进必需 inject):缺席时面板其余功能照常,\n * 只有项目宫殿来源 chip 显示「无工作区信息(进程默认)」。\n * @param ctx - client root context.\n */\nexport function apply(ctx: Context): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-engram: dictionaries')\n const t = ctx.locale.bind(NS)\n // 可选服务:按运行时形状取用(不硬依赖 @deepseek-ai/dsh-api-* 客户端包);\n // 用 getter 现取而不是 apply 时取实例——这两个服务可能在本插件之后才挂载。\n const workspaces = (): WorkspacesLike | undefined => ctx.get('workspaces' as never) as WorkspacesLike | undefined\n const sessions = (): SessionsLike | undefined => ctx.get('sessions' as never) as SessionsLike | undefined\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'engram',\n order: 20,\n label: () => t('nav'),\n locale: NS,\n }, bindEngramSection({ workspaces, sessions })))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["useMemo","useRef","useState","styles","styles","useState","useRef","useCallback","useState","useCallback","styles","useCallback","useSyncExternalStore","useState","useRef"],"sources":["../src/client/locales.ts","../src/client/CorridorMap.tsx","../src/client/Toast.tsx","../src/client/UiStorage.ts","../src/client/EngramPanel.tsx","../src/client/index.ts"],"sourcesContent":["/**\n * 「记忆库」client 词典:zh/en 键并集必须完全一致(类型化注册的编译约束)。\n * 数据层英文枚举(status/kind/op 等)只在显示层映射,存储值保持英文不变。\n * @module @kenz1117/dsh-engram/client/locales\n */\n\n/** 词典命名空间(同时用作 LocaleNamespaceMap 的声明合并键)。 */\nexport const NS = 'engram'\n\n/** 「记忆库」全部界面文案键。 */\nexport type EngramKey =\n | 'nav'\n | 'scopeUser'\n | 'scopeProject'\n | 'scopeShared'\n | 'projectFollow'\n | 'projectFollowNamed'\n | 'projectFollowHint'\n | 'projectPinned'\n | 'projectUnregistered'\n | 'projectNoWorkspace'\n | 'projectSwitch'\n | 'projectMemories'\n | 'projectProcessDefault'\n | 'refresh'\n | 'exportMd'\n | 'exportJson'\n | 'export'\n | 'exportMirror'\n | 'exportMdHint'\n | 'exportJsonHint'\n | 'exportMirrorHint'\n | 'allStatuses'\n | 'allKinds'\n | 'redactedAll'\n | 'redactedOnly'\n | 'redactedNone'\n | 'tagRedacted'\n | 'tagOutcomeSuccess'\n | 'tagOutcomeFailure'\n | 'searchPlaceholder'\n | 'statusActive'\n | 'statusArchived'\n | 'statusForgotten'\n | 'kindFact'\n | 'kindPreference'\n | 'kindDecision'\n | 'kindEpisode'\n | 'kindSkill'\n | 'labelContent'\n | 'labelKind'\n | 'labelStatus'\n | 'labelScope'\n | 'importance'\n | 'confidence'\n | 'accessCount'\n | 'labelCreated'\n | 'timeJustNow'\n | 'timeMinutesAgo'\n | 'timeHoursAgo'\n | 'timeDaysAgo'\n | 'sourceExplicit'\n | 'sourceSession'\n | 'round'\n | 'cardRedacted'\n | 'detail'\n | 'edit'\n | 'forget'\n | 'restore'\n | 'empty'\n | 'loadFailed'\n | 'loading'\n | 'pagerInfo'\n | 'prevPage'\n | 'nextPage'\n | 'cancel'\n | 'saveWithHint'\n | 'detailAttributes'\n | 'detailSource'\n | 'detailRelations'\n | 'detailOperations'\n | 'headerTitle'\n | 'headerSubtitle'\n | 'tabToday'\n | 'tabLibrary'\n | 'tabCorridor'\n | 'tabLog'\n | 'tabLibraryCount'\n | 'roomsTitle'\n | 'roomsHint'\n | 'healthEvaluatedAt'\n | 'logFilterAll'\n | 'logFilterWrite'\n | 'logFilterIngest'\n | 'logFilterRetrieve'\n | 'logFilterOrganize'\n | 'logCount'\n | 'benchTitle'\n | 'drawerClose'\n | 'drawerTitle'\n | 'kpiTotal'\n | 'kpiActive'\n | 'kpiForgotten'\n | 'kpiSignal'\n | 'emptyHint'\n | 'relSupersededBy'\n | 'relSupersedes'\n | 'relContradicts'\n | 'relRelated'\n | 'opWrite'\n | 'opWriteMerge'\n | 'opUpdate'\n | 'opForget'\n | 'opRestore'\n | 'opDecay'\n | 'opSuperseded'\n | 'opIngestRequest'\n | 'opIngestDone'\n | 'opOutcomeReport'\n | 'opAssess'\n | 'opConsolidation'\n | 'opReviewAnswer'\n | 'opSlotAssign'\n | 'opSlotBackfill'\n | 'opRoomOpen'\n | 'consolidateArchived'\n | 'consolidateMerged'\n | 'consolidateSkipped'\n | 'decayArchived'\n | 'slotBackfilled'\n | 'roomOpened'\n | 'reviewAnswered'\n | 'assessAdequate'\n | 'assessInadequate'\n | 'assessRefs'\n | 'opSearchRewrite'\n | 'opCompressRequest'\n | 'opDistillRequest'\n | 'selectAll'\n | 'deselectAll'\n | 'selectedCount'\n | 'batchForget'\n | 'batchForgetConfirm'\n | 'batchRestore'\n | 'clearSelection'\n | 'sectionCorridor'\n | 'corridorEmpty'\n | 'corridorFailed'\n | 'corridorLoad'\n | 'corridorAria'\n | 'corridorSummary'\n | 'edgeSupersedes'\n | 'edgeContradicts'\n | 'edgeOther'\n | 'healthLoading'\n | 'teleFailed'\n | 'teleLoading'\n | 'teleGroupRecent'\n | 'telePrivacyHint'\n | 'telePrivacyTip'\n | 'teleWrites'\n | 'teleIngest'\n | 'teleConsolidate'\n | 'benchPlaceholder'\n | 'benchRun'\n | 'benchScopeAll'\n | 'benchHits'\n | 'benchDegraded'\n | 'benchEmpty'\n | 'benchNote'\n | 'viaFts'\n | 'viaVec'\n | 'viaBoth'\n | 'viaEdgeLabel'\n | 'benchRewrite'\n | 'benchCompress'\n | 'activityEmpty'\n | 'detailRevisions'\n | 'tourProposalTitle'\n | 'tourProposalEmpty'\n | 'tourProposalHint'\n | 'tourFocusAll'\n | 'refurbTitle'\n | 'refurbEmpty'\n | 'refurbRun'\n | 'refurbActionDemote'\n | 'refurbActionMerge'\n | 'refurbActionReview'\n | 'refurbActionSplit'\n | 'refurbCount'\n | 'refurbExecute'\n | 'refurbConfirmDemote'\n | 'refurbConfirmMerge'\n | 'refurbDemoteDone'\n | 'refurbMergeDone'\n | 'refurbActionFailed'\n | 'refurbMergeEmpty'\n | 'heroDue'\n | 'filterDueToday'\n | 'sortTime'\n | 'sortTour'\n | 'dueBadgeLabel'\n | 'tabBackfill'\n | 'backfillIntro'\n | 'backfillRulesTitle'\n | 'backfillDays'\n | 'backfillDaysAll'\n | 'backfillDaysUnit'\n | 'backfillMaxTurns'\n | 'backfillMaxTotal'\n | 'backfillModel'\n | 'backfillModelAuto'\n | 'backfillIncludeSubagents'\n | 'backfillIncludeSeeded'\n | 'backfillIncludeNoCwd'\n | 'backfillReestimate'\n | 'backfillEstimateTitle'\n | 'backfillCandidates'\n | 'backfillPendingTurns'\n | 'backfillAlready'\n | 'backfillSkippedDetail'\n | 'backfillTruncated'\n | 'backfillStart'\n | 'backfillPause'\n | 'backfillStateRunning'\n | 'backfillStateDone'\n | 'backfillStateCancelled'\n | 'backfillStateFailed'\n | 'backfillProgressSessions'\n | 'backfillProgressTurns'\n | 'backfillWritten'\n | 'backfillTurnsSkipped'\n | 'backfillTurnsFailed'\n | 'backfillFailures'\n | 'backfillEstimating'\n | 'backfillSkipReasons'\n | 'backfillRouteHint'\n | 'skipLowActivity'\n | 'skipChitchat'\n | 'skipForbidden'\n | 'skipNoContent'\n | 'skipAlready'\n | 'skipNoTurn'\n | 'skipNoRoute'\n | 'skipUnparsable'\n | 'opProfileEdit'\n | 'profileOpCreate'\n | 'profileOpEdit'\n | 'profileOpRollback'\n | 'profileTitle'\n | 'profileEmpty'\n | 'profileEmptyHint'\n | 'profileCurrent'\n | 'profileHistory'\n | 'profileSourceEdit'\n | 'profileSourceRollback'\n | 'profileDiffBase'\n | 'profileDiffTarget'\n | 'profileDiffNone'\n | 'profileLoadFailed'\n | 'tabEpisodes'\n | 'episodeSince'\n | 'episodeUntil'\n | 'episodeSessionId'\n | 'episodeApply'\n | 'episodeReset'\n | 'episodeHint'\n | 'episodeNoGroups'\n | 'episodeNoSession'\n | 'episodeSummaryMissing'\n | 'episodeEntries'\n | 'episodeNearby'\n | 'episodeAroundTitle'\n | 'episodeAroundEmpty'\n | 'episodeClose'\n | 'tabEntities'\n | 'entityHint'\n | 'entityKindAll'\n | 'entityKindPerson'\n | 'entityKindProject'\n | 'entityKindTool'\n | 'entityKindConcept'\n | 'entityKindOther'\n | 'entitySearchPlaceholder'\n | 'entityCount'\n | 'entityMemories'\n | 'entityOpen'\n | 'entityAliases'\n | 'entityNoMemories'\n | 'entityEmpty'\n | 'factSection'\n | 'factEmpty'\n | 'factValid'\n | 'factInvalid'\n | 'tabJev'\n | 'jevIntro'\n | 'jevEnabled'\n | 'jevStatusOn'\n | 'jevStatusOff'\n | 'jevApiKey'\n | 'jevApiKeyHint'\n | 'jevApiKeyUnset'\n | 'jevClearKey'\n | 'jevKeyCleared'\n | 'jevBaseUrl'\n | 'jevModel'\n | 'jevTimeoutMs'\n | 'jevThresholdsTitle'\n | 'jevThresholdLine'\n | 'jevSave'\n | 'jevSaved'\n | 'jevLoadFailed'\n | 'jevTest'\n | 'jevTestOk'\n | 'jevTestFail'\n | 'jevObsTitle'\n | 'jevObsEmpty'\n | 'jevObsLoadFailed'\n | 'jevObsSiteBand'\n | 'jevObsSiteContradiction'\n | 'jevObsVerdictMerge'\n | 'jevObsVerdictAccept'\n | 'jevObsVerdictDefer'\n | 'jevObsVerdictConfirm'\n | 'jevObsVerdictReject'\n | 'jevObsVerdictFallback'\n | 'jevObsNoAnswer'\n | 'jevObsErrorLine'\n\n/** kind 数据值 → 词典键(面板与走廊图共用一份,避免两处各自硬编码房间名)。 */\nexport const KIND_KEY: Readonly<Record<string, EngramKey>> = {\n fact: 'kindFact',\n preference: 'kindPreference',\n decision: 'kindDecision',\n episode: 'kindEpisode',\n skill: 'kindSkill',\n}\n\n/** 中文词典(宿主默认语言)。整页采用「记忆宫殿」语言:宫殿 / 房间(kind 分组)/ 记忆 / 铭牌 / 参观 / 管家 / 走廊。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定以保证编译约束。 */\nexport const zh: Record<EngramKey, string> = {\n nav: '记忆宫殿',\n scopeUser: '私人宫殿',\n scopeProject: '项目宫殿',\n scopeShared: '共享宫殿',\n projectFollow: '跟随当前工作区',\n projectFollowNamed: '项目 · 跟随 {name}',\n projectFollowHint: '项目宫殿跟随 GUI 当前选中的工作区(按会话归属判定)',\n projectPinned: '项目 · {name}',\n projectUnregistered: '未注册工作区',\n projectNoWorkspace: '无工作区信息(进程默认)',\n projectSwitch: '项目宫殿来源',\n projectMemories: '{n} 条记忆',\n projectProcessDefault: '进程默认目录',\n refresh: '重访',\n exportMd: '导出 MD',\n exportJson: '导出 JSON',\n export: '导出',\n exportMirror: '镜像目录',\n exportMdHint: '单文件,可直接分享',\n exportJsonHint: '结构化全文,便于程序处理',\n exportMirrorHint: '每条记忆一个 .md,可用 Obsidian 漫游',\n allStatuses: '全部状态',\n allKinds: '全部房间',\n redactedAll: '全部铭牌',\n redactedOnly: '含涂改',\n redactedNone: '无涂改',\n tagRedacted: '已涂改',\n tagOutcomeSuccess: '管家验证·有效',\n tagOutcomeFailure: '管家验证·失效',\n searchPlaceholder: '在宫殿里寻找…',\n statusActive: '对外开放',\n statusArchived: '展厅陈列',\n statusForgotten: '已闭馆',\n kindFact: '事实厅',\n kindPreference: '偏好阁',\n kindDecision: '决策堂',\n kindEpisode: '往事廊',\n kindSkill: '技法坊',\n labelContent: '铭牌',\n labelKind: '房间',\n labelStatus: '状态',\n labelScope: '宫殿归属',\n importance: '地标亮度',\n confidence: '考据可靠度',\n accessCount: '参观 {n} 人次',\n labelCreated: '开馆时间',\n timeJustNow: '方才',\n timeMinutesAgo: '{n} 分钟前',\n timeHoursAgo: '{n} 小时前',\n timeDaysAgo: '{n} 天前',\n sourceExplicit: '管理员添置',\n sourceSession: '发掘地 {id}',\n round: '第 {n} 趟',\n cardRedacted: '涂改 {n}',\n detail: '参观',\n edit: '修缮',\n forget: '封门',\n restore: '重开',\n empty: '宫殿暂无可陈展的记忆',\n emptyHint: '试试调整房间筛选,或新添一条',\n loadFailed: '访客受挫:{msg}',\n loading: '导览中…',\n pagerInfo: '第 {page} / {pages} 页 · 共 {total} 条',\n prevPage: '上一页',\n nextPage: '下一页',\n cancel: '作罢',\n saveWithHint: '修缮(旧铭牌归展厅)',\n detailAttributes: '铭牌',\n detailSource: '发掘地',\n detailRelations: '邻接走廊',\n detailOperations: '管家日志',\n relSupersededBy: '被替代',\n relSupersedes: '替代',\n relContradicts: '互斥',\n relRelated: '相邻',\n headerTitle: '记忆宫殿',\n headerSubtitle: '跨会话长期记忆宫殿',\n tabToday: '今日',\n tabLibrary: '陈展',\n tabCorridor: '走廊',\n tabLog: '日志',\n tabLibraryCount: '{n} 条',\n roomsTitle: '房间目录',\n roomsHint: '每间满 9 个桩位后开新间',\n healthEvaluatedAt: '诊脉于 {time}',\n logFilterAll: '全部',\n logFilterWrite: '落成类',\n logFilterIngest: '发掘',\n logFilterRetrieve: '检索',\n logFilterOrganize: '整理',\n logCount: '{n} 条 · 两库合并倒序',\n benchTitle: '检索实验台',\n drawerClose: '归殿',\n drawerTitle: '记忆铭牌',\n kpiTotal: '记忆',\n kpiActive: '开放',\n kpiForgotten: '闭馆',\n kpiSignal: '清晰度',\n opWrite: '落成',\n opWriteMerge: '落成·并入',\n opUpdate: '修缮',\n opForget: '封门',\n opRestore: '重开',\n opDecay: '闭门陈列',\n opSuperseded: '被替代',\n opIngestRequest: '发掘请求',\n opIngestDone: '发掘完成',\n opOutcomeReport: '管家验证',\n opAssess: '证据判定',\n opConsolidation: '闭馆整理',\n opReviewAnswer: '复习答题',\n opSlotAssign: '排桩',\n opSlotBackfill: '批量排桩',\n opRoomOpen: '开新房',\n consolidateArchived: '归档 {n}',\n consolidateMerged: '合并 {n}',\n consolidateSkipped: '跳过 {n}',\n decayArchived: '归档 {n}',\n slotBackfilled: '新排 {n} 个桩位',\n roomOpened: '开新房 {room}',\n reviewAnswered: '评分 {grade} · 下次 {days} 天后',\n assessAdequate: '证据充足',\n assessInadequate: '证据不足',\n assessRefs: '{n} 条证据',\n opSearchRewrite: '路线改写',\n opCompressRequest: '导览压缩',\n opDistillRequest: '合并房间',\n selectAll: '本页全选',\n deselectAll: '取消全选',\n selectedCount: '已选 {n} 条',\n batchForget: '批量封门({n})',\n batchForgetConfirm: '确认封门 {n} 条?',\n batchRestore: '批量重开({n})',\n clearSelection: '清空所选',\n sectionCorridor: '走廊鸟瞰',\n corridorEmpty: '走廊空空如也,落成几条记忆后这里会出现鸟瞰图。',\n corridorFailed: '走廊加载失败',\n corridorLoad: '加载走廊鸟瞰…',\n corridorAria: '走廊鸟瞰图',\n corridorSummary: '{nodes} 条记忆 · {edges} 条走廊',\n edgeSupersedes: '推陈出新',\n edgeContradicts: '互斥',\n edgeOther: '相邻 / 支持 / 提炼',\n healthLoading: '正在诊脉…',\n teleFailed: '遥测加载失败',\n teleLoading: '聚合管家记录中…',\n teleGroupRecent: '近 7 天',\n telePrivacyHint: '数据仅在本机聚合 · 不外传',\n telePrivacyTip: '所有 op_log 与遥测计数只在当前进程的 SQLite 里聚合,从未发送至任何外部服务;本机重启或卸载插件即清空。',\n teleWrites: '落成',\n teleIngest: '发掘',\n teleConsolidate: '整理',\n benchPlaceholder: '说出要找的房间关键词或语义…',\n benchRun: '出发',\n benchScopeAll: '全部宫殿',\n benchHits: '到访 {n} 间',\n benchDegraded: '语义灯熄,仅关键词引路',\n benchEmpty: '此路不通',\n benchNote: '试走与正式导览共用同一张地图,会计入参观人次',\n viaFts: '关键词',\n viaVec: '语义',\n viaBoth: '双路',\n viaEdgeLabel: '邻接走廊',\n benchRewrite: '路线改写为 {n} 段',\n benchCompress: '铭牌压缩 {n} 条',\n activityEmpty: '暂无管家活动',\n detailRevisions: '陈展沿革',\n tourProposalTitle: '入殿导航',\n tourProposalEmpty: '宫殿尚空,建议先放第一段记忆(调用 engram_save)',\n tourProposalHint: '点击记忆可展开抽屉查看铭牌',\n tourFocusAll: '全部',\n refurbTitle: '翻新清单',\n refurbEmpty: '所有房间状态健康,无翻新建议',\n refurbRun: '重新扫描',\n refurbActionDemote: '降级',\n refurbActionMerge: '合并',\n refurbActionReview: '复习',\n refurbActionSplit: '拆分',\n refurbCount: '{n} 条建议',\n refurbExecute: '执行',\n refurbConfirmDemote: '确认降级这条记忆?执行后状态转 archived,可在统计页恢复。',\n refurbConfirmMerge: '确认合并 {n} 条相似记忆?将触发 engram_distill 把它们归纳为 1 条高层规律。',\n refurbDemoteDone: '已降级',\n refurbMergeDone: '合并任务已派发',\n refurbActionFailed: '执行失败:{msg}',\n refurbMergeEmpty: '无可合并的候选条目',\n heroDue: '今日到期',\n filterDueToday: '今日到期',\n sortTime: '按时间',\n sortTour: '按巡游路线',\n dueBadgeLabel: '今日到期 {n} 条,点击在陈展中筛选',\n tabBackfill: '回填',\n backfillIntro: '把 dsh 的历史会话逐轮提炼进宫殿:每条会话写进它自己 cwd 对应的项目库;已摄取过的轮次按幂等键自动跳过,中断后再次开始即可续做。回填的条目不会进入今日复习队列。',\n backfillRulesTitle: '导入规则',\n backfillDays: '时间窗',\n backfillDaysAll: '不限',\n backfillDaysUnit: '{n} 天',\n backfillMaxTurns: '单会话最多轮数',\n backfillMaxTotal: '本次总轮数上限',\n backfillModel: '辅助模型',\n backfillModelAuto: '自动(用当前在用的模型)',\n backfillIncludeSubagents: '包含子代理会话',\n backfillIncludeSeeded: '包含种子会话',\n backfillIncludeNoCwd: '包含无 cwd 会话(只能进私人宫殿)',\n backfillReestimate: '重新估算',\n backfillEstimateTitle: '估算',\n backfillCandidates: '候选会话 {n}',\n backfillPendingTurns: '待处理 {n} 轮',\n backfillAlready: '已摄取跳过 {n} 轮',\n backfillSkippedDetail: '已排除:子代理 {subagent} · 种子 {seeded} · 无 cwd {noCwd} · 超时间窗 {tooOld} · 日志不可读 {unreadable}',\n backfillTruncated: '候选超出总轮数上限:本次只处理最近的一部分会话,可调大上限或分几次跑',\n backfillStart: '开始回填',\n backfillPause: '暂停',\n backfillStateRunning: '回填中…',\n backfillStateDone: '已完成',\n backfillStateCancelled: '已中止(可再次开始续做)',\n backfillStateFailed: '失败',\n backfillProgressSessions: '会话 {done}/{total}',\n backfillProgressTurns: '轮次 {done}/{total}',\n backfillWritten: '写入 {n} 条',\n backfillTurnsSkipped: '跳过 {n} 轮',\n backfillTurnsFailed: '失败 {n} 轮',\n backfillFailures: '失败明细',\n backfillEstimating: '正在估算…',\n backfillSkipReasons: '跳过原因',\n backfillRouteHint: '失败多半是因为历史会话当时用的模型在当前环境不可用:可在 cordis.yml 配置 provider/model,或先用目标模型跑一轮会话(回填会复用当前在用的模型)再重试——已完成的轮次会自动跳过。',\n skipLowActivity: '低活动轮',\n skipChitchat: '寒暄轮',\n skipForbidden: '显式禁记',\n skipNoContent: '无用户内容',\n skipAlready: '已摄取',\n skipNoTurn: '无此轮',\n skipNoRoute: '日志无路由',\n skipUnparsable: '提炼输出不可解析',\n opProfileEdit: '画像修订',\n profileOpCreate: '创建 v{to} · {chars} 字',\n profileOpEdit: '编辑 v{from}→v{to} · {chars} 字',\n profileOpRollback: '回滚 v{from}→v{to}(还原 v{restored})· {chars} 字',\n profileTitle: '画像 curated block',\n profileEmpty: '尚无 curated 画像',\n profileEmptyHint: '在会话里让 agent 调 engram_profile_edit 创建;创建后会话开始时优先于自动派生画像注入。',\n profileCurrent: '当前内容 · v{n}',\n profileHistory: '版本历史(新→旧)',\n profileSourceEdit: '编辑',\n profileSourceRollback: '回滚',\n profileDiffBase: '基准版本',\n profileDiffTarget: '对比版本',\n profileDiffNone: '两个版本内容相同',\n profileLoadFailed: '画像加载失败',\n tabEpisodes: '往事',\n episodeSince: '开始日期',\n episodeUntil: '结束日期',\n episodeSessionId: '会话 id(可选)',\n episodeApply: '应用',\n episodeReset: '重置',\n episodeHint: '按会话分组浏览经历;组头是摄取时生成的一句话摘要,点条目的「邻近」看当时前后还发生了什么',\n episodeNoGroups: '该范围内没有情景记忆',\n episodeNoSession: '无会话来源',\n episodeSummaryMissing: '(该会话尚未生成摘要:跑一次历史回填即可补上)',\n episodeEntries: '{n} 条情景',\n episodeNearby: '邻近',\n episodeAroundTitle: '时间邻近扩展',\n episodeAroundEmpty: '邻近窗口内没有其他情景',\n episodeClose: '收起',\n tabEntities: '实体',\n entityHint: '从记忆中抽取的人物、项目、工具与概念;点「查看」看一条实体牵出的所有记忆',\n entityKindAll: '全部类别',\n entityKindPerson: '人物',\n entityKindProject: '项目',\n entityKindTool: '工具',\n entityKindConcept: '概念',\n entityKindOther: '其他',\n entitySearchPlaceholder: '搜索实体名或别名',\n entityCount: '{n} 个实体',\n entityMemories: '{n} 条关联记忆',\n entityOpen: '查看',\n entityAliases: '别名',\n entityNoMemories: '暂无关联记忆',\n entityEmpty: '该宫殿还没有实体;保存带实体提及的记忆后会自动出现',\n factSection: '事实链({n} 条)',\n factEmpty: '暂无事实;摄取时从记忆抽取的实体事实会出现在这里',\n factValid: '生效',\n factInvalid: '已失效',\n tabJev: '裁决',\n jevIntro: 'Jev 系统一裁决:写入落库前对模糊记忆做三路判定(合并 / 接受 / 搁置)并确认矛盾边。密钥保存在本机数据目录(0600 文件),保存后立即生效,无需重启;Jev 不可用时自动回落纯规则四态。',\n jevEnabled: '启用 Jev 裁决',\n jevStatusOn: 'Jev 裁决已生效',\n jevStatusOff: 'Jev 裁决未生效(纯规则四态)',\n jevApiKey: 'API 密钥',\n jevApiKeyHint: '留空表示保留现有密钥;要清除已存密钥(回落 cordis.yml 配置)点「清除已存密钥」。',\n jevApiKeyUnset: '未配置',\n jevClearKey: '清除已存密钥',\n jevKeyCleared: '已清除面板密钥,回落部署配置',\n jevBaseUrl: '端点',\n jevModel: '判决模型',\n jevTimeoutMs: '超时(毫秒,1000-60000)',\n jevThresholdsTitle: '裁决阈值(cordis.yml 高级配置,此处只读)',\n jevThresholdLine: '判同一条 ≥{merge} · 判不同条 ≤{accept} · 矛盾确认 ≥{contradict}',\n jevSave: '保存',\n jevSaved: '已保存,配置即时生效',\n jevLoadFailed: '加载失败',\n jevTest: '测试连接',\n jevTestOk: '连接正常:{ms} 毫秒,ping 概率 {p}',\n jevTestFail: '连接失败:{error}',\n jevObsTitle: '近期裁决(本进程,最多 50 条,重启清空)',\n jevObsEmpty: '暂无记录;启用 Jev 后发生写入裁决时出现',\n jevObsLoadFailed: '裁决记录加载失败',\n jevObsSiteBand: '模糊带',\n jevObsSiteContradiction: '矛盾确认',\n jevObsVerdictMerge: '并入',\n jevObsVerdictAccept: '放行',\n jevObsVerdictDefer: '搁置',\n jevObsVerdictConfirm: '确认矛盾',\n jevObsVerdictReject: '非矛盾',\n jevObsVerdictFallback: '回落',\n jevObsNoAnswer: '无答案',\n jevObsErrorLine: '错误:{error}',\n}\n\n/** 英文词典。整页采用「Memory Palace」语言:palace / room (kind group) / memory / placard / tour / curator / corridor。\n 数据层英文枚举(status/kind/op)不在此映射,文案键保持稳定。 */\nexport const en: Record<EngramKey, string> = {\n nav: 'Memory Palace',\n scopeUser: 'Private Palace',\n scopeProject: 'Project Palace',\n scopeShared: 'Shared Palace',\n projectFollow: 'Follow the active workspace',\n projectFollowNamed: 'Project · following {name}',\n projectFollowHint: 'The project palace follows the workspace selected in the GUI (by session ownership)',\n projectPinned: 'Project · {name}',\n projectUnregistered: 'unregistered workspace',\n projectNoWorkspace: 'No workspace info (process default)',\n projectSwitch: 'Project palace source',\n projectMemories: '{n} memories',\n projectProcessDefault: 'Process default directory',\n refresh: 'Revisit',\n exportMd: 'Export MD',\n exportJson: 'Export JSON',\n export: 'Export',\n exportMirror: 'Mirror tree',\n exportMdHint: 'Single file, easy to share',\n exportJsonHint: 'Structured full dump for scripts',\n exportMirrorHint: 'One .md per memory, roamable in Obsidian',\n allStatuses: 'All statuses',\n allKinds: 'All rooms',\n redactedAll: 'All placards',\n redactedOnly: 'Redacted',\n redactedNone: 'Unredacted',\n tagRedacted: 'redacted',\n tagOutcomeSuccess: 'curator: worked',\n tagOutcomeFailure: 'curator: failed',\n searchPlaceholder: 'Wander the palace…',\n statusActive: 'open to public',\n statusArchived: 'on display',\n statusForgotten: 'closed',\n kindFact: 'Fact Hall',\n kindPreference: 'Preference Pavilion',\n kindDecision: 'Decision Chamber',\n kindEpisode: 'Episode Gallery',\n kindSkill: 'Skill Workshop',\n labelContent: 'Placard',\n labelKind: 'Room',\n labelStatus: 'Status',\n labelScope: 'Palace',\n importance: 'Beacon',\n confidence: 'Provenance',\n accessCount: '{n} visits',\n labelCreated: 'Opened',\n timeJustNow: 'just now',\n timeMinutesAgo: '{n} min ago',\n timeHoursAgo: '{n} hr ago',\n timeDaysAgo: '{n} d ago',\n sourceExplicit: 'Curator placed',\n sourceSession: 'Excavated at {id}',\n round: 'pass {n}',\n cardRedacted: '{n} redacted',\n detail: 'Tour',\n edit: 'Renovate',\n forget: 'Close',\n restore: 'Reopen',\n empty: 'No memories to display',\n emptyHint: 'Adjust the rooms above, or place a new memory',\n loadFailed: 'Tour halted: {msg}',\n loading: 'Guiding…',\n pagerInfo: 'Page {page} / {pages} · {total} memories',\n prevPage: 'Previous page',\n nextPage: 'Next page',\n cancel: 'Cancel',\n saveWithHint: 'Renovate (archive old placard)',\n detailAttributes: 'Placard',\n detailSource: 'Excavation',\n detailRelations: 'Corridors',\n detailOperations: 'Curator log',\n relSupersededBy: 'Superseded by',\n relSupersedes: 'Supersedes',\n relContradicts: 'Contradicts',\n relRelated: 'Adjacent',\n headerTitle: 'Memory Palace',\n headerSubtitle: 'Cross-session long-term memory palace',\n tabToday: 'Today',\n tabLibrary: 'Palace',\n tabCorridor: 'Corridor',\n tabLog: 'Log',\n tabLibraryCount: '{n} memories',\n roomsTitle: 'Room directory',\n roomsHint: 'A new room opens once 9 slots fill',\n healthEvaluatedAt: 'Scored {time}',\n logFilterAll: 'All',\n logFilterWrite: 'Writes',\n logFilterIngest: 'Capture',\n logFilterRetrieve: 'Retrieval',\n logFilterOrganize: 'Organize',\n logCount: '{n} entries · both stores merged, newest first',\n benchTitle: 'Retrieval bench',\n drawerClose: 'Return',\n drawerTitle: 'Memory placard',\n kpiTotal: 'Memories',\n kpiActive: 'Open',\n kpiForgotten: 'Closed',\n kpiSignal: 'Clarity',\n opWrite: 'opened',\n opWriteMerge: 'merged in',\n opUpdate: 'renovated',\n opForget: 'closed',\n opRestore: 'reopened',\n opDecay: 'archived',\n opSuperseded: 'superseded',\n opIngestRequest: 'excavation requested',\n opIngestDone: 'excavated',\n opOutcomeReport: 'curator report',\n opAssess: 'evidence check',\n opConsolidation: 'consolidation',\n opReviewAnswer: 'review answer',\n opSlotAssign: 'slot assigned',\n opSlotBackfill: 'slots backfilled',\n opRoomOpen: 'room opened',\n consolidateArchived: 'archived {n}',\n consolidateMerged: 'merged {n}',\n consolidateSkipped: 'skipped {n}',\n decayArchived: 'archived {n}',\n slotBackfilled: '{n} slots assigned',\n roomOpened: 'opened room {room}',\n reviewAnswered: 'grade {grade} · next in {days}d',\n assessAdequate: 'evidence adequate',\n assessInadequate: 'evidence insufficient',\n assessRefs: '{n} refs',\n opSearchRewrite: 'route rewritten',\n opCompressRequest: 'placard compressed',\n opDistillRequest: 'rooms merged',\n selectAll: 'Select all on page',\n deselectAll: 'Deselect all',\n selectedCount: '{n} memories',\n batchForget: 'Close selected ({n})',\n batchForgetConfirm: 'Close {n} memories?',\n batchRestore: 'Reopen selected ({n})',\n clearSelection: 'Clear selection',\n sectionCorridor: 'Corridor overview',\n corridorEmpty: 'No memories yet — the bird’s-eye view appears after a few memories arrive.',\n corridorFailed: 'Failed to load corridor',\n corridorLoad: 'Loading corridor overview…',\n corridorAria: 'Corridor overview map',\n corridorSummary: '{nodes} memories · {edges} corridors',\n edgeSupersedes: 'supersedes',\n edgeContradicts: 'contradicts',\n edgeOther: 'related / supports / refines',\n healthLoading: 'Taking pulse…',\n teleFailed: 'Telemetry failed',\n teleLoading: 'Aggregating curator events…',\n teleGroupRecent: 'Last 7 days',\n telePrivacyHint: 'Local aggregation only · never transmitted',\n telePrivacyTip: 'All op_log and telemetry counters are aggregated in this process\\u2019s SQLite only; nothing is sent to any external service. Clearing the plugin or restarting the host wipes the data.',\n teleWrites: 'Opened',\n teleIngest: 'Excavated',\n teleConsolidate: 'Consolidated',\n benchPlaceholder: 'Name a room by keyword or meaning…',\n benchRun: 'Walk',\n benchScopeAll: 'All palaces',\n benchHits: '{n} rooms found',\n benchDegraded: 'Beacon dark · keyword lane only',\n benchEmpty: 'No route found',\n benchNote: 'Walk uses the same map as the guided tour and counts as a visit',\n viaFts: 'keyword',\n viaVec: 'semantic',\n viaBoth: 'dual',\n viaEdgeLabel: 'corridor',\n benchRewrite: 'route split into {n}',\n benchCompress: 'compressed {n} overflow placards',\n activityEmpty: 'No curator activity yet',\n detailRevisions: 'Exhibit history',\n tourProposalTitle: 'Tour proposal',\n tourProposalEmpty: 'The palace is empty — place a first memory via engram_save',\n tourProposalHint: 'Click a memory to open its placard',\n tourFocusAll: 'All',\n refurbTitle: 'Refurb suggestions',\n refurbEmpty: 'All rooms are healthy — no suggestions',\n refurbRun: 'Re-scan',\n refurbActionDemote: 'demote',\n refurbActionMerge: 'merge',\n refurbActionReview: 'review',\n refurbActionSplit: 'split',\n refurbCount: '{n} suggestions',\n refurbExecute: 'Apply',\n refurbConfirmDemote: 'Demote this memory? Status will become archived; you can reopen it later.',\n refurbConfirmMerge: 'Merge {n} similar memories? This triggers engram_distill to fold them into one higher-level pattern.',\n refurbDemoteDone: 'Demoted',\n refurbMergeDone: 'Merge dispatched',\n refurbActionFailed: 'Action failed: {msg}',\n refurbMergeEmpty: 'No merge candidates',\n heroDue: 'Due today',\n filterDueToday: 'Due today',\n sortTime: 'By time',\n sortTour: 'By tour route',\n dueBadgeLabel: '{n} due today — click to filter in the library',\n tabBackfill: 'Backfill',\n backfillIntro: 'Distils past dsh sessions into the palace, turn by turn: each session is written into the project store matching its own cwd. Turns already captured are skipped by idempotency key, so starting again resumes where it stopped. Backfilled memories never enter the due-today queue.',\n backfillRulesTitle: 'Import rules',\n backfillDays: 'Time window',\n backfillDaysAll: 'All',\n backfillDaysUnit: '{n} days',\n backfillMaxTurns: 'Max turns per session',\n backfillMaxTotal: 'Total turn budget',\n backfillModel: 'Auxiliary model',\n backfillModelAuto: 'Auto (model currently in use)',\n backfillIncludeSubagents: 'Include subagent sessions',\n backfillIncludeSeeded: 'Include seeded sessions',\n backfillIncludeNoCwd: 'Include sessions without cwd (private palace only)',\n backfillReestimate: 'Re-estimate',\n backfillEstimateTitle: 'Estimate',\n backfillCandidates: '{n} candidate sessions',\n backfillPendingTurns: '{n} turns pending',\n backfillAlready: '{n} turns already captured',\n backfillSkippedDetail: 'Excluded: subagent {subagent} · seeded {seeded} · no cwd {noCwd} · outside window {tooOld} · unreadable {unreadable}',\n backfillTruncated: 'Candidates exceed the total turn budget: only the most recent sessions run this time — raise the budget or run in batches',\n backfillStart: 'Start backfill',\n backfillPause: 'Pause',\n backfillStateRunning: 'Running…',\n backfillStateDone: 'Finished',\n backfillStateCancelled: 'Stopped (start again to resume)',\n backfillStateFailed: 'Failed',\n backfillProgressSessions: 'Sessions {done}/{total}',\n backfillProgressTurns: 'Turns {done}/{total}',\n backfillWritten: '{n} memories written',\n backfillTurnsSkipped: '{n} turns skipped',\n backfillTurnsFailed: '{n} turns failed',\n backfillFailures: 'Failures',\n backfillEstimating: 'Estimating…',\n backfillSkipReasons: 'Skipped',\n backfillRouteHint: 'Failures are usually because the model a past session used is not available here: set provider/model in cordis.yml, or run one turn with the target model first (backfill reuses the model currently in use) and retry — finished turns are skipped automatically.',\n skipLowActivity: 'low activity',\n skipChitchat: 'chitchat',\n skipForbidden: 'capture forbidden',\n skipNoContent: 'no user content',\n skipAlready: 'already captured',\n skipNoTurn: 'no such turn',\n skipNoRoute: 'no route in log',\n skipUnparsable: 'unparsable output',\n opProfileEdit: 'profile revised',\n profileOpCreate: 'created v{to} · {chars} chars',\n profileOpEdit: 'edited v{from}→v{to} · {chars} chars',\n profileOpRollback: 'rolled back v{from}→v{to} (restored v{restored}) · {chars} chars',\n profileTitle: 'Curated profile block',\n profileEmpty: 'No curated profile yet',\n profileEmptyHint: 'Ask the agent to call engram_profile_edit in a session; once created it is injected ahead of the derived profile at session start.',\n profileCurrent: 'Current content · v{n}',\n profileHistory: 'Version history (newest first)',\n profileSourceEdit: 'edited',\n profileSourceRollback: 'rollback',\n profileDiffBase: 'Base version',\n profileDiffTarget: 'Compare version',\n profileDiffNone: 'The two versions are identical',\n profileLoadFailed: 'Failed to load profile',\n tabEpisodes: 'Episodes',\n episodeSince: 'From date',\n episodeUntil: 'To date',\n episodeSessionId: 'Session id (optional)',\n episodeApply: 'Apply',\n episodeReset: 'Reset',\n episodeHint: 'Browse experiences grouped by session; group heads carry a one-line summary generated at ingest. Click \"Nearby\" on an entry to see what else happened around that moment',\n episodeNoGroups: 'No episodes in this range',\n episodeNoSession: 'No session origin',\n episodeSummaryMissing: '(No summary yet for this session: run a history backfill to add one)',\n episodeEntries: '{n} episodes',\n episodeNearby: 'Nearby',\n episodeAroundTitle: 'Time proximity expansion',\n episodeAroundEmpty: 'No other episodes within the proximity window',\n episodeClose: 'Collapse',\n tabEntities: 'Entities',\n entityHint: 'People, projects, tools and concepts extracted from memories; open one to see every memory that mentions it',\n entityKindAll: 'All kinds',\n entityKindPerson: 'People',\n entityKindProject: 'Projects',\n entityKindTool: 'Tools',\n entityKindConcept: 'Concepts',\n entityKindOther: 'Other',\n entitySearchPlaceholder: 'Search names or aliases',\n entityCount: '{n} entities',\n entityMemories: '{n} linked memories',\n entityOpen: 'View',\n entityAliases: 'Aliases',\n entityNoMemories: 'No linked memories',\n entityEmpty: 'No entities in this palace yet; they appear after you save memories that mention them',\n factSection: 'Facts ({n})',\n factEmpty: 'No facts yet; facts extracted from memories during ingestion will appear here',\n factValid: 'active',\n factInvalid: 'superseded',\n tabJev: 'Jev',\n jevIntro: 'Jev System-One adjudication: three-way ruling (merge / accept / defer) for ambiguous memories before they are written, plus contradiction confirmation. The key is stored in the local data directory (0600 file) and takes effect immediately after saving, no restart; when Jev is unavailable the plugin falls back to the pure four-rule disposition.',\n jevEnabled: 'Enable Jev adjudication',\n jevStatusOn: 'Jev adjudication active',\n jevStatusOff: 'Jev adjudication inactive (pure rule-based dispositions)',\n jevApiKey: 'API key',\n jevApiKeyHint: 'Leave empty to keep the stored key; click \"Clear stored key\" to remove it (falls back to cordis.yml).',\n jevApiKeyUnset: 'not configured',\n jevClearKey: 'Clear stored key',\n jevKeyCleared: 'Panel key cleared; falling back to deployment config',\n jevBaseUrl: 'Endpoint',\n jevModel: 'Adjudication model',\n jevTimeoutMs: 'Timeout (ms, 1000-60000)',\n jevThresholdsTitle: 'Adjudication thresholds (advanced cordis.yml config, read-only here)',\n jevThresholdLine: 'same memory ≥{merge} · new memory ≤{accept} · contradiction ≥{contradict}',\n jevSave: 'Save',\n jevSaved: 'Saved; config takes effect immediately',\n jevLoadFailed: 'Failed to load',\n jevTest: 'Test connection',\n jevTestOk: 'Connection OK: {ms} ms, ping probability {p}',\n jevTestFail: 'Connection failed: {error}',\n jevObsTitle: 'Recent adjudications (this process, up to 50, cleared on restart)',\n jevObsEmpty: 'No records yet; they appear when Jev adjudicates a write after being enabled',\n jevObsLoadFailed: 'Failed to load adjudication records',\n jevObsSiteBand: 'band',\n jevObsSiteContradiction: 'contradiction',\n jevObsVerdictMerge: 'merge',\n jevObsVerdictAccept: 'accept',\n jevObsVerdictDefer: 'defer',\n jevObsVerdictConfirm: 'confirm',\n jevObsVerdictReject: 'reject',\n jevObsVerdictFallback: 'fallback',\n jevObsNoAnswer: 'no answer',\n jevObsErrorLine: 'error: {error}',\n}\n","/**\n * 走廊鸟瞰图:中度版力导向 + 拖拽 + hover 邻居高亮 + 响应式 viewBox。\n *\n * 设计要点:\n * 1. 冷却调度 alpha 1.0 → 0.1(240 tick),保证收敛不抖。\n * 2. drag 节点:mousedown 抓住 → mousemove 改写 vx/vy 为 0(吸附鼠标)→ mouseup 释放。\n * 3. hover 节点:该节点 + 一跳邻居 + 关联边高亮,其他 0.15 透明。\n * 4. tooltip 显示完整铭牌(沿用 SVG <title> 标签 + 自定义 <foreignObject> HTML tooltip 增强可读性)。\n * 5. viewBox 自适应容器宽度(preserveAspectRatio=\"xMidYMid meet\"),固定 560x320 逻辑坐标。\n *\n * @module @kenz1117/dsh-engram/client/CorridorMap\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport styles from './panel.module.css'\nimport { KIND_KEY, type EngramKey } from './locales.ts'\n\n/** 走廊图使用的翻译函数(渲染器合成的窄签名)。 */\ntype CorridorT = (key: EngramKey, params?: Record<string, unknown>) => string\n\n/** kind → 本地化房间名(词典缺失时回退数据值)。 */\nfunction roomLabel(t: CorridorT, kind: string): string {\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key as EngramKey)\n}\n\ninterface CorridorNode {\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n /** 后端可选字段:完整铭牌(用于 tooltip)。 */\n readonly content?: string\n}\ninterface CorridorEdge {\n readonly id: string\n readonly from: string\n readonly to: string\n readonly type: string\n}\n\n/** 房间色板:5 个语义色相(按 kind 分组)。 */\nconst KIND_PALETTE: Readonly<Record<string, string>> = {\n fact: '#5b8def',\n preference: '#f0a85c',\n decision: '#9b6bd9',\n episode: '#3cb489',\n skill: '#e26b86',\n}\n\n/** 边视觉语义。dash 显式允许 undefined:exactOptionalPropertyTypes 下字面量表无需逐项删键。 */\ntype EdgeStyle = { color: string; dash?: string | undefined; width: number }\nconst EDGE_STYLE: Readonly<Record<string, EdgeStyle>> = {\n related: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n refines: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supports: { color: 'rgba(120, 130, 150, 0.6)', dash: undefined, width: 1 },\n supersedes:{ color: 'rgba(91, 141, 239, 0.85)', dash: undefined, width: 1.8 },\n contradicts:{ color: 'rgba(226, 107, 134, 0.9)', dash: '4 4', width: 1.4 },\n}\n\ninterface PositionedNode extends CorridorNode {\n x: number\n y: number\n vx: number\n vy: number\n r: number\n /** 是否被用户拖拽中(拖拽时禁用 tick 力更新)。 */\n fixed: boolean\n}\n\ninterface CorridorMapProps {\n readonly scope: 'user' | 'project' | 'shared'\n readonly nodes: readonly CorridorNode[]\n readonly edges: readonly CorridorEdge[]\n readonly onSelect?: (id: string) => void\n readonly selectedId?: string\n /** 界面文案(房间名与图例走宿主 locale 词典)。 */\n readonly t: CorridorT\n}\n\n/** 节点半径。 */\nfunction nodeRadius(n: CorridorNode): number {\n return Math.max(4, Math.min(14, 4 + 10 * n.importance * n.confidence))\n}\n\n/** 单步力更新(带冷却 alpha)。 */\nfunction step(nodes: PositionedNode[], edges: readonly CorridorEdge[], width: number, height: number, alpha: number): void {\n const REPLUSION = 4800\n const SPRING_LEN = 64\n const SPRING_K = 0.04\n const CENTER_K = 0.003\n const FLOOR_K = 0.005\n // 排斥力:平方反比(带 alpha 冷却)。\n for (let i = 0; i < nodes.length; i += 1) {\n const a = nodes[i]!\n for (let j = i + 1; j < nodes.length; j += 1) {\n const b = nodes[j]!\n const dx = a.x - b.x\n const dy = a.y - b.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (REPLUSION * alpha) / (dist * dist)\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n }\n // 弹簧力。\n const nodeMap = new Map<string, PositionedNode>(nodes.map(n => [n.id, n]))\n for (const edge of edges) {\n const a = nodeMap.get(edge.from)\n const b = nodeMap.get(edge.to)\n if (a === undefined || b === undefined) continue\n const dx = b.x - a.x\n const dy = b.y - a.y\n const dist = Math.sqrt(dx * dx + dy * dy) + 0.01\n const force = (dist - SPRING_LEN) * SPRING_K * alpha\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n a.vx += fx\n a.vy += fy\n b.vx -= fx\n b.vy -= fy\n }\n // 中心引力 + 房间水平分簇。\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n for (const n of nodes) {\n if (n.fixed) continue\n n.vx += (width / 2 - n.x) * CENTER_K * alpha\n n.vy += (height / 2 - n.y) * CENTER_K * alpha\n const idx = kinds.indexOf(n.kind)\n if (idx >= 0) {\n const target = band * (idx + 0.5)\n n.vx += (target - n.x) * FLOOR_K * alpha\n }\n }\n // 阻尼 + 边界。\n const DAMPING = 0.82\n for (const n of nodes) {\n if (n.fixed) { n.vx = 0; n.vy = 0; continue }\n n.vx *= DAMPING\n n.vy *= DAMPING\n n.x = Math.max(20, Math.min(width - 20, n.x + n.vx))\n n.y = Math.max(20, Math.min(height - 20, n.y + n.vy))\n }\n}\n\n/** 走廊鸟瞰组件。 */\nexport function CorridorMap(props: CorridorMapProps): ReactElement {\n const { scope, nodes, edges, onSelect, selectedId, t } = props\n const width = 560\n const height = 320\n /** 邻居表:node id → 邻居 id 集合(含一跳)。 */\n const neighborMap = useMemo(() => {\n const map = new Map<string, Set<string>>()\n for (const n of nodes) map.set(n.id, new Set())\n for (const e of edges) {\n if (!map.has(e.from)) map.set(e.from, new Set())\n if (!map.has(e.to)) map.set(e.to, new Set())\n map.get(e.from)!.add(e.to)\n map.get(e.to)!.add(e.from)\n }\n return map\n }, [nodes, edges])\n /** 起始布局:按房间水平均分带,垂直随机抖动。 */\n const initialNodes = useMemo<PositionedNode[]>(() => {\n const kinds = [...new Set(nodes.map(n => n.kind))]\n const band = width / Math.max(kinds.length, 1)\n return nodes.map((n, index) => ({\n ...n,\n x: kinds.indexOf(n.kind) >= 0 ? band * (kinds.indexOf(n.kind) + 0.5) : width / 2,\n y: 30 + ((index * 47) % (height - 60)),\n vx: 0, vy: 0,\n r: nodeRadius(n),\n fixed: false,\n }))\n }, [nodes, width, height])\n const positionsRef = useRef<PositionedNode[]>(initialNodes.map(n => ({ ...n })))\n const [, forceRender] = useState(0)\n const animRef = useRef<number | null>(null)\n const tickRef = useRef(0)\n const totalTicks = 280\n // 初始化 / 重置:拷贝新布局并清零 tick。\n useEffect(() => {\n positionsRef.current = initialNodes.map(n => ({ ...n }))\n tickRef.current = 0\n forceRender(value => value + 1)\n }, [initialNodes])\n // 力导向主循环:requestAnimationFrame,alpha 1.0 → 0.1。\n useEffect(() => {\n const tick = (): void => {\n const nodesArr = positionsRef.current\n tickRef.current += 1\n const alpha = Math.max(0.1, 1 - (tickRef.current / totalTicks) * 0.9)\n step(nodesArr, edges, width, height, alpha)\n // 触发 React 重渲染(不可变快照:拷贝一次引用)。\n positionsRef.current = nodesArr.map(n => ({ ...n }))\n forceRender(value => value + 1)\n if (tickRef.current < totalTicks) animRef.current = requestAnimationFrame(tick)\n }\n animRef.current = requestAnimationFrame(tick)\n return () => { if (animRef.current !== null) cancelAnimationFrame(animRef.current) }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- tick 仅在新 nodes/edges 时重启\n }, [initialNodes, edges])\n const positions = positionsRef.current\n const posMap = useMemo(() => new Map(positions.map(p => [p.id, p])), [positions])\n const roomKinds = useMemo(() => [...new Set(nodes.map(n => n.kind))], [nodes])\n /** hover 高亮:当前节点 id → 邻居 id 集合;null = 不高亮。 */\n const [hoverId, setHoverId] = useState<string | null>(null)\n const hoverNeighbors = useMemo(() => {\n if (hoverId === null) return null\n return neighborMap.get(hoverId) ?? new Set<string>()\n }, [hoverId, neighborMap])\n const isFaded = (nId: string): boolean => hoverId !== null && nId !== hoverId && !(hoverNeighbors?.has(nId) ?? false)\n const isEdgeHighlighted = (e: CorridorEdge): boolean => {\n if (hoverId === null) return false\n return e.from === hoverId || e.to === hoverId\n }\n /** drag:mousedown 抓住节点 → mousemove 改 vx/vy 为 0 → mouseup 释放。 */\n const svgRef = useRef<SVGSVGElement | null>(null)\n const dragIdRef = useRef<string | null>(null)\n const svgToScreen = (clientX: number, clientY: number): { x: number; y: number } | null => {\n const svg = svgRef.current\n if (svg === null) return null\n const rect = svg.getBoundingClientRect()\n // viewBox 0 0 width height,preserveAspectRatio meet → 等比缩放,逻辑坐标 = 屏幕坐标 * (width / rect.width)\n const scaleX = width / rect.width\n const scaleY = height / rect.height\n return { x: (clientX - rect.left) * scaleX, y: (clientY - rect.top) * scaleY }\n }\n const onNodeMouseDown = (event: React.MouseEvent<SVGGElement>, nodeId: string): void => {\n event.preventDefault()\n dragIdRef.current = nodeId\n const node = positionsRef.current.find(n => n.id === nodeId)\n if (node !== undefined) node.fixed = true\n }\n useEffect(() => {\n const handleMove = (event: MouseEvent): void => {\n const id = dragIdRef.current\n if (id === null) return\n const pos = svgToScreen(event.clientX, event.clientY)\n if (pos === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node === undefined) return\n node.x = Math.max(20, Math.min(width - 20, pos.x))\n node.y = Math.max(20, Math.min(height - 20, pos.y))\n node.vx = 0\n node.vy = 0\n forceRender(value => value + 1)\n }\n const handleUp = (): void => {\n const id = dragIdRef.current\n if (id === null) return\n const node = positionsRef.current.find(n => n.id === id)\n if (node !== undefined) node.fixed = false\n dragIdRef.current = null\n }\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleUp)\n return () => {\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleUp)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n if (nodes.length === 0) {\n return <div className={styles.empty}>{t('corridorEmpty')}</div>\n }\n\n return (\n <div className={styles.mapWrap}>\n <svg ref={svgRef} viewBox={`0 0 ${String(width)} ${String(height)}`} className={styles.map}\n preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label={t('corridorAria')} key={scope}>\n {/* 房间背景带(斑马纹区隔)。scope 切换通过父 svg key 重挂载触发 fade-in。 */}\n {roomKinds.map((kind, idx) => {\n const band = width / Math.max(roomKinds.length, 1)\n return <rect key={kind} x={band * idx} y={0} width={band} height={height} fill={idx % 2 === 0 ? 'rgba(127,127,127,0.04)' : 'transparent'} />\n })}\n {/* 房间标签条顶部。 */}\n {roomKinds.map((kind, idx) => {\n const band = width / Math.max(roomKinds.length, 1)\n return (\n <text key={`${kind}-label`} x={band * (idx + 0.5)} y={14} textAnchor=\"middle\"\n fill=\"rgba(127,127,127,0.7)\" fontSize=\"10\" fontFamily=\"ui-sans-serif, system-ui\">\n {roomLabel(t, kind)}\n </text>\n )\n })}\n {/* 走廊边:高亮时画弹簧弧线(quadratic 曲线 + 垂直凸起 6px),其他边保持直线。\n 用 stagger-delay 让边按 from 节点索引依次淡入,强化「地图刷新」感。 */}\n {edges.map((edge, idx) => {\n const a = posMap.get(edge.from)\n const b = posMap.get(edge.to)\n if (a === undefined || b === undefined) return null\n const style = EDGE_STYLE[edge.type] ?? EDGE_STYLE.related!\n const highlighted = isEdgeHighlighted(edge)\n const faded = hoverId !== null && !highlighted\n if (highlighted) {\n // 垂直中点偏移:构造弹簧视觉。\n const mx = (a.x + b.x) / 2\n const my = (a.y + b.y) / 2\n const dx = b.x - a.x\n const dy = b.y - a.y\n const length = Math.sqrt(dx * dx + dy * dy) || 1\n const offsetX = (-dy / length) * 6\n const offsetY = (dx / length) * 6\n return (\n <path key={edge.id} d={`M ${String(a.x)} ${String(a.y)} Q ${String(mx + offsetX)} ${String(my + offsetY)} ${String(b.x)} ${String(b.y)}`}\n fill=\"none\" stroke={style.color}\n strokeWidth={style.width + 1.2} strokeDasharray={style.dash}\n style={{ transition: 'stroke-width 200ms ease, d 240ms ease' }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </path>\n )\n }\n return (\n <line key={edge.id} x1={a.x} y1={a.y} x2={b.x} y2={b.y}\n stroke={style.color} strokeWidth={style.width}\n strokeDasharray={style.dash} opacity={faded ? 0.1 : 1}\n className={styles.edgeFade}\n style={{ transition: 'opacity 200ms ease, stroke-width 200ms ease', animationDelay: `${String(Math.min(idx, 24) * 24)}ms` }}>\n <title>{`${a.title} --${edge.type}--> ${b.title}`}</title>\n </line>\n )\n })}\n {/* 房间节点。 */}\n {positions.map((n, index) => {\n const color = KIND_PALETTE[n.kind] ?? '#7d8590'\n const isSelected = selectedId === n.id\n const isHovered = hoverId === n.id\n const faded = isFaded(n.id)\n return (\n <g key={n.id} className={styles.node} transform={`translate(${String(n.x)} ${String(n.y)})`}\n style={{ cursor: dragIdRef.current === n.id ? 'grabbing' : 'grab', opacity: faded ? 0.15 : 1, transition: 'opacity 200ms ease', animationDelay: `${String(Math.min(index, 24) * 24)}ms` }}\n onMouseEnter={() => { setHoverId(n.id) }}\n onMouseLeave={() => { setHoverId(prev => prev === n.id ? null : prev) }}\n onMouseDown={event => onNodeMouseDown(event, n.id)}\n onClick={() => onSelect?.(n.id)}>\n {/* hover 时画一圈柔光外晕。 */}\n {(isHovered || isSelected) && (\n <circle r={String(n.r + 6)} fill={color} fillOpacity={0.18} />\n )}\n <circle r={String(n.r)} fill={color} fillOpacity={n.status === 'active' ? 0.88 : 0.42}\n stroke={isSelected ? 'var(--dsw-alias-brand-primary)' : isHovered ? color : 'rgba(255,255,255,0.9)'}\n strokeWidth={isSelected ? 2 : isHovered ? 1.5 : 1}\n style={{ transition: 'stroke 160ms ease, stroke-width 160ms ease' }}>\n <title>{`${n.title}(${n.kind}/${n.status})`}</title>\n </circle>\n {isSelected && <circle r={String(n.r + 4)} fill=\"none\" stroke={color} strokeOpacity={0.4} strokeWidth={1} />}\n </g>\n )\n })}\n {/* hover tooltip:HTML 浮层,显示完整铭牌(用 SVG <text> 简易渲染)。 */}\n {hoverId !== null && (() => {\n const node = posMap.get(hoverId)\n if (node === undefined) return null\n const tx = Math.min(width - 180, Math.max(8, node.x + 14))\n const ty = Math.min(height - 60, Math.max(28, node.y - 16))\n const fullContent = (node.content ?? node.title).slice(0, 120)\n return (\n <g className={styles.tooltip} transform={`translate(${String(tx)} ${String(ty)})`}>\n <rect x={0} y={0} width={176} height={48} rx={6} ry={6}\n fill=\"var(--dsw-alias-bg-base)\" stroke=\"var(--dsw-alias-border-l2)\" strokeWidth={1} opacity={0.96} />\n <text x={8} y={16} fill=\"var(--dsw-alias-label-primary)\" fontSize=\"11\" fontWeight={600}\n fontFamily=\"ui-sans-serif, system-ui\">{roomLabel(t, node.kind)}</text>\n <text x={8} y={32} fill=\"var(--dsw-alias-label-secondary)\" fontSize=\"10\"\n fontFamily=\"ui-sans-serif, system-ui\">{`${fullContent}${(node.content ?? node.title).length > 120 ? '…' : ''}`}</text>\n </g>\n )\n })()}\n </svg>\n <div className={styles.legend}>\n {roomKinds.map(kind => (\n <span key={kind} className={styles.legendItem}>\n <span className={styles.legendDot} style={{ background: KIND_PALETTE[kind] ?? '#7d8590' }} />\n {roomLabel(t, kind)}\n </span>\n ))}\n <span className={styles.legendItem}>{t('corridorSummary', { nodes: nodes.length, edges: edges.length })}</span>\n </div>\n <div className={styles.legend} style={{ marginTop: 2 }}>\n {Object.entries(EDGE_STYLE).map(([type, style]) => (\n <span key={type} className={styles.legendItem}>\n <svg width={20} height={6} aria-hidden=\"true\">\n <line x1={0} y1={3} x2={20} y2={3} stroke={style.color} strokeWidth={style.width} strokeDasharray={style.dash} />\n </svg>\n <span>{type === 'supersedes' ? t('edgeSupersedes') : type === 'contradicts' ? t('edgeContradicts') : t('edgeOther')}</span>\n </span>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * 轻量 Toast:右上角叠层通知,3 秒自动消失,hover 暂停。\n * 4 种语义:info / success / error / warning(图标与配色由样式表决定,文案一律走调用方传入的字符串)。\n * confirm 不归本 hook 管——那是对话框决策,保留 window.confirm 以免破坏流程语义。\n * @module @kenz1117/dsh-engram/client/Toast\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport styles from './panel.module.css'\n\n/** Toast 语义类型。 */\nexport type ToastKind = 'info' | 'success' | 'error' | 'warning'\n\n/** 单条 Toast。 */\ninterface ToastItem {\n readonly id: number\n readonly kind: ToastKind\n readonly message: string\n readonly duration: number\n}\n\nconst DEFAULT_DURATION: Record<ToastKind, number> = {\n info: 3000,\n success: 3000,\n warning: 5000,\n error: 5000,\n}\n\n/** 顺序自增 id 源(避免 useEffect 依赖 Date.now)。 */\nlet toastIdCursor = 0\n\n/**\n * 把 toasts 数组渲染为右上角浮层。每帧返回新 ReactElement,调用方挂在面板根节点末尾。\n * hover 期间不消失(由 useToast 内部维护 timers 控制)。\n */\nfunction ToastViewport({ items, onDismiss }: {\n readonly items: readonly ToastItem[]\n readonly onDismiss: (id: number) => void\n}): React.ReactElement {\n return (\n <div className={styles.toastViewport} role=\"region\" aria-live=\"polite\" aria-label=\"notifications\">\n {items.map(toast => {\n const kindClass = toast.kind === 'success' ? styles.toastSuccess\n : toast.kind === 'error' ? styles.toastError\n : toast.kind === 'warning' ? styles.toastWarning\n : styles.toastInfo\n return (\n <div key={toast.id}\n className={`${styles.toast} ${kindClass}`}\n role={toast.kind === 'error' || toast.kind === 'warning' ? 'alert' : 'status'}>\n <span className={styles.toastBody}>{toast.message}</span>\n <button type=\"button\" className={styles.toastDismiss} aria-label=\"dismiss\"\n onClick={() => { onDismiss(toast.id) }}>×</button>\n </div>\n )\n })}\n </div>\n )\n}\n\n/** Toast hook 返回:toasts 列表 + push 函数 + 渲染节点。 */\nexport interface ToastController {\n readonly toasts: readonly ToastItem[]\n readonly push: (kind: ToastKind, message: string, duration?: number) => void\n readonly dismiss: (id: number) => void\n readonly viewport: React.ReactElement\n}\n\nexport function useToast(): ToastController {\n const [toasts, setToasts] = useState<readonly ToastItem[]>([])\n // 计时器表:id → setTimeout handle,方便 dismiss 取消。\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map())\n\n const dismiss = useCallback((id: number) => {\n setToasts(current => current.filter(toast => toast.id !== id))\n const timer = timersRef.current.get(id)\n if (timer !== undefined) {\n clearTimeout(timer)\n timersRef.current.delete(id)\n }\n }, [])\n\n const push = useCallback((kind: ToastKind, message: string, duration?: number) => {\n toastIdCursor += 1\n const id = toastIdCursor\n const ms = duration ?? DEFAULT_DURATION[kind]\n const item: ToastItem = { id, kind, message, duration: ms }\n setToasts(current => [...current, item])\n const timer = setTimeout(() => { dismiss(id) }, ms)\n timersRef.current.set(id, timer)\n }, [dismiss])\n\n useEffect(() => () => {\n for (const timer of timersRef.current.values()) clearTimeout(timer)\n timersRef.current.clear()\n }, [])\n\n const viewport = (\n <ToastViewport items={toasts} onDismiss={dismiss} />\n )\n\n return { toasts, push, dismiss, viewport }\n}","/**\n * UI 偏好持久化 hook:把任意 React state 同步到 localStorage,统一包名空间 dsh-engram.ui.*,\n * 隐私模式或存储失败时回退到默认值;非法值也降级默认。\n * 设计:包名空间 + key 后缀,避免与宿主/其它插件冲突。\n * @module @kenz1117/dsh-engram/client/UiStorage\n */\n\nimport { useCallback, useEffect, useState } from 'react'\n\n/** 命名空间:所有 key 都加此前缀。 */\nconst NAMESPACE = 'dsh-engram.ui'\n\n/** 防御性读:localStorage 抛错(隐私模式 / 禁用)返回 undefined。 */\nfunction safeGet(key: string): string | undefined {\n try { return window.localStorage.getItem(key) ?? undefined } catch { return undefined }\n}\n\n/** 防御性写:失败静默(UI 状态本身不依赖写回成功)。 */\nfunction safeSet(key: string, value: string): void {\n try { window.localStorage.setItem(key, value) } catch { /* 静默 */ }\n}\n\n/** 类型守卫:判断 raw 是否为合法值集合中的某一项。 */\nfunction isValid<T>(raw: string | undefined, allow: readonly T[]): raw is string & T {\n if (raw === undefined) return false\n return (allow as readonly unknown[]).includes(raw)\n}\n\n/**\n * 持久化 state:与 useState 同语义,初值惰性从 localStorage 读取,变更时同步写回。\n * @param suffix - localStorage key 后缀(不含包名空间)。\n * @param fallback - 默认值(首次进入或读取失败时使用)。\n * @param allow - 合法值白名单;同时用于入参校验与持久化校验。\n */\nexport function usePersistedState<T extends string>(\n suffix: string,\n fallback: T,\n allow: readonly T[],\n): [T, (next: T) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<T>(() => {\n const raw = safeGet(key)\n return isValid<T>(raw, allow) ? raw : fallback\n })\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: T) => { setValue(next) }, [])\n return [value, update]\n}\n\n/** 任意字符串持久化:无 allow 白名单,q 这种自由输入适用。 */\nexport function usePersistedString(\n suffix: string,\n fallback: string,\n): [string, (next: string) => void] {\n const key = `${NAMESPACE}.${suffix}`\n const [value, setValue] = useState<string>(() => safeGet(key) ?? fallback)\n useEffect(() => { safeSet(key, value) }, [key, value])\n const update = useCallback((next: string) => { setValue(next) }, [])\n return [value, update]\n}","/**\n * 记忆库设置面板:统计卡片、过滤列表、批量操作、编辑(取代链)、遗忘/恢复、导出。\n * 数据经回环 API(/api/engram/*)读写;详情与编辑为条目下方行内展开\n * (不嵌套弹窗);文案全部走宿主 locale 词典(zh/en),语言切换自动\n * 重渲染;数据层英文枚举(status/kind/op)只在显示层映射;内容节点\n * 一律 DOM/JSX 构建(防 XSS)。\n * @module @kenz1117/dsh-engram/client/EngramPanel\n */\n\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport styles from './panel.module.css'\nimport { KIND_KEY, NS, type EngramKey } from './locales.ts'\nimport { CorridorMap } from './CorridorMap.tsx'\nimport { useToast, type ToastController } from './Toast.tsx'\nimport { usePersistedState, usePersistedString } from './UiStorage.ts'\n\n/**\n * 线性图标库(Phosphor 风):统一 24px viewBox、stroke 1.75、round cap/join、\n * 全部 currentColor(跟随宿主主题)。name prop 查表,避免每个调用点重复写 SVG。\n * @param name - 图标键(见 ICONS)\n * @param className - 调用方附加的样式类(tabIcon / scopeIcon / brandIcon 等)\n */\nconst ICONS = {\n // Tab 主导航(8 个视图)\n today: <><circle cx=\"12\" cy=\"12\" r=\"3\" /><path d=\"M2 12h3M19 12h3M12 2v3M12 19v3\" /></>,\n library: <><rect x=\"4\" y=\"4\" width=\"9\" height=\"9\" rx=\"1\" /><rect x=\"11\" y=\"11\" width=\"9\" height=\"9\" rx=\"1\" /></>,\n corridor: <><circle cx=\"5\" cy=\"6\" r=\"1.8\" /><circle cx=\"19\" cy=\"6\" r=\"1.8\" /><circle cx=\"12\" cy=\"18\" r=\"1.8\" /><path d=\"M6.5 7.5L11 16.5M17.5 7.5L13 16.5M7 6h10\" /></>,\n episodes: <><circle cx=\"12\" cy=\"12\" r=\"8\" /><path d=\"M12 7v5l3 2\" /></>,\n entities: <><path d=\"M12 3 L21 12 L12 21 L3 12 Z\" /><circle cx=\"12\" cy=\"12\" r=\"2.5\" /></>,\n log: <><line x1=\"5\" y1=\"6\" x2=\"19\" y2=\"6\" /><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" /><line x1=\"5\" y1=\"18\" x2=\"13\" y2=\"18\" /></>,\n backfill: <><path d=\"M12 4v11\" /><path d=\"M7 10l5 5 5-5\" /><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" /></>,\n jev: <><path d=\"M12 3 L4 8 V16 L12 21 L20 16 V8 Z\" /><path d=\"M9 12l2 2 4-4\" /></>,\n // Scope 三宫格\n user: <><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M4 20c0-4 4-6 8-6s8 2 8 6\" /></>,\n project: <><path d=\"M3 7 L9 7 L11 5 L21 5 L21 17 L3 17 Z\" /><line x1=\"3\" y1=\"7\" x2=\"3\" y2=\"17\" /></>,\n shared: <><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M3 12h18\" /><path d=\"M12 3a14 14 0 010 18\" /><path d=\"M12 3a14 14 0 000 18\" /></>,\n // 功能图标\n folder: <><path d=\"M3 7 L9 7 L11 5 L21 5 L21 17 L3 17 Z\" /></>,\n refresh: <><path d=\"M3 12a9 9 0 0115-6.7L21 8\" /><path d=\"M21 3v5h-5\" /><path d=\"M21 12a9 9 0 01-15 6.7L3 16\" /><path d=\"M3 21v-5h5\" /></>,\n clock: <><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 7v5l3 2\" /></>,\n brand: <><path d=\"M12 2 L14.5 9 L22 9.5 L16 14.5 L18 22 L12 17.5 L6 22 L8 14.5 L2 9.5 L9.5 9 Z\" /></>,\n} as const\ntype IconName = keyof typeof ICONS\n\n/** SVG 图标组件:查表渲染,统一 stroke 风格。\n * className 显式允许 undefined(exactOptionalPropertyTypes 下与 React.SVGAttributes 对齐)。 */\nfunction Icon({ name, className }: { readonly name: IconName; readonly className?: string | undefined }): React.ReactElement {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n {ICONS[name]}\n </svg>\n )\n}\n\n/** 列表/详情用的记忆视图(宿主 /api/engram/list 的行结构)。 */\ninterface MemoryRow {\n readonly id: string\n readonly scope: 'user' | 'project' | 'shared'\n readonly kind: string\n readonly content: string\n readonly importance: number\n readonly confidence: number\n readonly status: 'active' | 'archived' | 'forgotten'\n /** 最近一次使用效果回报(engram_report 写入;未回报过缺省)。 */\n readonly outcome?: 'success' | 'failure'\n readonly createdAt: number\n readonly accessCount: number\n readonly sourceSessionId: string | null\n readonly sourceRound: number | null\n /** 桩位(v0.7.2 起;未排桩时缺省)。 */\n readonly slot?: { readonly room: string; readonly index: number }\n}\n\ninterface ListResult {\n readonly records: MemoryRow[]\n readonly total: number\n}\n\ninterface StatsPart {\n readonly scope: 'user' | 'project' | 'shared'\n readonly stats: {\n readonly total: number\n readonly active: number\n readonly archived: number\n readonly forgotten: number\n readonly redacted: number\n readonly signalRatio: number\n /** 各房间(kind)条目数;stats 路由的 byKind 字段(房间目录数据源)。 */\n readonly byKind?: Readonly<Record<string, number>>\n }\n}\n\n/** review API 的返回结构(详情行内展开区的数据源)。 */\ninterface ReviewView {\n readonly record: MemoryRow\n readonly supersededBy?: readonly string[]\n readonly supersedes?: readonly string[]\n readonly contradicts?: readonly string[]\n readonly related?: readonly string[]\n /** 修订历史(旧内容快照,按被取代时间倒序)。 */\n readonly revisions?: readonly { content: string; kind: string; importance: number; supersededAt: number }[]\n readonly operations?: readonly { at: number; op: string; detail: string | null }[]\n}\n\n/** 面板内部传递的翻译函数(渲染器按注册的 locale 声明合成的 t 的窄化签名)。 */\ntype T = (key: EngramKey, params?: Record<string, unknown>) => string\n\n/** kind 数据值(存储层英文枚举,编辑表单下拉的 value 保持英文)。 */\nconst KINDS = ['fact', 'preference', 'decision', 'episode', 'skill'] as const\nconst PAGE_SIZE = 20\n\n/** 数据层枚举 → 词典键映射(显示层本地化,存储值不变)。 */\nconst STATUS_KEY: Record<MemoryRow['status'], EngramKey> = {\n active: 'statusActive',\n archived: 'statusArchived',\n forgotten: 'statusForgotten',\n}\nconst SCOPE_KEY: Record<MemoryRow['scope'], EngramKey> = {\n user: 'scopeUser',\n project: 'scopeProject',\n shared: 'scopeShared',\n}\n/** 房间色相类(panel.module.css 的 .roomFact 等);未知 kind 回退通用的 .kind。 */\nconst ROOM_CLASS: Record<string, string> = {\n fact: 'roomFact',\n preference: 'roomPreference',\n decision: 'roomDecision',\n episode: 'roomEpisode',\n skill: 'roomSkill',\n}\nconst OP_KEY: Record<string, EngramKey> = {\n write: 'opWrite',\n 'write-merge': 'opWriteMerge',\n update: 'opUpdate',\n forget: 'opForget',\n restore: 'opRestore',\n decay: 'opDecay',\n superseded: 'opSuperseded',\n 'ingest-request': 'opIngestRequest',\n 'ingest-done': 'opIngestDone',\n 'outcome-report': 'opOutcomeReport',\n assess: 'opAssess',\n consolidation: 'opConsolidation',\n 'review-answer': 'opReviewAnswer',\n 'slot-assign': 'opSlotAssign',\n 'slot-backfill': 'opSlotBackfill',\n 'room-open': 'opRoomOpen',\n 'search-rewrite-request': 'opSearchRewrite',\n 'compress-request': 'opCompressRequest',\n 'distill-request': 'opDistillRequest',\n 'profile-edit': 'opProfileEdit',\n}\nconst REL_KEY: Record<string, EngramKey> = {\n supersededBy: 'relSupersededBy',\n supersedes: 'relSupersedes',\n contradicts: 'relContradicts',\n related: 'relRelated',\n}\n/** 操作日志 detail JSON 的已知键 → 词典键(write/update/superseded 的小对象)。 */\nconst DETAIL_KEY: Record<string, EngramKey> = {\n kind: 'labelKind',\n scope: 'labelScope',\n status: 'labelStatus',\n}\n\n/** kind 数据值 → 本地化标签(未知值回退原文)。 */\nfunction kindLabel(t: T, kind: string): string {\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n}\n\n/** 房间 pill 的类名:按 kind 取色相类,未知 kind 回退通用品牌色。 */\nfunction roomPillClass(kind: string): string {\n return `${styles.pill} ${styles[ROOM_CLASS[kind] ?? 'kind'] ?? ''}`\n}\n\n/** op 数据值 → 本地化标签(未知值回退原文)。 */\nfunction opLabel(t: T, op: string): string {\n const key = OP_KEY[op]\n return key === undefined ? op : t(key)\n}\n\n/** 操作日志 detail 的本地化:write/update/superseded 的小对象转中文键值;摄取/蒸馏请求的完整 JSON 保持原样(审计诚实性优先)。 */\nfunction formatOpDetail(t: T, op: string, detail: string | null): string {\n if (detail === null) return ''\n // 画像修订的小对象转成语义句(创建/编辑/回滚三式,与工具的 audit detail 键对齐)。\n if (op === 'profile-edit') {\n try {\n const parsed = JSON.parse(detail) as { action?: unknown; fromVersion?: unknown; toVersion?: unknown; restoredFrom?: unknown; chars?: unknown }\n const to = Number(parsed.toVersion)\n const chars = Number(parsed.chars)\n if (parsed.action === 'edit' && parsed.fromVersion === null) {\n return ' ' + t('profileOpCreate', { to, chars })\n }\n const from = Number(parsed.fromVersion)\n if (parsed.action === 'edit') return ' ' + t('profileOpEdit', { from, to, chars })\n const restored = Number(parsed.restoredFrom)\n if (parsed.action === 'rollback' && Number.isInteger(from) && Number.isInteger(to) && Number.isInteger(restored)) {\n return ' ' + t('profileOpRollback', { from, to, restored, chars })\n }\n } catch {\n // detail 不是预期的 JSON:落到底部原样展示。\n }\n return ` ${detail}`\n }\n if (op !== 'write' && op !== 'update' && op !== 'superseded') return ` ${detail}`\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n const entries = Object.entries(parsed)\n if (entries.length === 0) return ` ${detail}`\n return ' ' + entries.map(([key, value]) => {\n const label = DETAIL_KEY[key]\n if (label === undefined) return `${key}=${String(value)}`\n if (key === 'kind' && typeof value === 'string') return `${t(label)}=${kindLabel(t, value)}`\n if (key === 'scope' && (value === 'user' || value === 'project')) return `${t(label)}=${t(SCOPE_KEY[value])}`\n return `${t(label)}=${String(value)}`\n }).join(' · ')\n } catch {\n return ` ${detail}`\n }\n}\n\n/** 来源会话展示片段:截短的会话 id + 可选轮次。 */\nfunction sourceLabel(t: T, record: Pick<MemoryRow, 'sourceSessionId' | 'sourceRound'>): string {\n if (record.sourceSessionId === null) return t('sourceExplicit')\n const id = `${record.sourceSessionId.slice(0, 16)}…`\n const withRound = record.sourceRound === null\n ? id\n : `${id} ${t('round', { n: record.sourceRound })}`\n return t('sourceSession', { id: withRound })\n}\n\n/**\n * 当前项目宫殿的选择器(host 的项目分库 dbName);null = 不注入,服务端走进程默认库。\n * 由 EngramSection 在**渲染期**赋值:父组件先于子组件渲染,保证子组件 effect 里的首批\n * 请求就带上选择器(放进 useEffect 会因「子 effect 先跑」而漏掉首帧那批请求)。\n */\nlet activeProjectSelector: string | null = null\n\n/**\n * 固定的项目选择器失效时的自愈入口(host 回 404 unknown project):\n * EngramSection 挂载时注册、卸载时清空——清掉固定的 library.project 回到 follow 并重载。\n */\nlet healDeadProject: (() => void) | null = null\n\n/** 请求是否属于 project 作用域:URL 里的 scope=project,或 POST JSON body 的 scope === 'project'。 */\nfunction isProjectScoped(path: string, init?: RequestInit): boolean {\n if (/(?:^|[?&])scope=project(?:&|$)/.test(path)) return true\n const body = init?.body\n if (typeof body !== 'string' || body === '') return false\n try {\n const parsed = JSON.parse(body) as { scope?: unknown } | null\n return typeof parsed === 'object' && parsed !== null && parsed.scope === 'project'\n } catch {\n // body 不是 JSON:按「非 project 作用域」处理,不抛错(偏好类请求可能带自由文本)。\n return false\n }\n}\n\n/** 往 JSON 对象 body 里加 project 字段;不可解析或非对象时返回 undefined(调用方退回 query 兜底)。 */\nfunction withProjectField(body: string, selector: string): string | undefined {\n try {\n const parsed = JSON.parse(body) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return undefined\n return JSON.stringify({ ...(parsed as Record<string, unknown>), project: selector })\n } catch {\n return undefined\n }\n}\n\n/** 追加 project 查询参数(GET,以及无法改写 body 时的兜底路径)。 */\nfunction withProjectParam(path: string, selector: string): string {\n return `${path}${path.includes('?') ? '&' : '?'}project=${encodeURIComponent(selector)}`\n}\n\n/**\n * 唯一的请求出口:project 作用域的请求统一注入当前项目宫殿选择器。\n * POST 优先写进 JSON body(host 契约:POST 经 body 传选择器),body 不可解析时退回 query。\n * project 请求收到 404 unknown project 时触发一次自愈(清固定值回到 follow),随后照常抛错。\n * @param path - `/api/engram/` 之后的路径(含 query);不要以 `/` 开头。\n * @param init - fetch 参数。\n * @param forceProject - 显式要求注入(合并视图如管家日志:user 侧照旧、project 侧跟随选择器)。\n * @returns 解析后的响应体;非 2xx 抛错(错误文案取 body.error)。\n */\nasync function api<T>(path: string, init?: RequestInit, forceProject = false): Promise<T> {\n const selector = activeProjectSelector\n let target = path\n let requestInit = init\n const projectScoped = selector !== null && (forceProject || isProjectScoped(path, init))\n if (projectScoped) {\n const body = init?.body\n const fromBody = typeof body === 'string' && body !== '' ? withProjectField(body, selector) : undefined\n if (fromBody !== undefined && init !== undefined) requestInit = { ...init, body: fromBody }\n else target = withProjectParam(path, selector)\n }\n const response = await fetch(`/api/engram/${target}`, requestInit)\n const parsed = (await response.json()) as T & { error?: string }\n if (!response.ok) {\n // 自愈:固定的分库已失效(工作区被删/改名)→ 回到跟随并重载,避免面板卡在错误态。\n if (projectScoped && response.status === 404 && parsed.error === 'unknown project') healDeadProject?.()\n throw new Error(parsed.error ?? `HTTP ${String(response.status)}`)\n }\n return parsed\n}\n\n/** host 项目宫殿清单的行(GET /api/engram/workspaces)。 */\ninterface EngramProjectItem {\n readonly dbName: string\n /** 工作区标题;host 给不出时为 null(显示回退路径末段 / dbName 短写)。 */\n readonly title?: string | null | undefined\n /** 该分库归属的工作目录;无法归属时 host 给 null 或直接省略该键。 */\n readonly path?: string | null | undefined\n /** workspace = 宿主注册表里的工作区;session = 只从会话 cwd 见到;process = 进程目录兜底。 */\n readonly kind: 'workspace' | 'session' | 'process'\n /** 项目标识来源(origin = git 仓库;cwd = 目录编码兜底)。 */\n readonly source: 'origin' | 'cwd'\n /** 宿主注册表里的工作区 id;对不上时 null(此时跟随只能按路径匹配)。 */\n readonly workspaceId?: string | null | undefined\n /** 库文件是否已存在(不存在时 memories 为 null)。 */\n readonly exists: boolean\n /** 库内记忆条数;库还不存在时为 null。 */\n readonly memories: number | null\n}\n\n/** GET /api/engram/workspaces 的返回(processDefault = 进程目录兜底库;缺席时 null)。 */\ninterface EngramWorkspacesView {\n readonly items: readonly EngramProjectItem[]\n readonly processDefault: { readonly dbName: string; readonly path: string | null; readonly title: string | null } | null\n}\n\n/** 宿主工作区视图(@deepseek-ai/dsh-api-workspace-controller/client 的 WorkspaceView 窄视图)。 */\nexport interface HostWorkspaceView {\n readonly workspaceId: string\n readonly path: string\n readonly title: string\n readonly sessionIds: readonly string[]\n}\n\n/** 宿主可观察快照的窄视图(getSnapshot + subscribe;与 useSyncExternalStore 兼容)。 */\ninterface ObservableLike<T> {\n getSnapshot(): T\n subscribe(listener: () => void): () => void\n}\n\n/** 宿主工作区服务窄视图(可选注入;缺席时面板其余功能照常)。 */\nexport interface WorkspacesLike {\n readonly list: ObservableLike<{ readonly items: readonly HostWorkspaceView[] }>\n}\n\n/** 宿主会话清单服务窄视图(可选注入;判定当前工作区只看当前会话 id)。 */\nexport interface SessionsLike {\n readonly list: ObservableLike<{ readonly current?: string | undefined }>\n}\n\n/** 空清单常量:useSyncExternalStore 的 getSnapshot 必须返回稳定引用。 */\nconst NO_WORKSPACES: readonly HostWorkspaceView[] = []\n\n/** 服务缺席时的空订阅(保持 hook 调用形状一致)。 */\nfunction noopUnsubscribe(): void { /* 无订阅可退 */ }\n\n/**\n * 订阅宿主快照(useSyncExternalStore 的 subscribe 席位)。\n * 契约上返回退订函数;个别实现若返回 void,则退化为「不卸载」而不是抛错。\n */\nfunction subscribeSnapshot<T>(source: ObservableLike<T> | undefined, onChange: () => void): () => void {\n if (source === undefined) return noopUnsubscribe\n const off = source.subscribe(onChange)\n return typeof off === 'function' ? off : noopUnsubscribe\n}\n\n/**\n * 当前 GUI 工作区:与侧边栏 WorkspacePicker 同一判定(工作区的 sessionIds 含当前会话)。\n * 两个宿主服务都可选:任一缺席时 available=false,chip 显示「无工作区信息(进程默认)」。\n * @param workspaces - 可选取用的宿主工作区服务。\n * @param sessions - 可选取用的宿主会话清单服务。\n * @returns 当前工作区(判定不出为 null)与服务是否齐备。\n */\nfunction useCurrentWorkspace(workspaces: WorkspacesLike | undefined, sessions: SessionsLike | undefined): {\n workspace: HostWorkspaceView | null\n available: boolean\n} {\n const subscribeWorkspaces = useCallback(\n (onChange: () => void): (() => void) => subscribeSnapshot(workspaces?.list, onChange),\n [workspaces],\n )\n const subscribeSessions = useCallback(\n (onChange: () => void): (() => void) => subscribeSnapshot(sessions?.list, onChange),\n [sessions],\n )\n const currentSessionId = useSyncExternalStore(subscribeSessions, () => sessions?.list.getSnapshot().current ?? null)\n const items = useSyncExternalStore(subscribeWorkspaces, () => workspaces?.list.getSnapshot().items ?? NO_WORKSPACES)\n const available = workspaces !== undefined && sessions !== undefined\n if (!available || currentSessionId === null) return { workspace: null, available }\n return { workspace: items.find(item => item.sessionIds.includes(currentSessionId)) ?? null, available }\n}\n\n/** 路径比较键:统一分隔符、去尾斜杠、小写(GUI 与 host 的路径书写可能不一致,Windows 大小写不敏感)。 */\nfunction pathKey(path: string): string {\n return path.replace(/\\//g, '\\\\').replace(/\\\\+$/, '').toLowerCase()\n}\n\n/** 路径末段(title 缺失时的回退显示名)。 */\nfunction lastSegment(path: string): string {\n const normalized = path.replace(/[/\\\\]+$/, '')\n const at = Math.max(normalized.lastIndexOf('\\\\'), normalized.lastIndexOf('/'))\n return at < 0 ? normalized : normalized.slice(at + 1)\n}\n\n/** dbName 短写:project-<hash>.db → project-<前 8 位>…(不符合该命名时按长度截断)。 */\nfunction shortDbName(dbName: string): string {\n const match = /^project-([0-9a-f]+)\\.db$/i.exec(dbName)\n return match === null ? dbName.slice(0, 14) : `project-${match[1]!.slice(0, 8)}…`\n}\n\n/** 项目库的显示名与「未注册工作区」标记:无法归属目录 → dbName 短写;否则 title > 路径末段。 */\nfunction projectLabel(item: EngramProjectItem): { name: string; unregistered: boolean } {\n if (typeof item.path !== 'string' || item.path === '') return { name: shortDbName(item.dbName), unregistered: true }\n const title = item.title?.trim() ?? ''\n if (title !== '') return { name: title, unregistered: item.kind !== 'workspace' }\n return { name: lastSegment(item.path), unregistered: item.kind !== 'workspace' }\n}\n\n/** 下拉项文案:显示名(含未注册标记)· 记忆条数(库未建时给「—」,不显示 0)。 */\nfunction projectOptionLabel(t: T, item: EngramProjectItem): string {\n const label = projectLabel(item)\n const parts = [label.unregistered ? `${label.name} · ${t('projectUnregistered')}` : label.name]\n parts.push(item.memories === null ? '—' : t('projectMemories', { n: item.memories }))\n return parts.join(' · ')\n}\n\n/** 跟随模式的目标:先按宿主工作区 id 匹配(最稳),对不上再按路径匹配;都匹配不到 → 进程默认库。 */\nfunction matchFollowTarget(list: EngramWorkspacesView | null, workspace: HostWorkspaceView | null): EngramProjectItem | undefined {\n if (list === null || workspace === null) return undefined\n const byId = list.items.find(item => item.workspaceId === workspace.workspaceId)\n if (byId !== undefined) return byId\n const key = pathKey(workspace.path)\n return list.items.find(item => typeof item.path === 'string' && pathKey(item.path) === key)\n}\n\n/**\n * 项目宫殿 chip 的文案与 hover 说明:固定 / 跟随 / 未注册 / 无工作区信息四态。\n * 固定优先判定(host 清单不依赖客户端服务,固定态在缺服务时依然准确)。\n */\nfunction projectChip(t: T, state: {\n mode: string\n available: boolean\n items: readonly EngramProjectItem[]\n followed: EngramProjectItem | undefined\n processDefaultPath: string | null\n}): { label: string; title: string; tone: 'pinned' | 'follow' | 'muted' } {\n if (state.mode !== 'follow') {\n const item = state.items.find(entry => entry.dbName === state.mode)\n if (item === undefined) {\n return {\n label: t('projectPinned', { name: `${shortDbName(state.mode)} · ${t('projectUnregistered')}` }),\n title: state.mode,\n tone: 'pinned',\n }\n }\n const label = projectLabel(item)\n return {\n label: t('projectPinned', { name: label.unregistered ? `${label.name} · ${t('projectUnregistered')}` : label.name }),\n title: item.path ?? item.dbName,\n tone: 'pinned',\n }\n }\n if (!state.available) return { label: t('projectNoWorkspace'), title: t('projectFollowHint'), tone: 'muted' }\n if (state.followed === undefined) {\n return {\n label: t('projectPinned', { name: t('projectProcessDefault') }),\n title: state.processDefaultPath ?? t('projectFollowHint'),\n tone: 'pinned',\n }\n }\n const label = projectLabel(state.followed)\n return {\n label: t('projectFollowNamed', { name: label.unregistered ? `${label.name} · ${t('projectUnregistered')}` : label.name }),\n title: state.followed.path ?? t('projectFollowHint'),\n tone: 'follow',\n }\n}\n\n/** 绝对时间(审计时间线等需要精确时刻的位置)。 */\nfunction fmtTime(ms: number): string {\n // 时间格式跟随浏览器环境语言(宿主界面语言通常与浏览器一致)。\n return new Date(ms).toLocaleString(navigator.language || 'zh-CN', { hour12: false })\n}\n\n/** 列表用的相对时间:1 分钟内「刚刚」,其后按分钟/小时/天取整。 */\nfunction relTime(t: T, ms: number): string {\n const diff = Math.max(0, Date.now() - ms)\n const minutes = Math.floor(diff / 60_000)\n if (minutes < 1) return t('timeJustNow')\n if (minutes < 60) return t('timeMinutesAgo', { n: minutes })\n const hours = Math.floor(minutes / 60)\n if (hours < 48) return t('timeHoursAgo', { n: hours })\n return t('timeDaysAgo', { n: Math.floor(hours / 24) })\n}\n\n/** 速览指标:大数 + 小标签 + 可选尾注;secondary 用于并排的次级计数。 */\nfunction Metric({ label, value, tail, secondary }: {\n label: string\n value: string | number\n tail?: string | undefined\n secondary?: boolean\n}): React.ReactElement {\n return (\n <div className={styles.metric}>\n <span className={styles.metricLabel}>{label}</span>\n <b className={secondary === true ? `${styles.metricValue} ${styles.metricValueSecondary}` : styles.metricValue}>{value}</b>\n {tail !== undefined && <span className={styles.metricTail}>{tail}</span>}\n </div>\n )\n}\n\n/** 健康分环:SVG 描边进度(0-100),颜色随分数分档。 */\nfunction HealthRing({ score }: { score: number }): React.ReactElement {\n const radius = 24\n const circumference = 2 * Math.PI * radius\n const filled = circumference * (Math.min(100, Math.max(0, score)) / 100)\n const tone = score >= 80 ? 'var(--dsw-alias-state-success-primary)'\n : score >= 50 ? 'var(--dsw-alias-state-warn-primary)'\n : 'var(--dsw-alias-state-error-primary)'\n return (\n <div className={styles.ring} role=\"meter\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={score}>\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" aria-hidden=\"true\">\n <circle cx=\"28\" cy=\"28\" r={radius} fill=\"none\" stroke=\"var(--dsw-alias-border-l2)\" strokeWidth=\"4\" />\n <circle cx=\"28\" cy=\"28\" r={radius} fill=\"none\" stroke={tone} strokeWidth=\"4\" strokeLinecap=\"round\"\n strokeDasharray={`${filled.toFixed(1)} ${circumference.toFixed(1)}`} />\n </svg>\n <b>{score}</b>\n </div>\n )\n}\n\n/** 细仪表条:重要性(品牌色)与置信(成功色)共用,conf 变体换色。 */\nfunction Meter({ value, conf }: { value: number; conf?: boolean }): React.ReactElement {\n return (\n <span className={conf === true ? `${styles.meter} ${styles.conf}` : styles.meter}>\n <i style={{ width: `${String(Math.round(Math.min(1, Math.max(0, value)) * 100))}%` }} />\n </span>\n )\n}\n\n/** 关系 id 列表 → 等宽字体 chips(完整 id 放 title)。 */\nfunction RelChips({ ids }: { ids: readonly string[] }): React.ReactElement {\n return (\n <div className={styles.relChips}>\n {ids.map(id => <span key={id} className={styles.relChip} title={id}>{id.slice(0, 18)}</span>)}\n </div>\n )\n}\n\n/** 行内审计区:属性网格 + 关系 chips + 操作时间线(review API)。 */\nfunction ReviewBody({ t, recordId, scope, project }: {\n t: T\n recordId: string\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n}): React.ReactElement {\n const [view, setView] = useState<ReviewView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<ReviewView>(`review?scope=${scope}&id=${encodeURIComponent(recordId)}`)\n .then((data) => { if (!cancelled) setView(data) })\n .catch((error: Error) => { if (!cancelled) setFailed(error.message) })\n return () => { cancelled = true }\n }, [recordId, scope, project, t])\n if (failed !== null) return <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>\n if (view === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n const { record } = view\n const relations = (['supersededBy', 'supersedes', 'contradicts', 'related'] as const)\n .map(key => ({ key, label: REL_KEY[key], ids: view[key] ?? [] }))\n .filter(entry => entry.ids.length > 0)\n const operations = view.operations ?? []\n return (\n <div className={styles.reviewGrid}>\n <div>\n <dl className={styles.attrGrid}>\n <dt>{t('labelContent')}</dt>\n <dd>{record.content}</dd>\n <dt>{t('labelKind')}</dt>\n <dd><span className={roomPillClass(record.kind)}>{kindLabel(t, record.kind)}</span></dd>\n <dt>{t('labelStatus')}</dt>\n <dd><span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span></dd>\n <dt>{t('importance')}</dt>\n <dd>{record.importance.toFixed(2)}<Meter value={record.importance} /></dd>\n <dt>{t('confidence')}</dt>\n <dd>{record.confidence.toFixed(2)}<Meter value={record.confidence} conf /></dd>\n <dt>{t('detailSource')}</dt>\n <dd>{sourceLabel(t, record)}</dd>\n <dt>{t('labelCreated')}</dt>\n <dd>{fmtTime(record.createdAt)}</dd>\n </dl>\n {relations.map(({ key, label, ids }) => (\n <div key={key} className={styles.relBlock}>\n <h5>{label === undefined ? key : t(label)}</h5>\n <RelChips ids={ids} />\n </div>\n ))}\n </div>\n <div>\n {(view.revisions ?? []).length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailRevisions')}</h5>\n <ul className={styles.timeline}>\n {view.revisions!.map((rev, index) => (\n <li key={index}>\n <time>{fmtTime(rev.supersededAt)}</time>\n <b>{kindLabel(t, rev.kind)}</b>\n {' '}{rev.content}\n </li>\n ))}\n </ul>\n </div>\n )}\n {operations.length > 0 && (\n <div className={styles.relBlock}>\n <h5>{t('detailOperations')}</h5>\n <ul className={styles.timeline}>\n {operations.map((op, index) => (\n <li key={index}>\n <time>{fmtTime(op.at)}</time>\n <b>{opLabel(t, op.op)}</b>\n {formatOpDetail(t, op.op, op.detail)}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/** 行内编辑表单:内容/种类/重要性 → POST update(旧条目归档,取代链保留)。 */\nfunction EditForm({ t, record, onClose, onSaved, toast }: {\n t: T\n record: MemoryRow\n onClose: () => void\n onSaved: () => void\n toast: ToastController\n}): React.ReactElement {\n const [content, setContent] = useState(record.content)\n const [kind, setKind] = useState(record.kind)\n const [importance, setImportance] = useState(record.importance)\n const save = (): void => {\n api('update', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope, content, kind, importance }),\n })\n .then(onSaved)\n .catch((error: Error) => { toast.push('error', error.message) })\n }\n return (\n <div className={styles.editForm}>\n <div>\n <label className={styles.fieldLabel}>{t('labelContent')}</label>\n <textarea className={styles.input} rows={3} value={content} onChange={event => setContent(event.target.value)} />\n </div>\n <div>\n <label className={styles.fieldLabel}>{t('labelKind')}</label>\n {/* option 的 value 保持数据层英文枚举,仅显示文本本地化。 */}\n <select className={styles.input} value={kind} onChange={event => setKind(event.target.value)}>\n {KINDS.map(option => <option key={option} value={option}>{kindLabel(t, option)}</option>)}\n </select>\n </div>\n <div className={styles.fieldRow}>\n <div>\n <label className={styles.fieldLabel}>{`${t('importance')} ${importance.toFixed(2)}`}</label>\n <input type=\"range\" min={0} max={1} step={0.05} value={importance}\n onChange={event => setImportance(Number(event.target.value))} />\n </div>\n </div>\n <div className={styles.modalFoot}>\n <button type=\"button\" className={styles.button} onClick={onClose}>{t('cancel')}</button>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`} onClick={save}>{t('saveWithHint')}</button>\n </div>\n </div>\n )\n}\n\n/** search-test API 的命中行。 */\ninterface BenchHit {\n readonly id: string\n readonly score: number\n readonly via: 'fts' | 'vec' | 'both'\n readonly viaEdge?: { readonly from: string; readonly type: string }\n readonly scope: string\n readonly kind: string\n readonly content: string\n}\n\n/** search-test API 的返回结构。 */\ninterface BenchResult {\n readonly degraded: boolean\n readonly hits: readonly BenchHit[]\n}\n\n/** activity API 的行结构(两库 op_log 合并)。 */\ninterface ActivityRow {\n readonly at: number\n readonly op: string\n readonly targetId: string\n readonly detail: string | null\n readonly scope: 'user' | 'project'\n}\n\n/** 命中道 → 词典键。 */\nconst VIA_KEY: Record<BenchHit['via'], EngramKey> = { fts: 'viaFts', vec: 'viaVec', both: 'viaBoth' }\n\n/** 召回测试台:输入查询跑真实检索,展示得分、命中原委(关键词/语义/边扩展)与内容。 */\nfunction RecallBench({ t, scope }: { t: T; scope: 'user' | 'project' | 'shared' }): React.ReactElement {\n const [query, setQuery] = useState('')\n /** 默认随观察 scope,但用户可在 select 内手动切换 'all' / 其它;切换观察 scope 时重置。 */\n const [benchScope, setBenchScope] = useState<string>(scope)\n const [result, setResult] = useState<BenchResult | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // 观察 scope 变化时同步 benchScope(用户在 select 里改过的「all」会被覆盖——刻意保持一致性)。\n useEffect(() => { setBenchScope(scope) }, [scope])\n const run = (): void => {\n if (query.trim() === '' || busy) return\n setBusy(true)\n // forceProject:'all' 模式(user + project)与 project 模式都要用当前选中的项目分库。\n api<BenchResult>(`search-test?q=${encodeURIComponent(query.trim())}&scope=${benchScope}`, undefined, true)\n .then((data) => { setResult(data); setError(null) })\n .catch((benchError: Error) => setError(benchError.message))\n .finally(() => setBusy(false))\n }\n const hits = result?.hits ?? []\n return (\n <div>\n <div className={styles.benchBar}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('benchPlaceholder')} value={query}\n onChange={event => setQuery(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter') run() }} />\n <select className={styles.input} value={benchScope}\n onChange={event => setBenchScope(event.target.value)}>\n <option value=\"all\">{t('benchScopeAll')}</option>\n <option value=\"user\">{t('scopeUser')}</option>\n <option value=\"project\">{t('scopeProject')}</option>\n <option value=\"shared\">{t('scopeShared')}</option>\n </select>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n disabled={busy || query.trim() === ''} onClick={run}>{t('benchRun')}</button>\n </div>\n {error !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: error })}</div>}\n {result !== null && error === null && (\n <div className={styles.benchMeta}>\n <span>{t('benchHits', { n: hits.length })}</span>\n {result.degraded && <span className={styles.degradedNote}>{t('benchDegraded')}</span>}\n </div>\n )}\n <div className={styles.benchList}>\n {hits.map(hit => (\n <div key={hit.id} className={styles.benchRow}>\n <div className={styles.benchHead}>\n <span className={styles.viaChip}>{t(VIA_KEY[hit.via])}</span>\n {hit.viaEdge !== undefined && (\n <span className={styles.viaChip}\n title={`${hit.viaEdge.type} ${hit.viaEdge.from}`}>{t('viaEdgeLabel')} · {hit.viaEdge.type}</span>\n )}\n <span className={roomPillClass(hit.kind)}>{kindLabel(t, hit.kind)}</span>\n <span className={styles.benchScore}>{hit.score.toFixed(4)}</span>\n </div>\n <div className={styles.benchContent}>{hit.content}</div>\n <span className={styles.benchId} title={hit.id}>{hit.id}</span>\n </div>\n ))}\n </div>\n {result !== null && hits.length === 0 && error === null && (\n <div className={styles.benchEmpty}>{t('benchEmpty')}</div>\n )}\n </div>\n )\n}\n\n/** 活动日志 detail 的摘要:摄取/改写/压缩请求解析 JSON 字段,其余原样截断。\n 窄侧栏下文本应尽量短,长详情交给 title 悬浮展示。 */\nfunction activityDetail(t: T, detail: string | null): string {\n if (detail === null) return ''\n try {\n const parsed = JSON.parse(detail) as Record<string, unknown>\n if (typeof parsed.round === 'number' && typeof parsed.userText === 'string') {\n const mode = typeof parsed.mode === 'string' ? ` · ${parsed.mode}` : ''\n return `${t('round', { n: parsed.round })}${mode} · ${parsed.userText.slice(0, 48)}`\n }\n if (typeof parsed.query === 'string' && Array.isArray(parsed.queries)) {\n return `${t('benchRewrite', { n: parsed.queries.length })} · ${parsed.query.slice(0, 36)}`\n }\n if (typeof parsed.count === 'number' && Object.keys(parsed).length === 1) {\n return t('benchCompress', { n: parsed.count })\n }\n if (typeof parsed.batchId === 'string' && typeof parsed.sufficient === 'boolean') {\n const refs = Array.isArray(parsed.refs) ? parsed.refs.length : 0\n return `${parsed.batchId} · ${t(parsed.sufficient ? 'assessAdequate' : 'assessInadequate')} · ${t('assessRefs', { n: refs })}`\n }\n // 闭馆整理汇总:scope + 归档 / 合并 / 跳过三项计数。\n if (typeof parsed.archived === 'number' && typeof parsed.merged === 'number' && typeof parsed.skipped === 'number') {\n const scope = parsed.scope === 'project' ? t('scopeProject') : t('scopeUser')\n return `${scope} · ${t('consolidateArchived', { n: parsed.archived })} · ${t('consolidateMerged', { n: parsed.merged })} · ${t('consolidateSkipped', { n: parsed.skipped })}`\n }\n // 衰减归档:只有 archived 计数。\n if (typeof parsed.archived === 'number' && parsed.merged === undefined) {\n return t('decayArchived', { n: parsed.archived })\n }\n if (typeof parsed.assigned === 'number') return t('slotBackfilled', { n: parsed.assigned })\n if (typeof parsed.room === 'string') return t('roomOpened', { room: parsed.room })\n if (typeof parsed.grade === 'number' && typeof parsed.nextIntervalDays === 'number') {\n return t('reviewAnswered', { grade: parsed.grade, days: parsed.nextIntervalDays })\n }\n } catch {\n // 非 JSON(outcome 值等):走末尾原样截断。\n }\n return detail.length > 56 ? `${detail.slice(0, 56)}…` : detail\n}\n\n/** 日志筛选分组:op 枚举 → 分组(数据层英文枚举只在显示层映射)。 */\ntype LogFilter = 'all' | 'write' | 'ingest' | 'retrieve' | 'organize'\nconst LOG_GROUPS: Readonly<Record<LogFilter, readonly string[] | null>> = {\n all: null,\n write: ['write', 'update', 'forget', 'restore', 'decay', 'superseded', 'outcome-report'],\n ingest: ['ingest-request', 'ingest-done'],\n retrieve: ['search-rewrite-request', 'compress-request', 'assess'],\n organize: ['distill-request', 'consolidation', 'slot-assign', 'slot-backfill', 'room-open', 'review-answer', 'profile-edit'],\n}\nconst LOG_FILTER_KEY: Readonly<Record<LogFilter, EngramKey>> = {\n all: 'logFilterAll',\n write: 'logFilterWrite',\n ingest: 'logFilterIngest',\n retrieve: 'logFilterRetrieve',\n organize: 'logFilterOrganize',\n}\n/** 分组 → 行首色点类(与工具条计数、筛选分组同色)。 */\nconst LOG_DOT: Readonly<Record<'write' | 'ingest' | 'retrieve' | 'organize', string>> = {\n write: 'logDotWrite',\n ingest: 'logDotIngest',\n retrieve: 'logDotRetrieve',\n organize: 'logDotOrganize',\n}\n/** op 枚举 → 所属筛选分组(未归类返回 all)。 */\nfunction logGroupOf(op: string): LogFilter {\n for (const group of ['write', 'ingest', 'retrieve', 'organize'] as const) {\n if (LOG_GROUPS[group]?.includes(op) === true) return group\n }\n return 'all'\n}\n/** 行首色点类名:未归类的 op 用中性灰点,避免出现无颜色的空列。 */\nfunction logDotClass(op: string): string {\n const group = logGroupOf(op)\n const base = styles.logDot ?? ''\n return group === 'all' ? base : `${base} ${styles[LOG_DOT[group]] ?? ''}`\n}\n\n/** 行级 LCS 对齐:把两段文本按行 diff,输出 same/add/del 序列(行数少,O(n·m) DP 足够)。 */\nfunction lineDiff(oldText: string, newText: string): readonly { kind: 'same' | 'add' | 'del'; text: string }[] {\n const a = oldText.split('\\n')\n const b = newText.split('\\n')\n const m = a.length\n const n = b.length\n // dp[i][j] = a[i..] 与 b[j..] 的最长公共子序列长度(末行/末列补 0)。\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0))\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!)\n }\n }\n const rows: { kind: 'same' | 'add' | 'del'; text: string }[] = []\n let i = 0\n let j = 0\n while (i < m && j < n) {\n if (a[i] === b[j]) { rows.push({ kind: 'same', text: a[i]! }); i += 1; j += 1 }\n else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) { rows.push({ kind: 'del', text: a[i]! }); i += 1 }\n else { rows.push({ kind: 'add', text: b[j]! }); j += 1 }\n }\n while (i < m) { rows.push({ kind: 'del', text: a[i]! }); i += 1 }\n while (j < n) { rows.push({ kind: 'add', text: b[j]! }); j += 1 }\n return rows\n}\n\n/** profile-block 路由的响应体(block 为 null = 该 scope 尚未创建 curated block)。 */\ninterface ProfileBlockView {\n scope: string\n block: { content: string; version: number; updatedAt: number } | null\n versions: readonly { version: number; content: string; source: string; at: number }[]\n}\n\n/**\n * 画像 curated block 审计卡:当前内容 + 版本历史 + 任意两版本的行级 diff。\n * 只读视图(编辑走 engram_profile_edit 工具,乐观锁在存储层);scope/project 变化时重载。\n */\nfunction ProfileCard({ t, scope, project }: { t: T; scope: 'user' | 'project' | 'shared'; project: string | null }): React.ReactElement {\n const [data, setData] = useState<ProfileBlockView | null>(null)\n const [failed, setFailed] = useState(false)\n const [baseVersion, setBaseVersion] = useState<number | null>(null)\n const [targetVersion, setTargetVersion] = useState<number | null>(null)\n useEffect(() => {\n let cancelled = false\n api<ProfileBlockView>(`profile-block?scope=${scope}`, undefined, true)\n .then((view) => {\n if (cancelled) return\n setData(view)\n setFailed(false)\n // 默认对比:基准 = 上一版,目标 = 当前版(仅一版时不启用 diff)。\n setBaseVersion(view.versions.length > 1 ? view.versions[1]!.version : null)\n setTargetVersion(view.versions.length > 0 ? view.versions[0]!.version : null)\n })\n .catch(() => { if (!cancelled) setFailed(true) })\n return () => { cancelled = true }\n }, [scope, project])\n if (failed) {\n return <div className={styles.expandLoading}>{t('profileLoadFailed')}</div>\n }\n if (data === null) {\n return <div className={styles.expandLoading}>{t('loading')}</div>\n }\n if (data.block === null) {\n return (\n <div className={styles.expandLoading}>\n <p>{t('profileEmpty')}</p>\n <p className={styles.sectionHint}>{t('profileEmptyHint')}</p>\n </div>\n )\n }\n const versions = data.versions\n const byVersion = new Map(versions.map(version => [version.version, version]))\n const base = baseVersion === null ? undefined : byVersion.get(baseVersion)\n const target = targetVersion === null ? undefined : byVersion.get(targetVersion)\n const diffRows = base !== undefined && target !== undefined ? lineDiff(base.content, target.content) : []\n const hasDiff = diffRows.some(row => row.kind !== 'same')\n return (\n <div className={styles.profileCard}>\n <h5 className={styles.profileHeading}>{t('profileCurrent', { n: data.block.version })}</h5>\n <pre className={styles.profileContent}>{data.block.content}</pre>\n {versions.length > 1 && (\n <>\n <h5 className={styles.profileHeading}>{t('profileHistory')}</h5>\n <div className={styles.profilePickerRow}>\n <label>\n <span className={styles.sectionHint}>{t('profileDiffBase')}</span>\n <select className={styles.profileSelect} value={baseVersion ?? undefined}\n onChange={event => { setBaseVersion(Number(event.target.value)) }}>\n {versions.map(version => (\n <option key={version.version} value={version.version}>\n v{version.version} · {version.source === 'rollback' ? t('profileSourceRollback') : t('profileSourceEdit')}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span className={styles.sectionHint}>{t('profileDiffTarget')}</span>\n <select className={styles.profileSelect} value={targetVersion ?? undefined}\n onChange={event => { setTargetVersion(Number(event.target.value)) }}>\n {versions.map(version => (\n <option key={version.version} value={version.version}>\n v{version.version} · {version.source === 'rollback' ? t('profileSourceRollback') : t('profileSourceEdit')}\n </option>\n ))}\n </select>\n </label>\n </div>\n {base !== undefined && target !== undefined && (\n <div className={styles.profileDiff}>\n {hasDiff\n ? diffRows.map((row, index) => (\n <div key={index} className={\n row.kind === 'add' ? styles.profileDiffAdd : row.kind === 'del' ? styles.profileDiffDel : styles.profileDiffSame\n }>{row.kind === 'add' ? '+ ' : row.kind === 'del' ? '- ' : ' '}{row.text}</div>\n ))\n : <div className={styles.sectionHint}>{t('profileDiffNone')}</div>}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n\n/**\n * 管家日志整页视图:顶部近 7 天三个计数,下面是两库合并的完整 op_log\n * (时间 · 操作 · 宫殿 · 摘要),可按操作类别筛选;不再限高裁切,供逐条审计。\n * user 侧照旧合并,project 侧跟随项目宫殿选择器(api 的 forceProject)。\n */\nfunction LogPanel({ t, telemetry, project }: {\n t: T\n telemetry: TelemetrySnapshot | null\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n}): React.ReactElement {\n const [rows, setRows] = useState<ActivityRow[] | null>(null)\n const [filter, setFilter] = useState<LogFilter>('all')\n useEffect(() => {\n let cancelled = false\n api<{ operations: ActivityRow[] }>('activity?limit=50', undefined, true)\n .then((data) => { if (!cancelled) setRows(data.operations) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [project])\n const allow = LOG_GROUPS[filter]\n const visible = (rows ?? []).filter(row => allow === null || allow.includes(row.op))\n const counts = telemetry?.counts\n return (\n <section className={styles.section}>\n {/* 一条工具条:标题 + 条数 + 近 7 天三类计数(带类别色点)+ 类别筛选,\n 取代原先「独立计数卡 + 筛选行」两段式。 */}\n <div className={styles.logToolbar}>\n <h4 className={styles.sectionTitle}>{t('tabLog')}</h4>\n <span className={styles.sectionHint}>{t('logCount', { n: visible.length })}</span>\n <span className={styles.logCounts}>\n <span><i className={`${styles.logDot} ${styles.logDotWrite}`} aria-hidden=\"true\" />{t('teleWrites')} <b>{counts?.writes ?? 0}</b></span>\n <span><i className={`${styles.logDot} ${styles.logDotIngest}`} aria-hidden=\"true\" />{t('teleIngest')} <b>{counts?.ingestDones ?? 0}</b></span>\n <span><i className={`${styles.logDot} ${styles.logDotOrganize}`} aria-hidden=\"true\" />{t('teleConsolidate')} <b>{counts?.consolidations ?? 0}</b></span>\n </span>\n <div className={styles.segGroup} role=\"tablist\">\n {(['all', 'write', 'ingest', 'retrieve', 'organize'] as const).map(option => (\n <button key={option} type=\"button\" role=\"tab\" aria-selected={filter === option}\n className={filter === option ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setFilter(option) }}>{t(LOG_FILTER_KEY[option])}</button>\n ))}\n </div>\n </div>\n <div className={styles.panelCard}>\n {rows === null\n ? <div className={styles.expandLoading}>{t('loading')}</div>\n : visible.length === 0\n ? <div className={styles.expandLoading}>{t('activityEmpty')}</div>\n : (\n <div className={styles.logList}>\n {visible.map((op, index) => (\n <div key={index} className={styles.logRow}>\n <i className={logDotClass(op.op)} aria-hidden=\"true\" />\n <span className={styles.logTime}>{relTime(t, op.at)}</span>\n <span className={styles.logOp}>{opLabel(t, op.op)}</span>\n <span className={styles.logScope}>{op.scope === 'user' ? t('scopeUser') : t('scopeProject')}</span>\n <span className={styles.logDetail} title={op.detail ?? ''}>{activityDetail(t, op.detail)}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n )\n}\n\n/** 入殿导航:根据当前 scope 的 active 记忆给出开场邀请 + 候选记忆列表;点击可展开抽屉。\n * 顶部 kind chip(全部 / fact / preference / decision / episode / skill)切换 focusKind,\n * 触发后端按该 kind 优先选前 N 条作为开场建议。 */\nfunction TourProposalCard({ t, scope, project, onSelect }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n onSelect: (id: string) => void\n}): React.ReactElement {\n interface Stop { id: string; kind: string; content: string; importance: number; confidence: number }\n interface Proposal { greeting: string; activeCount: number; empty: boolean; suggestedStops: readonly Stop[] }\n const KINDS_FOCUS = ['', 'fact', 'preference', 'decision', 'episode', 'skill'] as const\n const [focusKind, setFocusKind] = usePersistedState<string>('tour.focusKind', '', KINDS_FOCUS)\n const [proposal, setProposal] = useState<Proposal | null>(null)\n useEffect(() => {\n let cancelled = false\n const path = focusKind === ''\n ? `tour-proposal?scope=${scope}`\n : `tour-proposal?scope=${scope}&focusKind=${focusKind}`\n api<Proposal>(path)\n .then((data) => { if (!cancelled) setProposal(data) })\n .catch(() => { if (!cancelled) setProposal({ greeting: t('tourProposalEmpty'), activeCount: 0, empty: true, suggestedStops: [] }) })\n return () => { cancelled = true }\n }, [t, scope, project, focusKind])\n const labelKind = (kind: string): string => {\n if (kind === '') return t('tourFocusAll')\n const key = KIND_KEY[kind]\n return key === undefined ? kind : t(key)\n }\n if (proposal === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.tourProposal}>\n <div className={styles.chipRow} role=\"tablist\" aria-label=\"focus-kind\">\n {KINDS_FOCUS.map(kind => (\n <button key={kind || 'all'} type=\"button\" role=\"tab\"\n aria-selected={focusKind === kind}\n className={focusKind === kind ? `${styles.chip} ${styles.chipOn}` : styles.chip}\n onClick={() => { setFocusKind(kind) }}>\n {labelKind(kind)}\n </button>\n ))}\n </div>\n {proposal.empty\n ? <div className={styles.expandLoading}>{t('tourProposalEmpty')}</div>\n : (\n <>\n <p className={styles.tourGreeting}>{proposal.greeting}</p>\n <ol className={styles.tourStops}>\n {proposal.suggestedStops.map((stop, index) => (\n <li key={stop.id}>\n <button type=\"button\" className={styles.tourStop} onClick={() => { onSelect(stop.id) }}>\n <span className={styles.tourStopIndex}>{index + 1}</span>\n <span className={styles.tourStopBody}>\n <span className={styles.tourStopKind}>{kindLabel(t, stop.kind)}</span>\n <span className={styles.tourStopText}>{stop.content.length > 60 ? `${stop.content.slice(0, 60)}…` : stop.content}</span>\n </span>\n </button>\n </li>\n ))}\n </ol>\n <p className={styles.tourHint}>{t('tourProposalHint')}</p>\n </>\n )}\n </div>\n )\n}\n\n/** 翻新清单:扫描 active 条目,给出 merge / demote / review / split 四类建议;带手动刷新 + 写回按钮。\n * - review / split:跳到对应记忆抽屉查看(无副作用)。\n * - demote:调用 engram_forget(带三问墓志铭),记忆转 archived。\n * - merge:触发当前 scope 的 engram_distill(用户级闭馆整理),把多条相似记忆蒸馏为一条高层规律。 */\nfunction RefurbCard({ t, scope, project, onSelect, onAfterAction, toast }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n onSelect: (id: string) => void\n onAfterAction: () => void\n toast: ToastController\n}): React.ReactElement {\n interface Suggestion { action: 'merge' | 'demote' | 'review' | 'split'; primaryId: string; candidates: readonly string[]; reason: string; confidence: number }\n interface RefurbReport { count: number; suggestions: readonly Suggestion[] }\n const [report, setReport] = useState<RefurbReport | null>(null)\n const [busy, setBusy] = useState(false)\n const reload = useCallback(() => {\n setBusy(true)\n api<RefurbReport>(`refurb?scope=${scope}`)\n .then((data) => { setReport(data) })\n .catch(() => { setReport({ count: 0, suggestions: [] }) })\n .finally(() => { setBusy(false) })\n }, [scope, project])\n useEffect(() => { reload() }, [reload])\n const labelOf = (action: Suggestion['action']): string => {\n switch (action) {\n case 'demote': return t('refurbActionDemote')\n case 'merge': return t('refurbActionMerge')\n case 'review': return t('refurbActionReview')\n case 'split': return t('refurbActionSplit')\n }\n }\n /** 执行建议:review/split 仅跳转;demote/merge 调写接口。 */\n const execute = useCallback((suggestion: Suggestion) => {\n if (suggestion.action === 'review' || suggestion.action === 'split') {\n onSelect(suggestion.primaryId)\n return\n }\n if (suggestion.action === 'demote') {\n if (!window.confirm(t('refurbConfirmDemote'))) return\n setBusy(true)\n api<{ id: string }>('forget', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n id: suggestion.primaryId,\n scope,\n reason: '翻新清单降级',\n affects: '无',\n stillUseful: '可经 engram_restore 复原',\n }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbDemoteDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n return\n }\n if (suggestion.action === 'merge') {\n const n = suggestion.candidates.length + 1\n if (n < 2) {\n toast.push('warning', t('refurbMergeEmpty'))\n return\n }\n if (!window.confirm(t('refurbConfirmMerge', { n }))) return\n setBusy(true)\n // 透传 candidates:后端 runConsolidation 仅把这些 ids 当合并种子,其它条目仅在与种子相似时被并入。\n const candidates = [suggestion.primaryId, ...suggestion.candidates]\n api<Record<string, unknown>>('consolidate', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ scope, candidates }),\n })\n .then(() => {\n reload()\n onAfterAction()\n toast.push('success', t('refurbMergeDone'))\n })\n .catch((error: Error) => { toast.push('error', t('refurbActionFailed', { msg: error.message })) })\n .finally(() => { setBusy(false) })\n }\n }, [reload, onSelect, onAfterAction, toast, t, scope])\n if (report === null) return <div className={styles.expandLoading}>{t('loading')}</div>\n return (\n <div className={styles.refurb}>\n <div className={styles.refurbHead}>\n <span className={styles.refurbCount}>{t('refurbCount', { n: report.count })}</span>\n <button type=\"button\" className={styles.button} disabled={busy} onClick={reload}>{t('refurbRun')}</button>\n </div>\n {report.count === 0\n ? <div className={styles.expandLoading}>{t('refurbEmpty')}</div>\n : (\n <ul className={styles.refurbList}>\n {report.suggestions.map((suggestion, index) => (\n <li key={`${suggestion.action}-${suggestion.primaryId}-${index}`} className={styles.refurbItem}>\n <button type=\"button\" className={styles.refurbBadge} onClick={() => { onSelect(suggestion.primaryId) }}>\n {labelOf(suggestion.action)}\n </button>\n <div className={styles.refurbReason}>{suggestion.reason}</div>\n <span className={styles.refurbConfidence}>{(suggestion.confidence * 100).toFixed(0)}%</span>\n <button type=\"button\" className={`${styles.refurbExec} ${styles.button}`} disabled={busy}\n onClick={() => { execute(suggestion) }}>{t('refurbExecute')}</button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/** 走廊鸟瞰数据拉取与节点/边状态(命中 active + archived,forgotten 默认隐藏)。 */\ninterface CorridorGraph {\n readonly nodes: ReadonlyArray<{\n readonly id: string\n readonly scope: string\n readonly kind: string\n readonly status: string\n readonly importance: number\n readonly confidence: number\n readonly title: string\n readonly content?: string\n }>\n readonly edges: ReadonlyArray<{ readonly id: string; readonly from: string; readonly to: string; readonly type: string }>\n}\n\nfunction CorridorPanel({ t, scope, project, onSelect }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n onSelect: (id: string) => void\n}): React.ReactElement {\n const [graph, setGraph] = useState<CorridorGraph | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n api<CorridorGraph>(`corridor?status=active,archived&scope=${scope}`)\n .then(data => { if (!cancelled) setGraph(data); setFailed(null) })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope, project])\n if (failed !== null) return <div className={styles.expandLoading}>{t('corridorFailed')}:{failed}</div>\n if (graph === null) return <div className={styles.expandLoading}>{t('corridorLoad')}</div>\n if (graph.nodes.length === 0) return <div className={styles.empty}>{t('corridorEmpty')}</div>\n return <CorridorMap scope={scope} nodes={graph.nodes} edges={graph.edges} onSelect={onSelect} t={t} />\n}\n\n/** GET /api/engram/episode-timeline 的情景行(host 已精简为四字段)。 */\ninterface EpisodeRowView {\n readonly id: string\n readonly kind: string\n readonly content: string\n readonly createdAt: number\n}\n\n/** GET /api/engram/episode-timeline 的组模式返回(组头带摄取期生成的会话摘要)。 */\ninterface EpisodeGroupsView {\n readonly groups: ReadonlyArray<{\n readonly sessionId: string | null\n readonly summary?: string | undefined\n readonly startedAt: number\n readonly endedAt: number\n readonly episodes: readonly EpisodeRowView[]\n }>\n}\n\n/** 邻近扩展(around 模式)返回:锚点条目 + 窗口内的情景邻居。 */\ninterface EpisodeAroundView {\n readonly anchor: EpisodeRowView\n readonly neighbors: readonly EpisodeRowView[]\n}\n\n/**\n * 情景时间线视图:按会话分组浏览 episode 往事,组头展示摄取期生成的一句话摘要;\n * 条目点「邻近」展开该时刻 ± 窗口的时间邻近扩展卡(回答「当时前后还发生了什么」)。\n */\nfunction EpisodeTimelineView({ t, scope, project, reloadTick }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n reloadTick: number\n}): React.ReactElement {\n const [sinceDate, setSinceDate] = useState('')\n const [untilDate, setUntilDate] = useState('')\n const [sessionIdInput, setSessionIdInput] = useState('')\n /** 已应用的过滤条件:date/文本输入不即时触发请求,点「应用」才生效。 */\n const [applied, setApplied] = useState<{ readonly since: string; readonly until: string; readonly sessionId: string }>({ since: '', until: '', sessionId: '' })\n const [data, setData] = useState<EpisodeGroupsView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n /** 邻近扩展卡(null = 未展开);busy 防重复点击。 */\n const [around, setAround] = useState<EpisodeAroundView | null>(null)\n const [aroundBusy, setAroundBusy] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n const params = new URLSearchParams({ scope })\n // date input 值按本地时区折算成当天首尾毫秒(T00:00:00 / T23:59:59.999)。\n if (applied.since !== '') params.set('since', String(new Date(`${applied.since}T00:00:00`).getTime()))\n if (applied.until !== '') params.set('until', String(new Date(`${applied.until}T23:59:59.999`).getTime()))\n if (applied.sessionId !== '') params.set('sessionId', applied.sessionId)\n api<EpisodeGroupsView>(`episode-timeline?${params.toString()}`)\n .then(d => { if (!cancelled) { setData(d); setFailed(null) } })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope, project, applied, reloadTick])\n\n /** 展开邻近扩展:以该条目为锚点查同库 ±60 分钟窗口内的情景(窗口由 host 缺省)。 */\n const openAround = (id: string): void => {\n setAroundBusy(true)\n api<EpisodeAroundView>(`episode-timeline?scope=${scope}&around=${encodeURIComponent(id)}`)\n .then(d => { setAround(d); setAroundBusy(false); setFailed(null) })\n .catch((err: Error) => { setFailed(err.message); setAroundBusy(false) })\n }\n\n /** 条目行:时刻 + 房间 + 内容 + 邻近按钮;id 放 title 便于复制。 */\n const renderRow = (row: EpisodeRowView): React.ReactElement => (\n <div key={row.id} className={styles.episodeRow} title={row.id}>\n <time className={styles.episodeRowTime}>{fmtTime(row.createdAt)}</time>\n <span className={styles.episodeRowKind}>{kindLabel(t, row.kind)}</span>\n <span className={styles.episodeRowText}>{row.content}</span>\n <button type=\"button\" className={styles.button} disabled={aroundBusy}\n onClick={() => { openAround(row.id) }}>\n {t('episodeNearby')}\n </button>\n </div>\n )\n\n return (\n <>\n {/* 过滤行:日期范围 + 可选会话 id;「应用」后生效,「重置」回到全量。 */}\n <div className={styles.toolbarRow}>\n <input type=\"date\" className={styles.input} value={sinceDate} aria-label={t('episodeSince')}\n onChange={event => { setSinceDate(event.target.value) }} />\n <span className={styles.episodeRangeSep} aria-hidden=\"true\">–</span>\n <input type=\"date\" className={styles.input} value={untilDate} aria-label={t('episodeUntil')}\n onChange={event => { setUntilDate(event.target.value) }} />\n <input className={`${styles.input} ${styles.search}`} placeholder={t('episodeSessionId')} value={sessionIdInput}\n onChange={event => { setSessionIdInput(event.target.value) }} />\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n onClick={() => { setApplied({ since: sinceDate, until: untilDate, sessionId: sessionIdInput.trim() }); setAround(null) }}>\n {t('episodeApply')}\n </button>\n <button type=\"button\" className={styles.button}\n onClick={() => {\n setSinceDate(''); setUntilDate(''); setSessionIdInput('')\n setApplied({ since: '', until: '', sessionId: '' }); setAround(null)\n }}>\n {t('episodeReset')}\n </button>\n </div>\n {failed !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>}\n {around !== null && (\n <section className={`${styles.panelCard} ${styles.episodeAround}`}>\n <header className={styles.episodeAroundHead}>\n <b>{t('episodeAroundTitle')}</b>\n <button type=\"button\" className={styles.button} onClick={() => { setAround(null) }}>\n {t('episodeClose')}\n </button>\n </header>\n {renderRow(around.anchor)}\n {around.neighbors.length === 0\n ? <p className={styles.sectionHint}>{t('episodeAroundEmpty')}</p>\n : around.neighbors.map(renderRow)}\n </section>\n )}\n {data === null && failed === null && <div className={styles.expandLoading}>{t('loading')}</div>}\n {data !== null && data.groups.length === 0 && <div className={styles.empty}>{t('episodeNoGroups')}</div>}\n {data?.groups.map(group => (\n <section key={group.sessionId ?? 'none'} className={styles.panelCard}>\n <header className={styles.episodeHead}>\n {group.summary === undefined\n ? <p className={`${styles.episodeSummary} ${styles.episodeSummaryMissing}`}>{t('episodeSummaryMissing')}</p>\n : <p className={styles.episodeSummary}>{group.summary}</p>}\n <span className={styles.episodeHeadMeta}>\n {group.sessionId === null ? t('episodeNoSession') : `#${group.sessionId}`}\n {' · '}\n {new Date(group.startedAt).toLocaleDateString()} ~ {new Date(group.endedAt).toLocaleDateString()}\n {' · '}\n {t('episodeEntries', { n: group.episodes.length })}\n </span>\n </header>\n <div>{group.episodes.map(renderRow)}</div>\n </section>\n ))}\n </>\n )\n}\n\n/** GET /api/engram/entities 的行(host 返回 { entity, memoryCount },entity 为实体记录的显示字段)。 */\ninterface EntityListItemView {\n readonly entity: {\n readonly id: string\n readonly name: string\n readonly kind: string\n readonly aliases: readonly string[]\n }\n readonly memoryCount: number\n}\n\n/** GET /api/engram/entities 返回(updated_at 倒序,附总数)。 */\ninterface EntityListView {\n readonly items: readonly EntityListItemView[]\n readonly total: number\n}\n\n/** GET /api/engram/entity 返回:实体 + 关联 active 记忆(创建时间倒序)。 */\ninterface EntityDetailView {\n readonly entity: EntityListItemView['entity']\n readonly memories: readonly MemoryRow[]\n}\n\n/** GET /api/engram/facts 返回的单条事实(面板只读显示所需字段)。 */\ninterface FactView {\n readonly id: string\n readonly content: string\n readonly validAt: number\n readonly invalidAt: number | null\n readonly replacedBy: string | null\n}\n\n/** GET /api/engram/facts 返回(valid_at 倒序,附总数)。 */\ninterface EntityFactsView {\n readonly items: readonly FactView[]\n readonly total: number\n}\n\n/** 实体类别数据值 → 词典键(筛选 chips、列表行与详情卡共用一份映射)。 */\nconst ENTITY_KIND_KEY: Record<string, EngramKey> = {\n person: 'entityKindPerson',\n project: 'entityKindProject',\n tool: 'entityKindTool',\n concept: 'entityKindConcept',\n other: 'entityKindOther',\n}\nconst ENTITY_KINDS = ['person', 'project', 'tool', 'concept', 'other'] as const\n\n/** 实体行的类别标签(未知 kind 回退「其他」)。 */\nfunction entityKindLabel(t: T, kind: string): string {\n return t(ENTITY_KIND_KEY[kind] ?? 'entityKindOther')\n}\n\n/**\n * 实体词典视图:浏览摄取期从记忆中抽取的实体(人物/项目/工具/概念),\n * 类别 chips + 名称/别名子串过滤;点「查看」展开该实体牵出的关联记忆卡。\n */\nfunction EntityView({ t, scope, project, reloadTick }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器(仅用于重载依赖;注入在 api() 里做)。 */\n project: string | null\n reloadTick: number\n}): React.ReactElement {\n const [kind, setKind] = useState<'all' | (typeof ENTITY_KINDS)[number]>('all')\n const [q, setQ] = useState('')\n const [data, setData] = useState<EntityListView | null>(null)\n const [failed, setFailed] = useState<string | null>(null)\n /** 展开的实体详情卡(null = 未展开);busy 防重复点击。 */\n const [detail, setDetail] = useState<EntityDetailView | null>(null)\n const [facts, setFacts] = useState<EntityFactsView | null>(null)\n const [detailBusy, setDetailBusy] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n const params = new URLSearchParams({ scope })\n if (kind !== 'all') params.set('kind', kind)\n if (q !== '') params.set('q', q)\n api<EntityListView>(`entities?${params.toString()}`)\n .then(d => { if (!cancelled) { setData(d); setFailed(null) } })\n .catch((err: Error) => { if (!cancelled) setFailed(err.message) })\n return () => { cancelled = true }\n }, [scope, project, kind, q, reloadTick])\n\n /** 展开实体详情:实体记录 + 关联记忆 + 事实链全貌(含已失效,看事实如何演变)。 */\n const openDetail = (id: string): void => {\n setDetailBusy(true)\n Promise.all([\n api<EntityDetailView>(`entity?scope=${scope}&id=${encodeURIComponent(id)}`),\n api<EntityFactsView>(`facts?scope=${scope}&entityId=${encodeURIComponent(id)}&includeInvalid=1`),\n ])\n .then(([d, f]) => { setDetail(d); setFacts(f); setDetailBusy(false); setFailed(null) })\n .catch((err: Error) => { setFailed(err.message); setDetailBusy(false) })\n }\n\n /** 详情卡里的关联记忆行:时刻 + 房间 + 内容(只读观测,不提供编辑入口)。 */\n const renderMemory = (row: MemoryRow): React.ReactElement => (\n <div key={row.id} className={styles.episodeRow} title={row.id}>\n <time className={styles.episodeRowTime}>{fmtTime(row.createdAt)}</time>\n <span className={styles.episodeRowKind}>{kindLabel(t, row.kind)}</span>\n <span className={styles.episodeRowText}>{row.content}</span>\n </div>\n )\n\n /** 详情卡里的事实行:生效日期 + 状态标签 + 陈述;失效行标「已失效」。 */\n const renderFact = (fact: FactView): React.ReactElement => (\n <div key={fact.id} className={styles.episodeRow} title={fact.id}>\n <time className={styles.episodeRowTime}>{new Date(fact.validAt).toLocaleDateString()}</time>\n <span className={styles.episodeRowKind}>{fact.invalidAt === null ? t('factValid') : t('factInvalid')}</span>\n <span className={styles.episodeRowText}>{fact.content}</span>\n </div>\n )\n\n return (\n <>\n {/* 过滤行:类别 chips;切换过滤时收起已展开的详情卡,避免与新列表错位。 */}\n <div className={styles.chipRow}>\n {([\n ['all', t('entityKindAll')],\n ...ENTITY_KINDS.map(option => [option, t(ENTITY_KIND_KEY[option] ?? 'entityKindOther')] as const),\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\" aria-pressed={kind === value}\n className={kind === value ? `${styles.chip} ${styles.chipOn}` : styles.chip}\n onClick={() => { setKind(value); setDetail(null); setFacts(null) }}>\n {label}\n </button>\n ))}\n </div>\n <div className={styles.toolbarRow}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('entitySearchPlaceholder')} value={q}\n onChange={event => { setQ(event.target.value.trim()); setDetail(null); setFacts(null) }} />\n {data !== null && <span className={styles.sectionHint}>{t('entityCount', { n: data.total })}</span>}\n </div>\n {failed !== null && <div className={styles.expandLoading}>{t('loadFailed', { msg: failed })}</div>}\n {detail !== null && (\n <section className={`${styles.panelCard} ${styles.episodeAround}`}>\n <header className={styles.episodeAroundHead}>\n <b>{detail.entity.name}</b>\n <span className={styles.episodeRowKind}>{entityKindLabel(t, detail.entity.kind)}</span>\n <button type=\"button\" className={styles.button} onClick={() => { setDetail(null); setFacts(null) }}>\n {t('episodeClose')}\n </button>\n </header>\n {detail.entity.aliases.length > 0 && (\n <p className={styles.sectionHint}>{`${t('entityAliases')}:${detail.entity.aliases.join('、')}`}</p>\n )}\n {detail.memories.length === 0\n ? <p className={styles.sectionHint}>{t('entityNoMemories')}</p>\n : <div>{detail.memories.map(renderMemory)}</div>}\n {facts !== null && (\n <>\n <p className={styles.sectionHint}>{t('factSection', { n: facts.total })}</p>\n {facts.items.length === 0\n ? <p className={styles.sectionHint}>{t('factEmpty')}</p>\n : <div>{facts.items.map(renderFact)}</div>}\n </>\n )}\n </section>\n )}\n {data === null && failed === null && <div className={styles.expandLoading}>{t('loading')}</div>}\n {data !== null && data.items.length === 0 && <div className={styles.empty}>{t('entityEmpty')}</div>}\n {data !== null && data.items.map(item => (\n <div key={item.entity.id} className={styles.episodeRow} title={item.entity.id}>\n <span className={styles.episodeRowKind}>{entityKindLabel(t, item.entity.kind)}</span>\n <span className={styles.episodeRowText}>\n {item.entity.name}\n {item.entity.aliases.length > 0 && (\n <small className={styles.sectionHint}>{`(${item.entity.aliases.join('、')})`}</small>\n )}\n </span>\n <span className={styles.episodeRowTime}>{t('entityMemories', { n: item.memoryCount })}</span>\n <button type=\"button\" className={styles.button} disabled={detailBusy}\n onClick={() => { openDetail(item.entity.id) }}>\n {t('entityOpen')}\n </button>\n </div>\n ))}\n </>\n )\n}\n\n/** 宫殿健康分卡:5 维 0-100 + 总分 + 每维度进度条。 */\ninterface HealthReport {\n readonly overall: number\n readonly parts: ReadonlyArray<{\n readonly scope: string\n readonly score: number\n readonly signal: number\n readonly activeRatio: number\n readonly edgeCount: number\n readonly redacted: number\n readonly archivedRatio: number\n }>\n readonly evaluatedAt: number\n}\n\n/** 房间目录:kind → 条目数(stats.byKind);色块与房间 pill 同色相。 */\nfunction RoomDirectory({ t, byKind }: { t: T; byKind: Readonly<Record<string, number>> }): React.ReactElement {\n return (\n <div className={styles.roomList}>\n {KINDS.map(kind => (\n <div key={kind} className={styles.roomRow}>\n <span className={`${styles.roomSwatch} ${styles[ROOM_CLASS[kind] ?? ''] ?? ''}`} aria-hidden=\"true\" />\n <span>{kindLabel(t, kind)}</span>\n <b className={styles.roomCount}>{byKind[kind] ?? 0}</b>\n </div>\n ))}\n </div>\n )\n}\n\n/** 宫殿遥测:最近 7 天 op_log 聚合(写 / 摄取 / 整理 / 闭环等计数)。 */\ninterface TelemetrySnapshot {\n readonly windowDays: number\n readonly counts: {\n readonly writes: number\n readonly forgets: number\n readonly ingestRequests: number\n readonly ingestDones: number\n readonly distillRequests: number\n readonly consolidations: number\n }\n}\n\n/**\n * 宫殿总览取数:规模(stats,含房间分布)+ 近 7 天活动(telemetry)+ 健康分(health)\n * 一次并行拉齐,供今日速览、健康分构成与房间目录共用(同一路由不重复请求)。\n * @param scope - 当前观察的宫殿(跟随 Header 三宫格)。\n * @param project - 项目宫殿选择器(仅用于选择器变化时重载;实际注入在 api() 里做)。\n * @returns 各段数据与取数失败原因(失败时保留上一次成功值)。\n */\nfunction usePalaceOverview(scope: 'user' | 'project' | 'shared', project: string | null): {\n stats: StatsPart['stats'] | null\n byKind: Readonly<Record<string, number>>\n telemetry: TelemetrySnapshot | null\n health: HealthReport | null\n failed: string | null\n} {\n const [state, setState] = useState<{\n stats: StatsPart['stats'] | null\n byKind: Readonly<Record<string, number>>\n telemetry: TelemetrySnapshot | null\n health: HealthReport | null\n failed: string | null\n }>({ stats: null, byKind: {}, telemetry: null, health: null, failed: null })\n useEffect(() => {\n let cancelled = false\n Promise.all([\n // stats 带 scope:project 时经 api() 注入选择器,host 让 project 段按选择器解析(缺省行为不变)。\n api<{ parts: StatsPart[] }>(`stats?scope=${scope}`),\n api<TelemetrySnapshot>(`telemetry?days=7&scope=${scope}`),\n api<HealthReport>(`health?scope=${scope}`),\n ])\n .then(([statRes, tele, health]) => {\n if (cancelled) return\n const stats = statRes.parts.find(part => part.scope === scope)?.stats ?? null\n setState({ stats, byKind: stats?.byKind ?? {}, telemetry: tele, health, failed: null })\n })\n .catch((error: Error) => {\n if (!cancelled) setState(current => ({ ...current, failed: error.message }))\n })\n return () => { cancelled = true }\n }, [scope, project])\n return state\n}\n\n/**\n * 今日速览:三个主指标(记忆 / 开放 / 清晰度)+ 近 7 天三个次级计数 + 健康分环。\n * 取代原先常驻的九格日报条——主次分层,其余计数下沉到「管家日志」tab。\n */\nfunction TodayHero({ t, overview, dueCount }: { t: T; overview: ReturnType<typeof usePalaceOverview>; dueCount: number }): React.ReactElement {\n const { stats, telemetry, health, failed } = overview\n if (failed !== null) {\n return <section className={styles.panelCard}><div className={styles.expandLoading}>{t('teleFailed')}:{failed}</div></section>\n }\n if (telemetry === null) {\n return <section className={styles.panelCard}><div className={styles.expandLoading}>{t('teleLoading')}</div></section>\n }\n const counts = telemetry.counts\n return (\n <section className={styles.panelCard}>\n <div className={styles.hero}>\n <div className={styles.heroMetrics}>\n <Metric label={t('kpiTotal')} value={stats?.total ?? 0}\n tail={`${t('teleGroupRecent')} +${String(counts.writes)}`} />\n <Metric label={t('kpiActive')} value={stats?.active ?? 0}\n tail={`${t('kpiForgotten')} ${String(stats?.forgotten ?? 0)}`} />\n <Metric label={t('kpiSignal')} value={`${String(Math.round((stats?.signalRatio ?? 0) * 100))}%`}\n tail={t('cardRedacted', { n: stats?.redacted ?? 0 })} />\n </div>\n <div className={styles.heroSide}>\n <Metric label={t('teleWrites')} value={counts.writes} secondary />\n <Metric label={t('teleIngest')} value={counts.ingestRequests} secondary />\n <Metric label={t('teleConsolidate')} value={counts.consolidations} secondary />\n {/* 今日到期:复习调度的消费者是 agent,这里只给观测计数(角标/陈展筛选可达)。 */}\n <Metric label={t('heroDue')} value={dueCount} secondary />\n <HealthRing score={health?.overall ?? 0} />\n </div>\n </div>\n <div className={styles.heroFoot}>\n <span className={styles.sectionHint}>\n {health === null ? t('healthLoading') : t('healthEvaluatedAt', { time: relTime(t, health.evaluatedAt) })}\n </span>\n {/* 隐私元数据:叹号图标 + 短标签 + hover/聚焦弹出长说明。 */}\n <span className={styles.telePrivacy} role=\"note\" aria-label={t('telePrivacyHint')} tabIndex={0}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"7\" y1=\"6\" x2=\"7\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\"/>\n <circle cx=\"7\" cy=\"4.2\" r=\"0.7\" fill=\"currentColor\"/>\n </svg>\n <span className={styles.telePrivacyHint}>{t('telePrivacyHint')}</span>\n <span className={styles.telePrivacyTip} role=\"tooltip\">{t('telePrivacyTip')}</span>\n </span>\n </div>\n </section>\n )\n}\n\n/** 历史回填 API 的估算结构(GET /api/engram/history-backfill)。 */\ninterface BackfillEstimateView {\n readonly rules: {\n readonly days: number\n readonly maxTurnsPerSession: number\n readonly maxTotalTurns: number\n readonly includeSubagents: boolean\n readonly includeSeeded: boolean\n readonly includeNoCwd: boolean\n }\n readonly candidates: number\n readonly eligibleTurns: number\n readonly pendingTurns: number\n readonly alreadyIngested: number\n readonly skipped: {\n readonly subagent: number\n readonly seeded: number\n readonly noCwd: number\n readonly tooOld: number\n readonly unreadable: number\n }\n readonly truncated: boolean\n readonly unavailable?: string\n}\n\n/** 宿主已注册的 provider 与模型清单(GET /api/engram/models)。 */\ninterface ModelsView {\n readonly providers: readonly { readonly id: string; readonly name: string; readonly models: readonly { readonly id: string; readonly name: string }[] }[]\n readonly failures: readonly string[]\n}\n\n/** 历史回填任务状态(GET /api/engram/history-backfill/status)。 */\ninterface BackfillStatusView {\n readonly progress: {\n readonly state: 'running' | 'done' | 'cancelled' | 'failed'\n readonly sessionsTotal: number\n readonly sessionsDone: number\n readonly turnsPlanned: number\n readonly turnsDone: number\n readonly memoriesWritten: number\n readonly turnsSkipped: number\n readonly turnsFailed: number\n readonly skipReasons: Readonly<Record<string, number>>\n readonly currentSession?: string\n }\n readonly failures: readonly { readonly sessionId: string; readonly turn: number; readonly reason: string }[]\n readonly error?: string\n}\n\n/** 跳过原因(摄取管线的英文枚举)→ 词典键。 */\nconst SKIP_KEY: Record<string, EngramKey> = {\n 'low-activity': 'skipLowActivity',\n chitchat: 'skipChitchat',\n 'capture-forbidden': 'skipForbidden',\n 'no-user-content': 'skipNoContent',\n 'already-ingested': 'skipAlready',\n 'no-such-turn': 'skipNoTurn',\n 'no-previous-turn': 'skipNoTurn',\n 'no-route-in-log': 'skipNoRoute',\n unparsable: 'skipUnparsable',\n}\n\n/** 跳过原因的本地化标签(未知枚举回退原值)。 */\nfunction skipLabel(t: T, reason: string): string {\n const key = SKIP_KEY[reason]\n return key === undefined ? reason : t(key)\n}\n\n/**\n * 历史回填:导入规则由用户选择(时间窗 / 轮数上限 / 三类会话过滤),\n * 先估算(零成本)再执行;运行中每 1.5 秒轮询进度,可暂停续做。\n */\nfunction HistoryBackfillCard({ t, toast }: { t: T; toast: ToastController }): React.ReactElement {\n /** 规则(持久化):时间窗与过滤开关以字符串存,便于 localStorage 往返。 */\n const [days, setDays] = usePersistedState<string>('backfill.days', '7', ['7', '30', '90', '0'])\n const [maxTurns, setMaxTurns] = usePersistedString('backfill.maxTurns', '20')\n const [maxTotal, setMaxTotal] = usePersistedString('backfill.maxTotal', '200')\n const [subagents, setSubagents] = usePersistedState<string>('backfill.subagents', 'false', ['false', 'true'])\n const [seeded, setSeeded] = usePersistedState<string>('backfill.seeded', 'false', ['false', 'true'])\n const [noCwd, setNoCwd] = usePersistedState<string>('backfill.noCwd', 'false', ['false', 'true'])\n /** 辅助模型选择:'' = 自动(用当前在用的模型);否则 `provider::model`。 */\n const [modelChoice, setModelChoice] = usePersistedString('backfill.model', '')\n const [models, setModels] = useState<ModelsView | null>(null)\n const [estimate, setEstimate] = useState<BackfillEstimateView | null>(null)\n const [status, setStatus] = useState<BackfillStatusView | null>(null)\n const [busy, setBusy] = useState(false)\n\n // 已注册模型清单:只拉一次(模型注册表变化不频繁,切换 tab 会重新挂载)。\n useEffect(() => {\n let cancelled = false\n api<ModelsView>('models')\n .then((data) => { if (!cancelled) setModels(data) })\n .catch(() => { if (!cancelled) setModels({ providers: [], failures: [] }) })\n return () => { cancelled = true }\n }, [])\n\n /** 显式选中的辅助模型(未选 = 交给后端用当前在用的模型)。 */\n const selection = ((): { provider: string; model: string } | undefined => {\n if (modelChoice === '') return undefined\n const separator = modelChoice.indexOf('::')\n if (separator <= 0) return undefined\n return { provider: modelChoice.slice(0, separator), model: modelChoice.slice(separator + 2) }\n })()\n\n const params = new URLSearchParams({\n days, maxTurnsPerSession: maxTurns, maxTotalTurns: maxTotal,\n includeSubagents: subagents, includeSeeded: seeded, includeNoCwd: noCwd,\n })\n if (selection !== undefined) {\n params.set('provider', selection.provider)\n params.set('model', selection.model)\n }\n const query = params.toString()\n\n const reload = useCallback((): void => {\n setBusy(true)\n api<{ estimate: BackfillEstimateView }>(`history-backfill?${query}`)\n .then((data) => { setEstimate(data.estimate) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }, [query, toast])\n useEffect(() => { reload() }, [reload])\n\n // 进度轮询:运行中每 1.5 秒一次;空闲只拉一次拿最终态。\n const running = status?.progress.state === 'running'\n useEffect(() => {\n let cancelled = false\n const poll = (): void => {\n api<BackfillStatusView>('history-backfill/status')\n .then((data) => { if (!cancelled) setStatus(data) })\n .catch(() => { /* 轮询失败静默重试,不打断面板 */ })\n }\n poll()\n if (!running) return () => { cancelled = true }\n const timer = window.setInterval(poll, 1500)\n return () => { cancelled = true; window.clearInterval(timer) }\n }, [running])\n\n const start = (): void => {\n setBusy(true)\n api<{ ok: boolean; status: BackfillStatusView }>('history-backfill/start', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n days: Number(days), maxTurnsPerSession: Number(maxTurns), maxTotalTurns: Number(maxTotal),\n includeSubagents: subagents === 'true', includeSeeded: seeded === 'true', includeNoCwd: noCwd === 'true',\n ...(selection === undefined ? {} : { provider: selection.provider, model: selection.model }),\n }),\n })\n .then((data) => { setStatus(data.status) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }\n const pause = (): void => {\n api<{ status: BackfillStatusView }>('history-backfill/cancel', {\n method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}',\n })\n .then((data) => { setStatus(data.status) })\n .catch((error: Error) => { toast.push('error', error.message) })\n }\n\n const progress = status?.progress\n const stateLabel = progress === undefined\n ? ''\n : progress.state === 'running' ? t('backfillStateRunning')\n : progress.state === 'done' ? t('backfillStateDone')\n : progress.state === 'cancelled' ? t('backfillStateCancelled')\n : t('backfillStateFailed')\n const percent = progress === undefined || progress.turnsPlanned === 0\n ? 0\n : Math.min(100, Math.round((progress.turnsDone / progress.turnsPlanned) * 100))\n\n return (\n <div className={styles.backfill}>\n <p className={styles.backfillIntro}>{t('backfillIntro')}</p>\n\n {/* 导入规则:全部由用户选择(持久化,下次进来沿用)。 */}\n <div className={styles.backfillRules}>\n <label className={styles.backfillRule}>\n <span>{t('backfillDays')}</span>\n <select className={styles.input} value={days} onChange={event => { setDays(event.target.value) }}>\n <option value=\"7\">{t('backfillDaysUnit', { n: 7 })}</option>\n <option value=\"30\">{t('backfillDaysUnit', { n: 30 })}</option>\n <option value=\"90\">{t('backfillDaysUnit', { n: 90 })}</option>\n <option value=\"0\">{t('backfillDaysAll')}</option>\n </select>\n </label>\n <label className={styles.backfillRule}>\n <span>{t('backfillMaxTurns')}</span>\n <input className={styles.input} type=\"number\" min={1} max={500} value={maxTurns}\n onChange={event => { setMaxTurns(event.target.value) }} />\n </label>\n <label className={styles.backfillRule}>\n <span>{t('backfillMaxTotal')}</span>\n <input className={styles.input} type=\"number\" min={1} max={5000} value={maxTotal}\n onChange={event => { setMaxTotal(event.target.value) }} />\n </label>\n {/* 辅助模型:默认「自动」= 回填时用你当前在用的模型(历史日志里的旧模型可能已不可用)。 */}\n <label className={styles.backfillRule}>\n <span>{t('backfillModel')}</span>\n <select className={styles.input} value={modelChoice}\n onChange={event => { setModelChoice(event.target.value) }}>\n <option value=\"\">{t('backfillModelAuto')}</option>\n {(models?.providers ?? []).map(provider => (\n <optgroup key={provider.id} label={provider.name}>\n {provider.models.map(model => (\n <option key={`${provider.id}::${model.id}`} value={`${provider.id}::${model.id}`}>{model.name}</option>\n ))}\n </optgroup>\n ))}\n </select>\n </label>\n </div>\n <div className={styles.backfillToggles}>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={subagents === 'true'}\n onChange={event => { setSubagents(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeSubagents')}\n </label>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={seeded === 'true'}\n onChange={event => { setSeeded(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeSeeded')}\n </label>\n <label className={styles.backfillToggle}>\n <input type=\"checkbox\" checked={noCwd === 'true'}\n onChange={event => { setNoCwd(event.target.checked ? 'true' : 'false') }} />\n {t('backfillIncludeNoCwd')}\n </label>\n </div>\n\n {/* 估算:零成本先看数(不写库、不调 LLM)。 */}\n <div className={styles.backfillEstimate}>\n {estimate === null\n ? <span className={styles.backfillMuted}>{t('backfillEstimating')}</span>\n : estimate.unavailable !== undefined\n ? <span className={styles.backfillMuted}>{estimate.unavailable}</span>\n : (\n <>\n <div className={styles.backfillNumbers}>\n <span className={styles.backfillMetric}>{t('backfillCandidates', { n: estimate.candidates })}</span>\n <span className={styles.backfillMetric}>{t('backfillPendingTurns', { n: estimate.pendingTurns })}</span>\n <span className={styles.backfillMetric}>{t('backfillAlready', { n: estimate.alreadyIngested })}</span>\n </div>\n <div className={styles.backfillMuted}>\n {t('backfillSkippedDetail', {\n subagent: estimate.skipped.subagent,\n seeded: estimate.skipped.seeded,\n noCwd: estimate.skipped.noCwd,\n tooOld: estimate.skipped.tooOld,\n unreadable: estimate.skipped.unreadable,\n })}\n </div>\n {estimate.truncated && <div className={styles.backfillMuted}>{t('backfillTruncated')}</div>}\n </>\n )}\n </div>\n\n <div className={styles.backfillActions}>\n <button type=\"button\" className={styles.button} disabled={busy} onClick={reload}>{t('backfillReestimate')}</button>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`}\n disabled={busy || running || estimate === null || estimate.unavailable !== undefined || estimate.pendingTurns === 0}\n onClick={start}>{t('backfillStart')}</button>\n <button type=\"button\" className={styles.button} disabled={!running} onClick={pause}>{t('backfillPause')}</button>\n </div>\n {progress !== undefined && (\n <div className={styles.backfillProgress}>\n <div className={styles.backfillProgressHead}>\n <span>{stateLabel}</span>\n <span>{t('backfillProgressTurns', { done: progress.turnsDone, total: progress.turnsPlanned })}</span>\n </div>\n <div className={styles.progressBar}><i style={{ width: `${String(percent)}%` }} /></div>\n <div className={styles.backfillMeta}>\n <span>{t('backfillProgressSessions', { done: progress.sessionsDone, total: progress.sessionsTotal })}</span>\n <span>{t('backfillWritten', { n: progress.memoriesWritten })}</span>\n <span>{t('backfillTurnsSkipped', { n: progress.turnsSkipped })}</span>\n <span>{t('backfillTurnsFailed', { n: progress.turnsFailed })}</span>\n </div>\n {/* 跳过原因分布:让「写入很少」可解释(多为节流跳过而非失败)。 */}\n {Object.keys(progress.skipReasons).length > 0 && (\n <div className={styles.backfillMeta}>\n <span>{t('backfillSkipReasons')}</span>\n {Object.entries(progress.skipReasons).sort(([, a], [, b]) => b - a).map(([reason, count]) => (\n <span key={reason}>{`${skipLabel(t, reason)} ${String(count)}`}</span>\n ))}\n </div>\n )}\n {(status?.failures ?? []).length > 0 && (\n <ul className={styles.backfillFailures}>\n <li className={styles.backfillMuted}>{t('backfillFailures')}</li>\n {status!.failures.slice(0, 3).map((failure, index) => (\n <li key={`${failure.sessionId}-${String(failure.turn)}-${String(index)}`}>\n {`${failure.sessionId.slice(-12)} · ${String(failure.turn)} · ${failure.reason}`}\n </li>\n ))}\n </ul>\n )}\n {(status?.failures ?? []).length > 0 && (\n <div className={styles.backfillMuted}>{t('backfillRouteHint')}</div>\n )}\n {status?.error !== undefined && <div className={styles.backfillMuted}>{status.error}</div>}\n </div>\n )}\n </div>\n )\n}\n\n/** Jev 面板视图(GET/POST /api/engram/jev-config 的响应体;密钥只有掩码,明文不出进程)。 */\ninterface JevPanelView {\n readonly enabled: boolean\n readonly apiKeySet: boolean\n readonly apiKeyMask: string | null\n readonly baseUrl: string\n readonly model: string\n readonly timeoutMs: number\n readonly deferMergeAbove: number\n readonly deferAcceptBelow: number\n readonly contradictMinProbability: number\n}\n\n/**\n * Jev 裁决配置:面板覆盖 cordis.yml 的连接字段(开关 / 密钥 / 端点 / 模型 / 超时),\n * 保存进 `<dbDir>/jev-config.json`(0600)后立即生效,无需重启。密钥输入框只进不出\n * (placeholder 回显掩码);留空 = 保留现有覆盖,清除走「清除已存密钥」。\n */\nfunction JevConfigCard({ t, toast }: { t: T; toast: ToastController }): React.ReactElement {\n const [view, setView] = useState<JevPanelView | null>(null)\n const [enabled, setEnabled] = useState(false)\n const [apiKey, setApiKey] = useState('')\n const [baseUrl, setBaseUrl] = useState('')\n const [model, setModel] = useState('')\n const [timeoutMs, setTimeoutMs] = useState('3000')\n const [busy, setBusy] = useState(false)\n const [testing, setTesting] = useState(false)\n\n // 初载:视图只读展示 + 表单初始值;密钥不回填输入框(保持空 = 不改动)。\n useEffect(() => {\n let cancelled = false\n api<JevPanelView>('jev-config')\n .then((data) => {\n if (cancelled) return\n setView(data)\n setEnabled(data.enabled)\n setBaseUrl(data.baseUrl)\n setModel(data.model)\n setTimeoutMs(String(data.timeoutMs))\n })\n .catch((error: Error) => { if (!cancelled) toast.push('error', `${t('jevLoadFailed')}: ${error.message}`) })\n return () => { cancelled = true }\n }, [t, toast])\n\n const save = (): void => {\n setBusy(true)\n api<{ ok: boolean; view: JevPanelView }>('jev-config', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n // 密钥留空 = 不发送该字段(保留现有覆盖);清空语义走 clearKey。\n body: JSON.stringify({\n enabled,\n baseUrl: baseUrl.trim(),\n model: model.trim(),\n timeoutMs: Number(timeoutMs),\n ...(apiKey.trim() === '' ? {} : { apiKey: apiKey.trim() }),\n }),\n })\n .then((data) => {\n setView(data.view)\n setApiKey('')\n toast.push('success', t('jevSaved'))\n })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }\n\n const clearKey = (): void => {\n setBusy(true)\n api<{ ok: boolean; view: JevPanelView }>('jev-config', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n // 空串 = 清除面板密钥覆盖,回落 cordis.yml 的值。\n body: JSON.stringify({ apiKey: '' }),\n })\n .then((data) => { setView(data.view); toast.push('success', t('jevKeyCleared')) })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setBusy(false) })\n }\n\n // 连接测试:用当前输入值(不落覆盖文件)发最小 ping 问题;密钥留空 = 测已存值。\n const testConnection = (): void => {\n setTesting(true)\n api<{ ok: boolean; elapsedMs: number; probability: number | undefined; error: string | undefined }>('jev-test', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n baseUrl: baseUrl.trim(),\n model: model.trim(),\n ...(apiKey.trim() === '' ? {} : { apiKey: apiKey.trim() }),\n }),\n })\n .then((result) => {\n if (result.ok) toast.push('success', t('jevTestOk', { ms: result.elapsedMs, p: result.probability }))\n else toast.push('error', t('jevTestFail', { error: result.error ?? '' }))\n })\n .catch((error: Error) => { toast.push('error', error.message) })\n .finally(() => { setTesting(false) })\n }\n\n if (view === null) return <span className={styles.jevMuted}>{t('loading')}</span>\n\n return (\n <div className={styles.jev}>\n <p className={styles.jevIntro}>{t('jevIntro')}</p>\n <div className={styles.jevToggleRow}>\n <label className={styles.jevToggle}>\n <input type=\"checkbox\" checked={enabled} onChange={event => setEnabled(event.target.checked)} />\n {t('jevEnabled')}\n </label>\n <span className={styles.jevStatus}>{view.enabled ? t('jevStatusOn') : t('jevStatusOff')}</span>\n </div>\n <div className={styles.jevForm}>\n <label className={styles.jevField}>\n <span>{t('jevApiKey')}</span>\n <input className={styles.input} type=\"password\" value={apiKey} autoComplete=\"off\"\n placeholder={view.apiKeyMask ?? t('jevApiKeyUnset')}\n onChange={event => setApiKey(event.target.value)} />\n <span className={styles.jevMuted}>{t('jevApiKeyHint')}</span>\n </label>\n <label className={styles.jevField}>\n <span>{t('jevBaseUrl')}</span>\n <input className={styles.input} value={baseUrl} onChange={event => setBaseUrl(event.target.value)} />\n </label>\n <label className={styles.jevField}>\n <span>{t('jevModel')}</span>\n <input className={styles.input} value={model} onChange={event => setModel(event.target.value)} />\n </label>\n <label className={styles.jevField}>\n <span>{t('jevTimeoutMs')}</span>\n <input className={styles.input} type=\"number\" min={1000} max={60000} value={timeoutMs}\n onChange={event => setTimeoutMs(event.target.value)} />\n </label>\n </div>\n <div className={styles.jevMuted}>{t('jevThresholdsTitle')}</div>\n <div className={styles.jevMuted}>{t('jevThresholdLine', {\n merge: view.deferMergeAbove,\n accept: view.deferAcceptBelow,\n contradict: view.contradictMinProbability,\n })}</div>\n <div className={styles.jevActions}>\n <button type=\"button\" className={`${styles.button} ${styles.primary}`} disabled={busy} onClick={save}>\n {t('jevSave')}\n </button>\n <button type=\"button\" className={styles.button} disabled={busy || testing} onClick={testConnection}>\n {t('jevTest')}\n </button>\n {view.apiKeySet && (\n <button type=\"button\" className={styles.button} disabled={busy} onClick={clearKey}>\n {t('jevClearKey')}\n </button>\n )}\n </div>\n </div>\n )\n}\n\n/** 近期裁决观测行视图(GET /api/engram/jev-observations 的 items 元素)。 */\ninterface JevObservationView {\n readonly at: number\n readonly site: 'band' | 'contradiction'\n readonly question: string\n readonly answered: boolean\n readonly probability: number | undefined\n readonly elapsedMs: number\n readonly error: string | undefined\n readonly verdict: 'merge' | 'accept' | 'defer' | 'confirm' | 'reject' | 'fallback'\n}\n\n/** verdict → 徽标文案键(动态模板字符串在 EngramKey union 下不可静态检查,改用映射表)。 */\nconst VERDICT_KEY: Readonly<Record<JevObservationView['verdict'], EngramKey>> = {\n merge: 'jevObsVerdictMerge',\n accept: 'jevObsVerdictAccept',\n defer: 'jevObsVerdictDefer',\n confirm: 'jevObsVerdictConfirm',\n reject: 'jevObsVerdictReject',\n fallback: 'jevObsVerdictFallback',\n}\n\n/**\n * 近期裁决观测:轮询 /api/engram/jev-observations(1.5s),展示判定结果 / Jev 是否给出答案 /\n * 耗时 / 回落原因,帮助排查「这条为什么被搁置」。数据只存进程内存,重启清空。\n */\nfunction JevObservationsCard({ t, toast }: { t: T; toast: ToastController }): React.ReactElement {\n const [items, setItems] = useState<readonly JevObservationView[] | null>(null)\n\n useEffect(() => {\n let cancelled = false\n // 初载失败弹 toast;轮询失败静默重试(观测卡不值得刷屏打扰)。\n const reload = (reportFailure: boolean): void => {\n api<{ items: readonly JevObservationView[] }>('jev-observations')\n .then((data) => { if (!cancelled) setItems(data.items) })\n .catch((error: Error) => {\n if (cancelled) return\n setItems(previous => previous ?? [])\n if (reportFailure) toast.push('error', `${t('jevObsLoadFailed')}: ${error.message}`)\n })\n }\n reload(true)\n const timer = window.setInterval(() => reload(false), 1500)\n return () => { cancelled = true; window.clearInterval(timer) }\n }, [t, toast])\n\n if (items === null) return <span className={styles.jevMuted}>{t('loading')}</span>\n if (items.length === 0) return <span className={styles.jevMuted}>{t('jevObsEmpty')}</span>\n\n return (\n <div className={styles.jevObs}>\n <div className={styles.jevObsHead}>{t('jevObsTitle')}</div>\n {items.map((item, index) => (\n <div key={`${item.at}-${item.site}-${index}`} className={styles.jevObsItem}>\n <span className={styles.jevObsTime}>{new Date(item.at).toLocaleTimeString()}</span>\n <span>{item.site === 'band' ? t('jevObsSiteBand') : t('jevObsSiteContradiction')}</span>\n <span className={item.verdict === 'fallback'\n ? styles.jevObsBadgeWarn\n : item.verdict === 'confirm' || item.verdict === 'merge' ? styles.jevObsBadgeGood : styles.jevObsBadge}>\n {t(VERDICT_KEY[item.verdict])}\n </span>\n <span>{item.answered ? `p=${item.probability?.toFixed(3)}` : t('jevObsNoAnswer')}</span>\n <span>{item.elapsedMs}ms</span>\n {item.error !== undefined && <span className={styles.jevObsError}>{t('jevObsErrorLine', { error: item.error })}</span>}\n </div>\n ))}\n </div>\n )\n}\n\n/** 导出下拉:把三种格式(Markdown / JSON / 镜像目录)合并成一个按钮 + 弹出列表。\n * 链接是浏览器直连的 GET(不走 api()),故这里显式拼接项目宫殿选择器。 */\nfunction ExportMenu({ t, scope, project }: {\n t: T\n scope: 'user' | 'project' | 'shared'\n /** 项目宫殿选择器:仅在 project 作用域拼接(null = 服务端走进程默认库)。 */\n project: string | null\n}): React.ReactElement {\n const [open, setOpen] = useState(false)\n const wrapRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n if (!open) return\n const handler = (event: MouseEvent): void => {\n if (wrapRef.current === null || !wrapRef.current.contains(event.target as Node)) setOpen(false)\n }\n window.addEventListener('mousedown', handler)\n return () => { window.removeEventListener('mousedown', handler) }\n }, [open])\n const projectQuery = scope === 'project' && project !== null ? `&project=${encodeURIComponent(project)}` : ''\n const options: Array<{ label: string; hint: string; href: string }> = [\n { label: t('exportMd'), hint: t('exportMdHint'), href: `/api/engram/export?scope=${scope}${projectQuery}&format=markdown` },\n { label: t('exportJson'), hint: t('exportJsonHint'), href: `/api/engram/export?scope=${scope}${projectQuery}&format=json` },\n { label: t('exportMirror'), hint: t('exportMirrorHint'), href: `/api/engram/mirror?scope=${scope}${projectQuery}` },\n ]\n return (\n <div className={styles.exportWrap} ref={wrapRef}>\n <button type=\"button\" className={styles.button} aria-haspopup=\"menu\" aria-expanded={open}\n onClick={() => { setOpen(value => !value) }}>\n {t('export')}\n <span className={styles.exportCaret} aria-hidden=\"true\">▾</span>\n </button>\n {open && (\n <div className={styles.exportMenu} role=\"menu\">\n {options.map(option => (\n <a key={option.href} role=\"menuitem\" className={styles.exportItem} href={option.href}\n onClick={() => { setOpen(false) }}>\n <span className={styles.exportItemLabel}>{option.label}</span>\n <span className={styles.exportItemHint}>{option.hint}</span>\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** EngramSection 的 props:渲染器给的 t(locale 席位)+ 可选取用的宿主服务。 */\nexport type EngramSectionProps = PropsLocale<typeof NS> & {\n /** 宿主工作区服务(缺席时 chip 显示「无工作区信息」,面板其余功能照常)。 */\n readonly workspaces?: WorkspacesLike | undefined\n /** 宿主会话清单服务(用于判定当前会话所属工作区)。 */\n readonly sessions?: SessionsLike | undefined\n}\n\n/** 设置页「记忆库」section 主组件(t 由渲染器按 locale: NS 声明合成)。 */\nexport function EngramSection({ t, workspaces, sessions }: EngramSectionProps): React.ReactElement {\n const toast = useToast()\n /** 全局 scope(持久化):Header 三宫格是唯一切换器,驱动今日速览、各视图卡片、陈展列表与导出。 */\n const [scope, setScope] = usePersistedState<'user' | 'project' | 'shared'>('library.scope', 'user', ['user', 'project', 'shared'])\n /** 库顶 status / kind / q 过滤器(持久化)。 */\n const [status, setStatus] = usePersistedState<string>('library.status', 'all', ['all', 'active', 'archived', 'forgotten'])\n const [kind, setKind] = usePersistedState<string>('library.kind', 'all', ['all', 'fact', 'preference', 'decision', 'episode', 'skill'])\n const [q, setQ] = usePersistedString('library.q', '')\n /** 陈展列表排序(持久化):time = 开馆时间倒序;tour = 固定巡游路线桩位顺序。 */\n const [sort, setSort] = usePersistedState<'time' | 'tour'>('library.sort', 'time', ['time', 'tour'])\n /** 今日到期条数与 id 集合(Header 角标 + 陈展「今日到期」筛选共用同一次拉取)。 */\n const [dueCount, setDueCount] = useState(0)\n const [dueIds, setDueIds] = useState<ReadonlySet<string>>(new Set())\n /** 陈展「今日到期」筛选:只显示复习调度今天到期的条目。 */\n const [dueOnly, setDueOnly] = useState(false)\n /** 脱敏筛选已合并到顶部 KPI 与 tag 视觉,不再作为过滤器。 */\n const [redacted] = useState('all')\n const [offset, setOffset] = useState(0)\n const [list, setList] = useState<ListResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n /** 行内展开态:互斥的唯一展开条目(review 或 edit)。 */\n const [expanded, setExpanded] = useState<{ kind: 'review' | 'edit'; record: MemoryRow } | null>(null)\n const [reloadTick, setReloadTick] = useState(0)\n /** 批量选择:条目 id 集合(scope/过滤/翻页/搜索变更时清空)。 */\n const [selected, setSelected] = useState<ReadonlySet<string>>(new Set())\n /** 批量遗忘的两段式确认。 */\n const [confirmForget, setConfirmForget] = useState(false)\n /** Tab 视图:today 今日速览 / library 陈展列表 / corridor 走廊与检索 / episodes 往事时间线 / entities 实体词典 / log 管家日志 / backfill 历史回填 / jev Jev 裁决配置。 */\n const [activeTab, setActiveTab] = useState<'today' | 'library' | 'corridor' | 'episodes' | 'entities' | 'log' | 'backfill' | 'jev'>('today')\n /** 项目宫殿来源(持久化):'follow' = 跟随 GUI 当前工作区;其它值 = 固定的 host 分库 dbName。 */\n const [projectMode, setProjectMode] = usePersistedString('library.project', 'follow')\n /** GUI 当前工作区(与侧边栏同一判定)与 host 的项目宫殿清单。 */\n const currentWorkspace = useCurrentWorkspace(workspaces, sessions)\n const [workspaceList, setWorkspaceList] = useState<EngramWorkspacesView | null>(null)\n const workspaceId = currentWorkspace.workspace?.workspaceId ?? ''\n\n /** 拉取 host 项目宫殿清单(挂载 / 工作区切换 / 固定值变化 / 手动重访):失败静默,只影响标签与下拉。 */\n useEffect(() => {\n let cancelled = false\n api<EngramWorkspacesView>('workspaces')\n .then((data) => { if (!cancelled) setWorkspaceList(data) })\n .catch(() => { /* 清单失败保持上一次:选择器本身仍可工作(跟随退化为进程默认) */ })\n return () => { cancelled = true }\n }, [workspaceId, projectMode, reloadTick])\n\n /** 跟随目标:GUI 当前工作区在 host 清单里对应的项目库(匹配不到 = 进程默认库)。 */\n const followedProject = matchFollowTarget(workspaceList, currentWorkspace.workspace)\n /** 实际选择器:follow + 已知工作区 → 该工作区分库;follow + 未知 → null(不注入)。 */\n const projectSelector = projectMode === 'follow' ? followedProject?.dbName ?? null : projectMode\n // 渲染期挂到 api() 的注入点:父先渲染,保证子组件 effect 的首批请求已带上选择器。\n activeProjectSelector = projectSelector\n /** Header chip 的四态文案(固定 / 跟随 / 未注册 / 无工作区信息)。 */\n const chip = projectChip(t, {\n mode: projectMode,\n available: currentWorkspace.available,\n items: workspaceList?.items ?? [],\n followed: followedProject,\n processDefaultPath: workspaceList?.processDefault?.path ?? null,\n })\n /** 固定的 dbName 不在 host 清单里(工作区被删除 / 只从会话 cwd 见过):下拉补一项避免选中态丢失。 */\n const pinnedMissing = projectMode !== 'follow'\n && !(workspaceList?.items ?? []).some(item => item.dbName === projectMode)\n\n /** 今日速览、健康分构成与房间目录共用一份总览数据(同一路由不重复请求)。 */\n const overview = usePalaceOverview(scope, projectSelector)\n\n const reload = useCallback((): void => { setReloadTick(tick => tick + 1) }, [])\n\n /** 失效选择器的自愈:同一轮只触发一次,回到 follow 后复位(见 api() 的 404 分支)。 */\n const healingRef = useRef(false)\n useEffect(() => {\n healDeadProject = (): void => {\n // 只在「固定到某个已失效分库」时自愈;跟随态 404 说明 host 清单与分库不一致,回退只会抖动。\n if (healingRef.current || projectMode === 'follow') return\n healingRef.current = true\n setProjectMode('follow')\n setOffset(0)\n setExpanded(null)\n setSelected(new Set())\n reload()\n }\n return () => { healDeadProject = null }\n }, [projectMode, reload])\n useEffect(() => {\n if (projectMode === 'follow') healingRef.current = false\n }, [projectMode])\n\n /** 刷新今日到期计数与 id 集合(本地回环毫秒级;失败静默归零,不打断面板)。 */\n const refreshDue = useCallback((): void => {\n api<{ items: readonly { id: string }[] }>(`review-due?scope=${scope}&limit=50`)\n .then(data => {\n setDueCount(data.items.length)\n setDueIds(new Set(data.items.map(item => item.id)))\n })\n .catch(() => { setDueCount(0); setDueIds(new Set()) })\n }, [scope, projectSelector])\n useEffect(() => { refreshDue() }, [refreshDue])\n\n /** 角标点击:切到宫殿陈展并启用「今日到期」筛选(复习调度的消费者是 agent,面板只做观测)。 */\n const goToDue = (): void => {\n setActiveTab('library')\n setDueOnly(true)\n }\n\n /** 打开详情抽屉:陈展列表已有该行时复用真实行,只有 id 的列表用最小占位行(抽屉自行拉 review)。 */\n const openReview = useCallback((id: string): void => {\n const record = list?.records.find(row => row.id === id)\n setExpanded({\n kind: 'review',\n record: record ?? ({\n id: id as never, scope, kind: 'fact', content: '', importance: 0.5, confidence: 0.5,\n status: 'active', createdAt: Date.now(), accessCount: 0, sourceSessionId: null, sourceRound: null,\n } as MemoryRow),\n })\n }, [list, scope])\n\n useEffect(() => {\n let cancelled = false\n const qs = new URLSearchParams({\n scope, status, kind, redacted, limit: String(PAGE_SIZE), offset: String(offset),\n })\n if (q !== '') qs.set('q', q)\n if (sort === 'tour') qs.set('sort', 'tour')\n api<ListResult>(`list?${qs.toString()}`)\n .then((data) => { if (!cancelled) { setList(data); setError(null) } })\n .catch((loadError: Error) => { if (!cancelled) setError(loadError.message) })\n return () => { cancelled = true }\n }, [scope, status, kind, redacted, q, sort, offset, reloadTick, projectSelector])\n\n /** 项目宫殿切换(工作区切换 / 手动固定):回到第 1 页并清掉跨库无意义的展开与选择态。 */\n const lastProject = useRef(projectSelector)\n useEffect(() => {\n if (lastProject.current === projectSelector) return\n lastProject.current = projectSelector\n setOffset(0)\n setExpanded(null)\n setSelected(new Set())\n }, [projectSelector])\n\n const act = (route: string, record: MemoryRow): void => {\n api(route, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, scope: record.scope }),\n })\n .then(reload)\n .catch((actError: Error) => { toast.push('error', actError.message) })\n }\n\n const toggle = (expandKind: 'review' | 'edit', record: MemoryRow): void => {\n setExpanded(current => (current !== null && current.kind === expandKind && current.record.id === record.id)\n ? null\n : { kind: expandKind, record })\n }\n\n const allRecords = list?.records ?? []\n // 「今日到期」筛选是页内视图过滤(复习调度今天到期的 id 白名单);分页仍按库内全量计算。\n const pageRecords = dueOnly ? allRecords.filter(record => dueIds.has(record.id)) : allRecords\n const selectedRecords = pageRecords.filter(record => selected.has(record.id))\n const forgetable = selectedRecords.filter(record => record.status === 'active').length\n const restorable = selectedRecords.length - forgetable\n const allSelected = pageRecords.length > 0 && pageRecords.every(record => selected.has(record.id))\n\n const toggleSelect = (id: string): void => {\n setSelected(current => {\n const next = new Set(current)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n const clearSelection = (): void => { setSelected(new Set()); setConfirmForget(false) }\n\n const toggleAllPage = (): void => {\n setSelected(current => {\n const next = new Set(current)\n if (allSelected) pageRecords.forEach(record => next.delete(record.id))\n else pageRecords.forEach(record => next.add(record.id))\n return next\n })\n }\n\n /** 批量执行:逐条调单条 API(回环毫秒级),单条失败不阻塞其余;完成即刷新并清空选择。 */\n const runBatch = (mode: 'forget' | 'restore'): void => {\n const targets = mode === 'forget'\n ? selectedRecords.filter(record => record.status === 'active')\n : selectedRecords.filter(record => record.status !== 'active')\n if (targets.length === 0) return\n void Promise.allSettled(targets.map(target => api(mode, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: target.id, scope: target.scope }),\n }))).then(() => { clearSelection(); reload() })\n }\n\n const armBatchForget = (): void => {\n // 确认态保持到用户点击确认执行或清空选择,不做自动复位(3 秒窗口曾导致执行落空)。\n if (confirmForget) { runBatch('forget'); return }\n setConfirmForget(true)\n }\n\n const page = Math.floor(offset / PAGE_SIZE) + 1\n const pages = list === null ? 1 : Math.max(1, Math.ceil(list.total / PAGE_SIZE))\n /** Segmented Control 玻璃指示器位置:根据选中按钮 DOM 测量。 */\n const segRefs = useRef<Map<string, HTMLButtonElement | null>>(new Map())\n const [segIndicator, setSegIndicator] = useState<{ left: number; width: number; opacity: number }>({ left: 0, width: 0, opacity: 0 })\n const measureSeg = useCallback((): void => {\n const node = segRefs.current.get(scope)\n if (node === null || node === undefined) return\n setSegIndicator({ left: node.offsetLeft, width: node.offsetWidth, opacity: 1 })\n }, [scope])\n useEffect(() => {\n measureSeg()\n const onResize = (): void => measureSeg()\n window.addEventListener('resize', onResize)\n return () => { window.removeEventListener('resize', onResize) }\n }, [measureSeg])\n\n return (\n <div className={styles.panel}>\n {/* 角落暖色渐变水印:amber→rose conic 模糊圆,只露右上角(克制不喧宾夺主) */}\n <div className={styles.brandWatermark} aria-hidden=\"true\" />\n {/* Header:去掉 Logo + 标题 + 副标题,改成「角落签名 + 功能栏」。\n 左:品牌色块 + 版本号芯片 + 当前 scope 微芯片(签名位);\n 右:scope 三宫格 + 今日到期角标 + 重访 + 导出。 */}\n <div className={styles.header}>\n <div className={styles.signature}>\n {/* 22×22 渐变方块 brandMark(替代原宫殿 Logo),用品牌渐变填充 + 玫瑰色微光 */}\n <span className={styles.brandMark} aria-hidden=\"true\" />\n {/* 版本号芯片:amber 染色的等宽字体(科技感签名) */}\n <span className={styles.versionChip}>v0.7.14</span>\n {/* 当前 scope 微芯片:图标 + 名称 */}\n <span className={styles.scopeBadge}>\n <Icon name={scope === 'user' ? 'user' : scope === 'project' ? 'project' : 'shared'} className={styles.scopeIcon} />\n <strong>{t(SCOPE_KEY[scope])}</strong>\n </span>\n </div>\n <div className={styles.headerActions}>\n <div className={`${styles.segGroup} ${styles.segScope}`}>\n <span className={styles.segIndicator}\n style={{ left: `${String(segIndicator.left)}px`, width: `${String(segIndicator.width)}px`, opacity: segIndicator.opacity }} />\n {(['user', 'project', 'shared'] as const).map(option => (\n <button key={option} type=\"button\" ref={node => { segRefs.current.set(option, node) }}\n className={scope === option ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setScope(option); setOffset(0); setExpanded(null); clearSelection() }}>\n <Icon name={option === 'user' ? 'user' : option === 'project' ? 'project' : 'shared'} className={styles.scopeIcon} />\n {t(SCOPE_KEY[option])}\n </button>\n ))}\n </div>\n {/* 今日待回忆角标:钟形图标 + 数字 */}\n {dueCount > 0 && (\n <button type=\"button\" className={styles.dueBadge}\n title={t('dueBadgeLabel', { n: dueCount })} aria-label={t('dueBadgeLabel', { n: dueCount })}\n onClick={goToDue}>\n <Icon name=\"clock\" className={styles.dueIcon} />\n {dueCount}\n </button>\n )}\n <button type=\"button\" className={styles.button} onClick={() => { reload(); refreshDue() }}>\n <Icon name=\"refresh\" className={styles.brandIcon} />\n {t('refresh')}\n </button>\n <ExportMenu t={t} scope={scope} project={projectSelector} />\n </div>\n {/* 项目宫殿来源:独占一行(flex-basis: 100%),紧贴作用域三宫格下方、Tab 栏之上——\n 只在 project 作用域显示(私人/共享宫殿没有工作区概念)。chip 显示当前落在哪个工作区分库\n (跟随 / 固定 / 未注册 / 无工作区信息)、hover 给完整路径,旁边下拉可临时固定到别的项目库。 */}\n {scope === 'project' && (\n <div className={styles.wsBar}>\n <span\n className={`${styles.wsChip}${chip.tone === 'follow' ? ` ${styles.wsFollow}` : chip.tone === 'muted' ? ` ${styles.wsMuted}` : ''}`}\n title={chip.title}>\n <Icon name=\"folder\" className={styles.wsChipIcon} />\n {chip.label}\n </span>\n <select className={`${styles.input} ${styles.wsSelect}`} value={projectMode}\n aria-label={t('projectSwitch')} title={t('projectSwitch')}\n onChange={event => { setProjectMode(event.target.value); setOffset(0); setExpanded(null); clearSelection() }}>\n <option value=\"follow\">{t('projectFollow')}</option>\n {(workspaceList?.items ?? []).map(item => (\n <option key={item.dbName} value={item.dbName}>{projectOptionLabel(t, item)}</option>\n ))}\n {pinnedMissing && (\n <option value={projectMode}>{`${shortDbName(projectMode)} · ${t('projectUnregistered')}`}</option>\n )}\n </select>\n </div>\n )}\n </div>\n\n {/* 顶部 Tab Bar:八个视图,每个 Tab 项前置线性图标;当前项用 amber→rose 渐变彩条作下划线。\n 排序沿用旧版(先管家后陈展与配置)。 */}\n <div className={styles.tabs} role=\"tablist\">\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'today' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'today'}\n onClick={() => { setActiveTab('today') }}>\n <Icon name=\"today\" className={styles.tabIcon} />\n {t('tabToday')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'library' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'library'}\n onClick={() => { setActiveTab('library') }}>\n <Icon name=\"library\" className={styles.tabIcon} />\n {t('tabLibrary')}\n <small>{t('tabLibraryCount', { n: list?.total ?? 0 })}</small>\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'corridor' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'corridor'}\n onClick={() => { setActiveTab('corridor') }}>\n <Icon name=\"corridor\" className={styles.tabIcon} />\n {t('tabCorridor')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'episodes' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'episodes'}\n onClick={() => { setActiveTab('episodes') }}>\n <Icon name=\"episodes\" className={styles.tabIcon} />\n {t('tabEpisodes')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'entities' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'entities'}\n onClick={() => { setActiveTab('entities') }}>\n <Icon name=\"entities\" className={styles.tabIcon} />\n {t('tabEntities')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'log' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'log'}\n onClick={() => { setActiveTab('log') }}>\n <Icon name=\"log\" className={styles.tabIcon} />\n {t('tabLog')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'backfill' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'backfill'}\n onClick={() => { setActiveTab('backfill') }}>\n <Icon name=\"backfill\" className={styles.tabIcon} />\n {t('tabBackfill')}\n </button>\n <button type=\"button\" role=\"tab\"\n className={activeTab === 'jev' ? `${styles.tabItem} ${styles.on}` : styles.tabItem}\n aria-selected={activeTab === 'jev'}\n onClick={() => { setActiveTab('jev') }}>\n <Icon name=\"jev\" className={styles.tabIcon} />\n {t('tabJev')}\n </button>\n </div>\n\n {activeTab === 'library' && (\n <div className={styles.tabPanel}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabLibrary')}</h4>\n </div>\n {/* 工具行:搜索占主宽,状态与排序靠右;房间筛选另起一行 chips,避免六项分段挤断换行。 */}\n <div className={styles.toolbarRow}>\n <input className={`${styles.input} ${styles.search}`} placeholder={t('searchPlaceholder')} value={q}\n onChange={event => { setQ(event.target.value.trim()); setOffset(0); setExpanded(null); clearSelection() }} />\n <div className={styles.segGroup}>\n {([\n ['all', t('allStatuses')],\n ['active', t('statusActive')],\n ['archived', t('statusArchived')],\n ['forgotten', t('statusForgotten')],\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={status === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setStatus(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n {/* 今日到期:复习调度今天到期的条目(消费者是 agent,这里只做观测筛选)。 */}\n <div className={styles.segGroup}>\n <button type=\"button\" aria-pressed={dueOnly}\n className={dueOnly ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setDueOnly(!dueOnly); setOffset(0); setExpanded(null); clearSelection() }}>\n {t('filterDueToday')}\n </button>\n </div>\n <div className={styles.segGroup}>\n {([['time', t('sortTime')], ['tour', t('sortTour')]] as const).map(([value, label]) => (\n <button key={value} type=\"button\"\n className={sort === value ? `${styles.segItem} ${styles.on}` : styles.segItem}\n onClick={() => { setSort(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n </div>\n <div className={styles.chipRow}>\n {([\n ['all', t('allKinds')],\n ...KINDS.map(option => [option, kindLabel(t, option)] as const),\n ] as const).map(([value, label]) => (\n <button key={value} type=\"button\" aria-pressed={kind === value}\n className={kind === value ? `${styles.chip} ${styles.chipOn}` : styles.chip}\n onClick={() => { setKind(value); setOffset(0); setExpanded(null); clearSelection() }}>\n {label}\n </button>\n ))}\n </div>\n\n {selected.size > 0 && (\n <div className={styles.batchBar}>\n <span>{t('selectedCount', { n: selected.size })}</span>\n <button type=\"button\" className={styles.button} onClick={toggleAllPage}>\n {allSelected ? t('deselectAll') : t('selectAll')}\n </button>\n <button type=\"button\" className={styles.button} disabled={restorable === 0}\n onClick={() => runBatch('restore')}>{t('batchRestore', { n: restorable })}</button>\n <button type=\"button\"\n className={confirmForget ? `${styles.button} ${styles.danger}` : styles.button}\n disabled={forgetable === 0}\n onClick={armBatchForget}>\n {confirmForget ? t('batchForgetConfirm', { n: forgetable }) : t('batchForget', { n: forgetable })}\n </button>\n <button type=\"button\" className={styles.button} onClick={clearSelection}>{t('clearSelection')}</button>\n </div>\n )}\n\n {error !== null && (\n <div className={styles.empty}>\n <b>{t('loadFailed', { msg: error })}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n {error === null && list === null && (\n <div className={styles.skeletonList}>\n {[0, 1, 2, 3].map(index => (\n <div key={index} className={styles.skeleton} style={{ animationDelay: `${String(index * 60)}ms` }}><i /><i /><i /></div>\n ))}\n </div>\n )}\n {error === null && list !== null && pageRecords.length === 0 && (\n <div className={styles.empty}>\n <b>{t('empty')}</b>\n <span>{t('emptyHint')}</span>\n </div>\n )}\n\n {pageRecords.length > 0 && (\n <div className={styles.itemList}>\n {pageRecords.map((record, index) => (\n <div key={record.id}\n className={selected.has(record.id) ? `${styles.item} ${styles.selected}` : styles.item}\n style={{ animationDelay: `${String(Math.min(index, 12) * 36)}ms` }}>\n <input type=\"checkbox\" className={styles.itemCheck} checked={selected.has(record.id)}\n aria-label={record.content.slice(0, 24)} onChange={() => toggleSelect(record.id)} />\n <div className={styles.itemBody}>\n <div className={styles.itemTags}>\n <span className={`${styles.pill} ${styles[`status${record.status.charAt(0).toUpperCase()}${record.status.slice(1)}`] ?? ''}`}>{t(STATUS_KEY[record.status])}</span>\n <span className={roomPillClass(record.kind)}>{kindLabel(t, record.kind)}</span>\n {record.slot !== undefined && (\n <span className={styles.pill}>{record.slot.room}#{record.slot.index}</span>\n )}\n {record.content.includes('[REDACTED:') && (\n <span className={`${styles.pill} ${styles.redacted}`}>{t('tagRedacted')}</span>\n )}\n {record.outcome !== undefined && (\n <span className={`${styles.pill} ${record.outcome === 'success' ? styles.outcomeSuccess : styles.outcomeFailure}`}>\n {record.outcome === 'success' ? t('tagOutcomeSuccess') : t('tagOutcomeFailure')}\n </span>\n )}\n <span className={styles.itemStamp} title={fmtTime(record.createdAt)}>\n {t(SCOPE_KEY[record.scope])} · {relTime(t, record.createdAt)}\n </span>\n </div>\n <div className={styles.content}>{record.content}</div>\n <div className={styles.itemMeta}>\n <span><b>{t('importance')}</b> {record.importance.toFixed(2)}</span>\n <span><b>{t('confidence')}</b> {record.confidence.toFixed(2)}</span>\n <span>{t('accessCount', { n: record.accessCount })}</span>\n <span>{sourceLabel(t, record)}</span>\n </div>\n </div>\n <div className={styles.itemOps}>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('review', record) }}>{t('detail')}</button>\n <button type=\"button\" className={styles.button}\n onClick={() => { toggle('edit', record) }}>{t('edit')}</button>\n {record.status === 'active'\n ? <button type=\"button\" className={styles.button}\n onClick={() => { act('forget', record) }}>{t('forget')}</button>\n : <button type=\"button\" className={styles.button}\n onClick={() => { act('restore', record) }}>{t('restore')}</button>}\n </div>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.pager}>\n <button type=\"button\" className={styles.button} disabled={offset === 0} aria-label={t('prevPage')}\n onClick={() => { setOffset(Math.max(0, offset - PAGE_SIZE)); setExpanded(null); clearSelection() }}>‹</button>\n <span>{t('pagerInfo', { page, pages, total: list?.total ?? 0 })}</span>\n <button type=\"button\" className={styles.button} disabled={list === null || offset + PAGE_SIZE >= list.total}\n aria-label={t('nextPage')}\n onClick={() => { setOffset(offset + PAGE_SIZE); setExpanded(null); clearSelection() }}>›</button>\n </div>\n </div>\n )}\n\n {activeTab === 'today' && (\n <div className={styles.tabPanel}>\n {/* 今日速览:主指标 + 健康环,替代原常驻日报条。 */}\n <TodayHero t={t} overview={overview} dueCount={dueCount} />\n <div className={styles.layout}>\n {/* 左:入殿导航(进宫的入口);右:房间目录 + 翻新清单(要看的与要做的)。\n 今日到期不再单独成卡:消费者是 agent(review 工具链),面板只在速览条显示计数、在陈展提供筛选。 */}\n <div className={styles.mainCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tourProposalTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <TourProposalCard t={t} scope={scope} project={projectSelector} onSelect={openReview} />\n </div>\n </section>\n </div>\n <aside className={styles.sideCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('profileTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <ProfileCard t={t} scope={scope} project={projectSelector} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('roomsTitle')}</h4>\n <span className={styles.sectionHint}>{t('roomsHint')}</span>\n </div>\n <div className={styles.panelCard}>\n <RoomDirectory t={t} byKind={overview.byKind} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('refurbTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <RefurbCard t={t} scope={scope} project={projectSelector} onSelect={openReview} onAfterAction={reload} toast={toast} />\n </div>\n </section>\n </aside>\n </div>\n </div>\n )}\n\n {activeTab === 'corridor' && (\n <div className={styles.tabPanel}>\n {/* 纵向堆叠:先看走廊结构(鸟瞰),再进检索实验台;两块都吃满宽度,图与命中行不被压窄。 */}\n <div className={styles.mainCol}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('sectionCorridor')}</h4>\n </div>\n <div className={styles.panelCard}>\n <CorridorPanel t={t} scope={scope} project={projectSelector} onSelect={openReview} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('benchTitle')}</h4>\n <span className={styles.sectionHint}>{t('benchNote')}</span>\n </div>\n <div className={styles.panelCard}>\n <RecallBench t={t} scope={scope} />\n </div>\n </section>\n </div>\n </div>\n )}\n\n {activeTab === 'episodes' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabEpisodes')}</h4>\n <span className={styles.sectionHint}>{t('episodeHint')}</span>\n </div>\n <EpisodeTimelineView t={t} scope={scope} project={projectSelector} reloadTick={reloadTick} />\n </section>\n </div>\n )}\n\n {activeTab === 'entities' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabEntities')}</h4>\n <span className={styles.sectionHint}>{t('entityHint')}</span>\n </div>\n <EntityView t={t} scope={scope} project={projectSelector} reloadTick={reloadTick} />\n </section>\n </div>\n )}\n\n {activeTab === 'log' && (\n <div className={styles.tabPanel}>\n <LogPanel t={t} telemetry={overview.telemetry} project={projectSelector} />\n </div>\n )}\n\n {activeTab === 'backfill' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('backfillRulesTitle')}</h4>\n </div>\n <div className={styles.panelCard}>\n <HistoryBackfillCard t={t} toast={toast} />\n </div>\n </section>\n </div>\n )}\n\n {activeTab === 'jev' && (\n <div className={styles.tabPanel}>\n <section className={styles.section}>\n <div className={styles.sectionHead}>\n <h4 className={styles.sectionTitle}>{t('tabJev')}</h4>\n </div>\n <div className={styles.panelCard}>\n <JevConfigCard t={t} toast={toast} />\n </div>\n </section>\n <section className={styles.section}>\n <div className={styles.panelCard}>\n <JevObservationsCard t={t} toast={toast} />\n </div>\n </section>\n </div>\n )}\n\n {/* Drawer:行内展开升级为右滑入聚焦态,避免列表被展开压塌。 */}\n {expanded !== null && (\n <>\n <div className={styles.drawerScrim} onClick={() => { setExpanded(null) }} />\n <aside className={styles.drawer} role=\"dialog\" aria-label={t('drawerTitle')}>\n <header className={styles.drawerHead}>\n <div className={styles.drawerTitle}>\n <h3>{t('drawerTitle')}</h3>\n <span title={expanded.record.id}>\n {`#${expanded.record.id.slice(0, 8)}…`}\n </span>\n </div>\n <button type=\"button\" className={styles.drawerClose} aria-label={t('drawerClose')}\n onClick={() => { setExpanded(null) }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 2 L12 12 M12 2 L2 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\n </svg>\n </button>\n </header>\n <div className={styles.drawerBody}>\n {expanded.kind === 'review'\n ? <ReviewBody t={t} recordId={expanded.record.id} scope={expanded.record.scope} project={projectSelector} />\n : <EditForm t={t} record={expanded.record} onClose={() => { setExpanded(null) }}\n onSaved={() => { setExpanded(null); reload() }} toast={toast} />}\n </div>\n </aside>\n </>\n )}\n {/* Toast 叠层(右上角,position:fixed 脱离 panel 容器)。 */}\n {toast.viewport}\n </div>\n )\n}\n\n/**\n * 注册用的薄包装:把**可选取用**的宿主服务经闭包带进 props。\n * 放在 .tsx 里是因为 index.ts 不能写 JSX;服务缺席时照常渲染(chip 显示「无工作区信息」)。\n * 服务按**渲染期现取**(getter 而非实例):宿主工作区/会话服务可能在插件 apply 之后才挂载。\n * @param services - 取宿主服务的 getter(workspaces / sessions,均可缺席)。\n * @returns 与注册席位兼容的组件(只吃 locale 的 t,其余 props 原样忽略)。\n */\nexport function bindEngramSection(services: {\n readonly workspaces: () => WorkspacesLike | undefined\n readonly sessions: () => SessionsLike | undefined\n}): (props: PropsLocale<typeof NS>) => React.ReactElement {\n return function EngramSectionBound(props: PropsLocale<typeof NS>): React.ReactElement {\n return <EngramSection {...props} workspaces={services.workspaces()} sessions={services.sessions()} />\n }\n}\n","/**\n * dsh-engram client half: 注册设置页「记忆库」section。\n * 数据经回环 API(/api/engram/*)读取与操作,与 host 半的路由对齐。\n * 文案经宿主 locale 服务(zh/en 词典,语言切换由渲染器自动重渲染)。\n * @module @kenz1117/dsh-engram/client\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\n// Type-only: ctx.locale 服务声明(宿主 locale 插件的 Context merge)。\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: ctx.slots(renderer 的 SlotMap 渲染接线)。\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\n// Type-only: settings.section 槽位的 SlotMap merge(ui-settings 契约)。\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\n// Type-only: LocaleNamespaceMap 声明合并目标(t 席位的键类型检查)。\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport { bindEngramSection } from './EngramPanel.tsx'\nimport type { SessionsLike, WorkspacesLike } from './EngramPanel.tsx'\nimport { NS, en, zh, type EngramKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n [NS]: EngramKey\n }\n}\n\n/** 必需服务:slots 渲染接线 + locale 词典注册。 */\nexport const inject = ['slots', 'locale']\n\n/**\n * Client plugin body: 注册 zh/en 词典与设置页「记忆库」section(order 20,\n * 排在 general/models/plugins 之后)。\n *\n * 面板的「项目宫殿」跟随 GUI 当前工作区,需要宿主的工作区/会话清单服务;\n * 两者都**可选取用**(`ctx.get`,不写进必需 inject):缺席时面板其余功能照常,\n * 只有项目宫殿来源 chip 显示「无工作区信息(进程默认)」。\n * @param ctx - client root context.\n */\nexport function apply(ctx: Context): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-engram: dictionaries')\n const t = ctx.locale.bind(NS)\n // 可选服务:按运行时形状取用(不硬依赖 @deepseek-ai/dsh-api-* 客户端包);\n // 用 getter 现取而不是 apply 时取实例——这两个服务可能在本插件之后才挂载。\n const workspaces = (): WorkspacesLike | undefined => ctx.get('workspaces' as never) as WorkspacesLike | undefined\n const sessions = (): SessionsLike | undefined => ctx.get('sessions' as never) as SessionsLike | undefined\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'engram',\n order: 20,\n label: () => t('nav'),\n locale: NS,\n }, bindEngramSection({ workspaces, sessions })))\n}\n"],"mappings":"44zDAOA,IAAa,EAAK,SAmUL,EAAgD,CAC3D,KAAM,WACN,WAAY,iBACZ,SAAU,eACV,QAAS,cACT,MAAO,WACT,EAIa,EAAgC,CAC3C,IAAK,OACL,UAAW,OACX,aAAc,OACd,YAAa,OACb,cAAe,UACf,mBAAoB,iBACpB,kBAAmB,+BACnB,cAAe,cACf,oBAAqB,SACrB,mBAAoB,eACpB,cAAe,SACf,gBAAiB,UACjB,sBAAuB,SACvB,QAAS,KACT,SAAU,QACV,WAAY,UACZ,OAAQ,KACR,aAAc,OACd,aAAc,YACd,eAAgB,eAChB,iBAAkB,4BAClB,YAAa,OACb,SAAU,OACV,YAAa,OACb,aAAc,MACd,aAAc,MACd,YAAa,MACb,kBAAmB,UACnB,kBAAmB,UACnB,kBAAmB,UACnB,aAAc,OACd,eAAgB,OAChB,gBAAiB,MACjB,SAAU,MACV,eAAgB,MAChB,aAAc,MACd,YAAa,MACb,UAAW,MACX,aAAc,KACd,UAAW,KACX,YAAa,KACb,WAAY,OACZ,WAAY,OACZ,WAAY,QACZ,YAAa,YACb,aAAc,OACd,YAAa,KACb,eAAgB,UAChB,aAAc,UACd,YAAa,SACb,eAAgB,QAChB,cAAe,WACf,MAAO,UACP,aAAc,SACd,OAAQ,KACR,KAAM,KACN,OAAQ,KACR,QAAS,KACT,MAAO,aACP,UAAW,iBACX,WAAY,aACZ,QAAS,OACT,UAAW,qCACX,SAAU,MACV,SAAU,MACV,OAAQ,KACR,aAAc,aACd,iBAAkB,KAClB,aAAc,MACd,gBAAiB,OACjB,iBAAkB,OAClB,gBAAiB,MACjB,cAAe,KACf,eAAgB,KAChB,WAAY,KACZ,YAAa,OACb,eAAgB,YAChB,SAAU,KACV,WAAY,KACZ,YAAa,KACb,OAAQ,KACR,gBAAiB,QACjB,WAAY,OACZ,UAAW,gBACX,kBAAmB,aACnB,aAAc,KACd,eAAgB,MAChB,gBAAiB,KACjB,kBAAmB,KACnB,kBAAmB,KACnB,SAAU,iBACV,WAAY,QACZ,YAAa,KACb,YAAa,OACb,SAAU,KACV,UAAW,KACX,aAAc,KACd,UAAW,MACX,QAAS,KACT,aAAc,QACd,SAAU,KACV,SAAU,KACV,UAAW,KACX,QAAS,OACT,aAAc,MACd,gBAAiB,OACjB,aAAc,OACd,gBAAiB,OACjB,SAAU,OACV,gBAAiB,OACjB,eAAgB,OAChB,aAAc,KACd,eAAgB,OAChB,WAAY,MACZ,oBAAqB,SACrB,kBAAmB,SACnB,mBAAoB,SACpB,cAAe,SACf,eAAgB,aAChB,WAAY,aACZ,eAAgB,4BAChB,eAAgB,OAChB,iBAAkB,OAClB,WAAY,UACZ,gBAAiB,OACjB,kBAAmB,OACnB,iBAAkB,OAClB,UAAW,OACX,YAAa,OACb,cAAe,WACf,YAAa,YACb,mBAAoB,cACpB,aAAc,YACd,eAAgB,OAChB,gBAAiB,OACjB,cAAe,0BACf,eAAgB,SAChB,aAAc,UACd,aAAc,QACd,gBAAiB,4BACjB,eAAgB,OAChB,gBAAiB,KACjB,UAAW,eACX,cAAe,QACf,WAAY,SACZ,YAAa,WACb,gBAAiB,QACjB,gBAAiB,iBACjB,eAAgB,8DAChB,WAAY,KACZ,WAAY,KACZ,gBAAiB,KACjB,iBAAkB,iBAClB,SAAU,KACV,cAAe,OACf,UAAW,WACX,cAAe,cACf,WAAY,OACZ,UAAW,yBACX,OAAQ,MACR,OAAQ,KACR,QAAS,KACT,aAAc,OACd,aAAc,cACd,cAAe,aACf,cAAe,SACf,gBAAiB,OACjB,kBAAmB,OACnB,kBAAmB,iCACnB,iBAAkB,gBAClB,aAAc,KACd,YAAa,OACb,YAAa,iBACb,UAAW,OACX,mBAAoB,KACpB,kBAAmB,KACnB,mBAAoB,KACpB,kBAAmB,KACnB,YAAa,UACb,cAAe,KACf,oBAAqB,oCACrB,mBAAoB,oDACpB,iBAAkB,MAClB,gBAAiB,UACjB,mBAAoB,aACpB,iBAAkB,YAClB,QAAS,OACT,eAAgB,OAChB,SAAU,MACV,SAAU,QACV,cAAe,sBACf,YAAa,KACb,cAAe,uFACf,mBAAoB,OACpB,aAAc,MACd,gBAAiB,KACjB,iBAAkB,QAClB,iBAAkB,UAClB,iBAAkB,UAClB,cAAe,OACf,kBAAmB,eACnB,yBAA0B,UAC1B,sBAAuB,SACvB,qBAAsB,sBACtB,mBAAoB,OACpB,sBAAuB,KACvB,mBAAoB,WACpB,qBAAsB,YACtB,gBAAiB,cACjB,sBAAuB,wFACvB,kBAAmB,qCACnB,cAAe,OACf,cAAe,KACf,qBAAsB,OACtB,kBAAmB,MACnB,uBAAwB,eACxB,oBAAqB,KACrB,yBAA0B,oBAC1B,sBAAuB,oBACvB,gBAAiB,WACjB,qBAAsB,WACtB,oBAAqB,WACrB,iBAAkB,OAClB,mBAAoB,QACpB,oBAAqB,OACrB,kBAAmB,wGACnB,gBAAiB,OACjB,aAAc,MACd,cAAe,OACf,cAAe,QACf,YAAa,MACb,WAAY,MACZ,YAAa,QACb,eAAgB,WAChB,cAAe,OACf,gBAAiB,uBACjB,cAAe,+BACf,kBAAmB,8CACnB,aAAc,mBACd,aAAc,gBACd,iBAAkB,4DAClB,eAAgB,cAChB,eAAgB,YAChB,kBAAmB,KACnB,sBAAuB,KACvB,gBAAiB,OACjB,kBAAmB,OACnB,gBAAiB,WACjB,kBAAmB,SACnB,YAAa,KACb,aAAc,OACd,aAAc,OACd,iBAAkB,YAClB,aAAc,KACd,aAAc,KACd,YAAa,+CACb,gBAAiB,aACjB,iBAAkB,QAClB,sBAAuB,0BACvB,eAAgB,UAChB,cAAe,KACf,mBAAoB,SACpB,mBAAoB,cACpB,aAAc,KACd,YAAa,KACb,WAAY,uCACZ,cAAe,OACf,iBAAkB,KAClB,kBAAmB,KACnB,eAAgB,KAChB,kBAAmB,KACnB,gBAAiB,KACjB,wBAAyB,WACzB,YAAa,UACb,eAAgB,YAChB,WAAY,KACZ,cAAe,KACf,iBAAkB,SAClB,YAAa,4BACb,YAAa,aACb,UAAW,2BACX,UAAW,KACX,YAAa,MACb,OAAQ,KACR,SAAU,qGACV,WAAY,YACZ,YAAa,YACb,aAAc,mBACd,UAAW,SACX,cAAe,iDACf,eAAgB,MAChB,YAAa,SACb,cAAe,iBACf,WAAY,KACZ,SAAU,OACV,aAAc,oBACd,mBAAoB,6BACpB,iBAAkB,sDAClB,QAAS,KACT,SAAU,aACV,cAAe,OACf,QAAS,OACT,UAAW,2BACX,YAAa,eACb,YAAa,yBACb,YAAa,yBACb,iBAAkB,WAClB,eAAgB,MAChB,wBAAyB,OACzB,mBAAoB,KACpB,oBAAqB,KACrB,mBAAoB,KACpB,qBAAsB,OACtB,oBAAqB,MACrB,sBAAuB,KACvB,eAAgB,MAChB,gBAAiB,YACnB,EAIa,EAAgC,CAC3C,IAAK,gBACL,UAAW,iBACX,aAAc,iBACd,YAAa,gBACb,cAAe,8BACf,mBAAoB,6BACpB,kBAAmB,sFACnB,cAAe,mBACf,oBAAqB,yBACrB,mBAAoB,sCACpB,cAAe,wBACf,gBAAiB,eACjB,sBAAuB,4BACvB,QAAS,UACT,SAAU,YACV,WAAY,cACZ,OAAQ,SACR,aAAc,cACd,aAAc,6BACd,eAAgB,mCAChB,iBAAkB,2CAClB,YAAa,eACb,SAAU,YACV,YAAa,eACb,aAAc,WACd,aAAc,aACd,YAAa,WACb,kBAAmB,kBACnB,kBAAmB,kBACnB,kBAAmB,qBACnB,aAAc,iBACd,eAAgB,aAChB,gBAAiB,SACjB,SAAU,YACV,eAAgB,sBAChB,aAAc,mBACd,YAAa,kBACb,UAAW,iBACX,aAAc,UACd,UAAW,OACX,YAAa,SACb,WAAY,SACZ,WAAY,SACZ,WAAY,aACZ,YAAa,aACb,aAAc,SACd,YAAa,WACb,eAAgB,cAChB,aAAc,aACd,YAAa,YACb,eAAgB,iBAChB,cAAe,oBACf,MAAO,WACP,aAAc,eACd,OAAQ,OACR,KAAM,WACN,OAAQ,QACR,QAAS,SACT,MAAO,yBACP,UAAW,gDACX,WAAY,qBACZ,QAAS,WACT,UAAW,2CACX,SAAU,gBACV,SAAU,YACV,OAAQ,SACR,aAAc,iCACd,iBAAkB,UAClB,aAAc,aACd,gBAAiB,YACjB,iBAAkB,cAClB,gBAAiB,gBACjB,cAAe,aACf,eAAgB,cAChB,WAAY,WACZ,YAAa,gBACb,eAAgB,wCAChB,SAAU,QACV,WAAY,SACZ,YAAa,WACb,OAAQ,MACR,gBAAiB,eACjB,WAAY,iBACZ,UAAW,qCACX,kBAAmB,gBACnB,aAAc,MACd,eAAgB,SAChB,gBAAiB,UACjB,kBAAmB,YACnB,kBAAmB,WACnB,SAAU,iDACV,WAAY,kBACZ,YAAa,SACb,YAAa,iBACb,SAAU,WACV,UAAW,OACX,aAAc,SACd,UAAW,UACX,QAAS,SACT,aAAc,YACd,SAAU,YACV,SAAU,SACV,UAAW,WACX,QAAS,WACT,aAAc,aACd,gBAAiB,uBACjB,aAAc,YACd,gBAAiB,iBACjB,SAAU,iBACV,gBAAiB,gBACjB,eAAgB,gBAChB,aAAc,gBACd,eAAgB,mBAChB,WAAY,cACZ,oBAAqB,eACrB,kBAAmB,aACnB,mBAAoB,cACpB,cAAe,eACf,eAAgB,qBAChB,WAAY,qBACZ,eAAgB,kCAChB,eAAgB,oBAChB,iBAAkB,wBAClB,WAAY,WACZ,gBAAiB,kBACjB,kBAAmB,qBACnB,iBAAkB,eAClB,UAAW,qBACX,YAAa,eACb,cAAe,eACf,YAAa,uBACb,mBAAoB,sBACpB,aAAc,wBACd,eAAgB,kBAChB,gBAAiB,oBACjB,cAAe,6EACf,eAAgB,0BAChB,aAAc,6BACd,aAAc,wBACd,gBAAiB,uCACjB,eAAgB,aAChB,gBAAiB,cACjB,UAAW,+BACX,cAAe,gBACf,WAAY,mBACZ,YAAa,8BACb,gBAAiB,cACjB,gBAAiB,6CACjB,eAAgB,sLAChB,WAAY,SACZ,WAAY,YACZ,gBAAiB,eACjB,iBAAkB,qCAClB,SAAU,OACV,cAAe,cACf,UAAW,kBACX,cAAe,kCACf,WAAY,iBACZ,UAAW,kEACX,OAAQ,UACR,OAAQ,WACR,QAAS,OACT,aAAc,WACd,aAAc,uBACd,cAAe,mCACf,cAAe,0BACf,gBAAiB,kBACjB,kBAAmB,gBACnB,kBAAmB,6DACnB,iBAAkB,qCAClB,aAAc,MACd,YAAa,qBACb,YAAa,yCACb,UAAW,UACX,mBAAoB,SACpB,kBAAmB,QACnB,mBAAoB,SACpB,kBAAmB,QACnB,YAAa,kBACb,cAAe,QACf,oBAAqB,4EACrB,mBAAoB,uGACpB,iBAAkB,UAClB,gBAAiB,mBACjB,mBAAoB,uBACpB,iBAAkB,sBAClB,QAAS,YACT,eAAgB,YAChB,SAAU,UACV,SAAU,gBACV,cAAe,iDACf,YAAa,WACb,cAAe,wRACf,mBAAoB,eACpB,aAAc,cACd,gBAAiB,MACjB,iBAAkB,WAClB,iBAAkB,wBAClB,iBAAkB,oBAClB,cAAe,kBACf,kBAAmB,gCACnB,yBAA0B,4BAC1B,sBAAuB,0BACvB,qBAAsB,qDACtB,mBAAoB,cACpB,sBAAuB,WACvB,mBAAoB,yBACpB,qBAAsB,oBACtB,gBAAiB,6BACjB,sBAAuB,uHACvB,kBAAmB,4HACnB,cAAe,iBACf,cAAe,QACf,qBAAsB,WACtB,kBAAmB,WACnB,uBAAwB,kCACxB,oBAAqB,SACrB,yBAA0B,0BAC1B,sBAAuB,uBACvB,gBAAiB,uBACjB,qBAAsB,oBACtB,oBAAqB,mBACrB,iBAAkB,WAClB,mBAAoB,cACpB,oBAAqB,UACrB,kBAAmB,qQACnB,gBAAiB,eACjB,aAAc,WACd,cAAe,oBACf,cAAe,kBACf,YAAa,mBACb,WAAY,eACZ,YAAa,kBACb,eAAgB,oBAChB,cAAe,kBACf,gBAAiB,gCACjB,cAAe,uCACf,kBAAmB,mEACnB,aAAc,wBACd,aAAc,yBACd,iBAAkB,qIAClB,eAAgB,yBAChB,eAAgB,iCAChB,kBAAmB,SACnB,sBAAuB,WACvB,gBAAiB,eACjB,kBAAmB,kBACnB,gBAAiB,iCACjB,kBAAmB,yBACnB,YAAa,WACb,aAAc,YACd,aAAc,UACd,iBAAkB,wBAClB,aAAc,QACd,aAAc,QACd,YAAa,2KACb,gBAAiB,4BACjB,iBAAkB,oBAClB,sBAAuB,uEACvB,eAAgB,eAChB,cAAe,SACf,mBAAoB,2BACpB,mBAAoB,gDACpB,aAAc,WACd,YAAa,WACb,WAAY,8GACZ,cAAe,YACf,iBAAkB,SAClB,kBAAmB,WACnB,eAAgB,QAChB,kBAAmB,WACnB,gBAAiB,QACjB,wBAAyB,0BACzB,YAAa,eACb,eAAgB,sBAChB,WAAY,OACZ,cAAe,UACf,iBAAkB,qBAClB,YAAa,wFACb,YAAa,cACb,UAAW,gFACX,UAAW,SACX,YAAa,aACb,OAAQ,MACR,SAAU,4VACV,WAAY,0BACZ,YAAa,0BACb,aAAc,2DACd,UAAW,UACX,cAAe,wGACf,eAAgB,iBAChB,YAAa,mBACb,cAAe,uDACf,WAAY,WACZ,SAAU,qBACV,aAAc,2BACd,mBAAoB,uEACpB,iBAAkB,4EAClB,QAAS,OACT,SAAU,yCACV,cAAe,iBACf,QAAS,kBACT,UAAW,+CACX,YAAa,6BACb,YAAa,oEACb,YAAa,+EACb,iBAAkB,sCAClB,eAAgB,OAChB,wBAAyB,gBACzB,mBAAoB,QACpB,oBAAqB,SACrB,mBAAoB,QACpB,qBAAsB,UACtB,oBAAqB,SACrB,sBAAuB,WACvB,eAAgB,YAChB,gBAAiB,gBACnB,EC97BA,SAAS,EAAU,EAAc,EAAsB,CACrD,IAAM,EAAM,EAAS,GACrB,OAAO,IAAQ,IAAA,GAAY,EAAO,EAAE,CAAgB,CACtD,CAqBA,IAAM,EAAiD,CACrD,KAAM,UACN,WAAY,UACZ,SAAU,UACV,QAAS,UACT,MAAO,SACT,EAIM,EAAkD,CACtD,QAAW,CAAE,MAAO,2BAA6B,KAAM,IAAA,GAAW,MAAO,CAAE,EAC3E,QAAW,CAAE,MAAO,2BAA6B,KAAM,IAAA,GAAW,MAAO,CAAE,EAC3E,SAAW,CAAE,MAAO,2BAA6B,KAAM,IAAA,GAAW,MAAO,CAAE,EAC3E,WAAW,CAAE,MAAO,2BAA4B,KAAM,IAAA,GAAW,MAAO,GAAI,EAC5E,YAAY,CAAE,MAAO,2BAA4B,KAAM,MAAW,MAAO,GAAI,CAC/E,EAuBA,SAAS,EAAW,EAAyB,CAC3C,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAI,GAAK,EAAE,WAAa,EAAE,UAAU,CAAC,CACvE,CAGA,SAAS,EAAK,EAAyB,EAAgC,EAAe,EAAgB,EAAqB,CACzH,IAGM,EAAW,KAGjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,GAAK,EAAG,CACxC,IAAM,EAAI,EAAM,GAChB,IAAK,IAAI,EAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,GAAK,EAAG,CAC5C,IAAM,EAAI,EAAM,GACV,EAAK,EAAE,EAAI,EAAE,EACb,EAAK,EAAE,EAAI,EAAE,EACb,EAAO,KAAK,KAAK,EAAK,EAAK,EAAK,CAAE,EAAI,IACtC,EAAS,KAAY,GAAU,EAAO,GACtC,EAAM,EAAK,EAAQ,EACnB,EAAM,EAAK,EAAQ,EACzB,EAAE,IAAM,EACR,EAAE,IAAM,EACR,EAAE,IAAM,EACR,EAAE,IAAM,CACV,CACF,CAEA,IAAM,EAAU,IAAI,IAA4B,EAAM,IAAI,GAAK,CAAC,EAAE,GAAI,CAAC,CAAC,CAAC,EACzE,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAI,EAAQ,IAAI,EAAK,IAAI,EACzB,EAAI,EAAQ,IAAI,EAAK,EAAE,EAC7B,GAAI,IAAM,IAAA,IAAa,IAAM,IAAA,GAAW,SACxC,IAAM,EAAK,EAAE,EAAI,EAAE,EACb,EAAK,EAAE,EAAI,EAAE,EACb,EAAO,KAAK,KAAK,EAAK,EAAK,EAAK,CAAE,EAAI,IACtC,GAAS,EAAO,IAAc,IAAW,EACzC,EAAM,EAAK,EAAQ,EACnB,EAAM,EAAK,EAAQ,EACzB,EAAE,IAAM,EACR,EAAE,IAAM,EACR,EAAE,IAAM,EACR,EAAE,IAAM,CACV,CAEA,IAAM,EAAQ,CAAC,GAAG,IAAI,IAAI,EAAM,IAAI,GAAK,EAAE,IAAI,CAAC,CAAC,EAC3C,EAAO,EAAQ,KAAK,IAAI,EAAM,OAAQ,CAAC,EAC7C,IAAK,IAAM,KAAK,EAAO,CACrB,GAAI,EAAE,MAAO,SACb,EAAE,KAAO,EAAQ,EAAI,EAAE,GAAK,EAAW,EACvC,EAAE,KAAO,EAAS,EAAI,EAAE,GAAK,EAAW,EACxC,IAAM,EAAM,EAAM,QAAQ,EAAE,IAAI,EAChC,GAAI,GAAO,EAAG,CACZ,IAAM,EAAS,GAAQ,EAAM,IAC7B,EAAE,KAAO,EAAS,EAAE,GAAK,KAAU,CACrC,CACF,CAEA,IAAM,EAAU,IAChB,IAAK,IAAM,KAAK,EAAO,CACrB,GAAI,EAAE,MAAO,CAAE,EAAE,GAAK,EAAG,EAAE,GAAK,EAAG,QAAS,CAC5C,EAAE,IAAM,EACR,EAAE,IAAM,EACR,EAAE,EAAI,KAAK,IAAI,GAAI,KAAK,IAAI,EAAQ,GAAI,EAAE,EAAI,EAAE,EAAE,CAAC,EACnD,EAAE,EAAI,KAAK,IAAI,GAAI,KAAK,IAAI,EAAS,GAAI,EAAE,EAAI,EAAE,EAAE,CAAC,CACtD,CACF,CAGA,SAAgB,EAAY,EAAuC,CACjE,GAAM,CAAE,QAAO,QAAO,QAAO,WAAU,aAAY,KAAM,EAInD,GAAA,EAAcA,EAAAA,QAAAA,KAAc,CAChC,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAK,EAAO,EAAI,IAAI,EAAE,GAAI,IAAI,GAAK,EAC9C,IAAK,IAAM,KAAK,EACT,EAAI,IAAI,EAAE,IAAI,GAAG,EAAI,IAAI,EAAE,KAAM,IAAI,GAAK,EAC1C,EAAI,IAAI,EAAE,EAAE,GAAG,EAAI,IAAI,EAAE,GAAI,IAAI,GAAK,EAC3C,EAAI,IAAI,EAAE,IAAI,CAAC,CAAE,IAAI,EAAE,EAAE,EACzB,EAAI,IAAI,EAAE,EAAE,CAAC,CAAE,IAAI,EAAE,IAAI,EAE3B,OAAO,CACT,EAAG,CAAC,EAAO,CAAK,CAAC,EAEX,GAAA,EAAeA,EAAAA,QAAAA,KAAgC,CACnD,IAAM,EAAQ,CAAC,GAAG,IAAI,IAAI,EAAM,IAAI,GAAK,EAAE,IAAI,CAAC,CAAC,EAC3C,EAAO,IAAQ,KAAK,IAAI,EAAM,OAAQ,CAAC,EAC7C,OAAO,EAAM,KAAK,EAAG,KAAW,CAC9B,GAAG,EACH,EAAG,EAAM,QAAQ,EAAE,IAAI,GAAK,EAAI,GAAQ,EAAM,QAAQ,EAAE,IAAI,EAAI,IAAO,IACvE,EAAG,GAAO,EAAQ,GAAO,IACzB,GAAI,EAAG,GAAI,EACX,EAAG,EAAW,CAAC,EACf,MAAO,EACT,EAAE,CACJ,EAAG,CAAC,EAAO,IAAO,GAAM,CAAC,EACnB,GAAA,EAAeC,EAAAA,OAAAA,CAAyB,EAAa,IAAI,IAAM,CAAE,GAAG,CAAE,EAAE,CAAC,EACzE,EAAG,IAAA,EAAeC,EAAAA,SAAAA,CAAS,CAAC,EAC5B,GAAA,EAAUD,EAAAA,OAAAA,CAAsB,IAAI,EACpC,GAAA,EAAUA,EAAAA,OAAAA,CAAO,CAAC,GAGxB,EAAA,EAAA,UAAA,KAAgB,CACd,EAAa,QAAU,EAAa,IAAI,IAAM,CAAE,GAAG,CAAE,EAAE,EACvD,EAAQ,QAAU,EAClB,EAAY,GAAS,EAAQ,CAAC,CAChC,EAAG,CAAC,CAAY,CAAC,GAEjB,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,MAAmB,CACvB,IAAM,EAAW,EAAa,QAC9B,EAAQ,SAAW,EACnB,IAAM,EAAQ,KAAK,IAAI,GAAK,EAAK,EAAQ,QAAU,IAAc,EAAG,EACpE,EAAK,EAAU,EAAO,IAAO,IAAQ,CAAK,EAE1C,EAAa,QAAU,EAAS,IAAI,IAAM,CAAE,GAAG,CAAE,EAAE,EACnD,EAAY,GAAS,EAAQ,CAAC,EAC1B,EAAQ,QAAU,MAAY,EAAQ,QAAU,sBAAsB,CAAI,EAChF,EAEA,MADA,GAAQ,QAAU,sBAAsB,CAAI,MAC/B,CAAM,EAAQ,UAAY,MAAM,qBAAqB,EAAQ,OAAO,CAAE,CAErF,EAAG,CAAC,EAAc,CAAK,CAAC,EACxB,IAAM,EAAY,EAAa,QACzB,GAAA,EAASD,EAAAA,QAAAA,KAAc,IAAI,IAAI,EAAU,IAAI,GAAK,CAAC,EAAE,GAAI,CAAC,CAAC,CAAC,EAAG,CAAC,CAAS,CAAC,EAC1E,GAAA,EAAYA,EAAAA,QAAAA,KAAc,CAAC,GAAG,IAAI,IAAI,EAAM,IAAI,GAAK,EAAE,IAAI,CAAC,CAAC,EAAG,CAAC,CAAK,CAAC,EAEvE,CAAC,EAAS,IAAA,EAAcE,EAAAA,SAAAA,CAAwB,IAAI,EACpD,GAAA,EAAiBF,EAAAA,QAAAA,KACjB,IAAY,KAAa,KACtB,EAAY,IAAI,CAAO,GAAK,IAAI,IACtC,CAAC,EAAS,CAAW,CAAC,EACnB,EAAW,GAAyB,IAAY,MAAQ,IAAQ,GAAW,EAAE,GAAgB,IAAI,CAAG,GAAK,IACzG,EAAqB,GACrB,IAAY,KAAa,GACtB,EAAE,OAAS,GAAW,EAAE,KAAO,EAGlC,GAAA,EAASC,EAAAA,OAAAA,CAA6B,IAAI,EAC1C,GAAA,EAAYA,EAAAA,OAAAA,CAAsB,IAAI,EACtC,GAAe,EAAiB,IAAqD,CACzF,IAAM,EAAM,EAAO,QACnB,GAAI,IAAQ,KAAM,OAAO,KACzB,IAAM,EAAO,EAAI,sBAAsB,EAEjC,EAAS,IAAQ,EAAK,MACtB,EAAS,IAAS,EAAK,OAC7B,MAAO,CAAE,GAAI,EAAU,EAAK,MAAQ,EAAQ,GAAI,EAAU,EAAK,KAAO,CAAO,CAC/E,EACM,GAAmB,EAAsC,IAAyB,CACtF,EAAM,eAAe,EACrB,EAAU,QAAU,EACpB,IAAM,EAAO,EAAa,QAAQ,KAAK,GAAK,EAAE,KAAO,CAAM,EACvD,IAAS,IAAA,KAAW,EAAK,MAAQ,GACvC,EAmCA,OAlCA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAc,GAA4B,CAC9C,IAAM,EAAK,EAAU,QACrB,GAAI,IAAO,KAAM,OACjB,IAAM,EAAM,EAAY,EAAM,QAAS,EAAM,OAAO,EACpD,GAAI,IAAQ,KAAM,OAClB,IAAM,EAAO,EAAa,QAAQ,KAAK,GAAK,EAAE,KAAO,CAAE,EACnD,IAAS,IAAA,KACb,EAAK,EAAI,KAAK,IAAI,GAAI,KAAK,IAAI,IAAY,EAAI,CAAC,CAAC,EACjD,EAAK,EAAI,KAAK,IAAI,GAAI,KAAK,IAAI,IAAa,EAAI,CAAC,CAAC,EAClD,EAAK,GAAK,EACV,EAAK,GAAK,EACV,EAAY,GAAS,EAAQ,CAAC,EAChC,EACM,MAAuB,CAC3B,IAAM,EAAK,EAAU,QACrB,GAAI,IAAO,KAAM,OACjB,IAAM,EAAO,EAAa,QAAQ,KAAK,GAAK,EAAE,KAAO,CAAE,EACnD,IAAS,IAAA,KAAW,EAAK,MAAQ,IACrC,EAAU,QAAU,IACtB,EAGA,OAFA,OAAO,iBAAiB,YAAa,CAAU,EAC/C,OAAO,iBAAiB,UAAW,CAAQ,MAC9B,CACX,OAAO,oBAAoB,YAAa,CAAU,EAClD,OAAO,oBAAoB,UAAW,CAAQ,CAChD,CAEF,EAAG,CAAC,CAAC,EAED,EAAM,SAAW,GACZ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWE,EAAO,MAAQ,SAAA,EAAE,eAAe,CAAO,CAAA,GAI9D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAQ,QAAS,cAA0C,UAAWA,EAAO,IACrF,oBAAoB,gBAAgB,KAAK,MAAM,aAAY,EAAE,cAAc,EAD7E,SAAA,CAGG,EAAU,KAAK,EAAM,IAAQ,CAC5B,IAAM,EAAO,IAAQ,KAAK,IAAI,EAAU,OAAQ,CAAC,EACjD,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAiB,EAAG,EAAO,EAAK,EAAG,EAAG,MAAO,EAAc,WAAQ,KAAM,EAAM,GAAM,EAAI,yBAA2B,aAAgB,EAAzH,CAAyH,CAC7I,CAAC,EAEA,EAAU,KAAK,EAAM,IAAQ,CAC5B,IAAM,EAAO,IAAQ,KAAK,IAAI,EAAU,OAAQ,CAAC,EACjD,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAA4B,EAAG,GAAQ,EAAM,IAAM,EAAG,GAAI,WAAW,SACnE,KAAK,wBAAwB,SAAS,KAAK,WAAW,2BACrD,SAAA,EAAU,EAAG,CAAI,CACd,EAHK,GAAG,EAAK,OAGb,CAEV,CAAC,EAGA,EAAM,KAAK,EAAM,IAAQ,CACxB,IAAM,EAAI,EAAO,IAAI,EAAK,IAAI,EACxB,EAAI,EAAO,IAAI,EAAK,EAAE,EAC5B,GAAI,IAAM,IAAA,IAAa,IAAM,IAAA,GAAW,OAAO,KAC/C,IAAM,EAAQ,EAAW,EAAK,OAAS,EAAW,QAC5C,EAAc,EAAkB,CAAI,EACpC,EAAQ,IAAY,MAAQ,CAAC,EACnC,GAAI,EAAa,CAEf,IAAM,GAAM,EAAE,EAAI,EAAE,GAAK,EACnB,GAAM,EAAE,EAAI,EAAE,GAAK,EACnB,EAAK,EAAE,EAAI,EAAE,EACb,EAAK,EAAE,EAAI,EAAE,EACb,EAAS,KAAK,KAAK,EAAK,EAAK,EAAK,CAAE,GAAK,EACzC,EAAW,CAAC,EAAK,EAAU,EAC3B,EAAW,EAAK,EAAU,EAChC,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAoB,EAAG,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,EAAK,CAAO,EAAE,GAAG,OAAO,EAAK,CAAO,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,IACnI,KAAK,OAAO,OAAQ,EAAM,MAC1B,YAAa,EAAM,MAAQ,IAAK,gBAAiB,EAAM,KACvD,MAAO,CAAE,WAAY,uCAAwC,EAC7D,UAAA,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,GAAG,EAAE,MAAM,KAAK,EAAK,KAAK,MAAM,EAAE,OAAe,CAAA,CACrD,EALK,EAAK,EAKV,CAEV,CACA,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAoB,GAAI,EAAE,EAAG,GAAI,EAAE,EAAG,GAAI,EAAE,EAAG,GAAI,EAAE,EACnD,OAAQ,EAAM,MAAO,YAAa,EAAM,MACxC,gBAAiB,EAAM,KAAM,QAAS,EAAQ,GAAM,EACpD,UAAWA,EAAO,SAClB,MAAO,CAAE,WAAY,8CAA+C,eAAgB,GAAG,OAAO,KAAK,IAAI,EAAK,EAAE,EAAI,EAAE,EAAE,GAAI,EAC1H,UAAA,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,GAAG,EAAE,MAAM,KAAK,EAAK,KAAK,MAAM,EAAE,OAAe,CAAA,CACrD,EANK,EAAK,EAMV,CAEV,CAAC,EAEA,EAAU,KAAK,EAAG,IAAU,CAC3B,IAAM,EAAQ,EAAa,EAAE,OAAS,UAChC,EAAa,IAAe,EAAE,GAC9B,EAAY,IAAY,EAAE,GAC1B,EAAQ,EAAQ,EAAE,EAAE,EAC1B,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAc,UAAWA,EAAO,KAAM,UAAW,aAAa,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,GACvF,MAAO,CAAE,OAAQ,EAAU,UAAY,EAAE,GAAK,WAAa,OAAQ,QAAS,EAAQ,IAAO,EAAG,WAAY,qBAAsB,eAAgB,GAAG,OAAO,KAAK,IAAI,EAAO,EAAE,EAAI,EAAE,EAAE,GAAI,EACxL,iBAAoB,CAAE,EAAW,EAAE,EAAE,CAAE,EACvC,iBAAoB,CAAE,EAAW,GAAQ,IAAS,EAAE,GAAK,KAAO,CAAI,CAAE,EACtE,YAAa,GAAS,EAAgB,EAAO,EAAE,EAAE,EACjD,YAAe,IAAW,EAAE,EAAE,EALhC,SAAA,EAOI,GAAa,KACb,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,EAAG,OAAO,EAAE,EAAI,CAAC,EAAG,KAAM,EAAO,YAAa,GAAO,CAAA,GAE/D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,EAAG,OAAO,EAAE,CAAC,EAAG,KAAM,EAAO,YAAa,EAAE,SAAW,SAAW,IAAO,IAC/E,OAAQ,EAAa,iCAAmC,EAAY,EAAQ,wBAC5E,YAAa,EAAa,EAAI,EAAY,IAAM,EAChD,MAAO,CAAE,WAAY,4CAA6C,EAClE,UAAA,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,GAAG,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,OAAO,EAAU,CAAA,CAC7C,CAAA,EACP,IAAc,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,EAAG,OAAO,EAAE,EAAI,CAAC,EAAG,KAAK,OAAO,OAAQ,EAAO,cAAe,GAAK,YAAa,CAAI,CAAA,CAC1G,CAjBK,EAAA,EAAE,EAiBP,CAEP,CAAC,EAEA,IAAY,WAAe,CAC1B,IAAM,EAAO,EAAO,IAAI,CAAO,EAC/B,GAAI,IAAS,IAAA,GAAW,OAAO,KAC/B,IAAM,EAAK,KAAK,IAAI,IAAa,KAAK,IAAI,EAAG,EAAK,EAAI,EAAE,CAAC,EACnD,EAAK,KAAK,IAAI,IAAa,KAAK,IAAI,GAAI,EAAK,EAAI,EAAE,CAAC,EACpD,GAAe,EAAK,SAAW,EAAK,MAAA,CAAO,MAAM,EAAG,GAAG,EAC7D,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,QAAS,UAAW,aAAa,OAAO,CAAE,EAAE,GAAG,OAAO,CAAE,EAAE,GAA/E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAG,EAAG,EAAG,MAAO,IAAK,OAAQ,GAAI,GAAI,EAAG,GAAI,EACnD,KAAK,2BAA2B,OAAO,6BAA6B,YAAa,EAAG,QAAS,GAAO,CAAA,GACtG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAG,EAAG,GAAI,KAAK,iCAAiC,SAAS,KAAK,WAAY,IACjF,WAAW,2BAA4B,SAAA,EAAU,EAAG,EAAK,IAAI,CAAQ,CAAA,GACvE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAG,EAAG,GAAI,KAAK,mCAAmC,SAAS,KAClE,WAAW,2BAA4B,SAAA,GAAG,KAAe,EAAK,SAAW,EAAK,MAAA,CAAO,OAAS,IAAM,IAAM,IAAW,CAAA,CACtH,GAEP,EAAA,CAAG,CACA,CAlGgF,EAAA,CAkGhF,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,OAAvB,SAAA,CACG,EAAU,IAAI,IACb,EAAA,EAAA,KAAA,CAAC,OAAD,CAAiB,UAAWA,EAAO,WAAnC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,UAAW,MAAO,CAAE,WAAY,EAAa,IAAS,SAAU,CAAI,CAAA,EAC3F,EAAU,EAAG,CAAI,CACd,CAHK,EAAA,CAGL,CACP,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,WAAa,SAAA,EAAE,kBAAmB,CAAE,MAAO,EAAM,OAAQ,MAAO,EAAM,MAAO,CAAC,CAAQ,CAAA,CAC3G,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,OAAQ,MAAO,CAAE,UAAW,CAAE,EAClD,SAAA,OAAO,QAAQ,CAAU,CAAC,CAAC,KAAK,CAAC,EAAM,MACtC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAiB,UAAWA,EAAO,WAAnC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,MAAO,GAAI,OAAQ,EAAG,cAAY,OACrC,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,OAAQ,EAAM,MAAO,YAAa,EAAM,MAAO,gBAAiB,EAAM,IAAO,CAAA,CAC7G,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAA+B,EAAxB,IAAS,aAAiB,iBAAoB,IAAS,cAAkB,kBAAuB,WAAW,CAAQ,CAAA,CACtH,CALK,EAAA,CAKL,CACP,CACE,CAAA,CACF,GAET,CC3XA,IAAM,EAA8C,CAClD,KAAM,IACN,QAAS,IACT,QAAS,IACT,MAAO,GACT,EAGI,EAAgB,EAMpB,SAAS,EAAc,CAAE,QAAO,aAGT,CACrB,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWC,EAAO,cAAe,KAAK,SAAS,YAAU,SAAS,aAAW,gBAC/E,SAAA,EAAM,IAAI,GAAS,CAClB,IAAM,EAAY,EAAM,OAAS,UAAYA,EAAO,aAChD,EAAM,OAAS,QAAUA,EAAO,WAChC,EAAM,OAAS,UAAYA,EAAO,aAClCA,EAAO,UACX,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,GAAGA,EAAO,MAAM,GAAG,IAC9B,KAAM,EAAM,OAAS,SAAW,EAAM,OAAS,UAAY,QAAU,SAFvE,SAAA,EAGE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,UAAY,SAAA,EAAM,OAAc,CAAA,GACxD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,aAAc,aAAW,UAC/D,YAAe,CAAE,EAAU,EAAM,EAAE,CAAE,EAAG,SAAA,GAAS,CAAA,CAChD,CANK,EAAA,EAAM,EAMX,CAET,CAAC,CACE,CAAA,CAET,CAUA,SAAgB,GAA4B,CAC1C,GAAM,CAAC,EAAQ,IAAA,EAAaC,EAAAA,SAAAA,CAA+B,CAAC,CAAC,EAEvD,GAAA,EAAYC,EAAAA,OAAAA,CAAmD,IAAI,GAAK,EAExE,GAAA,EAAUC,EAAAA,YAAAA,CAAa,GAAe,CAC1C,EAAU,GAAW,EAAQ,OAAO,GAAS,EAAM,KAAO,CAAE,CAAC,EAC7D,IAAM,EAAQ,EAAU,QAAQ,IAAI,CAAE,EAClC,IAAU,IAAA,KACZ,aAAa,CAAK,EAClB,EAAU,QAAQ,OAAO,CAAE,EAE/B,EAAG,CAAC,CAAC,EAEC,GAAA,EAAOA,EAAAA,YAAAA,EAAa,EAAiB,EAAiB,IAAsB,CAChF,GAAiB,EACjB,IAAM,EAAK,EACL,EAAK,GAAY,EAAiB,GAClC,EAAkB,CAAE,KAAI,OAAM,UAAS,SAAU,CAAG,EAC1D,EAAU,GAAW,CAAC,GAAG,EAAS,CAAI,CAAC,EACvC,IAAM,EAAQ,eAAiB,CAAE,EAAQ,CAAE,CAAE,EAAG,CAAE,EAClD,EAAU,QAAQ,IAAI,EAAI,CAAK,CACjC,EAAG,CAAC,CAAO,CAAC,EAWZ,OATA,EAAA,EAAA,UAAA,SAAsB,CACpB,IAAK,IAAM,KAAS,EAAU,QAAQ,OAAO,EAAG,aAAa,CAAK,EAClE,EAAU,QAAQ,MAAM,CAC1B,EAAG,CAAC,CAAC,EAME,CAAE,SAAQ,OAAM,UAAS,UAAA,EAAA,EAAA,IAAA,CAH7B,EAAD,CAAe,MAAO,EAAQ,UAAW,CAAU,CAGd,CAAE,CAC3C,CC5FA,IAAM,EAAY,gBAGlB,SAAS,EAAQ,EAAiC,CAChD,GAAI,CAAE,OAAO,OAAO,aAAa,QAAQ,CAAG,GAAK,IAAA,EAAU,MAAQ,CAAE,MAAiB,CACxF,CAGA,SAAS,EAAQ,EAAa,EAAqB,CACjD,GAAI,CAAE,OAAO,aAAa,QAAQ,EAAK,CAAK,CAAE,MAAQ,CAAW,CACnE,CAGA,SAAS,EAAW,EAAyB,EAAwC,CAEnF,OADI,IAAQ,IAAA,IACJ,EAA6B,SAAS,CAAG,CACnD,CAQA,SAAgB,EACd,EACA,EACA,EACwB,CACxB,IAAM,EAAM,GAAG,EAAU,GAAG,IACtB,CAAC,EAAO,IAAA,EAAYC,EAAAA,SAAAA,KAAkB,CAC1C,IAAM,EAAM,EAAQ,CAAG,EACvB,OAAO,EAAW,EAAK,CAAK,EAAI,EAAM,CACxC,CAAC,EAGD,OAFA,EAAA,EAAA,UAAA,KAAgB,CAAE,EAAQ,EAAK,CAAK,CAAE,EAAG,CAAC,EAAK,CAAK,CAAC,EAE9C,CAAC,GAAA,EADOC,EAAAA,YAAAA,CAAa,GAAY,CAAE,EAAS,CAAI,CAAE,EAAG,CAAC,CACzC,CAAC,CACvB,CAGA,SAAgB,EACd,EACA,EACkC,CAClC,IAAM,EAAM,GAAG,EAAU,GAAG,IACtB,CAAC,EAAO,IAAA,EAAYD,EAAAA,SAAAA,KAAuB,EAAQ,CAAG,GAAK,CAAQ,EAGzE,OAFA,EAAA,EAAA,UAAA,KAAgB,CAAE,EAAQ,EAAK,CAAK,CAAE,EAAG,CAAC,EAAK,CAAK,CAAC,EAE9C,CAAC,GAAA,EADOC,EAAAA,YAAAA,CAAa,GAAiB,CAAE,EAAS,CAAI,CAAE,EAAG,CAAC,CAC9C,CAAC,CACvB,CCpCA,IAAM,EAAQ,CAEZ,OAAO,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,gCAAkC,CAAA,CAAG,CAAA,CAAA,EACtF,SAAS,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,IAAI,GAAG,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,KAAK,EAAE,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,GAAK,CAAA,CAAG,CAAA,CAAA,EAC/G,UAAU,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,IAAI,GAAG,IAAI,EAAE,KAAO,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,IAAI,EAAE,KAAO,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,KAAO,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,0CAA4C,CAAA,CAAG,CAAA,CAAA,EACtK,UAAU,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,aAAe,CAAA,CAAG,CAAA,CAAA,EACtE,UAAU,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,6BAA+B,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,KAAO,CAAA,CAAG,CAAA,CAAA,EACxF,KAAK,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAM,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAM,CAAA,CAAG,CAAA,CAAA,EAC5H,UAAU,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,UAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,eAAiB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAM,CAAA,CAAG,CAAA,CAAA,EACpG,KAAK,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,mCAAqC,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,eAAiB,CAAA,CAAG,CAAA,CAAA,EAEjF,MAAM,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,IAAI,EAAE,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,2BAA6B,CAAA,CAAG,CAAA,CAAA,EAC/E,SAAS,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sCAAwC,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAM,CAAA,CAAG,CAAA,CAAA,EACnG,QAAQ,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,UAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sBAAwB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sBAAwB,CAAA,CAAG,CAAA,CAAA,EAEnI,QAAQ,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAA,UAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sCAAwC,CAAA,CAAG,CAAA,EAC7D,SAAS,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,2BAA6B,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,YAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,6BAA+B,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,YAAc,CAAA,CAAG,CAAA,CAAA,EACzI,OAAO,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,aAAe,CAAA,CAAG,CAAA,CAAA,EACnE,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAA,UAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,8EAAgF,CAAA,CAAG,CAAA,CACtG,EAKA,SAAS,EAAK,CAAE,OAAM,aAAuG,CAC3H,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAgB,YAAW,QAAQ,YAAY,cAAY,OAAO,UAAU,QACzE,SAAA,EAAM,EACJ,CAAA,CAET,CAwDA,IAAM,EAAQ,CAAC,OAAQ,aAAc,WAAY,UAAW,OAAO,EAI7D,EAAqD,CACzD,OAAQ,eACR,SAAU,iBACV,UAAW,iBACb,EACM,EAAmD,CACvD,KAAM,YACN,QAAS,eACT,OAAQ,aACV,EAEM,EAAqC,CACzC,KAAM,WACN,WAAY,iBACZ,SAAU,eACV,QAAS,cACT,MAAO,WACT,EACM,EAAoC,CACxC,MAAO,UACP,cAAe,eACf,OAAQ,WACR,OAAQ,WACR,QAAS,YACT,MAAO,UACP,WAAY,eACZ,iBAAkB,kBAClB,cAAe,eACf,iBAAkB,kBAClB,OAAQ,WACR,cAAe,kBACf,gBAAiB,iBACjB,cAAe,eACf,gBAAiB,iBACjB,YAAa,aACb,yBAA0B,kBAC1B,mBAAoB,oBACpB,kBAAmB,mBACnB,eAAgB,eAClB,EACM,GAAqC,CACzC,aAAc,kBACd,WAAY,gBACZ,YAAa,iBACb,QAAS,YACX,EAEM,EAAwC,CAC5C,KAAM,YACN,MAAO,aACP,OAAQ,aACV,EAGA,SAAS,EAAU,EAAM,EAAsB,CAC7C,IAAM,EAAM,EAAS,GACrB,OAAO,IAAQ,IAAA,GAAY,EAAO,EAAE,CAAG,CACzC,CAGA,SAAS,GAAc,EAAsB,CAC3C,MAAO,GAAGC,EAAO,KAAK,GAAGA,EAAO,EAAW,IAAS,SAAW,IACjE,CAGA,SAAS,EAAQ,EAAM,EAAoB,CACzC,IAAM,EAAM,EAAO,GACnB,OAAO,IAAQ,IAAA,GAAY,EAAK,EAAE,CAAG,CACvC,CAGA,SAAS,EAAe,EAAM,EAAY,EAA+B,CACvE,GAAI,IAAW,KAAM,MAAO,GAE5B,GAAI,IAAO,eAAgB,CACzB,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAM,EAC1B,EAAK,OAAO,EAAO,SAAS,EAC5B,EAAQ,OAAO,EAAO,KAAK,EACjC,GAAI,EAAO,SAAW,QAAU,EAAO,cAAgB,KACrD,MAAO,IAAM,EAAE,kBAAmB,CAAE,KAAI,OAAM,CAAC,EAEjD,IAAM,EAAO,OAAO,EAAO,WAAW,EACtC,GAAI,EAAO,SAAW,OAAQ,MAAO,IAAM,EAAE,gBAAiB,CAAE,OAAM,KAAI,OAAM,CAAC,EACjF,IAAM,EAAW,OAAO,EAAO,YAAY,EAC3C,GAAI,EAAO,SAAW,YAAc,OAAO,UAAU,CAAI,GAAK,OAAO,UAAU,CAAE,GAAK,OAAO,UAAU,CAAQ,EAC7G,MAAO,IAAM,EAAE,oBAAqB,CAAE,OAAM,KAAI,WAAU,OAAM,CAAC,CAErE,MAAQ,CAER,CACA,MAAO,IAAI,GACb,CACA,GAAI,IAAO,SAAW,IAAO,UAAY,IAAO,aAAc,MAAO,IAAI,IACzE,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAM,EAC1B,EAAU,OAAO,QAAQ,CAAM,EAErC,OADI,EAAQ,SAAW,EAAU,IAAI,IAC9B,IAAM,EAAQ,KAAK,CAAC,EAAK,KAAW,CACzC,IAAM,EAAQ,EAAW,GAIzB,OAHI,IAAU,IAAA,GAAkB,GAAG,EAAI,GAAG,OAAO,CAAK,IAClD,IAAQ,QAAU,OAAO,GAAU,SAAiB,GAAG,EAAE,CAAK,EAAE,GAAG,EAAU,EAAG,CAAK,IACrF,IAAQ,UAAY,IAAU,QAAU,IAAU,WAAmB,GAAG,EAAE,CAAK,EAAE,GAAG,EAAE,EAAU,EAAM,IACnG,GAAG,EAAE,CAAK,EAAE,GAAG,OAAO,CAAK,GACpC,CAAC,CAAC,CAAC,KAAK,KAAK,CACf,MAAQ,CACN,MAAO,IAAI,GACb,CACF,CAGA,SAAS,GAAY,EAAM,EAAoE,CAC7F,GAAI,EAAO,kBAAoB,KAAM,OAAO,EAAE,gBAAgB,EAC9D,IAAM,EAAK,GAAG,EAAO,gBAAgB,MAAM,EAAG,EAAE,EAAE,GAIlD,OAAO,EAAE,gBAAiB,CAAE,GAHV,EAAO,cAAgB,KACrC,EACA,GAAG,EAAG,GAAG,EAAE,QAAS,CAAE,EAAG,EAAO,WAAY,CAAC,GACP,CAAC,CAC7C,CAOA,IAAI,GAAuC,KAMvC,GAAuC,KAG3C,SAAS,EAAgB,EAAc,EAA6B,CAClE,GAAI,iCAAiC,KAAK,CAAI,EAAG,MAAO,GACxD,IAAM,EAAO,GAAM,KACnB,GAAI,OAAO,GAAS,UAAY,IAAS,GAAI,MAAO,GACpD,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAI,EAC9B,OAAO,OAAO,GAAW,YAAY,GAAmB,EAAO,QAAU,SAC3E,MAAQ,CAEN,MAAO,EACT,CACF,CAGA,SAAS,GAAiB,EAAc,EAAsC,CAC5E,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAI,EAE9B,OADuB,OAAO,GAAW,WAArC,GAAiD,MAAM,QAAQ,CAAM,EAAG,OACrE,KAAK,UAAU,CAAE,GAAI,EAAoC,QAAS,CAAS,CAAC,CACrF,MAAQ,CACN,MACF,CACF,CAGA,SAAS,GAAiB,EAAc,EAA0B,CAChE,MAAO,GAAG,IAAO,EAAK,SAAS,GAAG,EAAI,IAAM,IAAI,UAAU,mBAAmB,CAAQ,GACvF,CAWA,eAAe,EAAO,EAAc,EAAoB,EAAe,GAAmB,CACxF,IAAM,EAAW,GACb,EAAS,EACT,EAAc,EACZ,EAAgB,IAAa,OAAS,GAAgB,EAAgB,EAAM,CAAI,GACtF,GAAI,EAAe,CACjB,IAAM,EAAO,GAAM,KACb,EAAW,OAAO,GAAS,UAAY,IAAS,GAAK,GAAiB,EAAM,CAAQ,EAAI,IAAA,GAC1F,IAAa,IAAA,IAAa,IAAS,IAAA,GAAW,EAAc,CAAE,GAAG,EAAM,KAAM,CAAS,EACrF,EAAS,GAAiB,EAAM,CAAQ,CAC/C,CACA,IAAM,EAAW,MAAM,MAAM,eAAe,IAAU,CAAW,EAC3D,EAAU,MAAM,EAAS,KAAK,EACpC,GAAI,CAAC,EAAS,GAGZ,MADI,GAAiB,EAAS,SAAW,KAAO,EAAO,QAAU,mBAAmB,KAAkB,EAC5F,MAAM,EAAO,OAAS,QAAQ,OAAO,EAAS,MAAM,GAAG,EAEnE,OAAO,CACT,CAoDA,IAAM,EAA8C,CAAC,EAGrD,SAAS,GAAwB,CAAc,CAM/C,SAAS,EAAqB,EAAuC,EAAkC,CACrG,GAAI,IAAW,IAAA,GAAW,OAAO,EACjC,IAAM,EAAM,EAAO,UAAU,CAAQ,EACrC,OAAO,OAAO,GAAQ,WAAa,EAAM,CAC3C,CASA,SAAS,GAAoB,EAAwC,EAGnE,CACA,IAAM,GAAA,EAAsBC,EAAAA,YAAAA,CACzB,GAAuC,EAAkB,GAAY,KAAM,CAAQ,EACpF,CAAC,CAAU,CACb,EACM,GAAA,EAAoBA,EAAAA,YAAAA,CACvB,GAAuC,EAAkB,GAAU,KAAM,CAAQ,EAClF,CAAC,CAAQ,CACX,EACM,GAAA,EAAmBC,EAAAA,qBAAAA,CAAqB,MAAyB,GAAU,KAAK,YAAY,CAAC,CAAC,SAAW,IAAI,EAC7G,GAAA,EAAQA,EAAAA,qBAAAA,CAAqB,MAA2B,GAAY,KAAK,YAAY,CAAC,CAAC,OAAS,CAAa,EAC7G,EAAY,IAAe,IAAA,IAAa,IAAa,IAAA,GAE3D,MADI,CAAC,GAAa,IAAqB,KAAa,CAAE,UAAW,KAAM,WAAU,EAC1E,CAAE,UAAW,EAAM,KAAK,GAAQ,EAAK,WAAW,SAAS,CAAgB,CAAC,GAAK,KAAM,WAAU,CACxG,CAGA,SAAS,GAAQ,EAAsB,CACrC,OAAO,EAAK,QAAQ,MAAO,IAAI,CAAC,CAAC,QAAQ,OAAQ,EAAE,CAAC,CAAC,YAAY,CACnE,CAGA,SAAS,EAAY,EAAsB,CACzC,IAAM,EAAa,EAAK,QAAQ,UAAW,EAAE,EACvC,EAAK,KAAK,IAAI,EAAW,YAAY,IAAI,EAAG,EAAW,YAAY,GAAG,CAAC,EAC7E,OAAO,EAAK,EAAI,EAAa,EAAW,MAAM,EAAK,CAAC,CACtD,CAGA,SAAS,GAAY,EAAwB,CAC3C,IAAM,EAAQ,6BAA6B,KAAK,CAAM,EACtD,OAAO,IAAU,KAAO,EAAO,MAAM,EAAG,EAAE,EAAI,WAAW,EAAM,EAAE,CAAE,MAAM,EAAG,CAAC,EAAE,EACjF,CAGA,SAAS,EAAa,EAAkE,CACtF,GAAI,OAAO,EAAK,MAAS,UAAY,EAAK,OAAS,GAAI,MAAO,CAAE,KAAM,GAAY,EAAK,MAAM,EAAG,aAAc,EAAK,EACnH,IAAM,EAAQ,EAAK,OAAO,KAAK,GAAK,GAEpC,OADI,IAAU,GACP,CAAE,KAAM,EAAY,EAAK,IAAI,EAAG,aAAc,EAAK,OAAS,WAAY,EADtD,CAAE,KAAM,EAAO,aAAc,EAAK,OAAS,WAAY,CAElF,CAGA,SAAS,GAAmB,EAAM,EAAiC,CACjE,IAAM,EAAQ,EAAa,CAAI,EACzB,EAAQ,CAAC,EAAM,aAAe,GAAG,EAAM,KAAK,KAAK,EAAE,qBAAqB,IAAM,EAAM,IAAI,EAE9F,OADA,EAAM,KAAK,EAAK,WAAa,KAAO,IAAM,EAAE,kBAAmB,CAAE,EAAG,EAAK,QAAS,CAAC,CAAC,EAC7E,EAAM,KAAK,KAAK,CACzB,CAGA,SAAS,GAAkB,EAAmC,EAAoE,CAChI,GAAI,IAAS,MAAQ,IAAc,KAAM,OACzC,IAAM,EAAO,EAAK,MAAM,KAAK,GAAQ,EAAK,cAAgB,EAAU,WAAW,EAC/E,GAAI,IAAS,IAAA,GAAW,OAAO,EAC/B,IAAM,EAAM,GAAQ,EAAU,IAAI,EAClC,OAAO,EAAK,MAAM,KAAK,GAAQ,OAAO,EAAK,MAAS,UAAY,GAAQ,EAAK,IAAI,IAAM,CAAG,CAC5F,CAMA,SAAS,GAAY,EAAM,EAM+C,CACxE,GAAI,EAAM,OAAS,SAAU,CAC3B,IAAM,EAAO,EAAM,MAAM,KAAK,GAAS,EAAM,SAAW,EAAM,IAAI,EAClE,GAAI,IAAS,IAAA,GACX,MAAO,CACL,MAAO,EAAE,gBAAiB,CAAE,KAAM,GAAG,GAAY,EAAM,IAAI,EAAE,KAAK,EAAE,qBAAqB,GAAI,CAAC,EAC9F,MAAO,EAAM,KACb,KAAM,QACR,EAEF,IAAM,EAAQ,EAAa,CAAI,EAC/B,MAAO,CACL,MAAO,EAAE,gBAAiB,CAAE,KAAM,EAAM,aAAe,GAAG,EAAM,KAAK,KAAK,EAAE,qBAAqB,IAAM,EAAM,IAAK,CAAC,EACnH,MAAO,EAAK,MAAQ,EAAK,OACzB,KAAM,QACR,CACF,CACA,GAAI,CAAC,EAAM,UAAW,MAAO,CAAE,MAAO,EAAE,oBAAoB,EAAG,MAAO,EAAE,mBAAmB,EAAG,KAAM,OAAQ,EAC5G,GAAI,EAAM,WAAa,IAAA,GACrB,MAAO,CACL,MAAO,EAAE,gBAAiB,CAAE,KAAM,EAAE,uBAAuB,CAAE,CAAC,EAC9D,MAAO,EAAM,oBAAsB,EAAE,mBAAmB,EACxD,KAAM,QACR,EAEF,IAAM,EAAQ,EAAa,EAAM,QAAQ,EACzC,MAAO,CACL,MAAO,EAAE,qBAAsB,CAAE,KAAM,EAAM,aAAe,GAAG,EAAM,KAAK,KAAK,EAAE,qBAAqB,IAAM,EAAM,IAAK,CAAC,EACxH,MAAO,EAAM,SAAS,MAAQ,EAAE,mBAAmB,EACnD,KAAM,QACR,CACF,CAGA,SAAS,EAAQ,EAAoB,CAEnC,OAAO,IAAI,KAAK,CAAE,CAAC,CAAC,eAAe,UAAU,UAAY,QAAS,CAAE,OAAQ,EAAM,CAAC,CACrF,CAGA,SAAS,GAAQ,EAAM,EAAoB,CACzC,IAAM,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAI,CAAE,EAClC,EAAU,KAAK,MAAM,EAAO,GAAM,EACxC,GAAI,EAAU,EAAG,OAAO,EAAE,aAAa,EACvC,GAAI,EAAU,GAAI,OAAO,EAAE,iBAAkB,CAAE,EAAG,CAAQ,CAAC,EAC3D,IAAM,EAAQ,KAAK,MAAM,EAAU,EAAE,EAErC,OADI,EAAQ,GAAW,EAAE,eAAgB,CAAE,EAAG,CAAM,CAAC,EAC9C,EAAE,cAAe,CAAE,EAAG,KAAK,MAAM,EAAQ,EAAE,CAAE,CAAC,CACvD,CAGA,SAAS,EAAO,CAAE,QAAO,QAAO,OAAM,aAKf,CACrB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWF,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,CAAY,CAAA,GAClD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,IAAc,GAAO,GAAGA,EAAO,YAAY,GAAGA,EAAO,uBAAyBA,EAAO,YAAc,SAAA,CAAS,CAAA,EACzH,IAAS,IAAA,KAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,WAAa,SAAA,CAAW,CAAA,CACpE,GAET,CAGA,SAAS,GAAW,CAAE,SAAgD,CACpE,IACM,EAAgB,EAAI,KAAK,GAAK,GAC9B,EAA0B,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,CAAK,CAAC,EAAI,IAArD,EACT,EAAO,GAAS,GAAK,yCACvB,GAAS,GAAK,sCACZ,uCACN,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,KAAM,KAAK,QAAQ,gBAAe,EAAG,gBAAe,IAAK,gBAAe,EAA/F,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,cAAY,OAA5D,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAG,GAAQ,KAAK,OAAO,OAAO,6BAA6B,YAAY,GAAK,CAAA,GACpG,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAG,GAAQ,KAAK,OAAO,OAAQ,EAAM,YAAY,IAAI,cAAc,QACzF,gBAAiB,GAAG,EAAO,QAAQ,CAAC,EAAE,GAAG,EAAc,QAAQ,CAAC,GAAM,CAAA,CACrE,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,CAAS,CAAA,CACV,GAET,CAGA,SAAS,EAAM,CAAE,QAAO,QAA+D,CACrF,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,IAAS,GAAO,GAAGA,EAAO,MAAM,GAAGA,EAAO,OAASA,EAAO,MACzE,UAAA,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,MAAO,CAAE,MAAO,GAAG,OAAO,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,CAAK,CAAC,EAAI,GAAG,CAAC,EAAE,EAAG,CAAI,CAAA,CACnF,CAAA,CAEV,CAGA,SAAS,EAAS,CAAE,OAAuD,CACzE,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACpB,SAAA,EAAI,IAAI,IAAM,EAAA,EAAA,IAAA,CAAC,OAAD,CAAe,UAAWA,EAAO,QAAS,MAAO,EAAK,SAAA,EAAG,MAAM,EAAG,EAAE,CAAQ,EAAjE,CAAiE,CAAC,CACzF,CAAA,CAET,CAGA,SAAS,GAAW,CAAE,IAAG,WAAU,QAAO,WAMnB,CACrB,GAAM,CAAC,EAAM,IAAA,EAAWG,EAAAA,SAAAA,CAA4B,IAAI,EAClD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAwB,IAAI,EAQxD,IAPA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAIhB,OAHA,EAAgB,gBAAgB,EAAM,MAAM,mBAAmB,CAAQ,GAAG,CAAC,CACxE,KAAM,GAAS,CAAO,GAAW,EAAQ,CAAI,CAAE,CAAC,CAAC,CACjD,MAAO,GAAiB,CAAO,GAAW,EAAU,EAAM,OAAO,CAAE,CAAC,MAC1D,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAU,EAAO,EAAS,CAAC,CAAC,EAC5B,IAAW,KAAM,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWH,EAAO,cAAgB,SAAA,EAAE,aAAc,CAAE,IAAK,CAAO,CAAC,CAAO,CAAA,EACzG,GAAI,IAAS,KAAM,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,SAAS,CAAO,CAAA,EACnF,GAAM,CAAE,UAAW,EACb,EAAa,CAAC,eAAgB,aAAc,cAAe,SAAS,CAAC,CACxE,IAAI,IAAQ,CAAE,MAAK,MAAO,GAAQ,GAAM,IAAK,EAAK,IAAQ,CAAC,CAAE,EAAE,CAAC,CAChE,OAAO,GAAS,EAAM,IAAI,OAAS,CAAC,EACjC,EAAa,EAAK,YAAc,CAAC,EACvC,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,SAAtB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,cAAc,CAAM,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAO,OAAY,CAAA,GACxB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,WAAW,CAAM,CAAA,GACxB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAc,EAAO,IAAI,EAAI,SAAA,EAAU,EAAG,EAAO,IAAI,CAAQ,CAAA,CAAK,CAAA,GACvF,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,aAAa,CAAM,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAGA,EAAO,KAAK,GAAGA,EAAO,SAAS,EAAO,OAAO,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAO,OAAO,MAAM,CAAC,MAAQ,KAAO,SAAA,EAAE,EAAW,EAAO,OAAO,CAAQ,CAAA,CAAK,CAAA,GAC3K,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,YAAY,CAAM,CAAA,GACzB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAK,EAAO,WAAW,QAAQ,CAAC,GAAE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAO,EAAO,UAAa,CAAA,CAAK,CAAA,CAAA,GACzE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,YAAY,CAAM,CAAA,GACzB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAK,EAAO,WAAW,QAAQ,CAAC,GAAE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAO,EAAO,WAAY,KAAA,EAAM,CAAA,CAAK,CAAA,CAAA,GAC9E,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,cAAc,CAAM,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,GAAY,EAAG,CAAM,CAAM,CAAA,GAChC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,cAAc,CAAM,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAQ,EAAO,SAAS,CAAM,CAAA,CACjC,CACH,CAAA,EAAA,EAAU,KAAK,CAAE,MAAK,QAAO,UAC5B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAe,UAAWA,EAAO,SAAjC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,IAAU,IAAA,GAAY,EAAM,EAAE,CAAK,CAAM,CAAA,GAC9C,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,KAAM,CAAA,CAClB,CAHK,EAAA,CAGL,CACN,CACE,CAAA,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACI,EAAK,WAAa,CAAC,EAAA,CAAG,OAAS,IAC/B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,iBAAiB,CAAM,CAAA,GAC9B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,SACnB,SAAA,EAAK,UAAW,KAAK,EAAK,KACzB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAQ,EAAI,YAAY,CAAQ,CAAA,GACvC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAU,EAAG,EAAI,IAAI,CAAK,CAAA,EAC7B,IAAK,EAAI,OACR,CAAA,EAJK,CAIL,CACL,CACC,CAAA,CACD,CAEN,CAAA,EAAA,EAAW,OAAS,IACnB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,kBAAkB,CAAM,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,SACnB,SAAA,EAAW,KAAK,EAAI,KACnB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAQ,EAAG,EAAE,CAAQ,CAAA,GAC5B,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAQ,EAAG,EAAG,EAAE,CAAK,CAAA,EACxB,EAAe,EAAG,EAAG,GAAI,EAAG,MAAM,CACjC,CAAA,EAJK,CAIL,CACL,CACC,CAAA,CACD,CAEJ,CAAA,CAAA,CAAA,CAAA,CACF,GAET,CAGA,SAAS,GAAS,CAAE,IAAG,SAAQ,UAAS,UAAS,SAM1B,CACrB,GAAM,CAAC,EAAS,IAAA,EAAcG,EAAAA,SAAAA,CAAS,EAAO,OAAO,EAC/C,CAAC,EAAM,IAAA,EAAWA,EAAAA,SAAAA,CAAS,EAAO,IAAI,EACtC,CAAC,EAAY,IAAA,EAAiBA,EAAAA,SAAAA,CAAS,EAAO,UAAU,EAU9D,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWH,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,WAAa,SAAA,EAAE,cAAc,CAAS,CAAA,GAC/D,EAAA,EAAA,IAAA,CAAC,WAAD,CAAU,UAAWA,EAAO,MAAO,KAAM,EAAG,MAAO,EAAS,SAAU,GAAS,EAAW,EAAM,OAAO,KAAK,CAAI,CAAA,CAC7G,CAAA,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,WAAa,SAAA,EAAE,WAAW,CAAS,CAAA,GAE5D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,MAAO,MAAO,EAAM,SAAU,GAAS,EAAQ,EAAM,OAAO,KAAK,EACxF,SAAA,EAAM,IAAI,IAAU,EAAA,EAAA,IAAA,CAAC,SAAD,CAAqB,MAAO,EAAS,SAAA,EAAU,EAAG,CAAM,CAAU,EAArD,CAAqD,CAAC,CAClF,CAAA,CACL,CAAA,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,WAAa,SAAA,GAAG,EAAE,YAAY,EAAE,GAAG,EAAW,QAAQ,CAAC,GAAW,CAAA,GAC3F,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,QAAQ,IAAK,EAAG,IAAK,EAAG,KAAM,IAAM,MAAO,EACrD,SAAU,GAAS,EAAc,OAAO,EAAM,OAAO,KAAK,CAAC,CAAI,CAAA,CAC9D,CAAA,CAAA,CACF,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,QAAS,EAAU,SAAA,EAAE,QAAQ,CAAU,CAAA,GACvF,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,UAAW,YA/BpD,CACvB,EAAI,SAAU,CACZ,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAE,GAAI,EAAO,GAAI,MAAO,EAAO,MAAO,UAAS,OAAM,YAAW,CAAC,CACxF,CAAC,CAAC,CACC,KAAK,CAAO,CAAC,CACb,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAM,OAAO,CAAE,CAAC,CACnE,EAuB6F,SAAA,EAAE,cAAc,CAAU,CAAA,CAC9G,GACF,GAET,CA6BA,IAAM,GAA8C,CAAE,IAAK,SAAU,IAAK,SAAU,KAAM,SAAU,EAGpG,SAAS,GAAY,CAAE,IAAG,SAA6E,CACrG,GAAM,CAAC,EAAO,IAAA,EAAYG,EAAAA,SAAAA,CAAS,EAAE,EAE/B,CAAC,EAAY,IAAA,EAAiBA,EAAAA,SAAAA,CAAiB,CAAK,EACpD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAA6B,IAAI,EACvD,CAAC,EAAM,IAAA,EAAWA,EAAAA,SAAAA,CAAS,EAAK,EAChC,CAAC,EAAO,IAAA,EAAYA,EAAAA,SAAAA,CAAwB,IAAI,GAEtD,EAAA,EAAA,UAAA,KAAgB,CAAE,EAAc,CAAK,CAAE,EAAG,CAAC,CAAK,CAAC,EACjD,IAAM,MAAkB,CAClB,EAAM,KAAK,IAAM,IAAM,IAC3B,EAAQ,EAAI,EAEZ,EAAiB,iBAAiB,mBAAmB,EAAM,KAAK,CAAC,EAAE,SAAS,IAAc,IAAA,GAAW,EAAI,CAAC,CACvG,KAAM,GAAS,CAAE,EAAU,CAAI,EAAG,EAAS,IAAI,CAAE,CAAC,CAAC,CACnD,MAAO,GAAsB,EAAS,EAAW,OAAO,CAAC,CAAC,CAC1D,YAAc,EAAQ,EAAK,CAAC,EACjC,EACM,EAAO,GAAQ,MAAQ,CAAC,EAC9B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWH,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,GAAGA,EAAO,MAAM,GAAGA,EAAO,SAAU,YAAa,EAAE,kBAAkB,EAAG,MAAO,EAC/F,SAAU,GAAS,EAAS,EAAM,OAAO,KAAK,EAC9C,UAAW,GAAS,CAAM,EAAM,MAAQ,SAAS,EAAI,CAAE,CAAI,CAAA,GAC7D,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,MAAO,MAAO,EACtC,SAAU,GAAS,EAAc,EAAM,OAAO,KAAK,EADrD,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,MAAO,SAAA,EAAE,eAAe,CAAU,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,OAAQ,SAAA,EAAE,WAAW,CAAU,CAAA,GAC7C,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,UAAW,SAAA,EAAE,cAAc,CAAU,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,SAAU,SAAA,EAAE,aAAa,CAAU,CAAA,CAC3C,KACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,UAC1D,SAAU,GAAQ,EAAM,KAAK,IAAM,GAAI,QAAS,EAAM,SAAA,EAAE,UAAU,CAAU,CAAA,CAC3E,IACJ,IAAU,OAAQ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,aAAc,CAAE,IAAK,CAAM,CAAC,CAAO,CAAA,EAC9F,IAAW,MAAQ,IAAU,OAC5B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,YAAa,CAAE,EAAG,EAAK,MAAO,CAAC,CAAQ,CAAA,EAC/C,EAAO,WAAY,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,aAAe,SAAA,EAAE,eAAe,CAAQ,CAAA,CACjF,KAEP,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACtB,SAAA,EAAK,IAAI,IACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAkB,UAAWA,EAAO,SAApC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,QAAU,SAAA,EAAE,GAAQ,EAAI,IAAI,CAAQ,CAAA,EAC3D,EAAI,UAAY,IAAA,KACf,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,QACtB,MAAO,GAAG,EAAI,QAAQ,KAAK,GAAG,EAAI,QAAQ,OAD5C,SAAA,CACqD,EAAE,cAAc,EAAE,MAAI,EAAI,QAAQ,IAAW,KAEpG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAc,EAAI,IAAI,EAAI,SAAA,EAAU,EAAG,EAAI,IAAI,CAAQ,CAAA,GACxE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,WAAa,SAAA,EAAI,MAAM,QAAQ,CAAC,CAAQ,CAAA,CAC7D,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,aAAe,SAAA,EAAI,OAAa,CAAA,GACvD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,QAAS,MAAO,EAAI,GAAK,SAAA,EAAI,EAAS,CAAA,CAC3D,CAZK,EAAA,EAAI,EAYT,CACN,CACI,CAAA,EACJ,IAAW,MAAQ,EAAK,SAAW,GAAK,IAAU,OACjD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAa,SAAA,EAAE,YAAY,CAAO,CAAA,CAExD,CAAA,CAAA,CAET,CAIA,SAAS,GAAe,EAAM,EAA+B,CAC3D,GAAI,IAAW,KAAM,MAAO,GAC5B,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAM,EAChC,GAAI,OAAO,EAAO,OAAU,UAAY,OAAO,EAAO,UAAa,SAAU,CAC3E,IAAM,EAAO,OAAO,EAAO,MAAS,SAAW,MAAM,EAAO,OAAS,GACrE,MAAO,GAAG,EAAE,QAAS,CAAE,EAAG,EAAO,KAAM,CAAC,IAAI,EAAK,KAAK,EAAO,SAAS,MAAM,EAAG,EAAE,GACnF,CACA,GAAI,OAAO,EAAO,OAAU,UAAY,MAAM,QAAQ,EAAO,OAAO,EAClE,MAAO,GAAG,EAAE,eAAgB,CAAE,EAAG,EAAO,QAAQ,MAAO,CAAC,EAAE,KAAK,EAAO,MAAM,MAAM,EAAG,EAAE,IAEzF,GAAI,OAAO,EAAO,OAAU,UAAY,OAAO,KAAK,CAAM,CAAC,CAAC,SAAW,EACrE,OAAO,EAAE,gBAAiB,CAAE,EAAG,EAAO,KAAM,CAAC,EAE/C,GAAI,OAAO,EAAO,SAAY,UAAY,OAAO,EAAO,YAAe,UAAW,CAChF,IAAM,EAAO,MAAM,QAAQ,EAAO,IAAI,EAAI,EAAO,KAAK,OAAS,EAC/D,MAAO,GAAG,EAAO,QAAQ,KAAK,EAAE,EAAO,WAAa,iBAAmB,kBAAkB,EAAE,KAAK,EAAE,aAAc,CAAE,EAAG,CAAK,CAAC,GAC7H,CAEA,GAAI,OAAO,EAAO,UAAa,UAAY,OAAO,EAAO,QAAW,UAAY,OAAO,EAAO,SAAY,SAExG,MAAO,GADO,EAAO,QAAU,UAAY,EAAE,cAAc,EAAI,EAAE,WAAW,EAC5D,KAAK,EAAE,sBAAuB,CAAE,EAAG,EAAO,QAAS,CAAC,EAAE,KAAK,EAAE,oBAAqB,CAAE,EAAG,EAAO,MAAO,CAAC,EAAE,KAAK,EAAE,qBAAsB,CAAE,EAAG,EAAO,OAAQ,CAAC,IAG5K,GAAI,OAAO,EAAO,UAAa,UAAY,EAAO,SAAW,IAAA,GAC3D,OAAO,EAAE,gBAAiB,CAAE,EAAG,EAAO,QAAS,CAAC,EAElD,GAAI,OAAO,EAAO,UAAa,SAAU,OAAO,EAAE,iBAAkB,CAAE,EAAG,EAAO,QAAS,CAAC,EAC1F,GAAI,OAAO,EAAO,MAAS,SAAU,OAAO,EAAE,aAAc,CAAE,KAAM,EAAO,IAAK,CAAC,EACjF,GAAI,OAAO,EAAO,OAAU,UAAY,OAAO,EAAO,kBAAqB,SACzE,OAAO,EAAE,iBAAkB,CAAE,MAAO,EAAO,MAAO,KAAM,EAAO,gBAAiB,CAAC,CAErF,MAAQ,CAER,CACA,OAAO,EAAO,OAAS,GAAK,GAAG,EAAO,MAAM,EAAG,EAAE,EAAE,GAAK,CAC1D,CAIA,IAAM,GAAoE,CACxE,IAAK,KACL,MAAO,CAAC,QAAS,SAAU,SAAU,UAAW,QAAS,aAAc,gBAAgB,EACvF,OAAQ,CAAC,iBAAkB,aAAa,EACxC,SAAU,CAAC,yBAA0B,mBAAoB,QAAQ,EACjE,SAAU,CAAC,kBAAmB,gBAAiB,cAAe,gBAAiB,YAAa,gBAAiB,cAAc,CAC7H,EACM,EAAyD,CAC7D,IAAK,eACL,MAAO,iBACP,OAAQ,kBACR,SAAU,oBACV,SAAU,mBACZ,EAEM,EAAkF,CACtF,MAAO,cACP,OAAQ,eACR,SAAU,iBACV,SAAU,gBACZ,EAEA,SAAS,GAAW,EAAuB,CACzC,IAAK,IAAM,IAAS,CAAC,QAAS,SAAU,WAAY,UAAU,EAC5D,GAAI,GAAW,EAAM,EAAE,SAAS,CAAE,IAAM,GAAM,OAAO,EAEvD,MAAO,KACT,CAEA,SAAS,GAAY,EAAoB,CACvC,IAAM,EAAQ,GAAW,CAAE,EACrB,EAAOA,EAAO,QAAU,GAC9B,OAAO,IAAU,MAAQ,EAAO,GAAG,EAAK,GAAGA,EAAO,EAAQ,KAAW,IACvE,CAGA,SAAS,EAAS,EAAiB,EAA4E,CAC7G,IAAM,EAAI,EAAQ,MAAM;CAAI,EACtB,EAAI,EAAQ,MAAM;CAAI,EACtB,EAAI,EAAE,OACN,EAAI,EAAE,OAEN,EAAiB,MAAM,KAAK,CAAE,OAAQ,EAAI,CAAE,MAAa,MAAc,EAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAC3F,IAAK,IAAI,EAAI,EAAI,EAAG,GAAK,EAAG,IAC1B,IAAK,IAAI,EAAI,EAAI,EAAG,GAAK,EAAG,IAC1B,EAAG,EAAE,CAAE,GAAK,EAAE,KAAO,EAAE,GAAK,EAAG,EAAI,EAAE,CAAE,EAAI,GAAM,EAAI,KAAK,IAAI,EAAG,EAAI,EAAE,CAAE,GAAK,EAAG,EAAE,CAAE,EAAI,EAAG,EAGhG,IAAM,EAAyD,CAAC,EAC5D,EAAI,EACJ,EAAI,EACR,KAAO,EAAI,GAAK,EAAI,GACd,EAAE,KAAO,EAAE,IAAM,EAAK,KAAK,CAAE,KAAM,OAAQ,KAAM,EAAE,EAAI,CAAC,EAAG,GAAK,EAAG,GAAK,GACnE,EAAG,EAAI,EAAE,CAAE,IAAO,EAAG,EAAE,CAAE,EAAI,IAAO,EAAK,KAAK,CAAE,KAAM,MAAO,KAAM,EAAE,EAAI,CAAC,EAAG,GAAK,IACpF,EAAK,KAAK,CAAE,KAAM,MAAO,KAAM,EAAE,EAAI,CAAC,EAAG,GAAK,GAEvD,KAAO,EAAI,GAAK,EAAK,KAAK,CAAE,KAAM,MAAO,KAAM,EAAE,EAAI,CAAC,EAAG,GAAK,EAC9D,KAAO,EAAI,GAAK,EAAK,KAAK,CAAE,KAAM,MAAO,KAAM,EAAE,EAAI,CAAC,EAAG,GAAK,EAC9D,OAAO,CACT,CAaA,SAAS,GAAY,CAAE,IAAG,QAAO,WAAuG,CACtI,GAAM,CAAC,EAAM,IAAA,EAAWG,EAAAA,SAAAA,CAAkC,IAAI,EACxD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAS,EAAK,EACpC,CAAC,EAAa,IAAA,EAAkBA,EAAAA,SAAAA,CAAwB,IAAI,EAC5D,CAAC,EAAe,IAAA,EAAoBA,EAAAA,SAAAA,CAAwB,IAAI,EAetE,IAdA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAWhB,OAVA,EAAsB,uBAAuB,IAAS,IAAA,GAAW,EAAI,CAAC,CACnE,KAAM,GAAS,CACV,IACJ,EAAQ,CAAI,EACZ,EAAU,EAAK,EAEf,EAAe,EAAK,SAAS,OAAS,EAAI,EAAK,SAAS,EAAE,CAAE,QAAU,IAAI,EAC1E,EAAiB,EAAK,SAAS,OAAS,EAAI,EAAK,SAAS,EAAE,CAAE,QAAU,IAAI,EAC9E,CAAC,CAAC,CACD,UAAY,CAAO,GAAW,EAAU,EAAI,CAAE,CAAC,MACrC,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAO,CAAO,CAAC,EACf,EACF,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWH,EAAO,cAAgB,SAAA,EAAE,mBAAmB,CAAO,CAAA,EAE5E,GAAI,IAAS,KACX,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,SAAS,CAAO,CAAA,EAElE,GAAI,EAAK,QAAU,KACjB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAE,cAAc,CAAK,CAAA,GACzB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,YAAc,SAAA,EAAE,kBAAkB,CAAK,CAAA,CACzD,IAGT,IAAM,EAAW,EAAK,SAChB,EAAY,IAAI,IAAI,EAAS,IAAI,GAAW,CAAC,EAAQ,QAAS,CAAO,CAAC,CAAC,EACvE,EAAO,IAAgB,KAAO,IAAA,GAAY,EAAU,IAAI,CAAW,EACnE,EAAS,IAAkB,KAAO,IAAA,GAAY,EAAU,IAAI,CAAa,EACzE,EAAW,IAAS,IAAA,IAAa,IAAW,IAAA,GAAY,EAAS,EAAK,QAAS,EAAO,OAAO,EAAI,CAAC,EAClG,EAAU,EAAS,KAAK,GAAO,EAAI,OAAS,MAAM,EACxD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,eAAiB,SAAA,EAAE,iBAAkB,CAAE,EAAG,EAAK,MAAM,OAAQ,CAAC,CAAM,CAAA,GAC1F,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,eAAiB,SAAA,EAAK,MAAM,OAAa,CAAA,EAC/D,EAAS,OAAS,IACjB,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,eAAiB,SAAA,EAAE,gBAAgB,CAAM,CAAA,GAC/D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,iBAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,iBAAiB,CAAQ,CAAA,GACjE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,cAAe,MAAO,GAAe,IAAA,GAC7D,SAAU,GAAS,CAAE,EAAe,OAAO,EAAM,OAAO,KAAK,CAAC,CAAE,EAC/D,SAAA,EAAS,IAAI,IACZ,EAAA,EAAA,KAAA,CAAC,SAAD,CAA8B,MAAO,EAAQ,QAA7C,SAAA,CAAsD,IAClD,EAAQ,QAAQ,MAAI,EAAQ,SAAW,WAAa,EAAE,uBAAuB,EAAI,EAAE,mBAAmB,CAClG,CAFK,EAAA,EAAQ,OAEb,CACT,CACK,CAAA,CACH,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,mBAAmB,CAAQ,CAAA,GACnE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,cAAe,MAAO,GAAiB,IAAA,GAC/D,SAAU,GAAS,CAAE,EAAiB,OAAO,EAAM,OAAO,KAAK,CAAC,CAAE,EACjE,SAAA,EAAS,IAAI,IACZ,EAAA,EAAA,KAAA,CAAC,SAAD,CAA8B,MAAO,EAAQ,QAA7C,SAAA,CAAsD,IAClD,EAAQ,QAAQ,MAAI,EAAQ,SAAW,WAAa,EAAE,uBAAuB,EAAI,EAAE,mBAAmB,CAClG,CAFK,EAAA,EAAQ,OAEb,CACT,CACK,CAAA,CACH,CAAA,CAAA,CACJ,IACJ,IAAS,IAAA,IAAa,IAAW,IAAA,KAChC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACpB,SAAA,EACG,EAAS,KAAK,EAAK,KACnB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAiB,UACf,EAAI,OAAS,MAAQA,EAAO,eAAiB,EAAI,OAAS,MAAQA,EAAO,eAAiBA,EAAO,gBADnG,SAAA,CAEG,EAAI,OAAS,MAAQ,KAAO,EAAI,OAAS,MAAQ,KAAO,KAAM,EAAI,IAAU,CAFrE,EAAA,CAEqE,CAChF,GACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAc,SAAA,EAAE,iBAAiB,CAAO,CAAA,CAChE,CAAA,CAEP,CAAA,CAAA,CAED,GAET,CAOA,SAAS,GAAS,CAAE,IAAG,YAAW,WAKX,CACrB,GAAM,CAAC,EAAM,IAAA,EAAWG,EAAAA,SAAAA,CAA+B,IAAI,EACrD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAoB,KAAK,GACrD,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAIhB,OAHA,EAAmC,oBAAqB,IAAA,GAAW,EAAI,CAAC,CACrE,KAAM,GAAS,CAAO,GAAW,EAAQ,EAAK,UAAU,CAAE,CAAC,CAAC,CAC5D,UAAY,CAAO,GAAW,EAAQ,CAAC,CAAC,CAAE,CAAC,MACjC,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,CAAO,CAAC,EACZ,IAAM,EAAQ,GAAW,GACnB,GAAW,GAAQ,CAAC,EAAA,CAAG,OAAO,GAAO,IAAU,MAAQ,EAAM,SAAS,EAAI,EAAE,CAAC,EAC7E,EAAS,GAAW,OAC1B,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWH,EAAO,QAA3B,SAAA,EAGE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,QAAQ,CAAM,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,WAAY,CAAE,EAAG,EAAQ,MAAO,CAAC,CAAQ,CAAA,GACjF,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,UAAxB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,cAAe,cAAY,MAAQ,CAAA,EAAE,EAAE,YAAY,EAAE,KAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,GAAQ,QAAU,CAAK,CAAA,CAAO,CAAA,CAAA,GACvI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,eAAgB,cAAY,MAAQ,CAAA,EAAE,EAAE,YAAY,EAAE,KAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,GAAQ,aAAe,CAAK,CAAA,CAAO,CAAA,CAAA,GAC7I,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,iBAAkB,cAAY,MAAQ,CAAA,EAAE,EAAE,iBAAiB,EAAE,KAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,GAAQ,gBAAkB,CAAK,CAAA,CAAO,CAAA,CAAA,CACnJ,KACN,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAU,KAAK,UAClC,SAAA,CAAC,MAAO,QAAS,SAAU,WAAY,UAAU,CAAC,CAAW,IAAI,IACjE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAqB,KAAK,SAAS,KAAK,MAAM,gBAAe,IAAW,EACtE,UAAW,IAAW,EAAS,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QACzE,YAAe,CAAE,EAAU,CAAM,CAAE,EAAI,SAAA,EAAE,EAAe,EAAO,CAAU,EAF9D,CAE8D,CAC5E,CACE,CAAA,CACF,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACpB,SAAA,IAAS,MACN,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,SAAS,CAAO,CAAA,EACzD,EAAQ,SAAW,GACjB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,eAAe,CAAO,CAAA,GAE/D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QACpB,SAAA,EAAQ,KAAK,EAAI,KAChB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAiB,UAAWA,EAAO,OAAnC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,GAAY,EAAG,EAAE,EAAG,cAAY,MAAQ,CAAA,GACtD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,QAAU,SAAA,GAAQ,EAAG,EAAG,EAAE,CAAQ,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,MAAQ,SAAA,EAAQ,EAAG,EAAG,EAAE,CAAQ,CAAA,GACxD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,SAAW,SAAA,EAAG,QAAU,OAAS,EAAE,WAAW,EAAI,EAAE,cAAc,CAAQ,CAAA,GAClG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,UAAW,MAAO,EAAG,QAAU,GAAK,SAAA,GAAe,EAAG,EAAG,MAAM,CAAQ,CAAA,CAC5F,CANK,EAAA,CAML,CACN,CACE,CAAA,CAER,CAAA,CACE,GAEb,CAKA,SAAS,GAAiB,CAAE,IAAG,QAAO,UAAS,YAMxB,CAGrB,IAAM,EAAc,CAAC,GAAI,OAAQ,aAAc,WAAY,UAAW,OAAO,EACvE,CAAC,EAAW,GAAgB,EAA0B,iBAAkB,GAAI,CAAW,EACvF,CAAC,EAAU,IAAA,EAAeG,EAAAA,SAAAA,CAA0B,IAAI,GAC9D,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAOhB,OAHA,EAHa,IAAc,GACvB,uBAAuB,IACvB,uBAAuB,EAAM,aAAa,GAC5B,CAAC,CAChB,KAAM,GAAS,CAAO,GAAW,EAAY,CAAI,CAAE,CAAC,CAAC,CACrD,UAAY,CAAO,GAAW,EAAY,CAAE,SAAU,EAAE,mBAAmB,EAAG,YAAa,EAAG,MAAO,GAAM,eAAgB,CAAC,CAAE,CAAC,CAAE,CAAC,MACxH,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAG,EAAO,EAAS,CAAS,CAAC,EACjC,IAAM,EAAa,GAAyB,CAC1C,GAAI,IAAS,GAAI,OAAO,EAAE,cAAc,EACxC,IAAM,EAAM,EAAS,GACrB,OAAO,IAAQ,IAAA,GAAY,EAAO,EAAE,CAAG,CACzC,EAEA,OADI,IAAa,MAAa,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWH,EAAO,cAAgB,SAAA,EAAE,SAAS,CAAO,CAAA,GAErF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QAAS,KAAK,UAAU,aAAW,aACvD,SAAA,EAAY,IAAI,IACf,EAAA,EAAA,IAAA,CAAC,SAAD,CAA4B,KAAK,SAAS,KAAK,MAC7C,gBAAe,IAAc,EAC7B,UAAW,IAAc,EAAO,GAAGA,EAAO,KAAK,GAAGA,EAAO,SAAWA,EAAO,KAC3E,YAAe,CAAE,EAAa,CAAI,CAAE,EACnC,SAAA,EAAU,CAAI,CACT,EALK,GAAQ,KAKb,CACT,CACE,CAAA,EACJ,EAAS,OACN,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,mBAAmB,CAAO,CAAA,GAEnE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,aAAe,SAAA,EAAS,QAAY,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,UACnB,SAAA,EAAS,eAAe,KAAK,EAAM,KAClC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,SAAU,YAAe,CAAE,EAAS,EAAK,EAAE,CAAE,EAArF,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,cAAgB,SAAA,EAAQ,CAAQ,CAAA,GACxD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,aAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,aAAe,SAAA,EAAU,EAAG,EAAK,IAAI,CAAQ,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,aAAe,SAAA,EAAK,QAAQ,OAAS,GAAK,GAAG,EAAK,QAAQ,MAAM,EAAG,EAAE,EAAE,GAAK,EAAK,OAAc,CAAA,CACnH,CACA,CAAA,CAAA,CACN,CAAA,CAAA,EARK,EAAK,EAQV,CACL,CACC,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,SAAW,SAAA,EAAE,kBAAkB,CAAK,CAAA,CACzD,CAAA,CAAA,CAEH,GAET,CAMA,SAAS,GAAW,CAAE,IAAG,QAAO,UAAS,WAAU,gBAAe,SAQ3C,CAGrB,GAAM,CAAC,EAAQ,IAAA,EAAaG,EAAAA,SAAAA,CAA8B,IAAI,EACxD,CAAC,EAAM,IAAA,EAAWA,EAAAA,SAAAA,CAAS,EAAK,EAChC,GAAA,EAASF,EAAAA,YAAAA,KAAkB,CAC/B,EAAQ,EAAI,EACZ,EAAkB,gBAAgB,GAAO,CAAC,CACvC,KAAM,GAAS,CAAE,EAAU,CAAI,CAAE,CAAC,CAAC,CACnC,UAAY,CAAE,EAAU,CAAE,MAAO,EAAG,YAAa,CAAC,CAAE,CAAC,CAAE,CAAC,CAAC,CACzD,YAAc,CAAE,EAAQ,EAAK,CAAE,CAAC,CACrC,EAAG,CAAC,EAAO,CAAO,CAAC,GACnB,EAAA,EAAA,UAAA,KAAgB,CAAE,EAAO,CAAE,EAAG,CAAC,CAAM,CAAC,EACtC,IAAM,EAAW,GAAyC,CACxD,OAAQ,EAAR,CACE,IAAK,SAAU,OAAO,EAAE,oBAAoB,EAC5C,IAAK,QAAS,OAAO,EAAE,mBAAmB,EAC1C,IAAK,SAAU,OAAO,EAAE,oBAAoB,EAC5C,IAAK,QAAS,OAAO,EAAE,mBAAmB,CAC5C,CACF,EAEM,GAAA,EAAUA,EAAAA,YAAAA,CAAa,GAA2B,CACtD,GAAI,EAAW,SAAW,UAAY,EAAW,SAAW,QAAS,CACnE,EAAS,EAAW,SAAS,EAC7B,MACF,CACA,GAAI,EAAW,SAAW,SAAU,CAClC,GAAI,CAAC,OAAO,QAAQ,EAAE,qBAAqB,CAAC,EAAG,OAC/C,EAAQ,EAAI,EACZ,EAAoB,SAAU,CAC5B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CACnB,GAAI,EAAW,UACf,QACA,OAAQ,SACR,QAAS,IACT,YAAa,sBACf,CAAC,CACH,CAAC,CAAC,CACC,SAAW,CACV,EAAO,EACP,EAAc,EACd,EAAM,KAAK,UAAW,EAAE,kBAAkB,CAAC,CAC7C,CAAC,CAAC,CACD,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAE,qBAAsB,CAAE,IAAK,EAAM,OAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CACjG,YAAc,CAAE,EAAQ,EAAK,CAAE,CAAC,EACnC,MACF,CACA,GAAI,EAAW,SAAW,QAAS,CACjC,IAAM,EAAI,EAAW,WAAW,OAAS,EACzC,GAAI,EAAI,EAAG,CACT,EAAM,KAAK,UAAW,EAAE,kBAAkB,CAAC,EAC3C,MACF,CACA,GAAI,CAAC,OAAO,QAAQ,EAAE,qBAAsB,CAAE,GAAE,CAAC,CAAC,EAAG,OACrD,EAAQ,EAAI,EAEZ,IAAM,EAAa,CAAC,EAAW,UAAW,GAAG,EAAW,UAAU,EAClE,EAA6B,cAAe,CAC1C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAE,QAAO,YAAW,CAAC,CAC5C,CAAC,CAAC,CACC,SAAW,CACV,EAAO,EACP,EAAc,EACd,EAAM,KAAK,UAAW,EAAE,iBAAiB,CAAC,CAC5C,CAAC,CAAC,CACD,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAE,qBAAsB,CAAE,IAAK,EAAM,OAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CACjG,YAAc,CAAE,EAAQ,EAAK,CAAE,CAAC,CACrC,CACF,EAAG,CAAC,EAAQ,EAAU,EAAe,EAAO,EAAG,CAAK,CAAC,EAErD,OADI,IAAW,MAAa,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWD,EAAO,cAAgB,SAAA,EAAE,SAAS,CAAO,CAAA,GAEnF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,cAAe,CAAE,EAAG,EAAO,KAAM,CAAC,CAAQ,CAAA,GAClF,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,EAAM,QAAS,EAAS,SAAA,EAAE,WAAW,CAAU,CAAA,CACtG,CACJ,CAAA,EAAA,EAAO,QAAU,GACd,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,aAAa,CAAO,CAAA,GAE7D,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,WACnB,SAAA,EAAO,YAAY,KAAK,EAAY,KACnC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAkE,UAAWA,EAAO,WAApF,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,YAAa,YAAe,CAAE,EAAS,EAAW,SAAS,CAAE,EAClG,SAAA,EAAQ,EAAW,MAAM,CACpB,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,aAAe,SAAA,EAAW,MAAY,CAAA,GAC7D,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,iBAAxB,SAAA,EAA4C,EAAW,WAAa,IAAA,CAAK,QAAQ,CAAC,EAAE,GAAO,KAC3F,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAGA,EAAO,WAAW,GAAGA,EAAO,SAAU,SAAU,EAClF,YAAe,CAAE,EAAQ,CAAU,CAAE,EAAI,SAAA,EAAE,eAAe,CAAU,CAAA,CACpE,CARK,EAAA,GAAG,EAAW,OAAO,GAAG,EAAW,UAAU,GAAG,GAQrD,CACL,CACC,CAAA,CAEL,GAET,CAiBA,SAAS,GAAc,CAAE,IAAG,QAAO,UAAS,YAMrB,CACrB,GAAM,CAAC,EAAO,IAAA,EAAYG,EAAAA,SAAAA,CAA+B,IAAI,EACvD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAwB,IAAI,EAWxD,OAVA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAIhB,OAHA,EAAmB,yCAAyC,GAAO,CAAC,CACjE,KAAK,GAAQ,CAAO,GAAW,EAAS,CAAI,EAAG,EAAU,IAAI,CAAE,CAAC,CAAC,CACjE,MAAO,GAAe,CAAO,GAAW,EAAU,EAAI,OAAO,CAAE,CAAC,MACtD,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAO,CAAO,CAAC,EACf,IAAW,KACX,IAAU,MAAa,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWH,EAAO,cAAgB,SAAA,EAAE,cAAc,CAAO,CAAA,EACrF,EAAM,MAAM,SAAW,GAAU,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,MAAQ,SAAA,EAAE,eAAe,CAAO,CAAA,GACrF,EAAA,EAAA,IAAA,CAAC,EAAD,CAAoB,QAAO,MAAO,EAAM,MAAO,MAAO,EAAM,MAAiB,WAAa,GAAI,CAAA,GAHzE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAvB,SAAA,CAAuC,EAAE,gBAAgB,EAAE,IAAE,CAAY,GAIvG,CA+BA,SAAS,GAAoB,CAAE,IAAG,QAAO,UAAS,cAM3B,CACrB,GAAM,CAAC,EAAW,IAAA,EAAgBG,EAAAA,SAAAA,CAAS,EAAE,EACvC,CAAC,EAAW,IAAA,EAAgBA,EAAAA,SAAAA,CAAS,EAAE,EACvC,CAAC,EAAgB,IAAA,EAAqBA,EAAAA,SAAAA,CAAS,EAAE,EAEjD,CAAC,EAAS,IAAA,EAAcA,EAAAA,SAAAA,CAAyF,CAAE,MAAO,GAAI,MAAO,GAAI,UAAW,EAAG,CAAC,EACxJ,CAAC,EAAM,IAAA,EAAWA,EAAAA,SAAAA,CAAmC,IAAI,EACzD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAwB,IAAI,EAElD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAmC,IAAI,EAC7D,CAAC,EAAY,IAAA,EAAiBA,EAAAA,SAAAA,CAAS,EAAK,GAElD,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GACV,EAAS,IAAI,gBAAgB,CAAE,OAAM,CAAC,EAQ5C,OANI,EAAQ,QAAU,IAAI,EAAO,IAAI,QAAS,OAAO,IAAI,KAAK,GAAG,EAAQ,MAAM,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,EACjG,EAAQ,QAAU,IAAI,EAAO,IAAI,QAAS,OAAO,IAAI,KAAK,GAAG,EAAQ,MAAM,cAAc,CAAA,CAAE,QAAQ,CAAC,CAAC,EACrG,EAAQ,YAAc,IAAI,EAAO,IAAI,YAAa,EAAQ,SAAS,EACvE,EAAuB,oBAAoB,EAAO,SAAS,GAAG,CAAC,CAC5D,KAAK,GAAK,CAAO,IAAa,EAAQ,CAAC,EAAG,EAAU,IAAI,EAAI,CAAC,CAAC,CAC9D,MAAO,GAAe,CAAO,GAAW,EAAU,EAAI,OAAO,CAAE,CAAC,MACtD,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAO,EAAS,EAAS,CAAU,CAAC,EAGxC,IAAM,EAAc,GAAqB,CACvC,EAAc,EAAI,EAClB,EAAuB,0BAA0B,EAAM,UAAU,mBAAmB,CAAE,GAAG,CAAC,CACvF,KAAK,GAAK,CAAE,EAAU,CAAC,EAAG,EAAc,EAAK,EAAG,EAAU,IAAI,CAAE,CAAC,CAAC,CAClE,MAAO,GAAe,CAAE,EAAU,EAAI,OAAO,EAAG,EAAc,EAAK,CAAE,CAAC,CAC3E,EAGM,EAAa,IACjB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAkB,UAAWH,EAAO,WAAY,MAAO,EAAI,GAA3D,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAQ,EAAI,SAAS,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAU,EAAG,EAAI,IAAI,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAI,OAAc,CAAA,GAC3D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,EACxD,YAAe,CAAE,EAAW,EAAI,EAAE,CAAE,EACnC,SAAA,EAAE,eAAe,CACZ,CAAA,CACL,CARK,EAAA,EAAI,EAQT,EAGP,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAEE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,OAAO,UAAWA,EAAO,MAAO,MAAO,EAAW,aAAY,EAAE,cAAc,EACxF,SAAU,GAAS,CAAE,EAAa,EAAM,OAAO,KAAK,CAAE,CAAI,CAAA,GAC5D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,gBAAiB,cAAY,OAAO,SAAA,GAAO,CAAA,GACnE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,OAAO,UAAWA,EAAO,MAAO,MAAO,EAAW,aAAY,EAAE,cAAc,EACxF,SAAU,GAAS,CAAE,EAAa,EAAM,OAAO,KAAK,CAAE,CAAI,CAAA,GAC5D,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,GAAGA,EAAO,MAAM,GAAGA,EAAO,SAAU,YAAa,EAAE,kBAAkB,EAAG,MAAO,EAC/F,SAAU,GAAS,CAAE,EAAkB,EAAM,OAAO,KAAK,CAAE,CAAI,CAAA,GACjE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,UAC1D,YAAe,CAAE,EAAW,CAAE,MAAO,EAAW,MAAO,EAAW,UAAW,EAAe,KAAK,CAAE,CAAC,EAAG,EAAU,IAAI,CAAE,EACtH,SAAA,EAAE,cAAc,CACX,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OACtC,YAAe,CACb,EAAa,EAAE,EAAG,EAAa,EAAE,EAAG,EAAkB,EAAE,EACxD,EAAW,CAAE,MAAO,GAAI,MAAO,GAAI,UAAW,EAAG,CAAC,EAAG,EAAU,IAAI,CACrE,EACC,SAAA,EAAE,cAAc,CACX,CAAA,CACL,IACJ,IAAW,OAAQ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,aAAc,CAAE,IAAK,CAAO,CAAC,CAAO,CAAA,EAChG,IAAW,OACV,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,GAAGA,EAAO,UAAU,GAAGA,EAAO,gBAAlD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,kBAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAE,oBAAoB,CAAK,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,YAAe,CAAE,EAAU,IAAI,CAAE,EAC9E,SAAA,EAAE,cAAc,CACX,CAAA,CACF,IACP,EAAU,EAAO,MAAM,EACvB,EAAO,UAAU,SAAW,GACzB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,YAAc,SAAA,EAAE,oBAAoB,CAAK,CAAA,EAC9D,EAAO,UAAU,IAAI,CAAS,CAC3B,IAEV,IAAS,MAAQ,IAAW,OAAQ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,SAAS,CAAO,CAAA,EAC7F,IAAS,MAAQ,EAAK,OAAO,SAAW,IAAK,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,MAAQ,SAAA,EAAE,iBAAiB,CAAO,CAAA,EACtG,GAAM,OAAO,IAAI,IAChB,EAAA,EAAA,KAAA,CAAC,UAAD,CAAyC,UAAWA,EAAO,UAA3D,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,YAA1B,SAAA,CACG,EAAM,UAAY,IAAA,IACf,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,GAAGA,EAAO,eAAe,GAAGA,EAAO,wBAA0B,SAAA,EAAE,uBAAuB,CAAK,CAAA,GACzG,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,eAAiB,SAAA,EAAM,OAAW,CAAA,GAC3D,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,gBAAxB,SAAA,CACG,EAAM,YAAc,KAAO,EAAE,kBAAkB,EAAI,IAAI,EAAM,YAC7D,MACA,IAAI,KAAK,EAAM,SAAS,CAAC,CAAC,mBAAmB,EAAE,MAAI,IAAI,KAAK,EAAM,OAAO,CAAC,CAAC,mBAAmB,EAC9F,MACA,EAAE,iBAAkB,CAAE,EAAG,EAAM,SAAS,MAAO,CAAC,CAC7C,CACA,CAAA,CAAA,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,SAAM,EAAM,SAAS,IAAI,CAAS,CAAO,CAAA,CAClC,CAdK,EAAA,EAAM,WAAa,MAcxB,CACV,CACD,CAAA,CAAA,CAEN,CAyCA,IAAM,GAA6C,CACjD,OAAQ,mBACR,QAAS,oBACT,KAAM,iBACN,QAAS,oBACT,MAAO,iBACT,EACM,GAAe,CAAC,SAAU,UAAW,OAAQ,UAAW,OAAO,EAGrE,SAAS,GAAgB,EAAM,EAAsB,CACnD,OAAO,EAAE,GAAgB,IAAS,iBAAiB,CACrD,CAMA,SAAS,GAAW,CAAE,IAAG,QAAO,UAAS,cAMlB,CACrB,GAAM,CAAC,EAAM,IAAA,EAAWG,EAAAA,SAAAA,CAAgD,KAAK,EACvE,CAAC,EAAG,IAAA,EAAQA,EAAAA,SAAAA,CAAS,EAAE,EACvB,CAAC,EAAM,IAAA,EAAWA,EAAAA,SAAAA,CAAgC,IAAI,EACtD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAwB,IAAI,EAElD,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAkC,IAAI,EAC5D,CAAC,EAAO,IAAA,EAAYA,EAAAA,SAAAA,CAAiC,IAAI,EACzD,CAAC,EAAY,IAAA,EAAiBA,EAAAA,SAAAA,CAAS,EAAK,GAElD,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GACV,EAAS,IAAI,gBAAgB,CAAE,OAAM,CAAC,EAM5C,OALI,IAAS,OAAO,EAAO,IAAI,OAAQ,CAAI,EACvC,IAAM,IAAI,EAAO,IAAI,IAAK,CAAC,EAC/B,EAAoB,YAAY,EAAO,SAAS,GAAG,CAAC,CACjD,KAAK,GAAK,CAAO,IAAa,EAAQ,CAAC,EAAG,EAAU,IAAI,EAAI,CAAC,CAAC,CAC9D,MAAO,GAAe,CAAO,GAAW,EAAU,EAAI,OAAO,CAAE,CAAC,MACtD,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAO,EAAS,EAAM,EAAG,CAAU,CAAC,EAGxC,IAAM,EAAc,GAAqB,CACvC,EAAc,EAAI,EAClB,QAAQ,IAAI,CACV,EAAsB,gBAAgB,EAAM,MAAM,mBAAmB,CAAE,GAAG,EAC1E,EAAqB,eAAe,EAAM,YAAY,mBAAmB,CAAE,EAAE,kBAAkB,CACjG,CAAC,CAAC,CACC,MAAM,CAAC,EAAG,KAAO,CAAE,EAAU,CAAC,EAAG,EAAS,CAAC,EAAG,EAAc,EAAK,EAAG,EAAU,IAAI,CAAE,CAAC,CAAC,CACtF,MAAO,GAAe,CAAE,EAAU,EAAI,OAAO,EAAG,EAAc,EAAK,CAAE,CAAC,CAC3E,EAGM,EAAgB,IACpB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAkB,UAAWH,EAAO,WAAY,MAAO,EAAI,GAA3D,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAQ,EAAI,SAAS,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAU,EAAG,EAAI,IAAI,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAI,OAAc,CAAA,CACxD,CAJK,EAAA,EAAI,EAIT,EAID,EAAc,IAClB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAmB,UAAWA,EAAO,WAAY,MAAO,EAAK,GAA7D,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,IAAI,KAAK,EAAK,OAAO,CAAC,CAAC,mBAAmB,CAAQ,CAAA,GAC3F,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAK,YAAc,KAAO,EAAE,WAAW,EAAI,EAAE,aAAa,CAAQ,CAAA,GAC3G,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAK,OAAc,CAAA,CACzD,CAJK,EAAA,EAAK,EAIV,EAGP,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QACnB,SAAA,CACA,CAAC,MAAO,EAAE,eAAe,CAAC,EAC1B,GAAG,GAAa,IAAI,GAAU,CAAC,EAAQ,EAAE,GAAgB,IAAW,iBAAiB,CAAC,CAAU,CAClG,CAAC,CAAW,KAAK,CAAC,EAAO,MACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAoB,KAAK,SAAS,eAAc,IAAS,EACvD,UAAW,IAAS,EAAQ,GAAGA,EAAO,KAAK,GAAGA,EAAO,SAAWA,EAAO,KACvE,YAAe,CAAE,EAAQ,CAAK,EAAG,EAAU,IAAI,EAAG,EAAS,IAAI,CAAE,EAChE,SAAA,CACK,EAJK,CAIL,CACT,CACE,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,GAAGA,EAAO,MAAM,GAAGA,EAAO,SAAU,YAAa,EAAE,yBAAyB,EAAG,MAAO,EACtG,SAAU,GAAS,CAAE,EAAK,EAAM,OAAO,MAAM,KAAK,CAAC,EAAG,EAAU,IAAI,EAAG,EAAS,IAAI,CAAE,CAAI,CAAA,EAC3F,IAAS,OAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,cAAe,CAAE,EAAG,EAAK,KAAM,CAAC,CAAQ,CAAA,CAC/F,IACJ,IAAW,OAAQ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,aAAc,CAAE,IAAK,CAAO,CAAC,CAAO,CAAA,EAChG,IAAW,OACV,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,GAAGA,EAAO,UAAU,GAAGA,EAAO,gBAAlD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,kBAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAO,OAAO,IAAQ,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,GAAgB,EAAG,EAAO,OAAO,IAAI,CAAQ,CAAA,GACtF,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,YAAe,CAAE,EAAU,IAAI,EAAG,EAAS,IAAI,CAAE,EAC9F,SAAA,EAAE,cAAc,CACX,CAAA,CACF,IACP,EAAO,OAAO,QAAQ,OAAS,IAC9B,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,YAAc,SAAA,GAAG,EAAE,eAAe,EAAE,GAAG,EAAO,OAAO,QAAQ,KAAK,GAAG,GAAO,CAAA,EAElG,EAAO,SAAS,SAAW,GACxB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,YAAc,SAAA,EAAE,kBAAkB,CAAK,CAAA,GAC5D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,SAAM,EAAO,SAAS,IAAI,CAAY,CAAO,CAAA,EAChD,IAAU,OACT,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,YAAc,SAAA,EAAE,cAAe,CAAE,EAAG,EAAM,KAAM,CAAC,CAAK,CAAA,EAC1E,EAAM,MAAM,SAAW,GACpB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,YAAc,SAAA,EAAE,WAAW,CAAK,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,SAAM,EAAM,MAAM,IAAI,CAAU,CAAO,CAAA,CAC3C,CAAA,CAAA,CAEG,IAEV,IAAS,MAAQ,IAAW,OAAQ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,SAAS,CAAO,CAAA,EAC7F,IAAS,MAAQ,EAAK,MAAM,SAAW,IAAK,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,MAAQ,SAAA,EAAE,aAAa,CAAO,CAAA,EACjG,IAAS,MAAQ,EAAK,MAAM,IAAI,IAC/B,EAAA,EAAA,KAAA,CAAC,MAAD,CAA0B,UAAWA,EAAO,WAAY,MAAO,EAAK,OAAO,GAA3E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,GAAgB,EAAG,EAAK,OAAO,IAAI,CAAQ,CAAA,GACpF,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAxB,SAAA,CACG,EAAK,OAAO,KACZ,EAAK,OAAO,QAAQ,OAAS,IAC5B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,YAAc,SAAA,IAAI,EAAK,OAAO,QAAQ,KAAK,GAAG,EAAE,EAAU,CAAA,CAEjF,KACN,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAE,iBAAkB,CAAE,EAAG,EAAK,WAAY,CAAC,CAAQ,CAAA,GAC5F,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,EACxD,YAAe,CAAE,EAAW,EAAK,OAAO,EAAE,CAAE,EAC3C,SAAA,EAAE,YAAY,CACT,CAAA,CACL,CAbK,EAAA,EAAK,OAAO,EAajB,CACN,CACD,CAAA,CAAA,CAEN,CAkBA,SAAS,GAAc,CAAE,IAAG,UAAkF,CAC5G,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACpB,SAAA,EAAM,IAAI,IACT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,UAAWA,EAAO,QAAlC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAGA,EAAO,WAAW,GAAGA,EAAO,EAAW,IAAS,KAAO,KAAM,cAAY,MAAQ,CAAA,GACrG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAU,EAAG,CAAI,CAAQ,CAAA,GAChC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,UAAY,SAAA,EAAO,IAAS,CAAK,CAAA,CACnD,CAJK,EAAA,CAIL,CACN,CACE,CAAA,CAET,CAsBA,SAAS,GAAkB,EAAsC,EAM/D,CACA,GAAM,CAAC,EAAO,IAAA,EAAYG,EAAAA,SAAAA,CAMvB,CAAE,MAAO,KAAM,OAAQ,CAAC,EAAG,UAAW,KAAM,OAAQ,KAAM,OAAQ,IAAK,CAAC,EAmB3E,OAlBA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAehB,OAdA,QAAQ,IAAI,CAEV,EAA4B,eAAe,GAAO,EAClD,EAAuB,0BAA0B,GAAO,EACxD,EAAkB,gBAAgB,GAAO,CAC3C,CAAC,CAAC,CACC,MAAM,CAAC,EAAS,EAAM,KAAY,CACjC,GAAI,EAAW,OACf,IAAM,EAAQ,EAAQ,MAAM,KAAK,GAAQ,EAAK,QAAU,CAAK,CAAC,EAAE,OAAS,KACzE,EAAS,CAAE,QAAO,OAAQ,GAAO,QAAU,CAAC,EAAG,UAAW,EAAM,SAAQ,OAAQ,IAAK,CAAC,CACxF,CAAC,CAAC,CACD,MAAO,GAAiB,CAClB,GAAW,EAAS,IAAY,CAAE,GAAG,EAAS,OAAQ,EAAM,OAAQ,EAAE,CAC7E,CAAC,MACU,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAO,CAAO,CAAC,EACZ,CACT,CAMA,SAAS,GAAU,CAAE,IAAG,WAAU,YAA4G,CAC5I,GAAM,CAAE,QAAO,YAAW,SAAQ,UAAW,EAC7C,GAAI,IAAW,KACb,OAAO,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAWH,EAAO,UAAW,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAvB,SAAA,CAAuC,EAAE,YAAY,EAAE,IAAE,CAAY,GAAU,CAAA,EAE9H,GAAI,IAAc,KAChB,OAAO,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,UAAW,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,aAAa,CAAO,CAAA,CAAU,CAAA,EAEtH,IAAM,EAAS,EAAU,OACzB,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,UAA3B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,KAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAO,EAAE,UAAU,EAAG,MAAO,GAAO,OAAS,EACnD,KAAM,GAAG,EAAE,iBAAiB,EAAE,IAAI,OAAO,EAAO,MAAM,GAAM,CAAA,GAC9D,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAO,EAAE,WAAW,EAAG,MAAO,GAAO,QAAU,EACrD,KAAM,GAAG,EAAE,cAAc,EAAE,GAAG,OAAO,GAAO,WAAa,CAAC,GAAM,CAAA,GAClE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAO,EAAE,WAAW,EAAG,MAAO,GAAG,OAAO,KAAK,OAAO,GAAO,aAAe,GAAK,GAAG,CAAC,EAAE,GAC3F,KAAM,EAAE,eAAgB,CAAE,EAAG,GAAO,UAAY,CAAE,CAAC,CAAI,CAAA,CACtD,CACL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAO,EAAE,YAAY,EAAG,MAAO,EAAO,OAAQ,UAAA,EAAW,CAAA,GACjE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAO,EAAE,YAAY,EAAG,MAAO,EAAO,eAAgB,UAAA,EAAW,CAAA,GACzE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAO,EAAE,iBAAiB,EAAG,MAAO,EAAO,eAAgB,UAAA,EAAW,CAAA,GAE9E,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAO,EAAE,SAAS,EAAG,MAAO,EAAU,UAAA,EAAW,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,MAAO,GAAQ,SAAW,CAAI,CAAA,CACvC,CACF,CAAA,CAAA,CACL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YACrB,SAAA,IAAW,KAAO,EAAE,eAAe,EAAI,EAAE,oBAAqB,CAAE,KAAM,GAAQ,EAAG,EAAO,WAAW,CAAE,CAAC,CACnG,CAAA,GAEN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAa,KAAK,OAAO,aAAY,EAAE,iBAAiB,EAAG,SAAU,EAA7F,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,cAAY,OAAxE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM,OAAO,eAAe,YAAY,KAAM,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,OAAO,eAAe,YAAY,MAAM,cAAc,OAAQ,CAAA,GACnG,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAG,IAAI,GAAG,MAAM,EAAE,MAAM,KAAK,cAAe,CAAA,CACjD,KACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,gBAAkB,SAAA,EAAE,iBAAiB,CAAQ,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAgB,KAAK,UAAW,SAAA,EAAE,gBAAgB,CAAQ,CAAA,CAC9E,CACH,CAAA,CAAA,CACE,CAAA,CAAA,GAEb,CAoDA,IAAM,GAAsC,CAC1C,eAAgB,kBAChB,SAAU,eACV,oBAAqB,gBACrB,kBAAmB,gBACnB,mBAAoB,cACpB,eAAgB,aAChB,mBAAoB,aACpB,kBAAmB,cACnB,WAAY,gBACd,EAGA,SAAS,GAAU,EAAM,EAAwB,CAC/C,IAAM,EAAM,GAAS,GACrB,OAAO,IAAQ,IAAA,GAAY,EAAS,EAAE,CAAG,CAC3C,CAMA,SAAS,GAAoB,CAAE,IAAG,SAA+D,CAE/F,GAAM,CAAC,EAAM,GAAW,EAA0B,gBAAiB,IAAK,CAAC,IAAK,KAAM,KAAM,GAAG,CAAC,EACxF,CAAC,EAAU,GAAe,EAAmB,oBAAqB,IAAI,EACtE,CAAC,EAAU,GAAe,EAAmB,oBAAqB,KAAK,EACvE,CAAC,EAAW,GAAgB,EAA0B,qBAAsB,QAAS,CAAC,QAAS,MAAM,CAAC,EACtG,CAAC,EAAQ,GAAa,EAA0B,kBAAmB,QAAS,CAAC,QAAS,MAAM,CAAC,EAC7F,CAAC,EAAO,GAAY,EAA0B,iBAAkB,QAAS,CAAC,QAAS,MAAM,CAAC,EAE1F,CAAC,EAAa,GAAkB,EAAmB,iBAAkB,EAAE,EACvE,CAAC,EAAQ,IAAA,EAAaG,EAAAA,SAAAA,CAA4B,IAAI,EACtD,CAAC,EAAU,IAAA,EAAeA,EAAAA,SAAAA,CAAsC,IAAI,EACpE,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAoC,IAAI,EAC9D,CAAC,EAAM,IAAA,EAAWA,EAAAA,SAAAA,CAAS,EAAK,GAGtC,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAIhB,OAHA,EAAgB,QAAQ,CAAC,CACtB,KAAM,GAAS,CAAO,GAAW,EAAU,CAAI,CAAE,CAAC,CAAC,CACnD,UAAY,CAAO,GAAW,EAAU,CAAE,UAAW,CAAC,EAAG,SAAU,CAAC,CAAE,CAAC,CAAE,CAAC,MAChE,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,CAAC,EAGL,IAAM,OAAoE,CACxE,GAAI,IAAgB,GAAI,OACxB,IAAM,EAAY,EAAY,QAAQ,IAAI,EACtC,QAAa,GACjB,MAAO,CAAE,SAAU,EAAY,MAAM,EAAG,CAAS,EAAG,MAAO,EAAY,MAAM,EAAY,CAAC,CAAE,CAC9F,EAAA,CAAG,EAEG,EAAS,IAAI,gBAAgB,CACjC,OAAM,mBAAoB,EAAU,cAAe,EACnD,iBAAkB,EAAW,cAAe,EAAQ,aAAc,CACpE,CAAC,EACG,IAAc,IAAA,KAChB,EAAO,IAAI,WAAY,EAAU,QAAQ,EACzC,EAAO,IAAI,QAAS,EAAU,KAAK,GAErC,IAAM,EAAQ,EAAO,SAAS,EAExB,GAAA,EAASF,EAAAA,YAAAA,KAAwB,CACrC,EAAQ,EAAI,EACZ,EAAwC,oBAAoB,GAAO,CAAC,CACjE,KAAM,GAAS,CAAE,EAAY,EAAK,QAAQ,CAAE,CAAC,CAAC,CAC9C,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAM,OAAO,CAAE,CAAC,CAAC,CAC/D,YAAc,CAAE,EAAQ,EAAK,CAAE,CAAC,CACrC,EAAG,CAAC,EAAO,CAAK,CAAC,GACjB,EAAA,EAAA,UAAA,KAAgB,CAAE,EAAO,CAAE,EAAG,CAAC,CAAM,CAAC,EAGtC,IAAM,EAAU,GAAQ,SAAS,QAAU,WAC3C,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GACV,MAAmB,CACvB,EAAwB,yBAAyB,CAAC,CAC/C,KAAM,GAAS,CAAO,GAAW,EAAU,CAAI,CAAE,CAAC,CAAC,CACnD,UAAY,CAAuB,CAAC,CACzC,EAEA,GADA,EAAK,EACD,CAAC,EAAS,UAAa,CAAE,EAAY,EAAK,EAC9C,IAAM,EAAQ,OAAO,YAAY,EAAM,IAAI,EAC3C,UAAa,CAAE,EAAY,GAAM,OAAO,cAAc,CAAK,CAAE,CAC/D,EAAG,CAAC,CAAO,CAAC,EAEZ,IAAM,OAAoB,CACxB,EAAQ,EAAI,EACZ,EAAiD,yBAA0B,CACzE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CACnB,KAAM,OAAO,CAAI,EAAG,mBAAoB,OAAO,CAAQ,EAAG,cAAe,OAAO,CAAQ,EACxF,iBAAkB,IAAc,OAAQ,cAAe,IAAW,OAAQ,aAAc,IAAU,OAClG,GAAI,IAAc,IAAA,GAAY,CAAC,EAAI,CAAE,SAAU,EAAU,SAAU,MAAO,EAAU,KAAM,CAC5F,CAAC,CACH,CAAC,CAAC,CACC,KAAM,GAAS,CAAE,EAAU,EAAK,MAAM,CAAE,CAAC,CAAC,CAC1C,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAM,OAAO,CAAE,CAAC,CAAC,CAC/D,YAAc,CAAE,EAAQ,EAAK,CAAE,CAAC,CACrC,EACM,MAAoB,CACxB,EAAoC,0BAA2B,CAC7D,OAAQ,OAAQ,QAAS,CAAE,eAAgB,kBAAmB,EAAG,KAAM,IACzE,CAAC,CAAC,CACC,KAAM,GAAS,CAAE,EAAU,EAAK,MAAM,CAAE,CAAC,CAAC,CAC1C,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAM,OAAO,CAAE,CAAC,CACnE,EAEM,EAAW,GAAQ,SACnB,GAAa,IAAa,IAAA,GAC5B,GACA,EAAS,QAAU,UAAY,EAAE,sBAAsB,EACrD,EAAS,QAAU,OAAS,EAAE,mBAAmB,EAC/C,EAAS,QAAU,YAAc,EAAE,wBAAwB,EACzD,EAAE,qBAAqB,EAC3B,EAAU,IAAa,IAAA,IAAa,EAAS,eAAiB,EAChE,EACA,KAAK,IAAI,IAAK,KAAK,MAAO,EAAS,UAAY,EAAS,aAAgB,GAAG,CAAC,EAEhF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWD,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,cAAgB,SAAA,EAAE,eAAe,CAAK,CAAA,GAG3D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,aAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,cAAc,CAAQ,CAAA,GAC/B,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,MAAO,MAAO,EAAM,SAAU,GAAS,CAAE,EAAQ,EAAM,OAAO,KAAK,CAAE,EAA/F,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,IAAK,SAAA,EAAE,mBAAoB,CAAE,EAAG,CAAE,CAAC,CAAU,CAAA,GAC3D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,KAAM,SAAA,EAAE,mBAAoB,CAAE,EAAG,EAAG,CAAC,CAAU,CAAA,GAC7D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,KAAM,SAAA,EAAE,mBAAoB,CAAE,EAAG,EAAG,CAAC,CAAU,CAAA,GAC7D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,IAAK,SAAA,EAAE,iBAAiB,CAAU,CAAA,CAC1C,CACH,CAAA,CAAA,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,aAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,kBAAkB,CAAQ,CAAA,GACnC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,MAAO,KAAK,SAAS,IAAK,EAAG,IAAK,IAAK,MAAO,EACrE,SAAU,GAAS,CAAE,EAAY,EAAM,OAAO,KAAK,CAAE,CAAI,CAAA,CACtD,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,aAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,kBAAkB,CAAQ,CAAA,GACnC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,MAAO,KAAK,SAAS,IAAK,EAAG,IAAK,IAAM,MAAO,EACtE,SAAU,GAAS,CAAE,EAAY,EAAM,OAAO,KAAK,CAAE,CAAI,CAAA,CACtD,KAEP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,aAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,eAAe,CAAQ,CAAA,GAChC,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,MAAO,MAAO,EACtC,SAAU,GAAS,CAAE,EAAe,EAAM,OAAO,KAAK,CAAE,EAD1D,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAI,SAAA,EAAE,mBAAmB,CAAU,CAAA,GAC/C,GAAQ,WAAa,CAAC,EAAA,CAAG,IAAI,IAC7B,EAAA,EAAA,IAAA,CAAC,WAAD,CAA4B,MAAO,EAAS,KACzC,SAAA,EAAS,OAAO,IAAI,IACnB,EAAA,EAAA,IAAA,CAAC,SAAD,CAA4C,MAAO,GAAG,EAAS,GAAG,IAAI,EAAM,KAAO,SAAA,EAAM,IAAa,EAAzF,GAAG,EAAS,GAAG,IAAI,EAAM,IAAgE,CACvG,CACO,EAJK,EAAS,EAId,CACX,CACK,CACH,CAAA,CAAA,GACJ,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,gBAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,eAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,IAAc,OAC5C,SAAU,GAAS,CAAE,EAAa,EAAM,OAAO,QAAU,OAAS,OAAO,CAAE,CAAI,CAAA,EAChF,EAAE,0BAA0B,CACxB,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,eAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,IAAW,OACzC,SAAU,GAAS,CAAE,EAAU,EAAM,OAAO,QAAU,OAAS,OAAO,CAAE,CAAI,CAAA,EAC7E,EAAE,uBAAuB,CACrB,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,eAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,IAAU,OACxC,SAAU,GAAS,CAAE,EAAS,EAAM,OAAO,QAAU,OAAS,OAAO,CAAE,CAAI,CAAA,EAC5E,EAAE,sBAAsB,CACpB,GACJ,KAGL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,iBACpB,SAAA,IAAa,MACV,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,cAAgB,SAAA,EAAE,oBAAoB,CAAQ,CAAA,EACtE,EAAS,cAAgB,IAAA,IAGvB,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,gBAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAE,qBAAsB,CAAE,EAAG,EAAS,UAAW,CAAC,CAAQ,CAAA,GACnG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAE,uBAAwB,CAAE,EAAG,EAAS,YAAa,CAAC,CAAQ,CAAA,GACvG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAE,kBAAmB,CAAE,EAAG,EAAS,eAAgB,CAAC,CAAQ,CAAA,CAClG,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cACpB,SAAA,EAAE,wBAAyB,CAC1B,SAAU,EAAS,QAAQ,SAC3B,OAAQ,EAAS,QAAQ,OACzB,MAAO,EAAS,QAAQ,MACxB,OAAQ,EAAS,QAAQ,OACzB,WAAY,EAAS,QAAQ,UAC/B,CAAC,CACE,CAAA,EACJ,EAAS,YAAa,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,mBAAmB,CAAO,CAAA,CAC1F,CAAA,CAAA,GAlBF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,cAAgB,SAAA,EAAS,WAAkB,CAAA,CAoBtE,CAAA,GAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,gBAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,EAAM,QAAS,EAAS,SAAA,EAAE,oBAAoB,CAAU,CAAA,GAClH,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,UAC1D,SAAU,GAAQ,GAAW,IAAa,MAAQ,EAAS,cAAgB,IAAA,IAAa,EAAS,eAAiB,EAClH,QAAS,GAAQ,SAAA,EAAE,eAAe,CAAU,CAAA,GAC9C,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,CAAC,EAAS,QAAS,EAAQ,SAAA,EAAE,eAAe,CAAU,CAAA,CAC7G,IACJ,IAAa,IAAA,KACZ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,iBAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,qBAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAiB,CAAA,GACxB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,wBAAyB,CAAE,KAAM,EAAS,UAAW,MAAO,EAAS,YAAa,CAAC,CAAQ,CAAA,CACjG,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAa,UAAA,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,MAAO,CAAE,MAAO,GAAG,OAAO,CAAO,EAAE,EAAG,CAAI,CAAA,CAAM,CAAA,GACvF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,2BAA4B,CAAE,KAAM,EAAS,aAAc,MAAO,EAAS,aAAc,CAAC,CAAQ,CAAA,GAC3G,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,kBAAmB,CAAE,EAAG,EAAS,eAAgB,CAAC,CAAQ,CAAA,GACnE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,uBAAwB,CAAE,EAAG,EAAS,YAAa,CAAC,CAAQ,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,sBAAuB,CAAE,EAAG,EAAS,WAAY,CAAC,CAAQ,CAAA,CAChE,IAEJ,OAAO,KAAK,EAAS,WAAW,CAAC,CAAC,OAAS,IAC1C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,qBAAqB,CAAQ,CAAA,EACrC,OAAO,QAAQ,EAAS,WAAW,CAAC,CAAC,MAAM,EAAG,GAAI,EAAG,KAAO,EAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAQ,MAChF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAoB,GAAG,GAAU,EAAG,CAAM,EAAE,GAAG,OAAO,CAAK,GAAU,EAA1D,CAA0D,CACtE,CACE,KAEL,GAAQ,UAAY,CAAC,EAAA,CAAG,OAAS,IACjC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,iBAAtB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,cAAgB,SAAA,EAAE,kBAAkB,CAAM,CAAA,EAC/D,EAAQ,SAAS,MAAM,EAAG,CAAC,CAAC,CAAC,KAAK,EAAS,KAC1C,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,GAAG,EAAQ,UAAU,MAAM,GAAG,EAAE,KAAK,OAAO,EAAQ,IAAI,EAAE,KAAK,EAAQ,QACtE,EAFK,GAAG,EAAQ,UAAU,GAAG,OAAO,EAAQ,IAAI,EAAE,GAAG,OAAO,CAAK,GAEjE,CACL,CACC,KAEJ,GAAQ,UAAY,CAAC,EAAA,CAAG,OAAS,IACjC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAE,mBAAmB,CAAO,CAAA,EAEpE,GAAQ,QAAU,IAAA,KAAa,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAgB,SAAA,EAAO,KAAW,CAAA,CACtF,GAEJ,GAET,CAoBA,SAAS,GAAc,CAAE,IAAG,SAA+D,CACzF,GAAM,CAAC,EAAM,IAAA,EAAWG,EAAAA,SAAAA,CAA8B,IAAI,EACpD,CAAC,EAAS,IAAA,EAAcA,EAAAA,SAAAA,CAAS,EAAK,EACtC,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAS,EAAE,EACjC,CAAC,EAAS,IAAA,EAAcA,EAAAA,SAAAA,CAAS,EAAE,EACnC,CAAC,EAAO,IAAA,EAAYA,EAAAA,SAAAA,CAAS,EAAE,EAC/B,CAAC,EAAW,IAAA,EAAgBA,EAAAA,SAAAA,CAAS,MAAM,EAC3C,CAAC,EAAM,IAAA,EAAWA,EAAAA,SAAAA,CAAS,EAAK,EAChC,CAAC,EAAS,IAAA,EAAcA,EAAAA,SAAAA,CAAS,EAAK,EA4E5C,OAzEA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAWhB,OAVA,EAAkB,YAAY,CAAC,CAC5B,KAAM,GAAS,CACV,IACJ,EAAQ,CAAI,EACZ,EAAW,EAAK,OAAO,EACvB,EAAW,EAAK,OAAO,EACvB,EAAS,EAAK,KAAK,EACnB,EAAa,OAAO,EAAK,SAAS,CAAC,EACrC,CAAC,CAAC,CACD,MAAO,GAAiB,CAAO,GAAW,EAAM,KAAK,QAAS,GAAG,EAAE,eAAe,EAAE,IAAI,EAAM,SAAS,CAAE,CAAC,MAChG,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAG,CAAK,CAAC,EA0DT,IAAS,MAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWH,EAAO,SAAW,SAAA,EAAE,SAAS,CAAQ,CAAA,GAG9E,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,IAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWA,EAAO,SAAW,SAAA,EAAE,UAAU,CAAK,CAAA,GACjD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,UAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAS,SAAU,GAAS,EAAW,EAAM,OAAO,OAAO,CAAI,CAAA,EAC9F,EAAE,YAAY,CACV,CACP,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,UAAY,SAAA,EAAK,QAAU,EAAE,aAAa,EAAI,EAAE,cAAc,CAAQ,CAAA,CAC3F,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,SAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,WAAW,CAAQ,CAAA,GAC5B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,MAAO,KAAK,WAAW,MAAO,EAAQ,aAAa,MAC1E,YAAa,EAAK,YAAc,EAAE,gBAAgB,EAClD,SAAU,GAAS,EAAU,EAAM,OAAO,KAAK,CAAI,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,SAAW,SAAA,EAAE,eAAe,CAAQ,CAAA,CACvD,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,SAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,YAAY,CAAQ,CAAA,GAC7B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,MAAO,MAAO,EAAS,SAAU,GAAS,EAAW,EAAM,OAAO,KAAK,CAAI,CAAA,CAC/F,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,SAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,UAAU,CAAQ,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,MAAO,MAAO,EAAO,SAAU,GAAS,EAAS,EAAM,OAAO,KAAK,CAAI,CAAA,CAC3F,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,SAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,cAAc,CAAQ,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,MAAO,KAAK,SAAS,IAAK,IAAM,IAAK,IAAO,MAAO,EAC1E,SAAU,GAAS,EAAa,EAAM,OAAO,KAAK,CAAI,CAAA,CACnD,GACJ,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAW,SAAA,EAAE,oBAAoB,CAAO,CAAA,GAC/D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAW,SAAA,EAAE,mBAAoB,CACtD,MAAO,EAAK,gBACZ,OAAQ,EAAK,iBACb,WAAY,EAAK,wBACnB,CAAC,CAAO,CAAA,GACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAGA,EAAO,OAAO,GAAGA,EAAO,UAAW,SAAU,EAAM,YAjGpE,CACvB,EAAQ,EAAI,EACZ,EAAyC,aAAc,CACrD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAE9C,KAAM,KAAK,UAAU,CACnB,UACA,QAAS,EAAQ,KAAK,EACtB,MAAO,EAAM,KAAK,EAClB,UAAW,OAAO,CAAS,EAC3B,GAAI,EAAO,KAAK,IAAM,GAAK,CAAC,EAAI,CAAE,OAAQ,EAAO,KAAK,CAAE,CAC1D,CAAC,CACH,CAAC,CAAC,CACC,KAAM,GAAS,CACd,EAAQ,EAAK,IAAI,EACjB,EAAU,EAAE,EACZ,EAAM,KAAK,UAAW,EAAE,UAAU,CAAC,CACrC,CAAC,CAAC,CACD,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAM,OAAO,CAAE,CAAC,CAAC,CAC/D,YAAc,CAAE,EAAQ,EAAK,CAAE,CAAC,CACrC,EA6ES,SAAA,EAAE,SAAS,CACN,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,GAAQ,EAAS,YA/D9C,CACjC,EAAW,EAAI,EACf,EAAoG,WAAY,CAC9G,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CACnB,QAAS,EAAQ,KAAK,EACtB,MAAO,EAAM,KAAK,EAClB,GAAI,EAAO,KAAK,IAAM,GAAK,CAAC,EAAI,CAAE,OAAQ,EAAO,KAAK,CAAE,CAC1D,CAAC,CACH,CAAC,CAAC,CACC,KAAM,GAAW,CACZ,EAAO,GAAI,EAAM,KAAK,UAAW,EAAE,YAAa,CAAE,GAAI,EAAO,UAAW,EAAG,EAAO,WAAY,CAAC,CAAC,EAC/F,EAAM,KAAK,QAAS,EAAE,cAAe,CAAE,MAAO,EAAO,OAAS,EAAG,CAAC,CAAC,CAC1E,CAAC,CAAC,CACD,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAM,OAAO,CAAE,CAAC,CAAC,CAC/D,YAAc,CAAE,EAAW,EAAK,CAAE,CAAC,CACxC,EA+CS,SAAA,EAAE,SAAS,CACN,CAAA,EACP,EAAK,YACJ,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,EAAM,YAjF3C,CAC3B,EAAQ,EAAI,EACZ,EAAyC,aAAc,CACrD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAE9C,KAAM,KAAK,UAAU,CAAE,OAAQ,EAAG,CAAC,CACrC,CAAC,CAAC,CACC,KAAM,GAAS,CAAE,EAAQ,EAAK,IAAI,EAAG,EAAM,KAAK,UAAW,EAAE,eAAe,CAAC,CAAE,CAAC,CAAC,CACjF,MAAO,GAAiB,CAAE,EAAM,KAAK,QAAS,EAAM,OAAO,CAAE,CAAC,CAAC,CAC/D,YAAc,CAAE,EAAQ,EAAK,CAAE,CAAC,CACrC,EAuEW,SAAA,EAAE,aAAa,CACV,CAAA,CAEP,GACF,GAET,CAeA,IAAM,GAA0E,CAC9E,MAAO,qBACP,OAAQ,sBACR,MAAO,qBACP,QAAS,uBACT,OAAQ,sBACR,SAAU,uBACZ,EAMA,SAAS,GAAoB,CAAE,IAAG,SAA+D,CAC/F,GAAM,CAAC,EAAO,IAAA,EAAYG,EAAAA,SAAAA,CAA+C,IAAI,EAsB7E,OApBA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAEV,EAAU,GAAiC,CAC/C,EAA8C,kBAAkB,CAAC,CAC9D,KAAM,GAAS,CAAO,GAAW,EAAS,EAAK,KAAK,CAAE,CAAC,CAAC,CACxD,MAAO,GAAiB,CACnB,IACJ,EAAS,GAAY,GAAY,CAAC,CAAC,EAC/B,GAAe,EAAM,KAAK,QAAS,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAM,SAAS,EACrF,CAAC,CACL,EACA,EAAO,EAAI,EACX,IAAM,EAAQ,OAAO,gBAAkB,EAAO,EAAK,EAAG,IAAI,EAC1D,UAAa,CAAE,EAAY,GAAM,OAAO,cAAc,CAAK,CAAE,CAC/D,EAAG,CAAC,EAAG,CAAK,CAAC,EAET,IAAU,MAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWH,EAAO,SAAW,SAAA,EAAE,SAAS,CAAQ,CAAA,EAC7E,EAAM,SAAW,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,SAAW,SAAA,EAAE,aAAa,CAAQ,CAAA,GAGvF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAa,SAAA,EAAE,aAAa,CAAO,CAAA,EACzD,EAAM,KAAK,EAAM,KAChB,EAAA,EAAA,KAAA,CAAC,MAAD,CAA8C,UAAWA,EAAO,WAAhE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,WAAa,SAAA,IAAI,KAAK,EAAK,EAAE,CAAC,CAAC,mBAAmB,CAAQ,CAAA,GAClF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,OAAS,OAAS,EAAE,gBAAgB,EAAI,EAAE,yBAAyB,CAAQ,CAAA,GACvF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,UAAY,WAC9BA,EAAO,gBACP,EAAK,UAAY,WAAa,EAAK,UAAY,QAAUA,EAAO,gBAAkBA,EAAO,YAC1F,SAAA,EAAE,GAAY,EAAK,QAAQ,CACxB,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,SAAW,KAAK,EAAK,aAAa,QAAQ,CAAC,IAAM,EAAE,gBAAgB,CAAQ,CAAA,GACvF,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAO,EAAK,UAAU,IAAQ,CAAA,CAAA,EAC7B,EAAK,QAAU,IAAA,KAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,kBAAmB,CAAE,MAAO,EAAK,KAAM,CAAC,CAAQ,CAAA,CAClH,CAXK,EAAA,GAAG,EAAK,GAAG,GAAG,EAAK,KAAK,GAAG,GAWhC,CACN,CACE,GAET,CAIA,SAAS,GAAW,CAAE,IAAG,QAAO,WAKT,CACrB,GAAM,CAAC,EAAM,IAAA,EAAWG,EAAAA,SAAAA,CAAS,EAAK,EAChC,GAAA,EAAUC,EAAAA,OAAAA,CAA8B,IAAI,GAClD,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,GAA4B,EACvC,EAAQ,UAAY,MAAQ,CAAC,EAAQ,QAAQ,SAAS,EAAM,MAAc,IAAG,EAAQ,EAAK,CAChG,EAEA,OADA,OAAO,iBAAiB,YAAa,CAAO,MAC/B,CAAE,OAAO,oBAAoB,YAAa,CAAO,CAAE,CAClE,EAAG,CAAC,CAAI,CAAC,EACT,IAAM,EAAe,IAAU,WAAa,IAAY,KAAO,YAAY,mBAAmB,CAAO,IAAM,GACrG,EAAgE,CACpE,CAAE,MAAO,EAAE,UAAU,EAAG,KAAM,EAAE,cAAc,EAAG,KAAM,4BAA4B,IAAQ,EAAa,iBAAkB,EAC1H,CAAE,MAAO,EAAE,YAAY,EAAG,KAAM,EAAE,gBAAgB,EAAG,KAAM,4BAA4B,IAAQ,EAAa,aAAc,EAC1H,CAAE,MAAO,EAAE,cAAc,EAAG,KAAM,EAAE,kBAAkB,EAAG,KAAM,4BAA4B,IAAQ,GAAe,CACpH,EACA,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWJ,EAAO,WAAY,IAAK,EAAxC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,gBAAc,OAAO,gBAAe,EAClF,YAAe,CAAE,EAAQ,GAAS,CAAC,CAAK,CAAE,EAD5C,SAAA,CAEG,EAAE,QAAQ,GACX,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAa,cAAY,OAAO,SAAA,GAAO,CAAA,CACzD,CACP,CAAA,EAAA,IACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAY,KAAK,OACrC,SAAA,EAAQ,IAAI,IACX,EAAA,EAAA,KAAA,CAAC,IAAD,CAAqB,KAAK,WAAW,UAAWA,EAAO,WAAY,KAAM,EAAO,KAC9E,YAAe,CAAE,EAAQ,EAAK,CAAE,EADlC,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,gBAAkB,SAAA,EAAO,KAAY,CAAA,GAC7D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,eAAiB,SAAA,EAAO,IAAW,CAAA,CAC1D,CAJK,EAAA,EAAO,IAIZ,CACJ,CACE,CAAA,CAEJ,GAET,CAWA,SAAgB,GAAc,CAAE,IAAG,aAAY,YAAoD,CACjG,IAAM,EAAQ,EAAS,EAEjB,CAAC,EAAO,GAAY,EAAiD,gBAAiB,OAAQ,CAAC,OAAQ,UAAW,QAAQ,CAAC,EAE3H,CAAC,EAAQ,GAAa,EAA0B,iBAAkB,MAAO,CAAC,MAAO,SAAU,WAAY,WAAW,CAAC,EACnH,CAAC,EAAM,GAAW,EAA0B,eAAgB,MAAO,CAAC,MAAO,OAAQ,aAAc,WAAY,UAAW,OAAO,CAAC,EAChI,CAAC,EAAG,GAAQ,EAAmB,YAAa,EAAE,EAE9C,CAAC,EAAM,GAAW,EAAmC,eAAgB,OAAQ,CAAC,OAAQ,MAAM,CAAC,EAE7F,CAAC,EAAU,IAAA,EAAeG,EAAAA,SAAAA,CAAS,CAAC,EACpC,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAA8B,IAAI,GAAK,EAE7D,CAAC,EAAS,IAAA,EAAcA,EAAAA,SAAAA,CAAS,EAAK,EAEtC,CAAC,IAAA,EAAYA,EAAAA,SAAAA,CAAS,KAAK,EAC3B,CAAC,EAAQ,IAAA,EAAaA,EAAAA,SAAAA,CAAS,CAAC,EAChC,CAAC,EAAM,KAAA,EAAWA,EAAAA,SAAAA,CAA4B,IAAI,EAClD,CAAC,EAAO,IAAA,EAAYA,EAAAA,SAAAA,CAAwB,IAAI,EAEhD,CAAC,EAAU,IAAA,EAAeA,EAAAA,SAAAA,CAAgE,IAAI,EAC9F,CAAC,GAAY,KAAA,EAAiBA,EAAAA,SAAAA,CAAS,CAAC,EAExC,CAAC,EAAU,IAAA,EAAeA,EAAAA,SAAAA,CAA8B,IAAI,GAAK,EAEjE,CAAC,EAAe,KAAA,EAAoBA,EAAAA,SAAAA,CAAS,EAAK,EAElD,CAAC,EAAW,IAAA,EAAgBA,EAAAA,SAAAA,CAAkG,OAAO,EAErI,CAAC,EAAa,IAAkB,EAAmB,kBAAmB,QAAQ,EAE9E,EAAmB,GAAoB,EAAY,CAAQ,EAC3D,CAAC,EAAe,KAAA,EAAoBA,EAAAA,SAAAA,CAAsC,IAAI,EAC9E,GAAc,EAAiB,WAAW,aAAe,IAG/D,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAIhB,OAHA,EAA0B,YAAY,CAAC,CACpC,KAAM,GAAS,CAAO,GAAW,GAAiB,CAAI,CAAE,CAAC,CAAC,CAC1D,UAAY,CAAuC,CAAC,MAC1C,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,GAAa,EAAa,EAAU,CAAC,EAGzC,IAAM,GAAkB,GAAkB,EAAe,EAAiB,SAAS,EAE7E,EAAkB,IAAgB,SAAW,IAAiB,QAAU,KAAO,EAErF,GAAwB,EAExB,IAAM,EAAO,GAAY,EAAG,CAC1B,KAAM,EACN,UAAW,EAAiB,UAC5B,MAAO,GAAe,OAAS,CAAC,EAChC,SAAU,GACV,mBAAoB,GAAe,gBAAgB,MAAQ,IAC7D,CAAC,EAEK,GAAgB,IAAgB,UACjC,EAAE,GAAe,OAAS,CAAC,EAAA,CAAG,KAAK,GAAQ,EAAK,SAAW,CAAW,EAGrE,GAAW,GAAkB,EAAO,CAAe,EAEnD,GAAA,EAASF,EAAAA,YAAAA,KAAwB,CAAE,GAAc,GAAQ,EAAO,CAAC,CAAE,EAAG,CAAC,CAAC,EAGxE,IAAA,EAAaG,EAAAA,OAAAA,CAAO,EAAK,GAC/B,EAAA,EAAA,UAAA,MACE,OAA8B,CAExB,GAAW,SAAW,IAAgB,WAC1C,GAAW,QAAU,GACrB,GAAe,QAAQ,EACvB,EAAU,CAAC,EACX,EAAY,IAAI,EAChB,EAAY,IAAI,GAAK,EACrB,EAAO,EACT,MACa,CAAE,GAAkB,IAAK,GACrC,CAAC,EAAa,CAAM,CAAC,GACxB,EAAA,EAAA,UAAA,KAAgB,CACV,IAAgB,WAAU,GAAW,QAAU,GACrD,EAAG,CAAC,CAAW,CAAC,EAGhB,IAAM,IAAA,EAAaH,EAAAA,YAAAA,KAAwB,CACzC,EAA0C,oBAAoB,EAAM,UAAU,CAAC,CAC5E,KAAK,GAAQ,CACZ,EAAY,EAAK,MAAM,MAAM,EAC7B,EAAU,IAAI,IAAI,EAAK,MAAM,IAAI,GAAQ,EAAK,EAAE,CAAC,CAAC,CACpD,CAAC,CAAC,CACD,UAAY,CAAE,EAAY,CAAC,EAAG,EAAU,IAAI,GAAK,CAAE,CAAC,CACzD,EAAG,CAAC,EAAO,CAAe,CAAC,GAC3B,EAAA,EAAA,UAAA,KAAgB,CAAE,GAAW,CAAE,EAAG,CAAC,EAAU,CAAC,EAG9C,IAAM,OAAsB,CAC1B,EAAa,SAAS,EACtB,EAAW,EAAI,CACjB,EAGM,IAAA,EAAaA,EAAAA,YAAAA,CAAa,GAAqB,CACnD,IAAM,EAAS,GAAM,QAAQ,KAAK,GAAO,EAAI,KAAO,CAAE,EACtD,EAAY,CACV,KAAM,SACN,OAAQ,GAAW,CACb,KAAa,QAAO,KAAM,OAAQ,QAAS,GAAI,WAAY,GAAK,WAAY,GAChF,OAAQ,SAAU,UAAW,KAAK,IAAI,EAAG,YAAa,EAAG,gBAAiB,KAAM,YAAa,IAC/F,CACF,CAAC,CACH,EAAG,CAAC,EAAM,CAAK,CAAC,GAEhB,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GACV,EAAK,IAAI,gBAAgB,CAC7B,QAAO,SAAQ,OAAM,WAAU,MAAO,KAAmB,OAAQ,OAAO,CAAM,CAChF,CAAC,EAMD,OALI,IAAM,IAAI,EAAG,IAAI,IAAK,CAAC,EACvB,IAAS,QAAQ,EAAG,IAAI,OAAQ,MAAM,EAC1C,EAAgB,QAAQ,EAAG,SAAS,GAAG,CAAC,CACrC,KAAM,GAAS,CAAO,IAAa,GAAQ,CAAI,EAAG,EAAS,IAAI,EAAI,CAAC,CAAC,CACrE,MAAO,GAAqB,CAAO,GAAW,EAAS,EAAU,OAAO,CAAE,CAAC,MACjE,CAAE,EAAY,EAAK,CAClC,EAAG,CAAC,EAAO,EAAQ,EAAM,EAAU,EAAG,EAAM,EAAQ,GAAY,CAAe,CAAC,EAGhF,IAAM,IAAA,EAAcG,EAAAA,OAAAA,CAAO,CAAe,GAC1C,EAAA,EAAA,UAAA,KAAgB,CACV,GAAY,UAAY,IAC5B,GAAY,QAAU,EACtB,EAAU,CAAC,EACX,EAAY,IAAI,EAChB,EAAY,IAAI,GAAK,EACvB,EAAG,CAAC,CAAe,CAAC,EAEpB,IAAM,IAAO,EAAe,IAA4B,CACtD,EAAI,EAAO,CACT,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAE,GAAI,EAAO,GAAI,MAAO,EAAO,KAAM,CAAC,CAC7D,CAAC,CAAC,CACC,KAAK,CAAM,CAAC,CACZ,MAAO,GAAoB,CAAE,EAAM,KAAK,QAAS,EAAS,OAAO,CAAE,CAAC,CACzE,EAEM,IAAU,EAA+B,IAA4B,CACzE,EAAY,GAAY,IAAY,MAAQ,EAAQ,OAAS,GAAc,EAAQ,OAAO,KAAO,EAAO,GACpG,KACA,CAAE,KAAM,EAAY,QAAO,CAAC,CAClC,EAEM,GAAa,GAAM,SAAW,CAAC,EAE/B,EAAc,EAAU,GAAW,OAAO,GAAU,EAAO,IAAI,EAAO,EAAE,CAAC,EAAI,GAC7E,GAAkB,EAAY,OAAO,GAAU,EAAS,IAAI,EAAO,EAAE,CAAC,EACtE,GAAa,GAAgB,OAAO,GAAU,EAAO,SAAW,QAAQ,CAAC,CAAC,OAC1E,GAAa,GAAgB,OAAS,GACtC,GAAc,EAAY,OAAS,GAAK,EAAY,MAAM,GAAU,EAAS,IAAI,EAAO,EAAE,CAAC,EAE3F,GAAgB,GAAqB,CACzC,EAAY,GAAW,CACrB,IAAM,EAAO,IAAI,IAAI,CAAO,EAG5B,OAFI,EAAK,IAAI,CAAE,EAAG,EAAK,OAAO,CAAE,EAC3B,EAAK,IAAI,CAAE,EACT,CACT,CAAC,CACH,EAEM,MAA6B,CAAE,EAAY,IAAI,GAAK,EAAG,GAAiB,EAAK,CAAE,EAE/E,OAA4B,CAChC,EAAY,GAAW,CACrB,IAAM,EAAO,IAAI,IAAI,CAAO,EAG5B,OAFI,GAAa,EAAY,QAAQ,GAAU,EAAK,OAAO,EAAO,EAAE,CAAC,EAChE,EAAY,QAAQ,GAAU,EAAK,IAAI,EAAO,EAAE,CAAC,EAC/C,CACT,CAAC,CACH,EAGM,GAAY,GAAqC,CACrD,IAAM,EAAU,IAAS,SACrB,GAAgB,OAAO,GAAU,EAAO,SAAW,QAAQ,EAC3D,GAAgB,OAAO,GAAU,EAAO,SAAW,QAAQ,EAC3D,EAAQ,SAAW,GACvB,QAAa,WAAW,EAAQ,IAAI,GAAU,EAAI,EAAM,CACtD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAE,GAAI,EAAO,GAAI,MAAO,EAAO,KAAM,CAAC,CAC7D,CAAC,CAAC,CAAC,CAAC,CAAC,SAAW,CAAE,EAAe,EAAG,EAAO,CAAE,CAAC,CAChD,EAEM,OAA6B,CAEjC,GAAI,EAAe,CAAE,GAAS,QAAQ,EAAG,MAAO,CAChD,GAAiB,EAAI,CACvB,EAEM,GAAO,KAAK,MAAM,EAAS,EAAS,EAAI,EACxC,GAAQ,IAAS,KAAO,EAAI,KAAK,IAAI,EAAG,KAAK,KAAK,EAAK,MAAQ,EAAS,CAAC,EAEzE,IAAA,EAAUA,EAAAA,OAAAA,CAA8C,IAAI,GAAK,EACjE,CAAC,GAAc,KAAA,EAAmBD,EAAAA,SAAAA,CAA2D,CAAE,KAAM,EAAG,MAAO,EAAG,QAAS,CAAE,CAAC,EAC9H,IAAA,EAAaF,EAAAA,YAAAA,KAAwB,CACzC,IAAM,EAAO,GAAQ,QAAQ,IAAI,CAAK,EAClC,GAAS,MACb,GAAgB,CAAE,KAAM,EAAK,WAAY,MAAO,EAAK,YAAa,QAAS,CAAE,CAAC,CAChF,EAAG,CAAC,CAAK,CAAC,EAQV,OAPA,EAAA,EAAA,UAAA,KAAgB,CACd,GAAW,EACX,IAAM,MAAuB,GAAW,EAExC,OADA,OAAO,iBAAiB,SAAU,CAAQ,MAC7B,CAAE,OAAO,oBAAoB,SAAU,CAAQ,CAAE,CAChE,EAAG,CAAC,EAAU,CAAC,GAGb,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWD,EAAO,MAAvB,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,eAAgB,cAAY,MAAQ,CAAA,GAI3D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UAAvB,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,UAAW,cAAY,MAAQ,CAAA,GAEvD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAa,SAAA,SAAa,CAAA,GAElD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,WAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAM,IAAU,OAAS,OAAS,IAAU,UAAY,UAAY,SAAU,UAAWA,EAAO,SAAY,CAAA,GAClH,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAE,EAAU,EAAM,CAAU,CAAA,CACjC,GACH,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAGA,EAAO,SAAS,GAAGA,EAAO,WAA7C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,aACtB,MAAO,CAAE,KAAM,GAAG,OAAO,GAAa,IAAI,EAAE,IAAK,MAAO,GAAG,OAAO,GAAa,KAAK,EAAE,IAAK,QAAS,GAAa,OAAQ,CAAI,CAAA,EAC7H,CAAC,OAAQ,UAAW,QAAQ,CAAC,CAAW,IAAI,IAC5C,EAAA,EAAA,KAAA,CAAC,SAAD,CAAqB,KAAK,SAAS,IAAK,GAAQ,CAAE,GAAQ,QAAQ,IAAI,EAAQ,CAAI,CAAE,EAClF,UAAW,IAAU,EAAS,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QACxE,YAAe,CAAE,EAAS,CAAM,EAAG,EAAU,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EAFvF,SAAA,EAGE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAM,IAAW,OAAS,OAAS,IAAW,UAAY,UAAY,SAAU,UAAWA,EAAO,SAAY,CAAA,EACnH,EAAE,EAAU,EAAO,CACd,CALK,EAAA,CAKL,CACT,CACE,IAEJ,EAAW,IACV,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,SACtC,MAAO,EAAE,gBAAiB,CAAE,EAAG,CAAS,CAAC,EAAG,aAAY,EAAE,gBAAiB,CAAE,EAAG,CAAS,CAAC,EAC1F,QAAS,GAFX,SAAA,EAGE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,QAAQ,UAAWA,EAAO,OAAU,CAAA,EAC9C,CACK,KAEV,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,YAAe,CAAE,EAAO,EAAG,GAAW,CAAE,EAAxF,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,UAAU,UAAWA,EAAO,SAAY,CAAA,EAClD,EAAE,SAAS,CACN,KACR,EAAA,EAAA,IAAA,CAAC,GAAD,CAAe,IAAU,QAAO,QAAS,CAAkB,CAAA,CACxD,IAIJ,IAAU,YACT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAW,GAAGA,EAAO,SAAS,EAAK,OAAS,SAAW,IAAIA,EAAO,WAAa,EAAK,OAAS,QAAU,IAAIA,EAAO,UAAY,KAC9H,MAAO,EAAK,MAFd,SAAA,EAGE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,SAAS,UAAWA,EAAO,UAAa,CAAA,EAClD,EAAK,KACF,CACN,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,GAAGA,EAAO,MAAM,GAAGA,EAAO,WAAY,MAAO,EAC9D,aAAY,EAAE,eAAe,EAAG,MAAO,EAAE,eAAe,EACxD,SAAU,GAAS,CAAE,GAAe,EAAM,OAAO,KAAK,EAAG,EAAU,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EAF7G,SAAA,EAGE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,SAAU,SAAA,EAAE,eAAe,CAAU,CAAA,GACjD,GAAe,OAAS,CAAC,EAAA,CAAG,IAAI,IAChC,EAAA,EAAA,IAAA,CAAC,SAAD,CAA0B,MAAO,EAAK,OAAS,SAAA,GAAmB,EAAG,CAAI,CAAU,EAAtE,EAAK,MAAiE,CACpF,EACA,KACC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAO,EAAc,SAAA,GAAG,GAAY,CAAW,EAAE,KAAK,EAAE,qBAAqB,GAAY,CAAA,CAE7F,CACL,CAAA,CAAA,GAEJ,KAIL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,KAAM,KAAK,UAAlC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,QAAU,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAC7E,gBAAe,IAAc,QAC7B,YAAe,CAAE,EAAa,OAAO,CAAE,EAHzC,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,QAAQ,UAAWA,EAAO,OAAU,CAAA,EAC9C,EAAE,UAAU,CACP,KACR,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,UAAY,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAC/E,gBAAe,IAAc,UAC7B,YAAe,CAAE,EAAa,SAAS,CAAE,EAH3C,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,UAAU,UAAWA,EAAO,OAAU,CAAA,EAChD,EAAE,YAAY,GACf,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,EAAE,kBAAmB,CAAE,EAAG,GAAM,OAAS,CAAE,CAAC,CAAS,CAAA,CACvD,KACR,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,WAAa,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAChF,gBAAe,IAAc,WAC7B,YAAe,CAAE,EAAa,UAAU,CAAE,EAH5C,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,WAAW,UAAWA,EAAO,OAAU,CAAA,EACjD,EAAE,aAAa,CACV,KACR,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,WAAa,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAChF,gBAAe,IAAc,WAC7B,YAAe,CAAE,EAAa,UAAU,CAAE,EAH5C,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,WAAW,UAAWA,EAAO,OAAU,CAAA,EACjD,EAAE,aAAa,CACV,KACR,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,WAAa,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAChF,gBAAe,IAAc,WAC7B,YAAe,CAAE,EAAa,UAAU,CAAE,EAH5C,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,WAAW,UAAWA,EAAO,OAAU,CAAA,EACjD,EAAE,aAAa,CACV,KACR,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,MAAQ,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAC3E,gBAAe,IAAc,MAC7B,YAAe,CAAE,EAAa,KAAK,CAAE,EAHvC,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,MAAM,UAAWA,EAAO,OAAU,CAAA,EAC5C,EAAE,QAAQ,CACL,KACR,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,WAAa,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAChF,gBAAe,IAAc,WAC7B,YAAe,CAAE,EAAa,UAAU,CAAE,EAH5C,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,WAAW,UAAWA,EAAO,OAAU,CAAA,EACjD,EAAE,aAAa,CACV,KACR,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,KAAK,MACzB,UAAW,IAAc,MAAQ,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAC3E,gBAAe,IAAc,MAC7B,YAAe,CAAE,EAAa,KAAK,CAAE,EAHvC,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,MAAM,UAAWA,EAAO,OAAU,CAAA,EAC5C,EAAE,QAAQ,CACL,GACL,IAEJ,IAAc,YACb,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACrB,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,YAAY,CAAM,CAAA,CACtD,CAAA,GAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,GAAGA,EAAO,MAAM,GAAGA,EAAO,SAAU,YAAa,EAAE,mBAAmB,EAAG,MAAO,EAChG,SAAU,GAAS,CAAE,EAAK,EAAM,OAAO,MAAM,KAAK,CAAC,EAAG,EAAU,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,CAAI,CAAA,GAC9G,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACnB,SAAA,CACA,CAAC,MAAO,EAAE,aAAa,CAAC,EACxB,CAAC,SAAU,EAAE,cAAc,CAAC,EAC5B,CAAC,WAAY,EAAE,gBAAgB,CAAC,EAChC,CAAC,YAAa,EAAE,iBAAiB,CAAC,CACpC,CAAC,CAAW,KAAK,CAAC,EAAO,MACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAoB,KAAK,SACvB,UAAW,IAAW,EAAQ,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QACxE,YAAe,CAAE,EAAU,CAAK,EAAG,EAAU,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EACpF,SAAA,CACK,EAJK,CAIL,CACT,CACE,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACrB,UAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,eAAc,EAClC,UAAW,EAAU,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QAC/D,YAAe,CAAE,EAAW,CAAC,CAAO,EAAG,EAAU,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EACxF,SAAA,EAAE,gBAAgB,CACb,CAAA,CACL,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACnB,SAAA,CAAC,CAAC,OAAQ,EAAE,UAAU,CAAC,EAAG,CAAC,OAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAW,KAAK,CAAC,EAAO,MAC1E,EAAA,EAAA,IAAA,CAAC,SAAD,CAAoB,KAAK,SACvB,UAAW,IAAS,EAAQ,GAAGA,EAAO,QAAQ,GAAGA,EAAO,KAAOA,EAAO,QACtE,YAAe,CAAE,EAAQ,CAAK,EAAG,EAAU,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EAClF,SAAA,CACK,EAJK,CAIL,CACT,CACE,CAAA,CACF,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QACnB,SAAA,CACA,CAAC,MAAO,EAAE,UAAU,CAAC,EACrB,GAAG,EAAM,IAAI,GAAU,CAAC,EAAQ,EAAU,EAAG,CAAM,CAAC,CAAU,CAChE,CAAC,CAAW,KAAK,CAAC,EAAO,MACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAoB,KAAK,SAAS,eAAc,IAAS,EACvD,UAAW,IAAS,EAAQ,GAAGA,EAAO,KAAK,GAAGA,EAAO,SAAWA,EAAO,KACvE,YAAe,CAAE,EAAQ,CAAK,EAAG,EAAU,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EAClF,SAAA,CACK,EAJK,CAIL,CACT,CACE,CAAA,EAEJ,EAAS,KAAO,IACf,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,gBAAiB,CAAE,EAAG,EAAS,IAAK,CAAC,CAAQ,CAAA,GACtD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,QAAS,GACtD,SAAc,EAAd,GAAgB,cAAmB,WAAW,CACzC,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,KAAe,EACvE,YAAe,GAAS,SAAS,EAAI,SAAA,EAAE,eAAgB,CAAE,EAAG,EAAW,CAAC,CAAU,CAAA,GACpF,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SACX,UAAW,EAAgB,GAAGA,EAAO,OAAO,GAAGA,EAAO,SAAWA,EAAO,OACxE,SAAU,KAAe,EACzB,QAAS,GACR,SAAgB,EAAhB,EAAkB,qBAA6C,cAAvB,CAAE,EAAG,EAAW,CAAuC,CAC1F,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,QAAS,EAAiB,SAAA,EAAE,gBAAgB,CAAU,CAAA,CACnG,IAGN,IAAU,OACT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAE,aAAc,CAAE,IAAK,CAAM,CAAC,CAAK,CAAA,GACvC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,WAAW,CAAQ,CAAA,CACzB,IAEN,IAAU,MAAQ,IAAS,OAC1B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,aACpB,SAAA,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CAAC,IAAI,IAChB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAiB,UAAWA,EAAO,SAAU,MAAO,CAAE,eAAgB,GAAG,OAAO,EAAQ,EAAE,EAAE,GAAI,EAAhG,SAAA,EAAmG,EAAA,EAAA,IAAA,CAAC,IAAD,CAAI,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAI,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAI,CAAA,CAAM,CAA7G,EAAA,CAA6G,CACxH,CACE,CAAA,EAEN,IAAU,MAAQ,IAAS,MAAQ,EAAY,SAAW,IACzD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAE,OAAO,CAAK,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,WAAW,CAAQ,CAAA,CACzB,IAGN,EAAY,OAAS,IACpB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACpB,SAAA,EAAY,KAAK,EAAQ,KACxB,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,EAAS,IAAI,EAAO,EAAE,EAAI,GAAGA,EAAO,KAAK,GAAGA,EAAO,WAAaA,EAAO,KAClF,MAAO,CAAE,eAAgB,GAAG,OAAO,KAAK,IAAI,EAAO,EAAE,EAAI,EAAE,EAAE,GAAI,EAFnE,SAAA,EAGE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,UAAWA,EAAO,UAAW,QAAS,EAAS,IAAI,EAAO,EAAE,EACjF,aAAY,EAAO,QAAQ,MAAM,EAAG,EAAE,EAAG,aAAgB,GAAa,EAAO,EAAE,CAAI,CAAA,GACrF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAGA,EAAO,KAAK,GAAGA,EAAO,SAAS,EAAO,OAAO,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAO,OAAO,MAAM,CAAC,MAAQ,KAAO,SAAA,EAAE,EAAW,EAAO,OAAO,CAAQ,CAAA,GAClK,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAc,EAAO,IAAI,EAAI,SAAA,EAAU,EAAG,EAAO,IAAI,CAAQ,CAAA,EAC7E,EAAO,OAAS,IAAA,KACf,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,KAAxB,SAAA,CAA+B,EAAO,KAAK,KAAK,IAAE,EAAO,KAAK,KAAY,IAE3E,EAAO,QAAQ,SAAS,YAAY,IACnC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAGA,EAAO,KAAK,GAAGA,EAAO,WAAa,SAAA,EAAE,aAAa,CAAQ,CAAA,EAE/E,EAAO,UAAY,IAAA,KAClB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAGA,EAAO,KAAK,GAAG,EAAO,UAAY,UAAYA,EAAO,eAAiBA,EAAO,iBAC9F,SAAA,EAAO,UAAY,UAAY,EAAE,mBAAmB,EAAI,EAAE,mBAAmB,CAC1E,CAAA,GAER,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,UAAW,MAAO,EAAQ,EAAO,SAAS,EAAlE,SAAA,CACG,EAAE,EAAU,EAAO,MAAM,EAAE,MAAI,GAAQ,EAAG,EAAO,SAAS,CACvD,GACH,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QAAU,SAAA,EAAO,OAAa,CAAA,GACrD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAE,YAAY,CAAK,CAAA,EAAC,IAAE,EAAO,WAAW,QAAQ,CAAC,CAAQ,CAAA,CAAA,GACnE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAE,YAAY,CAAK,CAAA,EAAC,IAAE,EAAO,WAAW,QAAQ,CAAC,CAAQ,CAAA,CAAA,GACnE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,cAAe,CAAE,EAAG,EAAO,WAAY,CAAC,CAAQ,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAY,EAAG,CAAM,CAAQ,CAAA,CACjC,GACF,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OACtC,YAAe,CAAE,GAAO,SAAU,CAAM,CAAE,EAAI,SAAA,EAAE,QAAQ,CAAU,CAAA,GACpE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OACtC,YAAe,CAAE,GAAO,OAAQ,CAAM,CAAE,EAAI,SAAA,EAAE,MAAM,CAAU,CAAA,EAC/D,EAAO,SAAW,UACf,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OACtC,YAAe,CAAE,GAAI,SAAU,CAAM,CAAE,EAAI,SAAA,EAAE,QAAQ,CAAU,CAAA,GACjE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OACtC,YAAe,CAAE,GAAI,UAAW,CAAM,CAAE,EAAI,SAAA,EAAE,SAAS,CAAU,CAAA,CACpE,GACF,CA3CK,EAAA,EAAO,EA2CZ,CACN,CACE,CAAA,GAGP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,IAAW,EAAG,aAAY,EAAE,UAAU,EAC9F,YAAe,CAAE,EAAU,KAAK,IAAI,EAAG,EAAS,EAAS,CAAC,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EAAG,SAAA,GAAS,CAAA,GAC/G,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,YAAa,CAAE,QAAM,SAAO,MAAO,GAAM,OAAS,CAAE,CAAC,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,OAAQ,SAAU,IAAS,MAAQ,EAAS,IAAa,EAAK,MACpG,aAAY,EAAE,UAAU,EACxB,YAAe,CAAE,EAAU,EAAS,EAAS,EAAG,EAAY,IAAI,EAAG,EAAe,CAAE,EAAG,SAAA,GAAS,CAAA,CAC/F,GACF,IAGN,IAAc,UACb,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,IAAa,YAAoB,UAAW,CAAA,GAC1D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,OAAvB,SAAA,EAGE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QACrB,UAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACrB,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,mBAAmB,CAAM,CAAA,CAC7D,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAqB,IAAU,QAAO,QAAS,EAAiB,SAAU,EAAa,CAAA,CACpF,CAAA,CACE,GACN,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,QAAzB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACrB,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,cAAc,CAAM,CAAA,CACxD,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,IAAU,QAAO,QAAS,CAAkB,CAAA,CACzD,CAAA,CACE,KACT,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,YAAY,CAAM,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,WAAW,CAAQ,CAAA,CACxD,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,IAAG,OAAQ,GAAS,MAAS,CAAA,CAC5C,CAAA,CACE,KACT,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACrB,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,aAAa,CAAM,CAAA,CACvD,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAe,IAAU,QAAO,QAAS,EAAiB,SAAU,GAAY,cAAe,EAAe,OAAQ,CAAA,CACnH,CAAA,CACE,GACJ,CACJ,CAAA,CAAA,CACF,CAAA,CAAA,IAGN,IAAc,aACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAErB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACrB,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,iBAAiB,CAAM,CAAA,CAC3D,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,IAAU,QAAO,QAAS,EAAiB,SAAU,EAAa,CAAA,CACjF,CAAA,CACE,CACT,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,YAAY,CAAM,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,WAAW,CAAQ,CAAA,CACxD,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,IAAU,OAAQ,CAAA,CAC/B,CAAA,CACE,CACN,CAAA,CAAA,GACF,CAAA,EAGN,IAAc,aACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACrB,UAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,aAAa,CAAM,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,aAAa,CAAQ,CAAA,CAC1D,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAwB,IAAU,QAAO,QAAS,EAA6B,aAAa,CAAA,CACrF,GACN,CAAA,EAGN,IAAc,aACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACrB,UAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,aAAa,CAAM,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWA,EAAO,YAAc,SAAA,EAAE,YAAY,CAAQ,CAAA,CACzD,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAe,IAAU,QAAO,QAAS,EAA6B,aAAa,CAAA,CAC5E,GACN,CAAA,EAGN,IAAc,QACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,IAAG,UAAW,GAAS,UAAW,QAAS,CAAkB,CAAA,CACvE,CAAA,EAGN,IAAc,aACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SACrB,UAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACrB,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,oBAAoB,CAAM,CAAA,CAC9D,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAwB,IAAU,OAAQ,CAAA,CACvC,CAAA,CACE,GACN,CAAA,EAGN,IAAc,QACb,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YACrB,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWA,EAAO,aAAe,SAAA,EAAE,QAAQ,CAAM,CAAA,CAClD,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,IAAU,OAAQ,CAAA,CACjC,CAAA,CACE,CACT,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAWA,EAAO,QACzB,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,UACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAwB,IAAU,OAAQ,CAAA,CACvC,CAAA,CACE,CAAA,CACN,IAIN,IAAa,OACZ,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAa,YAAe,CAAE,EAAY,IAAI,CAAE,CAAI,CAAA,GAC3E,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAWA,EAAO,OAAQ,KAAK,SAAS,aAAY,EAAE,aAAa,EAA1E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWA,EAAO,WAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,aAAa,CAAM,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,MAAO,EAAS,OAAO,GAC1B,SAAA,IAAI,EAAS,OAAO,GAAG,MAAM,EAAG,CAAC,EAAE,EAChC,CAAA,CACH,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAWA,EAAO,YAAa,aAAY,EAAE,aAAa,EAC9E,YAAe,CAAE,EAAY,IAAI,CAAE,EACnC,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,cAAY,OACtE,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,0BAA0B,OAAO,eAAe,YAAY,MAAM,cAAc,OAAQ,CAAA,CAC7F,CAAA,CACC,CAAA,CACF,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWA,EAAO,WACpB,SAAA,EAAS,OAAS,UACf,EAAA,EAAA,IAAA,CAAC,GAAD,CAAe,IAAG,SAAU,EAAS,OAAO,GAAI,MAAO,EAAS,OAAO,MAAO,QAAS,CAAkB,CAAA,GACzG,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,IAAG,OAAQ,EAAS,OAAQ,YAAe,CAAE,EAAY,IAAI,CAAE,EAC1E,YAAe,CAAE,EAAY,IAAI,EAAG,EAAO,CAAE,EAAU,OAAQ,CAAA,CAClE,CAAA,CACA,CACP,CAAA,CAAA,CAAA,CAAA,EAGH,EAAM,QACJ,GAET,CASA,SAAgB,GAAkB,EAGwB,CACxD,OAAO,SAA4B,EAAmD,CACpF,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAe,GAAI,EAAO,WAAY,EAAS,WAAW,EAAG,SAAU,EAAS,SAAS,CAAI,CAAA,CACtG,CACF,CCp6FA,IAAa,EAAS,CAAC,QAAS,QAAQ,EAWxC,SAAgB,GAAM,EAAoB,CACxC,EAAI,WAAa,EAAI,OAAO,SAAS,EAAI,CAAE,KAAI,IAAG,CAAC,EAAG,0BAA0B,EAChF,IAAM,EAAI,EAAI,OAAO,KAAK,CAAE,EAGtB,MAA+C,EAAI,IAAI,YAAqB,EAC5E,MAA2C,EAAI,IAAI,UAAmB,EAC5E,EAAI,MAAM,OAAO,uBAA0B,EAAI,MAAM,SAAS,CAC5D,KAAM,mBACN,GAAI,SACJ,MAAO,GACP,UAAa,EAAE,KAAK,EACpB,OAAQ,CACV,EAAG,GAAkB,CAAE,aAAY,UAAS,CAAC,CAAC,CAAC,CACjD"}
|