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_key | API 密钥无效 | 提示用户更新 |
incorrect_api_key | API 密钥错误 | 提示用户更新 |
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 命令超时 | 60s | BashArgs.timeout |
| 首 Token 超时 | 可配置 | ATOMCODE_FIRST_TOKEN_TIMEOUT_SECS |
| 流式超时 | 120s | Stream timeout: no data received for 120 seconds |
| HTTP 请求超时 | 30s | DaemonClient |
| 会话存活时间 | 30min | Proxy config |
| 登录会话过期 | 600s | Login flow |
6. 新覆盖的盲区
| # | 之前未覆盖的领域 | 状态 | 发现 |
|---|---|---|---|
| 1 | continue_last 会话恢复 | ✅ | CLI 参数 + TUI /resume 命令 |
| 2 | 分层错误恢复系统 | ✅ | 4 层恢复策略(瞬态/限流/上下文/截断) |
| 3 | CodingPlan 配额字段 | ✅ | 25+ 字段的完整配额模型 |
| 4 | 限流检测与恢复 | ✅ | 429 检测 + RateLimitWindow 结构体 |
| 5 | 上下文窗口恢复 | ✅ | "layered compact" 自动压缩 |
| 6 | 输出截断处理 | ✅ | "Output limit hit" 重试提示 |
| 7 | 超时系统汇总 | ✅ | 6 种超时类型 + 默认值 |
| 8 | SyncMarker 同步机制 | ✅ | 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