57 Commits

  • test(mcp): 补充 MCP 路由回归测试
    覆盖 MCP token 鉴权、skill bundle 读取、JSON-RPC 初始化、工具列表分页、直接工具调用、通知处理、错误响应和移动端 facade 工具。
    
    验证媒体与导出类工具只返回 URL 和参数,不内联二进制内容。
  • fix(chat-search): 将会话列表外聊天纳入搜索索引
    构建聊天搜索索引时,合并 SessionTable、contact/stranger 与消息库 Name2Id 中存在消息表的联系人或群聊。
    
    这样左侧会话列表中不存在、但数据库里仍有消息记录的聊天也可以被全局搜索命中。
    
    提升搜索索引 schema 版本,触发旧索引自动重建,并补充默认搜索过滤下的回归测试。
  • fix(chat-export): 补充导出会话列表外的有消息聊天
    批量导出全部、群聊、单聊时,不再只依赖 SessionTable。
    
    导出目标会补充 contact/stranger 与消息库 Name2Id 中存在消息表的联系人或群聊,避免微信不显示会话从左侧列表消失后漏导。
    
    同时新增自定义范围,保留当前会话列表手动勾选导出的语义,并补充对应回归测试。
  • test(sns-media): 补充朋友圈图片缓存优先回归测试
    - 覆盖本地缓存命中时不调用远程下载
    
    - 覆盖本地缓存未命中时再回退到远程解密
  • fix(decrypt): 非首页 HMAC 异常时保留页面避免后续页整体错位
    - 微信 4.x 大库在 1GiB 边界会出现单页 HMAC 不匹配但页本身仍可解密的情况,原先直接丢弃页会让后续页号整体错位,最终导致 SQLite 必然损坏。改为:HMAC 不匹配时照常解密保留,AES 失败用零页占位,保证页号对齐。
    
    - 解密管线全程增加诊断采样:源文件读取前后快照、输入 layout、key 模式、HMAC/AES 异常页 SHA256 与 HMAC 变体匹配,便于后续定位疑难库。
    
    - 解密 SSE 流将 hmac_warning_pages / hmac_warning_samples 透出到前端并参与诊断告警判断,避免警告被静默吞掉。
    
    - 新增回归测试覆盖非首页 HMAC 单字节翻转场景。
  • fix(key): 修复数据库密钥模式识别逻辑
    - 新增原始加密密钥与 SQLCipher passphrase 两种密钥模式自动识别
    - 通过首页 HMAC 校验确认实际密钥模式,避免错误派生导致解密失败
    - 解密输出时清理加密页尾部的 IV/HMAC 保留区
    - 增加解密失败时的 key_mode、HMAC 与 SQLite 诊断信息
    - 新增单测覆盖两种密钥模式的解密路径
    - 更新 README 补充数据库解密兼容性说明
  • fix(key): 支持手动指定微信安装目录并校验 db key 来源
    - /api/get_keys 支持传入 wechat_install_path,兼容安装目录与 Weixin.exe / WeChat.exe
    
    - 解密完成后保存 db key 的来源路径与别名,避免历史密钥被错误账号复用
    
    - 解密页按 account + db_storage_path 回填已保存密钥,并补充相关测试覆盖
  • improvement(sns): 精简朋友圈媒体链路并移除手动挑图入口
    - 移除 Server-Timing/X-SNS 阶段透出与前端媒体来源标记
    - 移除本地候选图与手动匹配接口及预览交互
    - /api/sns/media 默认仅保留远程下载解密路径,未命中直接返回 404
    - 将导出所需的本地缓存匹配逻辑下沉到 sns_export_service
  • improvement(sns-media): 内置 WeFlow WASM 资源并切换朋友圈图片解密实现
    - 内置 wasm_video_decode 资源并纳入打包
    - Node helper 优先使用包内 weflow_wasm 目录
    - 朋友圈图片远程解密改为走 WeFlow WxIsaac64 全量 XOR
    - 补充对应测试并更新纯 Python fallback 说明
  • improvement(chat-export): 优化导出取消响应并补充保存进度反馈
    - 导出弹层展示实际生成位置、浏览器目录保存进度和取消中状态\n- 导出服务补充取消检查、链路追踪与实时同步暂停恢复\n- 预建媒体索引并减少 emoji 空查找开销,补充相关测试
  • feat(media): 新增表情批量下载步骤并支持并发配置
    - 解密页新增表情下载步骤,支持开始/停止、进度展示和结果统计\n- 图片解密与表情下载接口支持并发配置,补充 SSE 进度与结果信息\n- 增加表情目录聚合、缓存校验与媒体下载相关测试
  • fix(key): 支持通过 db_storage_path 精确获取当前账号图片密钥
    - 前端获取图片密钥时补充透传 db_storage_path / wxid_dir
    - 后端支持通过 db_storage_path 反推出目标 wxid_dir
    - 本地图片密钥匹配改为账号精确匹配,避免子串误命中
    - 切换账号时重置并重新预填密钥,避免跨账号串用旧密钥
    - 增加单测,覆盖精确匹配和未完成数据库解密时的远程获取场景
  • fix(chat): 补充视频号消息 objectId 和 objectNonceId 字段透传
    补充 Finder/视频号类型 app message 的 objectId、objectNonceId 解析
    
    在聊天消息接口、搜索结果和导出链路中透传上述字段
    
    前端消息归一化增加 objectId、objectNonceId 字段
    
    新增对应测试,覆盖 type=51 场景
  • fix(decrypt): 加强解密结果校验并过滤内部数据库
    - 新增可用 SQLite 校验,解密失败时返回更明确提示并清理无效输出
    
    - 统一过滤 key_info、FTS 索引库和内部缓存库,修正数据库扫描与账号统计
    
    - 补充解密流和数据库过滤相关测试
  • fix(chat-media): 修复聊天图片缓存降级并刷新当前会话媒体
    - 优先使用更高质量的微信图片资源并回写本地缓存
    - 图片接口返回 no-store,避免浏览器继续命中旧缓存
    - 页面恢复前台时刷新当前会话媒体资源,并补充相关测试
  • feat(desktop): 支持自定义 output 目录并迁移现有数据
    - 支持在桌面端查看、选择和恢复默认 output 目录
    - 安装器记录待应用目录,并在应用启动时自动迁移数据
    - 后端支持 output 目录覆盖,补充桌面端与后端相关测试
  • fix(decrypt): 修复 SQLCipher 密钥兼容性回归
    - 解密时同时兼容 raw enc_key 与 SQLCipher 派生密钥两种输入形态
    - 通过首页 HMAC 自动识别可用密钥模式,避免真实账号密钥被误判为不匹配
    - 后续页面解密统一使用识别出的有效密钥,恢复数据库解密流程
    - 补充 SQLCipher passphrase 场景回归测试,覆盖此次回归问题
  • fix(chat): 修复 realtime 同步下 Name2Id 映射缺失
    - 将 Name2Id 从随新消息顺带补写调整为按 live WCDB 整表同步\n- 修复输出库中 real_sender_id 无法稳定反查 sender_username 的问题\n- 消除必须删除当前项目数据并重新加载后 Name2Id 才能补全的问题\n- 增加 Name2Id 自愈同步回归测试,覆盖无新消息时的修复场景
  • fix(chat): 修复群聊置顶系统消息显示名称与导出文案
    - 解析 ChatRoomTopMsg 文本/XML 系统消息,识别置顶与取消置顶操作
    - 优先使用备注名/联系人名替换 wxid,避免实时消息、历史消息、搜索结果显示原始账号
    - 导出 JSON/TXT/HTML 时复用同一套系统消息名称解析逻辑
    - 补充系统消息解析与实时消息展示测试,覆盖多种消息载荷格式
  • fix(logging): 完善服务端错误日志记录并支持设置页打开日志
    - 为后端增加 5xx 请求与未处理异常日志记录
    - 新增前端服务端错误上报工具与管理接口
    - 在聊天导出、朋友圈信息加载、通用 API 请求中补充错误上报
    - 设置页新增日志文件路径展示与一键打开能力
    - 增加服务端错误日志相关测试
  • improvement(voice): 语音优先转 MP3,并完善导出/接口兜底
    - 新增 _convert_silk_to_browser_audio:优先 MP3(有 ffmpeg),否则 WAV,最后回退 SILK
    
    - /chat/voice 返回浏览器可播格式,并补充 Content-Disposition 文件名后缀
    
    - HTML 导出按实际格式写入语音资源;音频缺失时仍保留语音气泡结构
    
    - 测试覆盖 MP3 优先、缺失音频兜底,并在用例结束 logging.shutdown()
  • feat(chat): 支持位置消息与小程序卡片解析展示
    - 新增位置消息解析,补充经纬度、地点名和地址字段
    - 修复小程序分享 type 识别,避免嵌套 type 干扰
    - 聊天页新增位置卡片展示,并补充小程序卡片样式
    - 导出、搜索和会话预览同步支持位置消息
    - 补充位置导出与小程序解析测试
  • fix(logging): 日志写入改用 output_dir 并避免重复初始化
    - 日志目录改为 get_output_dir()/logs/...(兼容 WECHAT_TOOL_DATA_DIR)
    - 清理/关闭旧 handlers,避免重复输出和 Windows 文件锁
    - get_logger/get_log_file_path 未初始化时自动 setup_logging
    - 新增 tests/test_logging_config_data_dir.py
  • improvement(wrapped): Bento 总览补齐 topEmoji 与回复统计字段
    - Bento summary 新增 topEmoji:在 unicode emoji 与微信内置表情(topWechatEmojis/topTextEmojis)中统一择优
    - 回复速度统计补充 replyStats(p50/p90),并为 bestBuddy 增加最长连续互动天数/高峰时段等摘要字段
    - bump wrapped cache version,避免旧缓存导致前后端字段不一致
    - 增加 topEmoji 选择逻辑单测覆盖(wechat vs unicode / text emoji / none)
  • feat(wrapped): 新增便当总览卡片(Card #7)
    - 增加 Card07BentoSummary 前端渲染与加载/失败重试交互(注入 wrappedRetryCard)
    
    - 后端新增 card_07_bento_summary:基于已实现卡片聚合生成 snapshot,保证渲染稳定
    
    - Wrapped manifest/implemented_upto 升级到 7,并支持按卡片 id 单独构建
    
    - 新增 manifest 末尾卡片校验测试
  • improvement(chat-export): 收敛导出 CSS 打包范围,避免 Scoped 规则泄漏
    - 仅打包聊天页相关的 _nuxt/*_username_*.css,避免去 scoped 选择器后污染全局
    
    - Offline viewer CSS patch 引入 --dpr 缩放,改善不同 DPR 下的显示一致性
    
    - 移除 chatHistoryModal 的静态 HTML 输出,改由 data 标记驱动
    
    - 修正聊天记录解析正则中的空白匹配转义
    
    - 更新导出相关测试断言(移除 modal id/放宽字体资源/校验不引入 wrapped 样式)
  • feat(wrapped): 年度关键词卡升级为年度常用语词云
    - 新增常用语短句过滤与统计,按重复短句(非分词)生成词云数据。
    
    - 引入常用语扫描元数据(scannedCandidates/matchedCandidates/uniquePhrases 等)。
    
    - 示例语句抽样改为唯一优先,不足补齐重复,提升短句命中率。
    
    - wrapped cache version 升级到 24,并补充常用语相关单元测试。
  • feat(wrapped): 新增年度关键词词云卡片(Card #6)
    - 新增关键词词云后端计算:消息采样、jieba 分词、关键词权重与例句回看数据。
    
    - Wrapped 年度卡片接入 Card #6,并对该卡片改为按请求重算(不走单卡缓存)。
    
    - 前端新增 storm->cloud 词云动效卡片,支持词点击查看例句及动画阶段隐藏 deck 顶部 UI。
    
    - 统一 wrapped 消息表名解码逻辑,兼容 sqlite text_factory=bytes。
    
    - 新增关键词词云测试并加入 jieba 依赖。
  • feat(sns): 支持外部分享卡片并增强媒体阶段识别
    - 增强朋友圈 XML 解码与容错清洗,支持 bytes/hex/base64/zstd 场景。
    
    - 补充外部分享(Type 5/42)字段提取与展示,新增 sourceName、链接卡片与导出渲染。
    
    - 通过 Server-Timing + Timing-Allow-Origin 暴露 SNS 媒体阶段信息,前端改为从 ResourceTiming 读取,避免额外探测请求。
    
    - 新增 XML 容错解析与 Server-Timing 注入测试。
  • fix(chat): 修复 list_chat_messages 中 re 作用域遮蔽
    - 移除函数内局部 import re,避免遮蔽模块级 re。
    
    - 保持 emojiUrl 处理后续正则逻辑可稳定执行。
    
    - 新增回归测试,覆盖模板解析路径,防止同类作用域问题复发。
  • feat(chat-edit-backend): 新增消息编辑快照、回滚与修复接口
    - 新增 message_edits 存储,记录首次快照、编辑次数与已修改字段
    
    - 新增消息编辑链路:raw 查询、编辑、修改状态、按消息/会话恢复
    
    - 新增发送者修复与 packed_info_data 方向反转能力
    
    - 编辑流程支持 output/db_storage 双写与失败回滚
    
    - path_fix 改为按需校验 db_storage_path,并缓存 body 避免重复读取问题
    
    - 补充 chat_edit_store 单元测试覆盖核心行为
  • feat(wrapped): 增加月度好友墙卡片
    - 新增月度好友墙卡片(chat/monthly_best_friends_wall):按月评选聊天搭子并输出评分维度
    
    - 前端新增拍立得墙展示 12 个月获胜者与指标条,支持头像失败降级
    
    - Wrapped deck 插入新卡片;emoji 卡片 id 顺延为 5,并同步更新测试
    
    - Wrapped 页面默认展示上一年;切换年份时保持当前页并按需懒加载卡片
    
    - WrappedCardShell(slide)支持 wide 布局;更新 wrapped cache version
  • improvement(sns-media): 统一朋友圈远程媒体下载/解密/缓存逻辑
    - 新增 sns_media 模块:CDN URL 归一化、远程下载、图片 wcdb_api 解密、视频 WxIsaac64(WeFlow WASM)/ISAAC64 兜底解密与缓存
    
    - routers/sns 与 sns_export_service 复用该模块,收敛重复实现
    
    - 调整 ISAAC64 兜底实现:明确 keystream 生成与字节序格式,作为 WASM 不可用时的 best-effort
    
    - 增加单测覆盖:URL 改写、视频异或解密、缓存命中/升级、解密失败
  • feat(decrypt): 解密支持 SSE 实时进度
    - 新增 /api/decrypt_stream(GET + SSE):扫描 db_storage,逐库解密并推送 start/progress/complete/error
    
    - 前端解密页优先使用 SSE 展示实时进度,不支持时回退到原 POST(无进度)
    
    - 增加流式接口单测:验证事件序列与输出落盘
  • feat(contacts): 联系人支持拼音分组并补充性别/签名
    - 解析 extra_buffer 补齐 gender/signature\n- 返回 pinyinKey/pinyinInitial,前端按 A-Z/# 分组排序展示\n- tests: 更新联系人导出用例覆盖新增字段
  • feat(chat): 聊天页支持日历定位/卡片解析/HTML导出分页
    - 新增 /api/chat/messages/daily_counts 与 /api/chat/messages/anchor,用于月度热力图与按日/首条定位\n- messages/around 支持跨 message 分片定位,定位更稳定\n- 新增 /api/chat/chat_history/resolve 与 /api/chat/appmsg/resolve,合并转发/链接卡片可按 server_id 补全\n- 新增 /api/chat/media/favicon,并补齐 link 本地缩略图处理\n- HTML 导出支持分页加载(html_page_size),避免大聊天单文件卡顿\n- tests: 覆盖 heatmap/anchor、favicon 缓存、HTML 分页导出
  • feat(wrapped): 新增梗图年鉴(Emoji Universe)卡片
    - 后端新增 card_04_emoji_universe:统计表情包/emoji 使用与画像
    
    - 前端新增 Card04EmojiUniverse + VueBits Stack/ImageTrail 交互展示
    
    - 更新 Wrapped manifest/Hero 预览与用例覆盖
  • feat(chat-export): 支持 HTML 导出(合并消息/远程缩略图可选下载)
    - 导出格式新增 html:生成 index.html + 会话 messages.html,离线浏览
    
    - 支持 chatHistory(合并消息)解析/渲染与弹窗查看
    
    - 图片资源解析增强:MessageResourceInfo 优先 + md5/hdmd5 兜底
    
    - HTML 导出可选下载远程缩略图(仅公网主机/图片类型/5MB 限制)
    
    - 修复拍一拍误判、公众号封面样式识别;转账过期状态与前端展示