# 高级会话检索发现与决策 ## 用户边界 - 现有检索必须保留,不改输入行为和本地标题/项目/路径/ID 过滤。 - 在现有检索框旁增加高级检索按钮。 - 高级检索参照用户提供的暗色结果页,结合前一轮正文索引分析落地。 ## 视觉论点 在不打扰现有侧栏检索的前提下,打开一层沉静、近乎无边框的检索工作台,用青蓝标题、暖黄命中标记和克制分隔线建立快速扫读节奏。 ## 内容计划 1. 顶部:返回按钮、长查询输入、清空按钮和回车提示。 2. 控制:相关优先/最新优先,整词/包含两组切换。 3. 状态:结果数、耗时、索引构建/错误状态。 4. 结果:会话标题、项目/角色来源、最多两段摘要、右对齐时间和细分隔线。 5. 空态:未输入、无结果、索引构建中和查询失败。 ## 交互论点 - 入口点击后使用 140ms 淡入和轻微上移,形成从侧栏到检索工作台的空间切换。 - 查询采用约 200ms debounce;旧响应由 requestId 丢弃,结果更新只做轻微透明度过渡。 - 点击摘要打开原会话,必要时补载历史页,定位后做一次短暂暖色高亮。 ## 参考图量化 - 源图:733 × 673 RGBA PNG。 - 顶栏约 58px;左右内容安全区约 46–48px。 - 控制行位于顶栏下约 22px,采用低对比胶囊,不使用独立卡片。 - 状态行与第一条结果间距约 18px;结果之间使用 1px 低对比分隔线。 - 标题使用高饱和青蓝,正文接近中性白,命中使用暖黄底深色字,时间靠右且弱化。 - 面板是单一连续表面,不叠加卡片阴影;参考图中的圆角仅属于外围窗口,不复制成结果卡片。 ## 参考区域映射 | 参考区域 | 目标 DOM | CSS 责任 | 资产 | |---|---|---|---| | 顶部搜索栏 | `.advanced-search-header` | 高度、输入基线、返回/清空按钮 | 无 | | 排序/匹配切换 | `.advanced-search-toolbar` | 分段控件、选中态 | 无 | | 结果统计 | `#advanced-search-status` | 弱化状态文案 | 无 | | 结果列表 | `#advanced-search-results` | 连续流、分隔线、滚动 | 无 | | 命中标题/摘要 | `.result-title/.result-snippet` | 青蓝标题、暖黄 mark、截断 | 无 | | 侧栏入口 | `#advanced-search-open` | 紧邻现有输入、独立 tooltip | 无 | ## 资产台账 - 原始附件:`sessions/_attachments/237582ef-4157-4175-84fa-38629613df7f.png` - 归档:`.trellis/tasks/08-03-advanced-conversation-search/references/source-assets/advanced-search-reference.png` - SHA-256:`39e5b93d26deca64ea88a46b09bed7f7c47d2af733e8f2f857a9d35fc7895692` - 用途:仅作为视觉对照,不进入产品运行时。 ## 已确认技术基线 - 当前 `session_list` 只携带元数据,完整消息按会话加载。 - 当前可检索 user/assistant 正文约 4.26 MB,内存全量子串扫描约 0.98ms。 - 项目运行于 Node 18,发布使用 Bun baseline 单文件;首期采用零依赖内存索引和派生缓存。 ## 代码接入基线 - `codebase-memory-mcp` 的 `home-cc-web` 索引 ready(4417 节点、9212 边)。 - 服务端模块统一使用 CommonJS 工厂函数,可新增 `lib/session-search-index.js` 并在 `server.js` 顶部 require。 - WebSocket 消息 switch 在 `load_session/load_history_page/delete_session/rename_session` 附近,新增 `search_sessions` 可保持普通会话列表协议不变。 - 前端 `handleServerMessage` 已集中处理 `session_info/session_history_chunk`,高级检索结果可新增独立 case;`openSession(sessionId, options)` 已支持 options,适合作为命中定位入口。 - `markSessionMessageElement` 已给消息 DOM 写入 `data-message-index`;历史分页响应包含 `historyBaseIndex`,可以稳定定位旧消息。 - `saveSession` 有大量调用者,索引更新必须按 sessionId debounce 并在成功写盘后触发,避免频繁同步重建。 ## 跨层数据流 ```text sessions/*.json → SessionSearchIndex 规范化 user/assistant 文本 → 内存文档集合 + sessions/_search/index-v1.json 派生缓存 → search_sessions 请求验证 → session_search_results 受限摘要 → 高级检索结果流 → openSession + load_session(targetMessageIndex) → data-message-index 定位与高亮 ``` - 服务端入口负责 query、limit、sort、matchMode 校验;前端只发送枚举值并丢弃过期 requestId。 - 原始会话文件是唯一事实来源;缓存损坏只能降级/重建,不能反向覆盖会话。 - Trellis backend/frontend 细则当前仍为占位模板,本次以现有 CommonJS、集中消息 switch、原生 DOM/CSS 和回归脚本的实际约定为准。 ## 并行审计结论 - 高级检索面板放在 `.chat-main` 内并使用局部 absolute overlay;桌面保留侧栏,移动端点击入口后关闭抽屉。不要复用全局 modal overlay。 - 现有 `sessionSearchQuery`、`syncSessionSearchUi`、`getSessionSearchText`、`sessionMatchesSearch`、`renderSessionList` 和原 input/Escape/clear 事件均保持原样;高级检索使用完全独立状态。 - 搜索缓存的文件签名使用 dev/ino/size/mtimeMs;每次启动对账 root `*.json` 集合,原子保存导致 inode 变化时自然失效,删除项被 prune。 - 初次构建和变化扫描分批让出事件循环;查询只访问内存文档,不在请求路径解析全部 JSON。 - 高级面板 z-index 位于聊天内容之上、全局 modal 之下;结果区自身滚动,避免落进 `.messages-wrap` 的 overflow 裁切。 - 精确定位必须返回 `sessionId + messageIndex`;前端在 `renderMessages/prependHistoryMessages` 后查找 `data-message-index`,服务端按 `targetMessageIndex` 增加首次加载的历史预取块。 - 修改 `style.css/app.js` 后同步推进 `index.html` cache-bust,并覆盖 dark/gilded/wasteland 与 768px 移动端。