工作空间/对话溯源(workspace-trace)
用途
回答"哪次对话/哪个空间做了某事"。证据全部来自本地只读数据,禁止凭记忆或猜测作答;每条结论必须附索引中的依据(日期+命中内容)。
数据源地图
| 数据源 | 提供什么 | 路径 |
|---|---|---|
workbuddy.db sessions 表 |
会话ID ↔ 空间(cwd)/标题/起止时间 | ~/.workbuddy/workbuddy.db |
| audit-log 每日 jsonl | 每次命令执行、文件读写的审计记录 | ~/.workbuddy/audit-log/YYYY-MM-DD*.jsonl |
| changes-detail | 每次文件变更(目录名=会话ID) | ~/.workbuddy/changes-detail/<sid>/*.json |
| logs 会话日志 | <空间名>__<对话id>.log(深挖才用) |
~/.workbuddy/logs/ |
索引分片位于 ~/.workbuddy/workspace-trace-index/(sess.jsonl / by-date/ / chg/),由 build_index.py 增量维护;首次使用自动全量构建,之后增量刷新。
标准工作流(按序执行,命中即停)
脚本仅依赖 Python 标准库,无第三方包;直接以 python3 运行即可。设 SK=~/.workbuddy/skills/workspace-trace。
- T0 服务端检索(仅限最近 7 天的问题):调用 conversation_search 搜关键词。注意:默认只覆盖最近 7 天;带 start_date/end_date 参数会 HTTP 400,不要传日期。
- T1 查本地索引(默认主路径,最先跑):
bash $PY $SK/scripts/query_index.py <关键词> [更多关键词...] [--mode any|all] [--ws 空间名] [--since 2026-10-01] [--detail]
有命中 → 直接进入"输出格式"收尾;多个关键词默认 any 模式(任一命中即计),要求同时出现加--mode all。 - T2 索引缺失或结果存疑时增量重建(只处理新数据,通常秒级;首次全量约 1-2 分钟):
bash $PY $SK/scripts/build_index.py
重建后重跑 T1。触发条件:报 INDEX_MISSING;T1 NO_HIT 但用户确信做过;涉及最近 24 小时的新操作。 - T3 深挖原始证据(仅在需要引用原始记录细节时):带上表命中的会话ID+日期精确定位,严禁整文件读取。配方见
references/sources.md。
输出格式(固定,结论先行)
| 空间 | 对话标题 | 会话ID | 时间 | 依据 |
|---|---|---|---|---|
| <空间名> | <对话标题> | <会话ID> |
<日期范围> | audit: <命令片段> |
- 依据一栏写索引中的原文片段(命令/路径/变更摘要),不贴大段日志。
- 多个命中时按命中数排序取前 3-5,其余一句话概括。
- 查不到时明确说"未命中",并给出已试过的检索路径,禁止编造。
Token 纪律(硬规则)
- 禁止 Read/cat 任何 >100KB 的日志或 JSON;一律
grep -o '.\{0,80\}关键词.\{0,120\}' | head -N或 python 只打印需要的字段。 - 命中密度先用
grep -c探再取内容。 - 查询一律走 query_index.py(自带截断上限);禁止即兴写脚本全量扫 audit-log/changes-detail。
- 时间戳是 epoch 毫秒,换算用
date -r <秒>,不要心算。
已知坑
~/.workbuddy/mcp.json等全局配置不属于任何空间;判断"哪个对话建的"要看 audit-log 里谁执行了安装/写入命令(按 sessionId 归属)。- audit-log 有留存裁剪事件(
audit.retention.pruned,无 sessionId),自动跳过。 - logs/ 下同一空间可能有多个窗口日志文件,文件名里的 ID 不总是目标会话,以 workbuddy.db 的 sessions 表为准。
- 详细下钻配方与字段结构见
references/sources.md。