agentic_huge_data_base / wiki
页面 jcode · 14.1 Overnight Run 生命周期·DeepWiki 中文全文译文

14.1 · Overnight Run 生命周期(Overnight Run Lifecycle)

代理式研究运行时 · 聚焦本章的模块关系、源码依据与实现要点。

项目jcode 章节14.1 状态全文译文 模块界面与交互、测试、发布与运维、工作流与编排、接口与服务契约
源码线索
  • crates/jcode-overnight-core/Cargo.toml
  • crates/jcode-overnight-core/src/helper_tests.rs
  • crates/jcode-overnight-core/src/lib.rs
  • crates/jcode-overnight-core/src/prompts.rs
  • src/overnight.rs
  • src/tui/app/commands_overnight.rs
模块标签
  • 界面与交互
  • 测试、发布与运维
  • 工作流与编排
  • 接口与服务契约
  • 评测、反馈与人工复核

章节正文

Overnight Run 生命周期

过夜运行生命周期

相关源文件

本章引用的主要源码文件:

  • crates/jcode-overnight-core/Cargo.toml
  • crates/jcode-overnight-core/src/helper_tests.rs
  • crates/jcode-overnight-core/src/lib.rs
  • crates/jcode-overnight-core/src/prompts.rs
  • src/overnight.rs
  • src/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 时:

  1. ID 生成:使用 crate::id::new_id("overnight") 创建新的 run_id
  2. 目录设置:系统创建包含 task-cardsissue-draftsvalidation 结果子目录的 run_dir
  3. 会话准备:默认情况下,当前会话被用作协调器(use_current_session: true)。系统捕获当前会话状态并准备初始协调器提示。
  4. 清单持久化OvernightManifest 保存到磁盘。
  5. 初始事件:在 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 函数注入一组严格的规则:

  1. 风险缓解:避免发送电子邮件或删除数据等副作用。
  2. 可验证性:所有完成的任务都需要客观证据(测试输出、日志)。
  3. 资源感知:监控 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,其中包含:

  • 阶段:(例如 runningwind-downmorning 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

数据流:从命令到报告

下图说明了自然语言命令如何触发负责过夜生命周期的代码实体。

命令与清单流

标题:过夜启动数据流

jcode · 命令与清单流 · 图 1
jcode · 命令与清单流 · 图 1

来源: src/overnight.rs:54-129, src/tui/app/commands_overnight.rs:15-59, crates/jcode-overnight-core/src/lib.rs:47-82

状态转换与自动唤醒

标题:过夜运行状态机与唤醒循环

jcode · 状态转换与自动唤醒 · 图 2
jcode · 状态转换与自动唤醒 · 图 2

来源: 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 采样

为确保自主运行期间的安全,系统执行定期的"预检"检查和持续采样。

  1. ResourceSnapshot:捕获 memory_used_percentload_onebattery_percent。如果资源紧张,会提示协调器延迟繁重任务。
  2. GitSnapshot:跟踪 dirty_count 和当前分支。这使得晨报能够精确总结夜间修改了哪些文件。
  3. 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