feat: add conversation search and usage dashboard

This commit is contained in:
shiyue
2026-08-03 18:20:33 +08:00
parent cc600bdf31
commit 58d5f816c2
30 changed files with 6316 additions and 22 deletions

View File

@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}

View File

@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}

View File

@@ -0,0 +1,34 @@
# 高级会话检索
## 背景
会话数量增长后,现有侧栏检索只能使用标题、项目、路径和 ID 等元数据,无法通过曾经讨论过的消息正文找回会话。
## 目标
保留现有检索不变,在其旁边新增高级检索按钮,打开独立检索工作台,支持搜索历史用户消息和助手回复、查看上下文摘要并跳转到原消息。
## 功能范围
- 新增高级检索入口和独立覆盖面板。
- 搜索标题、项目、路径、ID、用户消息和助手回复。
- 支持相关优先/最新优先、整词/包含。
- 展示结果数、耗时、命中来源、摘要和更新时间。
- 点击结果打开会话并定位命中消息。
- 服务端维护可重建的派生索引,保存、重命名、删除后增量同步。
## 非目标
- 不改变现有检索框、过滤函数和普通会话列表协议。
- 不引入拼音、模糊纠错、向量语义检索或外部搜索服务。
- 不索引 system、工具参数、工具结果和附件内容。
- 不修改现有会话 JSON schema。
## 验收标准
- 现有检索行为和回归保持不变。
- 只出现在历史用户/助手消息里的中英文片段可找到正确会话。
- 搜索模式视觉结构与参考图一致:连续结果流、青蓝标题、暖黄命中、弱化时间、无卡片堆叠。
- 新消息持久化后 2 秒内可检索,重命名和删除同步生效。
- 缓存缺失/损坏可重建,查询 p95 低于 50ms响应最多 50 条。
- 桌面、参考视口和移动端真实浏览器验收通过。

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

View File

@@ -0,0 +1,10 @@
{
"name": "advanced-search-reference",
"role": "完整视觉参考",
"original_path": "sessions/_attachments/237582ef-4157-4175-84fa-38629613df7f.png",
"archived_path": "references/source-assets/advanced-search-reference.png",
"sha256": "39e5b93d26deca64ea88a46b09bed7f7c47d2af733e8f2f857a9d35fc7895692",
"size": [733, 673],
"format": "PNG RGBA",
"usage": "仅用于构图与视觉验收,不进入运行时"
}

View File

@@ -0,0 +1,23 @@
# 高级检索视觉规格
## 设计方向
沿用当前主题背景和语义 token不创建新主题。高级检索是覆盖主工作区的独立操作面参考图只提供构图、层级和结果阅读方式。
## 关键尺寸
- 桌面面板:覆盖 `.chat-main`,最小宽度 0顶栏 5864px。
- 内容最大宽度960px参考视口下左右 4648px窄屏下 18px。
- 控件高度2430px结果标题与正文间距 1216px结果垂直内边距 1822px。
- 摘要最多两段,每段最多约 220 字符;时间位于结果底部右侧。
## 状态覆盖
- 未输入、输入不足两个字符、查询中、索引构建中、无结果、错误、有结果。
- 长标题、长路径、长摘要、中文/英文、代码片段、特殊 HTML 字符。
- 参考视口 733×673、常规桌面 1440×900、移动端 390×844。
## 安全
- 标题和摘要只用文本节点渲染,高亮拆分 text/mark 节点。
- 尊重 `prefers-reduced-motion`,移动端不使用大幅位移。

View File

@@ -0,0 +1,33 @@
{
"id": "advanced-conversation-search",
"name": "advanced-conversation-search",
"title": "高级会话检索",
"description": "",
"status": "completed",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P2",
"creator": "shiyue",
"assignee": "shiyue",
"createdAt": "2026-08-03",
"completedAt": "2026-08-03",
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [
"lib/session-search-index.js",
"server.js",
"public/index.html",
"public/app.js",
"public/style.css",
"scripts/regression.js"
],
"notes": "高级会话检索已完成专项、全量回归和 1672/1440/390 三视口真实 Chromium 验收。",
"meta": {}
}

View File

@@ -0,0 +1,5 @@
{"file":".trellis/spec/backend/error-handling.md","reason":"检查统计异常不会影响现有功能"}
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"检查数据边界、性能和测试"}
{"file":".trellis/spec/frontend/state-management.md","reason":"检查看板与聊天状态隔离"}
{"file":".trellis/spec/frontend/quality-guidelines.md","reason":"检查主题、响应式和可访问性"}
{"file":".trellis/tasks/08-03-usage-statistics-dashboard/research/current-findings.md","reason":"检查是否满足用户入口和统计口径约束"}

View File

@@ -0,0 +1,5 @@
{"file":".trellis/spec/backend/error-handling.md","reason":"统计模块必须旁路失败并与聊天链路隔离"}
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"约束统计聚合与协议实现质量"}
{"file":".trellis/spec/frontend/state-management.md","reason":"统计工作区必须与聊天状态隔离并可恢复"}
{"file":".trellis/spec/frontend/quality-guidelines.md","reason":"约束看板 DOM、响应式和交互实现"}
{"file":".trellis/tasks/08-03-usage-statistics-dashboard/research/current-findings.md","reason":"提供数据口径、脏工作树和入口位置约束"}

View File

@@ -0,0 +1,58 @@
# 使用统计看板 PRD
## 目标
为 cc-web 增加一个只读、可回滚的使用统计看板,同时保持聊天、会话列表、会话检索、消息发送和 MCP 执行链路的既有行为不变。
## 用户入口
- 入口固定在侧栏底部操作区。
- 位于会话列表下方,与现有 `CC-Web` 设置入口同一区域。
- 入口不能成为会话列表滚动项。
- 点击后切换到独立统计工作区;返回聊天时保留原会话、滚动位置和输入草稿。
参考图:`sessions/_attachments/750cb7a2-a109-44a9-ae3d-6ca352d4aba0.jpg`
## 首版功能
- 时间范围:本周、本月、自定义范围。
- 概览新建会话、发送消息、MCP 调用、MCP 失败、Skill 显式使用。
- 趋势:按日展示上述指标。
- MCP按 server/tool 统计调用、成功、失败,并可查看该工具的调用明细。
- Skill`composerMentions` 统计显式 `$skill` 排行。
- 会话:展示所选时间范围内的最近会话统计明细。
- 页面显示数据范围说明和最后统计时间。
## 数据口径
- 只统计当前保留的 `sessions/*.json` 数据。
- MCP 历史调用没有独立时间戳,归属到所属 assistant 消息时间。
- Skill 只统计用户显式 `$skill` mention不统计模型实际读取或执行。
- 不使用“活跃会话”这一含糊指标。
- 自动协作消息只有在现有字段可稳定区分时才单独展示。
## 架构边界
- 新增独立统计模块和独立查询协议。
- 不修改会话 JSON schema不回写源会话文件。
- 不改变 `session_list``search_sessions``load_session` 等现有协议。
- 不在消息处理同步链路执行统计扫描。
- 统计索引和错误必须与聊天功能隔离。
- 提供可立即关闭统计入口和查询的功能开关。
## 前端基线
- 视觉主张:延续 cc-web 现有外壳,安静、紧凑、可快速扫描。
- 内容结构:筛选与刷新 → 核心数字 → 趋势与 MCP 明细 → 状态与 Skill 排行 → 最近会话。
- 交互主张:切换保留聊天现场;看板内部刷新;明细返回后保留筛选。
- 避免通用 SaaS 卡片拼盘;卡片只用于真正可交互或需要独立语义的区域。
## 完成标准
1. 核心统计模块、独立查询协议和完整看板可用。
2. 入口位置符合用户截图指定区域。
3. 所有现有主题完成样式适配,窄屏可用。
4. 现有回归与新增专项回归通过。
5. 统计失败或索引损坏不影响消息、会话、搜索和 MCP。
6. 真实浏览器完成桌面、移动端及动态状态验收。

View File

@@ -0,0 +1,13 @@
# 当前调研与实施约束
- 当前工作树已有高级会话检索的大量未提交修改:`public/app.js``public/index.html``public/style.css``scripts/regression.js``server.js`
- 必须保留这些改动,只在稳定锚点附近做小范围追加。
- 134 个会话 JSON总量约 82 MB一次全量扫描约 0.93 秒、峰值 RSS 约 116 MB。
- 现有保留数据中可解析 1,678 次 MCP 调用,其中 completed 1,578、failed 100工具调用本身没有时间戳。
- 显式 Skill mention 当前共 7 次,来源是用户消息的 `composerMentions`
- 推荐旁路:源会话只读 → 可重建索引 → 独立查询 → 独立看板。
- 用户指定入口在侧栏底部操作区,不在会话列表滚动内容中。
- 主题适配必须使用语义变量和已有主题系统,不复制业务逻辑或第二套看板 DOM。
- 最终实现使用 `lib/usage-statistics.js` 的懒加载派生索引,查询协议为 `usage_stats_query/result/error`schemaVersion 为 1。
- 真实数据最终性能83.3 MB 回填 1.15 秒、查询 P95 51.79 ms、峰值 RSS 116.7 MB、索引占比 0.47%。
- Chrome 151 已完成 11 主题 × 5 视口验收,并覆盖 loading、MCP 明细、空态和错误态。

View File

@@ -0,0 +1,26 @@
{
"id": "usage-statistics-dashboard",
"name": "usage-statistics-dashboard",
"title": "使用统计看板",
"description": "",
"status": "completed",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P2",
"creator": "shiyue",
"assignee": "shiyue",
"createdAt": "2026-08-03",
"completedAt": "2026-08-03T17:52:38+08:00",
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "",
"meta": {}
}