Overnight TUI 集成与报告
Overnight TUI 集成与报告
相关源文件
本章引用的主要源码文件:
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.rssrc/tui/app/commands_overnight.rssrc/tui/app/input.rssrc/tui/app/local.rssrc/tui/app/remote.rssrc/tui/app/remote/key_handling.rssrc/tui/app/remote/server_events.rssrc/tui/app/state_ui.rssrc/tui/app/tests.rssrc/tui/app/tui_lifecycle.rssrc/tui/app/tui_state.rssrc/tui/app/turn.rssrc/tui/ui_overlays.rs
Overnight 模式是 jcode 中一种专门用于长时间运行、多步骤工程任务的自主执行状态。TUI 集成提供了对这些后台运行的实时监控、通过"戳动"机制实现的自动恢复,以及通过 HTML 和审查笔记实现的高保真结果报告。
Overnight 自动戳动机制
为确保自主运行不会因瞬时错误或不完整的工具输出而停滞,jcode 实现了"自动戳动"机制。该系统会监控 Overnight 代理的状态,并在模型未完成指定任务而停止时自动注入后续提示。
OvernightAutoPokeState
TUI 使用 OvernightAutoPokeState(以及相关的通用戳动逻辑)来跟踪这些自动交互的状态。
| 常量/状态 | 值/作用 |
|---|---|
OVERNIGHT_MAX_POKES | 限制自动戳动的次数,防止无限循环。 |
PokeCommand | 表示用户意图的枚举:Trigger、On、Off、Status。src/tui/app/commands.rs:35-40 |
auto_poke_incomplete_todos | App 状态中的布尔值,控制 TUI 是否应自动推动模型。src/tui/app/commands.rs:164-164 |
实现流程
TUI 在尝试戳动之前会检查"不可重试"的错误。如果模型返回确定性错误(例如 context_length_exceeded、invalid_request_error),则会禁用自动戳动系统,以防止浪费 Token。
*来源:src/tui/app/commands.rs:91-138、src/tui/app/commands.rs:163-185*
进度卡片渲染
当 Overnight 运行处于活动状态时,TUI 会渲染专门的进度卡片。这提供了 OvernightManifest 状态的高层概览,无需用户切换到特定的协调器会话。
数据流:从 Manifest 到 UI
App通过maybe_refresh_overnight_display_card()轮询 Manifest 更新。src/tui/app/local.rs:73-73- 它检索包含
task_cards和resource_usage的OvernightManifest。 - TUI 渲染包含以下内容的摘要:
- 当前活动任务描述。
- 整体计划的完成百分比。
- 累计成本和 Token 使用量。
- 工作器会话状态(就绪、运行中、阻塞)。
*来源:src/tui/app/local.rs:73-73、crates/jcode-overnight-core/src/lib.rs:1-50*
晨间报告生成
Overnight 运行完成后,系统会生成"晨间报告"。这是一份供人工审查的全面摘要。
报告组件
- HTML 生成:生成独立的 HTML 文件,包含运行的完整叙述、所做更改的差异以及所有工具执行的日志。
- 审查笔记:协调器代理会合成
REVIEW_NOTES.md文件。该文件使用与/review命令相同的基础设施。src/tui/app/commands.rs:11-20
基础设施共享
/improve 和 /refactor 命令共享 Overnight 模式使用的相同审查和评判基础设施。
| 命令 | 共享逻辑 | 文件指针 |
|---|---|---|
/improve | build_improve_prompt | src/tui/app/commands.rs:1-8 |
/refactor | build_refactor_prompt | src/tui/app/commands.rs:1-8 |
/review | queue_review_spawn_remote | src/tui/app/commands.rs:11-20 |
*来源:src/tui/app/commands.rs:1-20、crates/jcode-overnight-core/src/prompts.rs:1-30*
TUI 命令集成
用户通过 /overnight 斜杠命令与 Overnight 系统交互,该命令由 commands_overnight.rs 模块处理。
命令映射
| 子命令 | 函数/效果 |
|---|---|
/overnight start | 解析请求并生成 OvernightCoordinator。 |
/overnight status | 显示当前的 OvernightRunStatus 和资源采样。 |
/overnight log | 流式传输后台协调器会话的日志。 |
/overnight review | 在 TUI 侧面板中打开生成的审查笔记。 |
/overnight cancel | 在 Manifest 上设置 cancel_requested 以触发优雅关闭。 |
交互图:TUI 到 Overnight 核心
此图说明了 TUI App 如何与存储在文件系统中的 OvernightManifest 交互,以同步后台进程与用户界面之间的状态。
*来源:src/tui/app/local.rs:73-73、src/tui/app/commands.rs:35-62、crates/jcode-overnight-core/src/lib.rs:1-100*
实现细节
状态持久化
TUI 确保即使终端关闭,Overnight 运行也会继续。重新连接时,finalize_reload_reconnect 和 apply_restored_reload_input 会恢复任何活动 Overnight 运行的跟踪状态。
- 文件恢复:
src/tui/app/tui_lifecycle.rs处理queued_messages和interleave_message的恢复,这些消息可能包含待处理的戳动。src/tui/app/tui_lifecycle.rs:30-54 - 远程同步:对于远程会话,TUI 使用
apply_remote_transcript_event来同步协调器会话的状态。src/tui/app/remote.rs:46-50
错误处理与戳动
is_non_retryable_auto_poke_error 函数对于防止自主代理进入"燃烧循环"至关重要,在这种循环中,代理会反复尝试发送 LLM 提供商会拒绝的消息。
// 停止自动戳动的确定性标记示例
let deterministic_markers = [
"context_length_exceeded",
"token_limit_exceeded",
"content_policy_violation",
"401 unauthorized",
];
*来源:src/tui/app/commands.rs:96-132、src/tui/app/tui_lifecycle.rs:6-29*
关键文件摘要
src/tui/app/commands_overnight.rs:Overnight CLI 集成的主要入口点。crates/jcode-overnight-core/src/lib.rs:定义OvernightManifest和状态机。src/tui/app/commands.rs:实现共享的戳动和审查逻辑。src/tui/app/commands.rs:1-185src/tui/app/turn.rs:管理执行戳动的run_turn_interactive循环。src/tui/app/turn.rs:26-120
来源:src/tui/app/commands.rs:1-185、src/tui/app/turn.rs:26-120、src/tui/app/tui_lifecycle.rs:1-72、src/tui/app/local.rs:55-100