26 Commits

  • 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 限制)
    
    - 修复拍一拍误判、公众号封面样式识别;转账过期状态与前端展示
  • improvement(chat): 完善会话置顶与消息卡片解析展示
    - 后端:会话列表支持置顶识别(isTop)并按置顶优先排序
    
    - 后端:修正群聊 XML 发送者提取,避免 refermsg 嵌套误识别
    
    - 后端:完善转账状态后处理与视频缩略图 MD5 回填(packed_info_data)
    
    - 后端:补充 quoteThumbUrl/linkType/linkStyle 字段链路
    
    - 前端:新增置顶会话背景态、引用链接缩略图预览与 LinkCard cover 样式
    
    - 测试:新增转账、置顶、引用解析与视频缩略图相关回归用例
  • test(chat): 覆盖系统撤回/群名片/实时会话同步相关用例
    - 新增系统撤回消息 replacemsg 解析与导出语义测试
    
    - 新增群聊会话预览格式化与群名片 ext_buffer 解析测试
    
    - 新增 realtime 会话列表与 sync_all 落库 last_sender_display_name 测试
  • improvement(chat): 增强 realtime 增量同步并补充消息搜索索引接口
    - 新增后台 autosync:监听 db_storage 变化后触发 realtime -> decrypted 增量同步(去抖/限频)\n- 优化 WCDB realtime 关闭:支持锁超时,避免 busy 时强行 shutdown\n- 新增消息搜索索引相关接口(status/build/senders)\n- 前端关闭 realtime 前改为 sync_all,减少切回解密库后的列表/消息落后\n- 增加解密库消息表/索引创建相关单测
  • feat(wrapped): 新增回复速度卡片 #3(秒回置顶关心)
    - 新增年度总结卡片 #3:回复速度/置顶关心统计与排行\n- 前端新增 Card03 渲染与交互(含抽奖揭晓/Top 列表)\n- 更新年度总结卡片清单并加入评分单测