斜杠命令与行内交互
斜杠命令与内联交互
相关源文件
本章引用的主要源码文件:
crates/jcode-overnight-core/Cargo.tomlcrates/jcode-overnight-core/src/helper_tests.rscrates/jcode-overnight-core/src/lib.rscrates/jcode-overnight-core/src/prompts.rsdocs/AWS_BEDROCK_PROVIDER.mdsrc/overnight.rssrc/provider/bedrock.rssrc/subscription_catalog.rssrc/tui/app/commands.rssrc/tui/app/commands_overnight.rssrc/tui/app/inline_interactive.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/tests/state_model_poke_03.rssrc/tui/app/tests/support_failover/part_01.rssrc/tui/app/tests/support_failover/part_02.rssrc/tui/app/tui_lifecycle.rssrc/tui/app/tui_state.rssrc/tui/app/turn.rssrc/tui/ui_inline_interactive.rssrc/tui/ui_overlays.rs
本页面详细介绍了基于 TUI 的斜杠命令实现,以及用于选择模型、会话和账户的交互式选择器覆盖层。这些组件在用户意图(自然语言/选择)与系统状态(代码实体空间)之间架起了桥梁。
斜杠命令实现
斜杠命令是由 TUI App 处理的特殊输入模式,用于执行系统操作而不向大语言模型(LLM)发送消息。这些命令主要在 commands 模块中进行解析和分发。
命令分发与路由
当用户提交以 / 开头的输入时,App 通过 src/tui/app/commands.rs 路由请求。命令可以在本地处理,也可以在 serve/connect 模式下转发到远程服务器。
| 命令 | 函数/实现 | 用途 |
|---|---|---|
/improve | handle_improve_command_local src/tui/app/commands.rs:1-8 | 启动一个子代理,基于对话记录改进当前代码。 |
/refactor | handle_refactor_command_local src/tui/app/commands.rs:1-8 | 用于代码重构的专用代理流程。 |
/review | handle_review_command_local src/tui/app/commands.rs:11-20 | 触发对当前会话变更的代码审查。 |
/overnight | OvernightCommand::parse src/tui/app/commands_overnight.rs | 通过 OvernightManifest 调度长时间运行的自主任务。 |
/transfer | maybe_begin_pending_local_transfer src/tui/app/local.rs:74-75 | 在不同提供方或会话之间迁移会话上下文。 |
/compact | handle_compaction_event src/tui/app/turn.rs:69-71 | 手动触发上下文压缩以节省 Token。 |
/model | open_model_picker src/tui/app/inline_interactive.rs:185-186 | 打开内联模型选择覆盖层。 |
/sessions | open_session_picker src/tui/app/inline_interactive.rs:10-11 | 打开会话管理覆盖层。 |
/workspace | handle_workspace_command src/tui/app/remote/workspace.rs | 导航多会话 Niri 风格工作区。 |
来源: src/tui/app/commands.rs:1-20, src/tui/app/local.rs:74-85, src/tui/app/inline_interactive.rs:1-15
代理命令(/improve、/refactor、/review)
这些命令不仅仅是发送提示词,它们使用 ManualSubagentSpec src/tui/app/commands.rs:11-20 启动一个带有专用系统提示词的独立会话。
- 数据流: 当前会话状态被快照,通过
id::generate_session_id()生成新的会话 ID,然后调用launch_prompt_in_new_session_localsrc/tui/app/commands.rs:11-20。 - 审查基础设施: 使用
REVIEW_PREFERRED_MODEL(默认为 "gpt-5.5")确保高质量的反馈src/tui/app/commands.rs:31。
来源: src/tui/app/commands.rs:1-32
内联交互选择器
TUI 为复杂选择提供了交互式覆盖层。这些由 InlineInteractiveState 结构体管理 src/tui/app/inline_interactive.rs:95-103。
模型选择器实现
模型选择器从活动的 Provider 动态获取可用模型,并以过滤列表形式展示。
关键组件:
ModelPickerCacheSignature:用于在提供方、模型或远程状态发生变化时使选择器缓存失效src/tui/app/inline_interactive.rs:43-76。invalidate_model_picker_cache:递增model_picker_catalog_revision以强制重新加载提供方模型src/tui/app/inline_interactive.rs:23-28。poll_model_picker_load:一个异步后台任务,从provider_catalog填充选择器条目src/tui/app/local.rs:70。
模型选择器数据流
下图展示了 TUI App 如何从用户输入 /model 过渡到代码级别的 ModelRoute 选择。
图表:模型选择管线
来源: src/tui/app/inline_interactive.rs:23-119, src/tui/app/local.rs:166-188, src/tui/app/tui_state.rs:118-143
会话选择器与追赶
会话选择器(/sessions)允许用户在历史会话或远程会话之间切换。
- 实现: 通过
SessionPicker结构体管理src/tui/app/inline_interactive.rs:2-6。 - 追赶逻辑: 切换会话时,
App可能进入PendingCatchupResume状态src/tui/app/remote.rs:81-90。它使用catchup_candidates和catchup_queue_position确定需要向 UI 重放多少历史记录src/tui/app/inline_interactive.rs:16-20。
来源: src/tui/app/remote.rs:81-106, src/tui/app/inline_interactive.rs:1-20
交互状态机
当交互式覆盖层处于活动状态时,TUI 会以不同方式处理事件。这在 src/tui/app/turn.rs 和 src/tui/app/remote/key_handling.rs 中控制。
输入处理逻辑
- 过滤: 选择器打开时,字符输入会追加到
inline_interactive_state.filter中,而不是主input缓冲区src/tui/app/inline_interactive.rs:101。 - 导航:
KeyCode::Up和KeyCode::Down更新inline_interactive_state.selectedsrc/tui/app/tests/state_model_poke_03.rs:20-31。 - 预览:
KeyCode::Right或特定斜杠命令触发(如带尾随空格的/model)切换picker.previewsrc/tui/app/tests/state_model_poke_03.rs:16。
图表:交互事件循环
来源: src/tui/app/turn.rs:124-148, src/tui/app/inline_interactive.rs:95-103, src/tui/app/state_ui.rs:28-45
Overnight 模式交互
/overnight 命令与 jcode-overnight-core crate 交互。它将 TUI 转换为长时间运行自主任务的监控状态。
- 命令: 支持的子命令包括
start、status、log、review和cancelsrc/tui/app/commands_overnight.rs。 - 自动唤醒: 使用
OvernightAutoPokeState通过定期发送系统提醒来保持会话活跃,以防代理停滞src/tui/app/commands.rs:35-40。 - UI 集成:
App在 tick 循环中调用maybe_refresh_overnight_display_card(),以更新 TUI 主体中的进度可视化src/tui/app/local.rs:73。
来源: src/tui/app/commands_overnight.rs, src/tui/app/local.rs:73, src/tui/app/commands.rs:35-62
关键函数总结
| 函数 | 文件 | 描述 |
|---|---|---|
run_turn_interactive | src/tui/app/turn.rs | 在大语言模型(LLM)轮次期间处理 UI 重绘和键盘事件的主循环。 |
handle_server_event | src/tui/app/remote/server_events.rs | 处理来自远程服务器的事件(如 ToolStart 或 TextDelta),以更新 TUI 状态。 |
apply_restored_reload_input | src/tui/app/tui_lifecycle.rs | 在 TUI 重新加载后恢复输入缓冲区、光标位置和待处理图像。 |
save_input_for_reload | src/tui/app/state_ui.rs | 将当前 UI 状态序列化到 ~/.jcode/client-input-ID,以便在重启之间持久化。 |
来源: src/tui/app/turn.rs:26-31, src/tui/app/remote/server_events.rs:6-10, src/tui/app/tui_lifecycle.rs:6-10, src/tui/app/state_ui.rs:92-112