v0.4.2 的核心命题只有一个:让「对话摘要」这件事在 Web 和移动端体验完全一致——同一个数据源、同一个查询逻辑、同一份格式化文本,不存在「网页看到的和钉钉收到的对不上」。
Web 对话摘要实时页
新版本在 Web 侧栏「消息中心」分组下加了独立「对话摘要」入口,打开就是 per-conversation 的摘要明细——每个对话一张卡片,显示会话名、平台、最后消息时间、摘要文本。30 秒轮询一次,前端无感刷新。
页面顶部的「每日摘要汇总」文本框和钉钉 17:30 主动触达推送走的是完全同一份数据源(list_recent_summaries + 同一窗口计算),不再是「Web 写一套、推送写一套」的双轨实现。这点我认为是这次最重要的事——之前是「同源」承诺但实际是两份代码,Web 改了推送没改就会出诡异差异;现在物理上共用,差异不存在。
主动触达可自定义时刻
v0.4.0 上线时主动触达默认是每天 09:00,但很多用户希望换个时间(比如下班前 17:30 回顾一天)。v0.4.2 把 proactive.hour 和 proactive.minute 暴露为可配置项,config.yaml 里改完重启服务生效,下个版本会做成热更新。
CodeQL 安全告警清零
CodeQL 上一直挂着两条告警,这次终于清掉了:
- 异常信息通过响应暴露(
web/routers/summaries.py):旧实现在 500 路径上把str(e)直接塞进 response body,等于把内部异常类型、堆栈片段全暴露给前端。修复方式是分层 error envelope:对外只暴露 error_code + 通用 message,detail 走服务端日志。 - URL 子串消毒误报(
tests/test_memory_inject.py):测试里有个 fixture 用了含evil.example.com的 URL,被 CodeQL 的js/server-side-request-forgery规则误判为 SSRF 探测。其实这是测试断言「外部域名应该被拒」,不是真发起请求。修复方式:把测试 URL 改成 RFC 6761 保留的invalid.TLD,避开启发式匹配。
CodeQL 的价值在于「持续盯住一类问题」,但误报也是真实噪音。原则:真漏洞必修,工具误判要么改代码要么加 allowlist,不要为了绿而绿。本次是「真漏洞修了 + 误报换 fixture」,没有加 allowlist。
升级注意:对话摘要页无需额外配置即可访问;主动触达仍为 proactive.enabled=false,按需开启。