110 Commits

  • fix(chat): 修复群聊置顶系统消息显示名称与导出文案
    - 解析 ChatRoomTopMsg 文本/XML 系统消息,识别置顶与取消置顶操作
    - 优先使用备注名/联系人名替换 wxid,避免实时消息、历史消息、搜索结果显示原始账号
    - 导出 JSON/TXT/HTML 时复用同一套系统消息名称解析逻辑
    - 补充系统消息解析与实时消息展示测试,覆盖多种消息载荷格式
  • fix(decrypt): 修复错误账号目录导致的坏库读取问题
    - 修正 db_storage 路径扫描逻辑,避免将多账号上级目录误识别为单个账号
    
    - 统一普通解密和流式解密的账号识别与来源写入逻辑
    
    - 为聊天和媒体账号列表增加 SQLite 文件头校验
    
    - 跳过损坏的解密目录,避免聊天页和头像接口继续读取坏库
  • fix: resolve chat messages not loading due to Nuxt auto-import bug and WCDB timeout
    - Move frontend/utils/ to frontend/lib/ to avoid Nuxt unimport scanner
      incorrectly extracting function parameter names (value, fallback) as
      module-level exports, which injected phantom imports that broke all
      client-side JavaScript execution
    - Update all import paths across 13 files from ~/utils/ to ~/lib/
    - Add timeout (5s) and negative cache (60s TTL) to WCDB realtime
      ensure_connected() to prevent open_account() from hanging indefinitely
      when the WeChat database is locked
    - Reorder selectContact() to fire loadMessages() before navigateTo() so
      the message fetch starts before route navigation triggers Suspense
    - Add watch: false to SSR useAsyncData calls to prevent unnecessary
      re-fetching on client-side route changes
  • fix(logging): 完善服务端错误日志记录并支持设置页打开日志
    - 为后端增加 5xx 请求与未处理异常日志记录
    - 新增前端服务端错误上报工具与管理接口
    - 在聊天导出、朋友圈信息加载、通用 API 请求中补充错误上报
    - 设置页新增日志文件路径展示与一键打开能力
    - 增加服务端错误日志相关测试
  • fix(desktop-runtime): 修复桌面端重装后仍命中旧 UI 缓存
    - 启动打包版时按 UI buildId 检测并清理 renderer 缓存
    - 记录 lastSeenUiBuildId,避免每次启动都重复清缓存
    - 调整 SPA 静态资源缓存策略,index.html/200.html/_payload.json 禁止缓存
    - 保留 _nuxt 哈希资源长期缓存,减少必须在卸载时删除数据后才生效的问题
  • feat(account-data): 新增账号信息查询与项目数据删除能力
    新增 /api/chat/account_info 与 DELETE /api/chat/account
    
    删除账号时清理编辑记录、账号密钥缓存与导出/数据库目录
    
    桌面端新增 app:getAccountInfo、app:deleteAccountData IPC 能力
    
    前端 API 层新增 getChatAccountInfo、deleteChatAccount
  • 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
  • fix(desktop-runtime): 兼容 updater 缺失并修复打包后 wcdb 加载路径
    - electron-updater 改为可选加载,缺失时自动禁用更新并记录原因
    - 打包环境优先注入 WECHAT_TOOL_WCDB_API_DLL_PATH 指向 resources/backend/native/wcdb_api.dll
    - 启动后端进程 cwd 调整为 exe 所在目录,避免运行目录不一致
    - wcdb_init 失败时附带 native log 摘要,提升故障排查信息
    - package.json 显式保留 updater 相关依赖,避免构建裁剪导致模块缺失
  • chore(native): 更新 wcdb_api.dll
    同步更新 wechat_decrypt_tool 原生依赖(wcdb_api.dll)。
    
    该文件为二进制变更;本次发布版本由 tag v1.6.1 驱动 Release workflow。
  • 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,并补充常用语相关单元测试。
  • improvement(wrapped): 精简全局概览热力图,移除 highlights 标记
    - 移除 annualHeatmap highlights 的扫描与计算逻辑,降低卡片计算复杂度。
    
    - card_00_global_overview 固定返回 highlights: [],保持热力图主体数据不变。
    
    - 清理不再使用的辅助函数与正则依赖。
  • 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 处理后续正则逻辑可稳定执行。
    
    - 新增回归测试,覆盖模板解析路径,防止同类作用域问题复发。
  • improvement(sns-media): 悬停展示朋友圈媒体来源阶段
    - SNS 页面在封面/媒体悬停时显示来源阶段标识
    
    - 后端媒体接口补充 X-SNS-Source 响应头标记命中来源
    
    - CORS 暴露 X-SNS-Source / X-SNS-Hit-Type / X-SNS-X-Enc 供前端读取
  • feat(chat-edit-backend): 新增消息编辑快照、回滚与修复接口
    - 新增 message_edits 存储,记录首次快照、编辑次数与已修改字段
    
    - 新增消息编辑链路:raw 查询、编辑、修改状态、按消息/会话恢复
    
    - 新增发送者修复与 packed_info_data 方向反转能力
    
    - 编辑流程支持 output/db_storage 双写与失败回滚
    
    - path_fix 改为按需校验 db_storage_path,并缓存 body 避免重复读取问题
    
    - 补充 chat_edit_store 单元测试覆盖核心行为
  • improvement(sns): 优化视频号卡片样式(页面/导出)
    - sns.vue:视频号 card 改为正方形封面(无图用文字占位),并移除 source/显示计数
    
    - sns_export_service:HTML 导出同步相同布局与播放按钮样式
  • feat(wrapped): 增加月度好友墙卡片
    - 新增月度好友墙卡片(chat/monthly_best_friends_wall):按月评选聊天搭子并输出评分维度
    
    - 前端新增拍立得墙展示 12 个月获胜者与指标条,支持头像失败降级
    
    - Wrapped deck 插入新卡片;emoji 卡片 id 顺延为 5,并同步更新测试
    
    - Wrapped 页面默认展示上一年;切换年份时保持当前页并按需懒加载卡片
    
    - WrappedCardShell(slide)支持 wide 布局;更新 wrapped cache version
  • improvement(wrapped): 回复速度排行支持收发拆分
    - 后端按 sender_username 拆分 outgoing/incoming,并输出累计序列用于动画
    
    - 前端条形图改为分段堆叠(我发/对方),补充图例与容错降级逻辑
    
    - 文案更新为 我发 + 对方
  • improvement(wrapped): 全局概览改为年度日历热力图
    - card_00_global_overview 输出 annualHeatmap(dailyCounts + highlights)
    
    - 新增 AnnualCalendarHeatmap:横向滚动网格 + 气泡 tooltip + 高光日文案
    
    - GlobalOverviewChart 从 Radar 重构为 Heatmap;Card00 slide 下微调间距
    
    - MessageCharsChart 复用 msg-bubble 样式,统一气泡外观
  • 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(sns-export): 支持朋友圈 HTML 离线导出(ZIP)
    - 新增导出任务:创建/查询/取消/下载 ZIP
    - 提供 SSE 进度流 /api/sns/exports/{id}/events(用于前端实时展示进度)
    - 复用聊天导出 CSS/emoji 能力,导出媒体优先本地缓存,必要时远程下载解密
    - 后端 app 注册 sns_export 路由
  • feat(sns): 增强朋友圈时间线/媒体获取与实时同步
    - 新增 /api/sns/users:按发圈数统计联系人(支持 keyword/limit)
    - 新增 /api/sns/realtime/sync_latest:WCDB 实时增量同步到解密库(append-only),并持久化 sync state
    - 朋友圈媒体优先走“远程下载+解密”:图片支持 wcdb_decrypt_sns_image,视频/实况支持 ISAAC64(WeFlow 逻辑)
    - 增加 WeFlow WASM keystream(Node) 优先 + Python ISAAC64 fallback,提升兼容性
    - wcdb_api.dll 支持多路径自动发现/环境变量覆盖,并在状态信息中回传实际使用路径
  • 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 限制)
    
    - 修复拍一拍误判、公众号封面样式识别;转账过期状态与前端展示