5.8 KiB
5.8 KiB
高级会话检索发现与决策
用户边界
- 现有检索必须保留,不改输入行为和本地标题/项目/路径/ID 过滤。
- 在现有检索框旁增加高级检索按钮。
- 高级检索参照用户提供的暗色结果页,结合前一轮正文索引分析落地。
视觉论点
在不打扰现有侧栏检索的前提下,打开一层沉静、近乎无边框的检索工作台,用青蓝标题、暖黄命中标记和克制分隔线建立快速扫读节奏。
内容计划
- 顶部:返回按钮、长查询输入、清空按钮和回车提示。
- 控制:相关优先/最新优先,整词/包含两组切换。
- 状态:结果数、耗时、索引构建/错误状态。
- 结果:会话标题、项目/角色来源、最多两段摘要、右对齐时间和细分隔线。
- 空态:未输入、无结果、索引构建中和查询失败。
交互论点
- 入口点击后使用 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 并在成功写盘后触发,避免频繁同步重建。
跨层数据流
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.htmlcache-bust,并覆盖 dark/gilded/wasteland 与 768px 移动端。