feat: 拆分 worker 架构并增强 assistant 安全保护

- 新增 daemon/channel/assistant/function/scheduler/logging worker 架构和 JetStream 消息协议

- 修复邮件通知误入 assistant、迁移 checksum、日志 subject 和工具调用无限循环风险

- 新增 assistant 工具轮次熔断、工具结果截断和提示词软收敛规则

- 补充邮件推送关键字、可信发件人配置、升级日志和验证测试
This commit is contained in:
2026-07-10 00:41:36 +08:00
parent 7deae286ca
commit af6cfdaa83
70 changed files with 5953 additions and 1608 deletions
+23
View File
@@ -1,5 +1,28 @@
# 更新日志
## 0.3.0 - 2026-07-09
-`docs/architecture-split-design.md` 落地第一版进程拆分:新增 `ias-daemon` 控制面、`ias-channel``ias-assistant``ias-function``ias-scheduler``ias-logging` worker crate。
- `ias-common` 新增 JetStream 公共协议和薄封装,定义 `MessageEnvelope`、inbound/outbound/function/schedule/log/DLQ payload、固定 stream/subject 命名、durable pull consumer、explicit ack、有限并发消费、消费循环持续回收 handler 任务、handler 失败显式 NAK、最后一次失败后显式 DLQ 转发和 stream 初始化;DLQ message id 使用原消息 id + UUID,避免同毫秒并发去重碰撞。
- CLI 新增 `ias daemon run``ias worker assistant``ias worker wechat --account-ids ...``ias worker mail``ias worker function --name ...``ias worker scheduler``ias worker logging``ias http --host ...``ias service start|stop|restart|status|logs` 改为管理 daemon 控制面。
- daemon 只负责 worker 进程、control socket、JetStream 初始化和状态汇总,worker 初始启动失败或运行后退出都会在后续健康检查 tick 中按配置重试;依赖边界测试确保不依赖 `ias-ai``ias-context``ias-wechat``ias-mail`
- 微信和邮件通道改为通过 JetStream 发布/消费业务消息:微信入站发布 `IA_INBOUND`assistant 生成 outbound/typing/function call,微信 worker 执行 `IA_OUTBOUND`;邮件提醒只发布微信 outbound 消息,不再直接调用微信 manager,也不会误进入 assistant inboundWeChat Worker 启动后继续发送上线提醒和版本更新通知。
- Assistant Worker 新增 token 消耗保护:每个 turn 默认最多 8 轮工具往返、每轮最多 5 个工具调用,超过后自动熔断并结束当前 turn;工具结果返回模型前默认截断到 4000 字符,避免邮件 HTML 等大响应反复进入上下文;修复日志 subject 生成,`logs.worker.assistant` 可正确写入 `IA_LOGS`
- Assistant 系统提示词和入口工具描述新增软收敛规则:已有足够信息时直接回答,`query_capability_detail``query_api_docs` 不再作为默认前置步骤;宽泛邮件查询默认只汇总列表,禁止同一 turn 重复调用相同能力参数或重复读取同一邮件 ID;每次 LLM 请求都会注入当前工具预算状态,引导模型在接近上限前主动总结或请用户缩小范围。
- Scheduler Worker 新增 `ias_schedules``ias_schedule_fires` 表,通过 `fire_id` 主键保证多副本下同一触发只发布一次;失败 fire 可重试,`publishing` 超时后可回收,避免一次发布失败或 worker 崩溃导致 schedule 永久卡死;Logging Worker 消费 `IA_LOGS` 并写入 `ias_operation_logs`
- Assistant Worker 新增 `ias_assistant_turns` 持久化 active/completed/cancelled turn 状态,worker 重启后 function result 可继续当前 turn`/new` 取消的旧 turn 不会被误恢复。
- 删除 `ias-service::run_service`、旧 `ias-service` supervisor、内存队列/control/runtime 单进程代码和旧微信 looper,避免新 daemon 与旧 supervisor 双实现并存;`ias-service` 仅保留账号管理、控制台和上下文模拟 HTTP routes。
- HTTP 新增 `/v1/daemon/status` 代理 daemon control socketdaemon 不在线时返回 degraded 状态;新增 `docker-compose.nats.yml`,本地 NATS JetStream 默认只绑定 `127.0.0.1:4222``127.0.0.1:8222`,并使用 `./data/nats` file store。
- 新增 worker 消息序列化/幂等键测试、daemon `cargo tree` 依赖边界测试、max_deliver 语义测试和被默认忽略的 JetStream ack/redelivery/DLQ 集成测试模板;`/data` 已加入 `.gitignore`,避免误提交 NATS file store`ias-common` 升级至 `0.2.0`,新增 `ias-daemon`/`ias-channel`/`ias-assistant`/`ias-function`/`ias-scheduler`/`ias-logging` `0.1.0``ias-db` 升级至 `0.1.2``ias-http` 升级至 `0.1.17``ias-service` 升级至 `0.1.27``ias-main` 升级至 `0.3.0`;已验证 `cargo fmt --check``cargo check``cargo test`(真实 NATS JetStream 集成测试默认 ignored,需要启动 `docker-compose.nats.yml` 后手动运行)。
## 0.2.28 - 2026-07-09
- 邮件账号新增推送标题关键字过滤配置:关键字列表为空时保持全部推送;配置后只有主题命中任一关键字的新邮件才发送微信提醒,邮件本身仍正常入库和刷新缓存。
- 邮件账号新增可信发件人列表,邮件详情 API 返回 `rendering.trusted_sender``rendering.remote_resources_allowed`;前端详情页仅在发件人命中可信列表时允许 HTML 邮件加载远程图片资源。
- `ias mail auth``ias mail edit` 支持录入推送关键字和可信发件人;新增 `ias mail settings <id>` 可单独修改这两项邮箱设置。
- 用户配置页面展示邮件账号的推送标题关键字和可信发件人列表,HTTP API 文档同步说明邮件详情渲染策略。
- 数据库新增 `ias_mail_accounts.notification_subject_keywords``ias_mail_accounts.trusted_senders` 两个 `TEXT[]` 字段;新增 `0.2.28` 升级日志记录,`ias-db` 升级至 `0.1.1``ias-http` 升级至 `0.1.16``ias-mail` 升级至 `0.1.17``ias-service` 升级至 `0.1.26``ias-main` 升级至 `0.2.28`;已验证 `cargo fmt --check``cargo check``cargo test -p ias-mail``cargo test -p ias-service``cargo test -p ias-http``bun run build`
## 0.2.27 - 2026-07-08
- 新增 `ias-db` crate,集中负责 PostgreSQL 连接池创建、`DATABASE_URL` 读取和 SQLx 迁移执行。