v0.4.0 是一次偏「内功」的版本:没有新增大模块,而是把过去一个月里暴露出来的几个真实风险点一次性收口——认证不再手搓、出站不再裸奔、配置覆盖不再能悄悄丢参数;同时补了一个我一直想要的小能力:让 AI 分身每天主动跟我同步近期对话。下面是这次改动里我认为值得记一下的几件事。
认证:从手搓 HMAC 迁移到 pyjwt
之前的 Web 鉴权是自己实现的 HMAC 签名 + json.loads 解析 token。能跑,但「自己造密码学」本身就是负债——边界条件、时钟漂移、异常处理都得自己兜底。v0.4.0 把整套逻辑迁移到 pyjwt 标准实现(HS256),签名、过期、篡改校验全部交给成熟库;旧格式令牌保持兼容、可继续校验,移除了手搓的 HMAC 与 json.loads。密钥解析语义不变,升级无需改任何配置。
出站 SSRF:默认拒绝一切非公网地址
AI 分身会调一堆外部服务(LLM、天气、搜索、网页抓取),出站请求是个典型的 SSRF 入口。新版本把出站策略改成默认拒绝:私网、回环、云元数据(169.254.169.254)、链路本地、CGNAT 全部封死,只放行公网单播与代理 fake-IP 段(198.18.0.0/15)。并补了一组边界回归测试,确保这条规则不会被后续改动悄悄改松。
主动触达:AI 分身每天主动找我同步
这是本次唯一的新能力。以前都是「人问我答」,现在它可以每天定时把近期对话摘要主动推到我的钉钉 1:1——复用既有对话缓存的摘要、不额外消耗 LLM token。默认关闭,在 config.yaml 里配 proactive.enabled=true 并填好主人账号后立即生效。对线上零行为影响,是纯增量。
配置护栏:从根上堵死「覆盖丢参数」
2026-08-17 出过一次事故:本地覆盖 config.yaml 时把全部真实定制整份冲掉。v0.4.0 在 CI 里接入了配置漂移防护——写盘前自检会丢失哪些 live 独有、非密钥的参数,从源头杜绝整份覆盖。这条护栏不依赖人的记忆,是机制而非约定。
知识库检索增强 & 平台能力诚实标注
KB 文档列表支持关键词搜索,RAG 管理页加了带防抖的搜索框;同时把飞书 / 企微在真实 CLI 下不支持的日历、待办、文档、已读闸门等能力,在平台能力矩阵里如实标注为不可用——消除此前「虚标可用、调用静默返回空」的黑洞。企微此前被错误暴露的日历 / 待办工具已收敛为钉钉专属。
升级注意:主动触达默认关闭,安全加固无需改配置;飞书 / 企微用户此前若试过日历 / 待办工具(实际静默失败),升级后会收到明确的不支持提示而非空结果。
完整变更见 CHANGELOG,代码在 GitHub。下个阶段我打算把 RAG 分块按语义边界切分、文档清洗引入 LLM 替代纯正则——这两块才是真正影响「答得准不准」的硬仗。