# 更新日志 本项目的所有显著变更都将记录在此文件中。 本项目遵循 [Semantic Versioning](https://semver.org/spec/v2.0.0.html) 规范。 [English](./CHANGELOG.md) | **简体中文** ## [1.5.0] - 2026-02-09 ### 新增 - **文件附件支持**:用户现在可以通过控制面板和 API 发送文件和图片。 - **Git Pre-commit 钩子**:使用 Husky 和 Biome 自动检查和格式化暂存代码。 - **Multipart Form-Data 支持**:Webhook 端点现在支持处理用于文件上传的 `multipart/form-data`。 - **顺序消息分发**:支持在单个请求中将文本和附件作为多个顺序消息发送。 - **SendAlertForm 组件**:新的 UI 组件,支持直接从话题视图发送带有附件的告警。 ### 修复 - **飞书 SDK Bun 兼容性**:通过使用临时文件和 `fs.ReadStream`,解决了在 Bun 环境下上传文件时的崩溃问题。 - **Drizzle ORM 原型错误**:通过标准化请求体,修复了数据库插入过程中的 `null is not an object` 崩溃。 - **附件优先级**:修复了当同时存在文本内容时附件被忽略的问题。 ## [1.4.0] - 2026-01-23 ### 新增 - **全量话题 (Global Topics)**:引入了一种自动向所有用户广播告警的新话题类型。 - **用户申请**:所有用户在创建话题时均可申请将其标记为“全量”。 - **管理员控制**:管理员可以通过后台将任何话题提升为“全量”模式。 - **自动分发**:发送至全量话题的告警将自动推送给每一位注册用户,无需手动订阅。 - **UI 标识**:在话题列表和管理视图中增加了“全量”徽章及专属管理操作。 ## [1.3.3] - 2026-01-17 ### 新增 - **多副本部署支持**:增强了在负载均衡/多实例环境下的稳定性。 - **数据库锁**: 在 `db:migrate:deploy` 脚本中引入了 **Postgres Advisory Locks**,防止多个实例同时执行数据库迁移时产生竞态条件。 - **幂等性增强**: 验证并确保了飞书事件处理逻辑的幂等性,支持在多副本环境下安全地多次接收相同事件。 ## [1.3.2] - 2026-01-17 ### 新增 - **群聊搜索**: 在绑定群聊时增加了实时搜索功能,解决了群组过多时难以定位的问题。 - **后端支持**: `GET /groups` 接口现在支持 `q` 查询参数,并提升了默认返回数量。 - **搜索前端**: 引入了带有防抖逻辑的搜索输入框和自定义下拉列表,提升了交互体验。 ### 变更 - **UI 优化**: 改进了 `GroupBindingsModal` 的视觉设计,采用了更现代的列表样式、状态图标和加载动画。 - **文档**: 将 `README.md` 拆分为英文版 (`README.md`) 和中文版 (`README.zh-CN.md`),以更好地支持国际化。 ## [1.3.1] - 2026-01-16 ### 新增 - **群聊绑定管理**: 增强了将 Topic 绑定到飞书群聊的安全性和流程。 - **权限校验**: 仅限 Topic 创建者或管理员执行绑定/解绑操作。 - **审批流程**: 为非管理员/非信任用户的群聊绑定请求引入了审批机制(通过 `status` 字段追踪)。 - **管理员通知**: 引入 `admin-notifier.ts`,当有新的 Topic 或群聊绑定请求时,通过飞书卡片实时通知管理员。 - **信任用户系统**: 引入 `isTrusted` 标志。 - 信任用户创建 Topic 或绑定群聊时将自动通过审批。 - 管理员由于其特殊权限,默认享受自动审批。 ### 变更 - **数据库架构**: `topic_group_chats` 表新增了 `status` 和 `created_by` 字段,以支持审批流和权限校验。 ## [1.3.0] - 2026-01-16 ### 新增 - **视觉品牌**: 引入了自定义图标和 Favicon。 - 为 "Alert Message Center" 专门设计的现代 Indigo 主题 Logo。 - 将 Logo 集成到登录界面和顶部导航栏,替换了通用的 Activity 图标。 ### 修复 - **部署可靠性**: 修复了 Docker 环境下数据库迁移失败的问题。 - 在 `.gitignore` 中移除了对 `apps/server/drizzle/meta` 的忽略,确保 Drizzle 迁移日志 (`_journal.json`) 能正确打包进 Docker 镜像。 ## [1.2.7] - 2026-01-15 ### 修复 - **数据库迁移**:修复了在 K8s 环境下执行 `db:migrate:deploy` 时由于相对路径解析失败导致的迁移中断问题。现在使用绝对路径进行稳健解析,并增加了调试日志。 ## [1.2.6] - 2026-01-15 ### 变更 - **用户 Token**:将用户的 `personalToken` 从 32 位 UUID 缩短为 8 位十六进制字符串,提升易用性。 - **数据库迁移**:完善了数据库迁移流程,在 `db:migrate:deploy` 中集成了存量用户 Token 的自动缩短逻辑,确保线上环境数据的一致性。 - **AI 规范**:更新了 `copilot-context.md`,明确要求 AI 在每次修改代码后必须进行代码风格和 Lint 检查。 ## [1.2.5] - 2026-01-15 ### 修复 - **前端鲁棒性**: 修复了当数据库为空或 API 返回错误对象时页面发生崩溃(白屏)的问题。 - 为 `TopicsView`, `SystemLoadView` 和 `AdminView` 中的所有 API 请求增加了 `res.ok` 和 `Array.isArray` 校验。 - 增加了防御性逻辑,确保在数据未加载或加载失败时显示友好的提示而非崩溃。 - **Vite 环境变量**: 修复了 `TypeError: Cannot read properties of undefined (reading 'VITE_WEBHOOK_BASE_URL')`。 - 在 `TopicsView.tsx` 中使用可选链 (`meta.env?.`) 安全地访问 Vite 环境变量,防止由于环境未完全初始化导致的崩溃。 - **CI & 类型安全**: 修复了破坏 CI 流水的类型错误与格式问题。 - 运行 `biome check --write` 统一了全局代码格式。 - 完善了 `feishu.ts` 中的 `UserAccessTokenData` 接口定义,补充了飞书 API 返回的用户基础信息字段。 - 在 `auth.ts` 中增加了对 `feishuClient.getUserAccessToken` 返回值的空值校验,确保 OAuth 回调流程更健壮。 ## [1.2.4] - 2026-01-15 ### 变更 - **类型安全**: 全面重构了服务端与前端的代码,消除了绝大部分 `any` 类型的使用。 - 在 `webhook.ts`, `verify_permissions.ts`, `feishu.ts` 等核心文件中引入了显式接口。 - 改进了 Webhook Body 的处理逻辑,在保持灵活性的同时增强了类型校验。 - 修复了多处 Non-null Assertion 为更安全的可选链或显式空值检查。 - **Linting**: 严格执行 Biome 的 `noExplicitAny` 规则。 ## [1.2.3] - 2026-01-15 ### 新增 - **自动化数据库迁移**: 引入了自动化数据库初始化与迁移机制。 - 添加了 `src/db/migrate.ts` 脚本,使用 Drizzle Migrator 自动应用挂起的迁移。 - 更新了 `Dockerfile`,使容器启动时自动执行数据库迁移。 - 在 `package.json` 中新增了 `db:migrate:deploy` 脚本。 ### 修复 - **初始化错误**: 修复了在全新环境下启动时因缺少数据库表导致的 `relation "users" does not exist` 错误。 - **迁移历史**: 清理并重新生成了初始迁移文件,确保所有表在全新部署时能正确创建。 ## [1.2.2] - 2026-01-14 ### 变更 - **Linting**: 强化了 Biome 配置,启用了更严格的 `a11y` (可访问性), `suspicious` (可疑代码), `style` (代码规范) 和 `correctness` (正确性) 检查规则。 - **配置**: 配置 `noUnknownAtRules` 规则以忽略 Tailwind CSS 特有的 At-rules。 - **CI/CD**: 集成 Biome 检查到 GitHub Actions 工作流,确保在所有 Pull Request 中强制执行代码规范检查。 ### 修复 - **Web 可访问性**: 为所有按钮添加了显式的 `type="button"` 以符合规范。 - **语义化/ARAI**: 修正了 `Modal` 背景的交互逻辑,将非语义化的 `div` 替换为 `