Overnight Run 生命周期
过夜运行生命周期
相关源文件
本章引用的主要源码文件:
crates/jcode-overnight-core/Cargo.tomlcrates/jcode-overnight-core/src/helper_tests.rscrates/jcode-overnight-core/src/lib.rscrates/jcode-overnight-core/src/prompts.rssrc/overnight.rssrc/tui/app/commands_overnight.rs
jcode 中的过夜模式提供了一个长时间运行的自主执行环境,专为高价值、低风险的工程任务(例如修复 Bug、扩展测试套件或代码清理)而设计,可在用户离开期间运行。它利用专门的协调器会话、用于状态跟踪的结构化清单以及集成在 TUI 中的"自动唤醒"机制,确保代理持续工作,直到达到目标唤醒时间。
过夜清单与状态机
过夜运行的生命周期由 OvernightManifest 结构体和 OvernightRunStatus 状态机控制。清单跟踪时间约束、制品的目录位置以及当前运行状态。
OvernightRunStatus 状态
运行过程会经历 crates/jcode-overnight-core/src/lib.rs 中定义的多个状态:
| 状态 | 描述 |
|---|---|
Running | 代理正在主动执行轮次或等待下一次计划唤醒。 |
CancelRequested | 用户已发出 /overnight cancel 命令。代理应完成当前轮次后停止。 |
Completed | 运行自然结束或在成功收尾后完成。 |
Failed | 运行遇到致命错误或超出错误限制。 |
OvernightManifest 结构体
清单是运行配置和进度的真实来源。它持久化到磁盘,以便支持恢复和状态跟踪。
| 字段 | 用途 |
|---|---|
run_id | 唯一标识符(以 overnight- 为前缀)。 |
target_wake_at | 用户预计返回的时间戳。 |
handoff_ready_at | 开始收尾并准备报告的阈值时间。 |
run_dir | 包含日志、任务卡片和审查 HTML 的目录。 |
coordinator_session_id | 驱动工作的会话 ID。 |
来源: crates/jcode-overnight-core/src/lib.rs:28-33, crates/jcode-overnight-core/src/lib.rs:47-82, src/overnight.rs:54-127
命令解析与启动
过夜运行通过 /overnight 斜杠命令启动。解析逻辑将自然语言时长和任务转换为结构化命令。
命令变体
parse_overnight_command 函数处理以下子命令:
/overnight start <duration> [mission]:启动新的运行。/overnight status:显示当前/最新运行的摘要。/overnight log:显示事件日志(events.jsonl)。/overnight review:在浏览器中打开生成的review.html。/overnight cancel:触发优雅关闭。
启动序列
当调用 start_overnight_run 时:
- ID 生成:使用
crate::id::new_id("overnight")创建新的run_id。 - 目录设置:系统创建包含
task-cards、issue-drafts和validation结果子目录的run_dir。 - 会话准备:默认情况下,当前会话被用作协调器(
use_current_session: true)。系统捕获当前会话状态并准备初始协调器提示。 - 清单持久化:
OvernightManifest保存到磁盘。 - 初始事件:在 JSONL 日志中记录
run_started事件。
来源: src/overnight.rs:54-149, src/tui/app/commands_overnight.rs:15-70, crates/jcode-overnight-core/src/lib.rs:14-24
协调器会话与提示链
过夜运行由"协调器"代理驱动。该代理遵循特定的提示链,该链会根据运行剩余时间而变化。
提示生成
系统动态构建提示,以引导代理完成不同阶段:
- 初始/协调器提示:建立"操作契约"(优先低风险工作、修复前复现 Bug、更新任务卡片)。
- 继续提示:在自动唤醒期间注入,提醒代理剩余时间和当前任务。
- 晨报提示:当
now > target_wake_at时触发,指示代理总结所有工作并完成review.html。
操作契约
build_coordinator_prompt 函数注入一组严格的规则:
- 风险缓解:避免发送电子邮件或删除数据等副作用。
- 可验证性:所有完成的任务都需要客观证据(测试输出、日志)。
- 资源感知:监控 RAM 和 CPU 负载,避免在繁重编译期间导致主机崩溃。
来源: crates/jcode-overnight-core/src/prompts.rs:89-149, src/overnight.rs:170-185
TUI 集成与自动唤醒
由于过夜运行通常需要多次大语言模型(LLM)轮次才能完成复杂任务,TUI 实现了"自动唤醒"机制,使代理无需用户干预即可继续工作。
OvernightAutoPokeState
App 结构体跟踪自动唤醒循环的状态:
- 停滞检测:如果代理在未完成任务的情况下停止,TUI 通过发送继续消息来"唤醒"它。
- 限制:为防止无限循环或成本超支,系统强制执行
OVERNIGHT_MAX_POKES(默认 48)和OVERNIGHT_ERROR_LIMIT。 - 资源采样:每 5 分钟(
RESOURCE_SAMPLE_INTERVAL),系统捕获一次ResourceSnapshot(CPU、RAM、电池)并记录。
进度可视化
TUI 渲染一个 OvernightProgressCard,其中包含:
- 阶段:(例如
running、wind-down、morning report)。 - 使用风险:基于 Token 消耗预测。
- 任务摘要:从
task-cards目录派生的活跃、已完成和阻塞任务计数。
来源: src/tui/app/commands_overnight.rs:11-13, src/overnight.rs:30-31, crates/jcode-overnight-core/src/lib.rs:204-225, crates/jcode-overnight-core/src/helper_tests.rs:117-170
数据流:从命令到报告
下图说明了自然语言命令如何触发负责过夜生命周期的代码实体。
命令与清单流
标题:过夜启动数据流
来源: src/overnight.rs:54-129, src/tui/app/commands_overnight.rs:15-59, crates/jcode-overnight-core/src/lib.rs:47-82
状态转换与自动唤醒
标题:过夜运行状态机与唤醒循环
来源: crates/jcode-overnight-core/src/lib.rs:28-33, src/tui/app/commands_overnight.rs:11-13, crates/jcode-overnight-core/src/prompts.rs:7-26
资源与 Git 采样
为确保自主运行期间的安全,系统执行定期的"预检"检查和持续采样。
- ResourceSnapshot:捕获
memory_used_percent、load_one和battery_percent。如果资源紧张,会提示协调器延迟繁重任务。 - GitSnapshot:跟踪
dirty_count和当前分支。这使得晨报能够精确总结夜间修改了哪些文件。 - UsageProjection:估算 Token 成本并与限制进行比较,以将运行的"使用风险"分类为低/中/高。
来源: crates/jcode-overnight-core/src/lib.rs:99-121, crates/jcode-overnight-core/src/lib.rs:155-165, crates/jcode-overnight-core/src/lib.rs:142-152