Files
iAs/CHANGELOG.md
T
wunianxiao af6cfdaa83 feat: 拆分 worker 架构并增强 assistant 安全保护
- 新增 daemon/channel/assistant/function/scheduler/logging worker 架构和 JetStream 消息协议

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

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

- 补充邮件推送关键字、可信发件人配置、升级日志和验证测试
2026-07-10 00:41:36 +08:00

381 lines
36 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 更新日志
## 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 迁移执行。
- 将原 `ias-service/migrations` 整体迁移到 `ias-db/migrations`,迁移嵌入和变更监听由 `ias-db/build.rs` 负责。
- `ias-main` 改为直接调用 `ias_db::connect_db()``ias-service` 只接收已建立的 `PgPool` 并运行服务,数据库生命周期边界更清晰。
- 新增操作日志 HTTP 查询接口:`GET /v1/logs`(分页查询,支持按级别、模块、关键词筛选)和 `GET /v1/logs/{id}`(单条详情),API 文档新增 `logs` 功能分组。
- 新增操作日志 Web 前端页面,支持按级别、模块和关键词筛选查看日志,便于排障和审计。
- 消息队列关键节点增加操作日志写入:LLM 响应、渠道消息接收、上下文记录错误、消息发送失败等场景自动记录到 `ias_operation_logs`
- `ias-mail` 新增 `mark_remote_message_seen` 函数,通过 IMAP 设置邮件已读并验证服务器确认,抽取 `connect_imap_session` 复用连接逻辑。
- 工作流配置加载改为文件级容错:`ias-ai` 新增 `load_configs_with_warnings`,返回 `LoadedFlowConfigs` 包含 warnings 信息,单个 YAML 配置损坏时不会导致所有 HTTP 能力为空。
- `ias-context` 工具调用说明中的能力引用路径从已废弃的 `record_tool_call_instruction` 更新为 `query_api_docs` + `call_http_api`,并新增单元测试验证。
- 新增高德地图地理编码/逆地理编码 HTTP 能力配置文件 `tools/amap_geocode.yaml`
- 数据库无结构变化;新增 `0.2.27` 升级日志记录,新增 `ias-db` `0.1.0``ias-ai` 升级至 `0.1.14``ias-context` 升级至 `0.1.6``ias-http` 升级至 `0.1.15``ias-mail` 升级至 `0.1.16``ias-service` 升级至 `0.1.25``ias-main` 升级至 `0.2.27`;已验证 `cargo fmt --check``cargo check`
- 修复服务队列记录 LLM 响应和工具结果预览时按字节直接切片的问题,避免中文、emoji 等多字节字符刚好落在预览上限时触发 `char boundary` panic。
- 操作日志预览现在仍按字节上限控制长度,但会回退到合法 UTF-8 字符边界,保证写入 metadata 前不会破坏字符串。
- 新增单元测试覆盖中文字符跨越 500 字节边界的预览场景。
- 数据库无结构变化;新增 `0.2.26` 升级日志记录,`ias-service` 升级至 `0.1.23``ias-main` 升级至 `0.2.26`;已验证 `cargo fmt --check``cargo test -p ias-service`
## 0.2.25 - 2026-07-08
- 在消息队列关键节点自动记录操作日志:收到渠道消息(channel)、LLM 响应(llm)、工具调用结果(tool)、上下文记录错误(error)和消息发送失败(error)。
- 新增 `log_operation` 函数,支持按级别(info/warn/error)和模块写入日志。
- `ias-service` 升级至 `0.1.22``ias-http` 升级至 `0.1.14``ias-main` 升级至 `0.2.25`;已验证 `cargo fmt``cargo check``cargo test`
## 0.2.24 - 2026-07-08
- HTTP YAML 能力加载改为文件级容错:单个 YAML 配置读取或解析失败时只跳过该文件并返回 warning,不再导致其它 HTTP 能力全部为空。
- `query_capabilities` 会继续展示成功加载的 HTTP 能力,并在 `warnings` 中标明被跳过的配置文件和错误原因,便于定位坏配置。
- `call_capability` 调用 HTTP YAML 能力时同样继承文件级容错,坏配置不会影响其它可用 YAML 能力执行。
- 数据库无结构变化;新增 `0.2.24` 升级日志记录,`ias-ai` 升级至 `0.1.13``ias-service` 升级至 `0.1.21``ias-main` 升级至 `0.2.24`;已验证 `cargo fmt``cargo test`
## 0.2.23 - 2026-07-08
- 修复 `amap_geocode` HTTP 能力 YAML 的 `query` 配置格式,改为工具链引擎支持的二元组列表,避免 `query_capabilities` 因解析失败导致所有 HTTP 能力为空。
- `query_capabilities` 在没有额外动态工具调用说明时,会明确提示固定工具调用约束已在系统提示词中生效,避免误解为缺少系统级约束。
- 修正工具调用说明动态段中的过期能力名,不再引用已移除的 `record_tool_call_instruction`,改为提示通过 `query_api_docs` 查询 `context.tool-instructions.update` 后使用 `call_http_api` 维护。
- 数据库无结构变化;新增 `0.2.23` 升级日志记录,`ias-ai` 升级至 `0.1.12``ias-context` 升级至 `0.1.5``ias-service` 升级至 `0.1.20``ias-main` 升级至 `0.2.23`;已验证 `cargo fmt``cargo test`
## 0.2.22 - 2026-07-08
- AI API 能力去重:移除与 HTTP endpoint 一一重复的专用能力(如 web 页面、邮件查询、长期记忆和工具调用说明写入包装),统一改为 `query_api_docs` 发现接口、`call_http_api``endpoint_id` 调用接口。
- 新增通用 API 能力 `call_http_api`,会根据 `/v1/api-docs/{endpoint_id}` 校验接口路径和方法,支持 `path_params``query``body`,并为 `context` 分组接口自动补当前用户作用域身份和内部鉴权。
- 删除不再编译的 AI 专用 API 包装文件,保留 `query_tool_call_instruction` 作为 `query_capabilities` 内部读取工具调用说明的实现。
- 无数据库结构变化;新增 `0.2.22` 升级日志记录,`ias-ai` 升级至 `0.1.11``ias-service` 升级至 `0.1.19``ias-main` 升级至 `0.2.22`;已验证 `cargo fmt --check``cargo check``cargo test -p ias-ai``cargo test -p ias-service`
## 0.2.21 - 2026-07-08
- HTTP API 文档新增功能分组说明,`/v1/api-docs` 会返回 `groups`,描述 `system``updates``api-docs``web``mail``console``context` 等 API 面向及主要功能,方便 AI 先判断有哪些接口能力。
- API 文档搜索会把功能分组的标题、说明、功能面和关键词纳入匹配;例如查询“未读”“邮箱目录”可直接命中邮件相关接口。
- `query_api_docs` 的列表输出会先展示 API 功能分组,并在每个 endpoint 简表中补充完整说明;查询单个 endpoint 时会附带所属功能分组说明。
- 无数据库结构变化;新增 `0.2.21` 升级日志记录,`ias-ai` 升级至 `0.1.10``ias-http` 升级至 `0.1.13``ias-service` 升级至 `0.1.18``ias-main` 升级至 `0.2.21`;已验证 `cargo fmt --check``cargo check``cargo test -p ias-http`
## 0.2.20 - 2026-07-08
- 微信“输入中”状态改用官方 `getconfig` + `sendtyping` 流程:按用户获取并缓存 `typing_ticket`,再发送 typing/cancel 状态,不再依赖 `/sendmessage``message_state=1` 中间态。
- 服务队列在最终回复发出后、空回复结束时和 `/new` 打断当前 turn 时会显式取消微信输入中状态,避免提示残留。
- 微信发送请求补齐 `base_info`,并默认发送 `iLink-App-Id=bot` 请求头;仍可通过 `WEIXIN_APP_ID` 覆盖。
- 无数据库结构变化;新增 `0.2.20` 升级日志记录,`ias-wechat` 升级至 `0.1.1``ias-service` 升级至 `0.1.17``ias-main` 升级至 `0.2.20`;已验证 `cargo check``cargo test -p ias-wechat`
## 0.2.19 - 2026-07-08
- `/new` 现在拥有上下文队列内的最高打断语义:收到后会停止当前输入中状态、取消同一用户作用域正在运行的 LLM/工具任务、清除当前 turn,并立即开启新上下文;迟到的 assistant、工具提醒或工具结果会按 turn_id 丢弃,不再写入新上下文。
- 聊天记录新增 `raw_message` JSONB 原文入库;用户、assistant 和 tool 消息都会保存可追溯 JSON,读取上下文时优先从 raw JSON 重新序列化出 `content``tool_calls``tool_call_id`,旧字段继续兼容历史数据。
- 微信入口会把上游 `message_id``session_id``group_id``create_time_ms` 带入上下文 raw 记录;同一 session 内相同外部消息 ID 的重复用户消息会自动去重。
- 群聊上下文 scope 现在优先使用 `group_id`,避免同一发送者在私聊和不同群聊之间串上下文;私聊继续保持原有 `channel:account_id:from_user_id` 形式。
- 数据库会先自动结束同一 scope 中较旧的重复活跃会话,再新增同一 scope 仅允许一个活跃上下文会话的唯一约束,避免异常重试或多实例情况下产生隐性多活会话。
- 模型响应兼容纯工具调用场景的 `content=null`,请求消息序列化不再发送空的 `tool_call_id` / `tool_calls` 字段。
- 将“动态附加系统提示词”改为“工具调用说明”:说明不再进入系统提示词,只随 `query_capabilities` 展示,用于记录用户提供的工具调用规则、调用顺序、优先使用内部 API 等偏好,以及 AI 调用过程中总结出的可复用经验。
- 新增内部接口 `POST/PATCH /v1/context/tool-instructions` 和 API 能力 `record_tool_call_instruction`;上下文模拟器改为展示独立的工具调用说明,并在 messages 预览中保留 `tool_calls``tool_call_id``raw_message`,用于观察不同上下文组成是否合理。
- 数据库新增 `ias_context_messages.raw_message``ias_context_messages.external_message_id``ias_context_sessions` 活跃会话唯一约束和 `ias_tool_call_instructions` 表,并会把旧 `ias_additional_system_prompts` 中已有内容迁移为工具调用说明;`ias-common` 升级至 `0.1.2``ias-context` 升级至 `0.1.4``ias-ai` 升级至 `0.1.9``ias-http` 升级至 `0.1.12``ias-service` 升级至 `0.1.16``ias-main` 升级至 `0.2.19`
## 0.2.18 - 2026-07-08
- 固定系统提示词新增工具调用说明和约束:只允许直接调用三入口工具,具体能力必须通过 `call_capability` 调用;工具结果、长期记忆、会话摘要和动态提示词都不能覆盖硬编码固定规则。
- 系统提示词拆分为硬编码固定部分和 AI 可维护的动态附加部分;固定部分在代码中生成且优先级最高,动态部分只允许补充偏好和工作方式。
- 新增 API 能力 `update_additional_system_prompt`,AI 可在当前用户作用域内更新或清空动态附加系统提示词,并记录修改原因。
- 新增内部接口 `PATCH /v1/context/system-prompt` 和数据表 `ias_additional_system_prompts`,按 scope 持久化动态附加系统提示词。
- 上下文组装和上下文模拟器会读取动态附加系统提示词,并在固定系统提示词之后、长期记忆和摘要之前插入。
- 数据库新增 `ias_additional_system_prompts` 表;新增 `0.2.18` 升级日志记录,`ias-context` 升级至 `0.1.3``ias-ai` 升级至 `0.1.8``ias-http` 升级至 `0.1.11``ias-service` 升级至 `0.1.15`;已验证 `cargo test``bun run build`
## 0.2.17 - 2026-07-08
- 收束模型初始工具列表,仅暴露 `query_capabilities``query_capability_detail``call_capability` 三个入口工具;其它能力直接调用会被拒绝,必须通过 `call_capability` 按名称和参数调用。
- `query_capabilities` 改为只返回能力名称和描述,并按 `api` / `http` 分类;`query_capability_detail` 返回单个能力的完整参数、来源、分类和 JSON Schema`call_capability` 支持 `name``parameters` 和可选提示语 `text`
- API 能力统一表示通过 iAs HTTP API 封装的能力,新增 API 版 `query_mail_messages`;删除重复的 YAML 邮件查询能力。
- HTTP 能力统一表示 `tools/*.yaml` 定义的外部 API 调用能力;删除天气测试 YAML,YAML 扫描只加载 `.yaml/.yml` 并保持排序。
- 控制台工具页和上下文模拟器同步展示入口工具、API 能力和 HTTP 能力分组,避免调试请求继续直接暴露底层能力。
- 无数据库结构变化;新增 `0.2.17` 升级日志记录,`ias-ai` 升级至 `0.1.7``ias-service` 升级至 `0.1.14``ias-http` 升级至 `0.1.10`;已验证 `cargo test``bun run build`
## 0.2.16 - 2026-07-07
- 修复 AI 内置页面工具在配置了受保护公开地址时,请求 `/v1/web/pages` 命中 NetBird 鉴权页并返回 401 的问题。
- `create_web_page``create_markdown_preview``query_web_pages` 的内部 HTTP 请求现在优先使用 `IA_WEB_INTERNAL_URL` 或本地 `HOST`;返回给用户的页面链接仍优先使用 `IA_WEB_BASE_URL`
- `query_api_docs` 同步优先使用内部地址查询 API 文档,避免内部工具调用被公开入口鉴权拦截。
- 无数据库结构变化;新增 `0.2.16` 升级日志记录,`ias-ai` 升级至 `0.1.6``ias-service` 升级至 `0.1.13`
## 0.2.15 - 2026-07-07
- 新增 Markdown 预览页面能力:`page_type=markdown` 的动态页面公开路径为 `/md/{slug}`React 前端按 Markdown/GFM 渲染标题、列表、表格、引用、链接和代码块。
- 新增内置 AI 工具 `create_markdown_preview`,模型可把长篇 Markdown、报告、代码说明或结构化答复创建成预览页,并只在聊天中发送简短摘要和链接,避免平台消息长度限制。
- `query_web_pages` 支持查询 `markdown` 页面类型,并会返回 `/md/{slug}` 链接;普通动态页面和邮件页面路径保持不变。
- API 文档补充 Markdown 动态页面说明;HTTP 模块仍只负责 JSON API 与静态资源托管,Markdown 渲染由 React 前端负责。
- 无数据库结构变化;新增 `0.2.15` 升级日志记录,`ias-ai` 升级至 `0.1.5``ias-http` 升级至 `0.1.9``ias-service` 升级至 `0.1.12`
## 0.2.14 - 2026-07-07
- 新增 HTTP API 文档接口 `/v1/api-docs``/v1/api-docs/{id}`,支持按关键词、分组和接口 id 查询当前服务的结构化 API 文档。
- 新增内置 AI 工具 `query_api_docs`,模型可查询 API 路径、参数、请求体、响应示例和备注,并据此用中文回复用户。
- 新增内置 AI 工具 `query_web_pages`,模型可按页面类型和关键词查询已创建的动态页面,并把相关 `/web/...``/mail/...` 链接发给用户。
- 动态页面列表 API `GET /v1/web/pages` 新增 `q` 关键词搜索,可匹配标题、摘要、正文、来源和 metadata,便于查找已创建页面。
- API 文档覆盖健康检查、升级日志、动态页面、邮件、控制台工具、用户配置、长期记忆和上下文模拟器接口;HTTP 模块继续只负责 JSON API 与静态资源托管,页面展示仍由 React 前端负责。
- 无数据库结构变化;新增 `0.2.14` 升级日志记录,`ias-ai` 升级至 `0.1.4``ias-http` 升级至 `0.1.8``ias-service` 升级至 `0.1.11`
## 0.2.13 - 2026-07-07
- 修复模型返回多个 `tool_calls` 时只执行第一个工具导致后续请求缺少 tool 消息的问题;现在会为每个 `tool_call_id` 生成对应工具结果。
- 服务队列新增批量工具结果处理,所有 tool 消息都写入上下文后才触发下一次 LLM 请求,避免中间态消息序列发送给模型。
- 上下文快照会过滤历史中不完整的 assistant/tool 调用片段,防止已存在的坏数据继续触发 `insufficient tool messages following tool_calls message`
- 新增单元测试覆盖完整多工具调用保留、缺失工具结果过滤,以及 `/v1` API catch-all 路由构建。
- 无数据库结构变化;`ias-common` 升级至 `0.1.1``ias-ai` 升级至 `0.1.3``ias-context` 升级至 `0.1.2``ias-service` 升级至 `0.1.10`
## 0.2.12 - 2026-07-07
- 修复 React SPA 静态资源托管的路径安全问题,改用 `tower-http` 静态文件服务,避免手写路径拼接读取 `web/dist` 之外的文件。
- React 新增动态内容页路由 `/web/{page_type}/{slug}``/mail/{slug}`,通过 `/v1/web/...` API 拉取数据并渲染,保持 `ias-http` 只负责 API 与静态资源托管的边界。
- 邮件详情页恢复 HTML 邮件的沙箱 iframe 渲染,纯文本邮件继续按文本展示。
- 修复上下文组装模拟器提交表单后首次查询仍使用旧 URL 参数的问题。
- 邮件详情 API 在自动标记已读成功后,会在响应中同步返回 `seen=true`
- 无数据库结构变化;`ias-http` 升级至 `0.1.7``ias-mail` 升级至 `0.1.15``ias-service` 升级至 `0.1.9`
## 0.2.11 - 2026-07-07
- 新增上下文组装模拟器页面(`/context`),可查询指定 scope 下的上下文数据,用于分析排错。
- 页面展示:活跃会话及其消息列表、组装后的系统上下文预览、历史会话表、长期记忆、会话摘要(上次会话 / 近一周)和可用工具列表。
- React 导航栏新增「上下文」入口;`ias-service` 新增 `context_simulator``context_simulator_data` 模块。
- 无数据库结构变化;`ias-service` 升级至 `0.1.8``ias-http` 升级至 `0.1.6`
## 0.2.10 - 2026-07-07
- 修复邮件详情页自动标记已读后,下一轮 IMAP 轮询可能把本地已读状态回滚为未读的问题;本地已读状态现在不会被远端未读标记降级。
- 修复从筛选后的邮件列表进入详情页时丢失搜索、已读筛选和分页参数的问题;详情页返回列表、上一封和下一封会保留当前查询上下文。
- 说明:SMTP 只负责发信,不能设置收件箱邮件已读状态;已读同步需要 IMAP `\Seen` 标记或服务端本地状态维护。
- 无数据库结构变化;新增 `0.2.10` 升级日志记录,`ias-mail` 升级至 `0.1.14`
## 0.2.9 - 2026-07-07
- HTTP 页面职责迁移到 React SPA`ias-http` 保留 `/v1/updates``/v1/web/...` 等 JSON API,页面渲染由 `web/` 前端负责。
- 新增 React 前端工程,提供更新日志、邮件、工具、配置等页面入口。
- `ias-http` 删除旧的服务端 HTML shell 与字符串拼接页面渲染代码,新增 React 静态资源托管入口。
- 无数据库结构变化;新增 `0.2.9` 升级日志记录。
## 0.2.8 - 2026-07-07
- 新增邮件已读/未读状态持久化,保存 IMAP `\Seen` 标记到 `ias_mail_messages.seen`
- 邮件列表页面新增状态筛选,支持查看全部、未读或已读邮件。
- 邮件列表卡片和详情页显示已读/未读状态,未读邮件在列表中使用更醒目的样式。
- 邮件 API `GET /v1/mail/messages` 支持 `seen=true/false` 过滤,并在返回的邮件对象中包含 `seen` 字段。
- 数据库新增 `ias_mail_messages.seen` 字段;已有历史邮件默认标记为未读,后续拉取最近邮件时会刷新为 IMAP 当前状态。
## 0.2.7 - 2026-07-07
- 修复 multipart/alternative 邮件详情页只展示纯文本 fallback 的问题;现在详情页优先保存和渲染 HTML 邮件体。
- 邮件列表摘要、搜索预览和微信通知继续使用纯文本正文;没有纯文本正文时会从 HTML 中提取简要文本,避免标签污染摘要。
- 邮件轮询或手动拉取遇到已缓存的重复邮件时,会刷新缓存正文和摘要,使最近抓取范围内的旧纯文本缓存可自动更新为 HTML 正文。
- 邮件详情 iframe 继续禁止脚本和表单,但允许加载 `http/https` 图片,使 Facebook 等 HTML 邮件更接近邮箱客户端渲染效果。
- 无数据库结构变化;不在最近抓取范围内的旧邮件仍需要扩大抓取范围或重新入库后才能显示 HTML 版本。
## 0.2.6 - 2026-07-07
- 新增工具列表 HTTP 页面 `/tools`,展示内置工具和 `tools/*.yaml` 工具定义。
- 新增工具列表 API `GET /v1/tools`,返回内置工具、YAML 工具、参数、环境变量名和工具目录加载告警。
- 新增用户配置列表 HTTP 页面 `/configs`,展示微信渠道账号和邮件账户配置。
- 新增用户配置列表 API `GET /v1/user-configs`,返回脱敏后的微信与邮件配置,不暴露微信 token、更新游标和邮件密码明文。
- 顶部导航新增“工具”和“配置”入口;无数据库结构变化,新增 `0.2.6` 升级日志记录。
## 0.2.5 - 2026-07-07
- 修复新增 SQL 迁移文件后后台服务可能继续使用旧二进制迁移列表的问题。
- `ias-service` 新增 `build.rs`,显式监听 `migrations` 目录和 SQL 文件变化,确保 `sqlx::migrate!` 重新嵌入最新迁移。
- 无数据库结构变化;新增 `0.2.5` 升级日志记录。
## 0.2.4 - 2026-07-07
- 新增 YAML 配置的邮件查询 HTTP 工具 `query_mail_messages`,通过 `/v1/mail/messages` 查询或搜索邮件列表。
- 工具支持关键词、邮箱目录、来源、页码和每页数量参数,返回分页信息和当前页邮件 JSON 列表。
- 无数据库结构变化;新增 `0.2.4` 升级日志记录。
## 0.2.3 - 2026-07-07
- 修复邮件自动通知漏发:后台轮询现在会对所有新入库邮件发送通知,不再因为 IMAP `\Seen` 已读标记跳过通知。
- 邮件轮询现在尊重账户配置的 `fetch_limit`,不再固定只检查最近 20 封邮件。
- 邮件轮询启动日志新增 `fetch_limit`,便于确认实际加载的抓取范围。
- 新增单元测试覆盖已读新邮件仍会被自动轮询处理,以及不同抓取上限下的 IMAP 序列范围计算。
## 0.2.2 - 2026-07-06
- 修复邮件详情页预览链接的 HTML 属性转义,避免异常 URL 破坏页面结构或注入属性。
- 修复长中文或 Emoji 邮件内容、Message-ID 截断时可能因 UTF-8 非字符边界切片导致的页面错误。
- 收紧 HTML 邮件 iframe 沙箱:移除同源权限,并通过 CSP 默认禁止外部资源、表单提交和脚本加载。
- 修复 Web 动态页面 404/500 错误页的响应类型,确保浏览器按 HTML 页面渲染。
- 补齐 `0.2.0` 数据库升级日志记录,并新增本版本升级日志记录。
- 新增针对邮件 HTML 安全渲染、Unicode 截断和 Web 错误页响应类型的单元测试。
## 0.2.1 - 2026-07-06
- **回滚为服务端渲染架构**:恢复 HTML 页面渲染,移除独立 React 前端项目
- **全面采用 Tailwind CSS**:通过 CDN 引入,统一所有页面样式
- 更新日志列表/详情:卡片布局,蓝色点缀
- 邮件列表:支持筛选表单、分页、Hover 高亮
- 邮件详情:详细信息折叠面板、键盘左右键导航
- Web 页面/Mail 提醒页面:元数据网格展示
- 提取公共 `shell` 模块:统一 HTML 布局、导航栏和 Tailwind CDN 引入
- 保留 JSON API 端点(`/v1/*`),供内部调用
- 首页 `/` 重定向到更新日志
## 0.2.0 - 2026-07-06
- **重大架构调整**:前后端分离,将 HTML 服务端渲染改为 RESTful JSON API + React 前端
- 新增 `ias-web` 前端项目,基于 Vite + React + TypeScript 构建
- 后端 API 路由调整:
- 更新日志接口改为 `/v1/updates`JSON
- 新增页面列表接口 `/v1/web/pages`GET
- Web 页面查看接口改为 `/v1/web/pages/{type}/{slug}`JSON
- 邮件页面查看接口改为 `/v1/web/mail/{slug}`JSON
- 移除所有 HTML 渲染端点(`/updates``/mail``/web/{type}/{slug}` 等)
- 后端添加 CORS 支持(tower-http
- 后端集成前端静态文件托管,`cargo build` 自动构建前端并嵌入服务
- 新增 `build.rs`:前端源文件变更自动触发 `npm build`,无变更时零开销跳过
- 支持 `SKIP_FRONTEND_BUILD``IA_STATIC_DIR` 环境变量
- React 前端支持页面:首页、更新日志列表/详情、邮件列表/详情、通知页面
- 前端开发代理配置自动转发 `/v1` API 请求到后端
## 0.1.15 - 2026-07-06
- 邮件预览页面全新设计:现代化卡片布局,顶部展示发件人、时间和来源等关键信息。
- 新增上一封/下一封快速导航,无需返回列表即可连续浏览邮件。
- 详细信息折叠面板,UID 和 Message-ID 支持一键复制。
- HTML 邮件自动检测并在沙箱 iframe 中渲染,纯文本邮件保持原有展示方式。
- 新增 `find_adjacent_ids` 仓库方法,按 ID 查询相邻邮件记录。
- 无数据库结构变化;新增 `0.1.15` 升级日志记录。
## 0.1.14 - 2026-07-06
- 删除旧邮件查询兼容路由 `GET /mail-api/messages``GET /mail-api/messages/{id}``GET /mail-api/search`
- 所有 JSON API 统一使用 `/v1/...`:邮件、上下文记忆、动态页面创建和健康检查接口均迁移到新地址。
- 页面路由继续保持非 `/v1` 地址:`/mail``/mail/messages/{id}``/mail/{slug}``/web/{page_type}/{slug}``/updates`
- AI 内部工具调用同步改用 `/v1/web/pages``/v1/context/memories...`
- 无数据库结构变化;新增 `0.1.14` 升级日志记录。
## 0.1.13 - 2026-07-06
- 新增 `GET /v1/mail/messages``GET /v1/mail/messages/{id}``GET /v1/mail/search`,作为邮件查询 API 的新地址。
- 保留 `GET /mail-api/messages``GET /mail-api/messages/{id}``GET /mail-api/search` 兼容旧调用。
- 新增 `GET /mail` 邮件列表页面,支持关键词、账户、邮箱目录、来源和分页查询。
- 新增 `GET /mail/messages/{id}` 邮件预览页面,可查看邮件正文、元信息和原始头信息。
- 无数据库结构变化;新增 `0.1.13` 升级日志记录。
## 0.1.12 - 2026-07-06
- 增强邮件 HTTP 查询服务:`GET /mail-api/messages` 支持关键词、账户、邮箱目录、来源和分页查询。
- 新增 `GET /mail-api/search` 作为邮件查询别名,便于客户端直接按查询语义调用。
- 邮件列表响应新增 `page``per_page``total` 字段,保留 `limit` 参数的兼容行为。
- 查询关键词 `q` 会匹配发件人、主题、摘要、正文和 `Message-ID`
- 无数据库结构变化;新增 `0.1.12` 升级日志记录。
## 0.1.11 - 2026-07-06
- 修正 `ias mail pull [id]` 的手动拉取语义:现在会抓取最近 20 封邮件并入库,不再只处理未读邮件。
- `ias mail pull` 输出新增扫描数量,便于确认 IMAP 确实返回了最近邮件;同时继续显示其中未读、新增和已存在数量。
- 后台邮件轮询保持只处理未读邮件并发送微信提醒,手动拉取不发送微信提醒。
- 无数据库结构变化;新增 `0.1.11` 升级日志记录。
## 0.1.10 - 2026-07-06
- 新增 `ias mail pull [id]` 命令,可手动拉取最近 20 封中的未读邮件;不传 `id` 时拉取所有启用邮件账户,传 `id` 时拉取指定账户。
- 手动拉取会复用后台轮询的解析、去重、入库和邮件预览页生成逻辑,并输出本次未读、新增和已存在数量。
- 修复服务启动和版本更新通知使用 `ias-service` crate 版本的问题,改为读取根目录 `VERSION` 作为整体项目版本。
- 修复版本更新通知可能链接到不存在的 `/updates/0.1.0` 页面的问题;本版本通知会指向 `/updates/0.1.10`
- 无数据库结构变化;新增 `0.1.10` 升级日志记录。
## 0.1.9 - 2026-07-06
- 调整邮件轮询逻辑:每轮固定读取邮箱最近 20 封邮件,而不是仅搜索 `UNSEEN` 集合。
- 读取最近邮件时同步获取 `FLAGS`,只对未包含 `\Seen` 标记的邮件入库、生成预览页并发送微信提醒。
- 邮件正文抓取改用 `BODY.PEEK[]`,避免检查最近邮件时把未读邮件隐式标记为已读。
- 新增最近 20 封 sequence range 的单元测试,并通过 `cargo test -p ias-mail``cargo check` 验证。
- 无数据库结构变化;新增 `0.1.9` 升级日志记录。
## 0.1.8 - 2026-07-06
- 新增 `ias mail edit <id>` 命令,可交互式修改已保存的 IMAP 邮件账户配置,密码留空时保留原值。
- 新增 `ias mail check <id>` 命令,可使用已保存配置检查 IMAP 服务器连通性和邮箱目录可访问性。
- 邮件账户检查成功会更新 `last_checked_at` 并清空 `last_error`,失败会记录错误信息。
- 复用新增账户时的 IMAP 连接测试逻辑,TLS 证书错误仍支持交互式选择接受无效证书后重试。
- 无数据库结构变化;新增 `0.1.8` 升级日志记录。
## 0.1.7 - 2026-07-06
- 所有 Rust crate 统一加 `ias-` 前缀:`ai``ias-ai``common``ias-common``context``ias-context``mail``ias-mail``service``ias-service``wechat``ias-wechat`
- 内部依赖和所有 `use` 语句同步更新。
- 新增 `IA_WEB_INTERNAL_URL` 环境变量,用于配置内网可访问的基础 URL。
- 新增 `internal_url_for_path()` 函数,版本更新通知同时发送公网和内网地址的 Markdown 链接。
- 将已有升级日志的 title、description、changes 翻译为中文。
- 持久化 `0.1.7` 升级记录。
## 0.1.6 - 2026-07-06
- 新增 HTTP 渲染的更新日志页面,路由为 `/updates``/updates/{version}`
- 新增服务版本一次性启动通知,包含更新的版本号和 HTTP 更新日志链接。
- 新增持久化的版本通知状态,避免普通重启后重复通知用户。
- 持久化 `0.1.6` 升级记录。
## 0.1.5 - 2026-07-06
- 新增基于数据库的邮件账号配置,通过 `ias mail auth` 引导命令完成。
- 新增 `ias_mail_accounts` 表,并将缓存的邮件消息关联到对应配置账号。
- 扩展邮件缓存,在 `ias_mail_messages` 中持久化完整解析后的邮件内容和原始头信息。
- 更新邮件轮询逻辑,优先从数据库加载启用的邮件账号,同时保留环境变量配置作为回退方案。
- 新增 `ias mail list` 命令查看邮件账号列表。
- 持久化 `0.1.5` 升级记录。
## 0.1.4 - 2026-07-06
- 新增独立的 Rust `mail` 模块,实现 IMAP 邮箱轮询、邮件解析、数据库去重、预览页面创建和用户通知。
- 新增独立的 Rust `ias-http` 模块,提供 HTTP 服务、健康检查和可复用的网页预览页面。
- 将现有的网页预览路由从 `service` 迁移至 `ias-http`
- 新增 `/mail-api/messages``/mail-api/messages/{id}` 接口,用于查看存储的邮件记录。
- 新增 `ias_mail_messages` 数据库表,持久化 `0.1.4` 升级记录。
- 新增通过 `IA_MAIL_*` 环境变量配置邮件轮询;未配置邮箱时轮询保持禁用。
## 0.1.3 - 2026-07-06
- 修复后台服务启动问题,使 `ias service start/restart` 能将子服务进程与调用命令的会话分离。
- 新增版本 `0.1.3` 的数据库升级日志迁移。
- 重启后通过 `ias service status` 验证服务健康状态。
## 0.1.2 - 2026-07-06
- 新增 `ias_upgrade_logs` 数据库表,用于持久化升级记录。
- 新增迁移种子数据,写入 `0.1.1``0.1.2` 的升级记录。
- 更新 `AGENTS.md` 中的 Codex 项目规则,使版本升级同步更新 `VERSION`、crate 版本、`CHANGELOG.md` 和数据库升级记录。
- 明确项目规则应写在 Codex 实际读取的 `AGENTS.md` 文件中。
## 0.1.1 - 2026-07-06
- 新增独立的 Rust `context` 模块,支持长期记忆、会话上下文、会话摘要和近一周摘要。
- 新增带时间戳的记忆记录和上下文 API,支持查询、创建、更新和删除记忆。
- 新增上下文窗口切换规则,涵盖 `/new` 命令、两小时不活跃和 token 上限阈值。
- 新增开启新上下文时自动生成会话摘要。
- 新增记忆工具,使助手在对话中可以查询和更新用户记忆。
- 修复 LLM 响应解析,使不带 `service_tier` 的路由响应也能正常接受。
- 新增启动上线通知,服务恢复后向用户发送友好提示消息。
- 新增项目版本文件和更新日志,并记录每次代码变更必须升级版本和更新日志的规则。