Skip to content

AtomCode 会话恢复与错误恢复系统分析

持续深度分析 — continue_last 会话恢复、错误恢复、限流处理、输出截断 2026-06-23


1. 会话恢复系统

1.1 continue_last 机制

CLI 参数:
  --continue_last   / -c    继续上一个会话
  CONTINUE_LAST              环境变量/标志名

行为:
  ┌─────────────────────────────────────┐
  │ 启动时检查:                            │
  │  ├── 是否存在未结束的上一个会话         │
  │  ├── 存在 → 自动恢复会话上下文          │
  │  └── 不存在 → 启动新会话               │
  │                                        │
  │ TUI 斜杠命令:                          │
  │  /resume          恢复上一个会话        │
  │  /bg <N>          恢复后台任务 #N       │
  └─────────────────────────────────────┘

1.2 会话恢复数据流

1. 会话存储路径:
   ~/.atomcode/sessions/<session_id>.json
   ~/.atomcode/sessions/<session_id>.ndjson

2. 恢复过程:
   a. 读取 sessions/ 中最新会话的 JSON
   b. 还原 Session 结构体(含所有 Turn 记录)
   c. 重放最后 N 回合到 LLM 上下文
   d. 继续接受用户输入

3. Session 结构体(8 个字段):
   struct Session {
       id: String,
       project_hash: String,
       name: Option<String>,
       turns: Vec<Turn>,
       created_at: String,
       updated_at: String,
       config_override: Option<Config>,
       // ...
   }

1.3 后台会话恢复

/bg <N>  恢复后台会话 #N

后台会话存储:
  - 与主会话分离(独立的 session_id)
  - 独立的历史和上下文
  - run_in_background=true 的 bash 任务不阻塞
  - 可随时通过 /bg <N> 切回查看

2. 错误恢复系统

2.1 分层恢复策略

__error_recovery 模块
  ┌────────────────────────────────────────────┐
  │ Level 1: 瞬态错误重试                       │
  │  ├── 网络超时 → 重试                        │
  │  ├── 流中断 → 重新连接                      │
  │  └── provider 临时错误 → 重试               │
  ├────────────────────────────────────────────┤
  │ Level 2: 限流恢复                            │
  │  ├── 429 Too Many Requests                  │
  │  ├── rate_limit_exhausted                   │
  │  └── 自动等待 + 重试                        │
  ├────────────────────────────────────────────┤
  │ Level 3: 上下文窗口恢复                      │
  │  ├── context_window 错误                     │
  │  ├── recovered via layered compact           │
  │  └── 压缩历史后重试                          │
  ├────────────────────────────────────────────┤
  │ Level 4: 输出截断恢复                        │
  │  ├── "Output limit hit" message             │
  │  └── 提示模型继续输出                        │
  └────────────────────────────────────────────┘

2.2 限流 (Rate Limiting)

检测:
  错误类型: rate_limit_exhausted
  HTTP 状态: 429
  错误码: rate_limited, quota_exhausted

响应:
  "[429] recovered via layered compact, retrying..."
  自动等待后重试
  Telemetry 事件: rate_limited

RateLimitWindow 结构体:
  struct RateLimitWindow {
      window_size_seconds: u64,
      call_limit: u64,
      calls_used: u64,
      quota_exhausted: bool,
  }

2.3 CodingPlan 配额模型

配额字段(从 /coding-plan/status-v2 响应):
  plan_name               计划名称
  claimed_at              声明时间
  expires_at              过期时间
  remaining_days          剩余天数
  total_days              总天数
  window_token_limit      Token 窗口限制
  window_tokens_used      已用 Token
  usage_percent           使用率百分比
  window_hours            窗口小时数
  reset_label             重置标签
  seconds_until_reset     距重置秒数
  usage_status_desc       使用状态描述
  is_infinity             是否无限
  is_atomcode_exclusive   是否 AtomCode 独占
  display_model_name      显示模型名
  plan_available          计划可用性
  duplicate               重复标记
  codingplan_free         免费计划
  current_usage           当前用量
  audit_status            审计状态
  window_quota_exhausted  窗口配额已耗尽
  quota_exhausted         配额已耗尽
  rule_index              规则索引
  show_enable             显示启用
  call_limit              调用上限
  calls_used              已用调用次数

2.4 上下文窗口恢复

触发条件:
  - LLM 响应包含 context_window 错误
  - 响应被截断

恢复流程:
  1. 检测 context_window 信号
  2. 自动执行 "layered compact"(分层压缩)
  3. 保留最近回合 + 中间回合摘要化
  4. 重试最后一次 LLM 调用
  5. 如果仍失败 → 提示用户手动操作

日志: "[429] recovered via layered compact, retrying..."

2.5 输出截断处理

模型输出超过限制时:
  "Output limit hit. If the task is already complete,
   just output a short summary and stop (no tool calls).
   Otherwise resume where you left off."

触发条件:
  - max_tokens 参数限制
  - 模型生成了过长的输出
  
处理:
  - 截断当前输出
  - 在下一轮 LLM 调用中包含截断提示
  - 让模型决定是否继续

3. 错误类型分类

3.1 API 错误

错误字符串含义恢复策略
invalid_api_keyAPI 密钥无效提示用户更新
incorrect_api_keyAPI 密钥错误提示用户更新
rate_limit_exhausted限流超限等待后重试
quota_exhausted配额耗尽等待窗口重置
illegal非法请求记录错误
api_error通用 API 错误重试
server_error服务器错误重试

3.2 流错误

错误字符串含义
rate_limited被限流
stream_interrupted流中断
stream_timeout流超时(120s)
timeout通用超时
context_window上下文窗口超限

3.3 用户/权限错误

错误字符串含义
denied_by_user用户拒绝操作
blocked_by_hook钩子阻止操作
loop_detected检测到无限循环

4. 会话标记与同步

4.1 SyncMarker

json
{
  "last_sync_unix_secs": 1687500000,
  "session": "{session_id}"
}

文件: ~/.atomcode/codingplan_sync.json

4.2 Sentinal 结构体

rust
struct Sentinel {  // 4 个字段
    // 哨兵值用于状态一致性检查
}

5. 超时系统汇总

超时类型默认值
Bash 命令超时60sBashArgs.timeout
首 Token 超时可配置ATOMCODE_FIRST_TOKEN_TIMEOUT_SECS
流式超时120sStream timeout: no data received for 120 seconds
HTTP 请求超时30sDaemonClient
会话存活时间30minProxy config
登录会话过期600sLogin flow

6. 新覆盖的盲区

#之前未覆盖的领域状态发现
1continue_last 会话恢复CLI 参数 + TUI /resume 命令
2分层错误恢复系统4 层恢复策略(瞬态/限流/上下文/截断)
3CodingPlan 配额字段25+ 字段的完整配额模型
4限流检测与恢复429 检测 + RateLimitWindow 结构体
5上下文窗口恢复"layered compact" 自动压缩
6输出截断处理"Output limit hit" 重试提示
7超时系统汇总6 种超时类型 + 默认值
8SyncMarker 同步机制codingplan_sync.json

本报告由持续分析循环生成

逆向命令索引

bash
# 提取 Session 结构体
strings atomcode.bin.bak | grep "struct Session with"
# 输出: struct Session with 8 elements

# 提取 continue_last
strings atomcode.bin.bak | grep -iE "continue_last|CONTINUE_LAST" | sort -u
# 输出: continue_last

基于 VitePress 构建 · AtomCode v4.25.3 逆向工程分析文档