# 更新日志

## [0.1.5] - 2025-10-25

### 改进
- **页码标记优化** - 将分段提示从"续上页/未完待续"改为清晰的页码格式
  - **新格式**：`(Page X/Y)` 显示在每段开头，换行符分隔
  - **智能显示**：仅当分段数 > 1 时显示页码，单段内容不显示
  - **位置固定**：页码统一放在每段开头，便于快速识别当前进度
  - **调试增强**：`SegmentInfo` 新增 `page_number` 和 `total_pages` 字段，方便日志调试

### 技术细节
- 删除旧常量：`SEGMENT_CONTINUE_PREFIX`、`SEGMENT_CONTINUE_SUFFIX`
- 新增常量：`PAGE_INDICATOR_FORMAT`、`MAX_PAGE_INDICATOR_BYTES`（预留20字节）
- 更新字节预留逻辑：从42字节（旧提示）调整为20字节（页码标记）
- 示例效果：
  ```
  (Page 1/3)
  消息内容第一段...

  (Page 2/3)
  消息内容第二段...

  (Page 3/3)
  消息内容第三段...
  ```

---

## [0.1.4] - 2025-10-21

### 修复
- **Markdown分段超限问题** - 修复 `_segment_text()` 和 `_segment_markdown()` 方法未预留续页提示空间的bug
  - **问题1**：分段时直接使用 `max_bytes`（3800字节）作为限制，但之后添加续页提示（约42字节）可能导致超过4096字节限制
  - **问题2**：在 `_segment_markdown()` 第151行，当 `current` 不为空且 `test_content` 超限时，直接将 `para` 赋给 `current`，但未检查 `para` 本身是否超过 `available_bytes`
  - **解决**：
    1. 在分段前计算 `available_bytes = max_bytes - reserved_bytes`，确保添加续页提示后不会超限
    2. 在处理段落时，增加对 `para` 本身大小的二次检查，如果 `para` 超限则进行二次分段
  - **影响**：修复了 Segment 3/8 failed 类型的 40058 错误（markdown_v2.content exceed max length 4096）

### 技术细节
- 续页提示占用：`SEGMENT_CONTINUE_PREFIX`（约18字节） + `SEGMENT_CONTINUE_SUFFIX`（约24字节） = 42字节
- 实际可用空间：3800 - 42 = 3758字节
- 与 `_segment_table()` 方法保持一致的预留空间策略
- 测试数据：25903字节文件 → 8段，最大分段3710字节，全部在4096字节限制内

---

## [0.1.1] - 2025-10-18

### 修复
- **表格分段超长问题** - 修复表格分段时未预留续页提示空间导致超过4096字节限制
- **频率控制器卡住** - 重写频率控制逻辑，使用while循环替代递归，在锁外等待避免阻塞

### 优化
- **安全阈值调整** - 将消息分段阈值从4096字节调整为3800字节，留出296字节安全余量
  - 预留空间用于：续页提示（~40字节）、表头（变长）、Markdown格式符号等
  - 避免边界情况导致超限

### 性能
- 表格分段：7166字节 → 2段，无超限错误
- 频率控制：25条消息，67.4秒，20.5条/分钟，92%成功率

---

## [0.1.0] - 2025-10-17

### 新增
- 企业微信通知器核心功能
- 支持text、markdown_v2、image三种消息格式
- 智能频率控制（20条/分钟）
- 长文本自动分段
- 表格智能分段（保留表头）
- @all功能增强（markdown_v2/image自动追加text）
- 同步/异步发送模式
- 多webhook独立管理
- 自动重试机制
- 详细日志记录

### 文档
- 完整的README
- 使用指南（USAGE_GUIDE.md）
- 测试示例
- API文档

## 0.1.2 - 2025-10-19
- 增强：跨程序频控保护 —— 当 webhook 已被其他进程/程序触发频控时，发送方可自动等待并重试（重试等待时间可控），降低偶发频控导致的失败率。

## 0.1.3 - 2025-10-19
- 新增：在同一群聊中可添加多个机器人，实现负载均衡与更高的消息吞吐。在单个 webhook 触发频控时，自动切换到其他可用机器人，进一步降低限频导致的失败率。
