单会话视图与服务端集成
单会话视图与服务器集成
相关源文件
本章引用的主要源码文件:
crates/jcode-desktop/Cargo.tomlcrates/jcode-desktop/src/animation.rscrates/jcode-desktop/src/desktop_log.rscrates/jcode-desktop/src/main.rscrates/jcode-desktop/src/main_tests.rscrates/jcode-desktop/src/power_inhibit.rscrates/jcode-desktop/src/session_data.rscrates/jcode-desktop/src/session_launch.rscrates/jcode-desktop/src/session_launch/events.rscrates/jcode-desktop/src/session_launch/server_io.rscrates/jcode-desktop/src/session_launch/terminal.rscrates/jcode-desktop/src/session_launch/tests.rscrates/jcode-desktop/src/single_session.rscrates/jcode-desktop/src/single_session_render.rscrates/jcode-desktop/src/workspace.rscrates/jcode-protocol/src/comm_format.rsdocs/DESKTOP_FIRST_PROTOTYPE.mdpackaging/linux/jcode-desktop.desktopsrc/cli/hot_exec.rssrc/cli/hot_exec/rebuild.rs
SingleSessionApp 在 jcode-desktop 应用中提供了一个专注的高分辨率聊天界面。它管理用户本地输入(编辑器)、历史对话记录以及底层 jcode 服务器会话之间的交互。这种集成通过异步协议实现,允许桌面客户端生成、恢复并与后台运行的代理会话进行通信。
SingleSessionApp 组件
SingleSessionApp 结构体是聚焦聊天视图的主要状态容器 crates/jcode-desktop/src/single_session.rs:98-135。它管理多个子组件:
- 编辑器(Composer):处理
draft字符串、draft_cursor位置以及input_undo_stack(输入撤销栈)crates/jcode-desktop/src/single_session.rs:100-101,123。 - 对话记录(Transcript):以
SingleSessionMessage对象存储messages,并跟踪body_scroll_lines用于导航crates/jcode-desktop/src/single_session.rs:104,109。 - 模型选择器(Model Picker):一个专门的状态机(
ModelPickerState),用于过滤和选择大语言模型(LLM)提供方/模型crates/jcode-desktop/src/single_session.rs:113,243-294。 - 标准输入请求(Stdin Request):管理工具所需的交互式输入提示(
StdinResponseState),例如密码输入crates/jcode-desktop/src/single_session.rs:115,204-210。
模型选择器与选择过程
ModelPickerState 处理模型选择的完整生命周期,包括从服务器加载目录以及根据用户输入过滤结果 crates/jcode-desktop/src/single_session.rs:243-294。它跟踪 query 字符串、selected_index(选中索引)以及服务器返回的 available_models(可用模型)列表 crates/jcode-desktop/src/single_session.rs:244-250。
数据流:从用户输入到服务器
来源:crates/jcode-desktop/src/single_session.rs:98-135、crates/jcode-desktop/src/workspace.rs:65-108、crates/jcode-desktop/src/session_launch.rs:177-208
桌面会话协议
桌面 UI 与服务器之间的集成使用 DesktopSessionEvent 枚举来异步通信状态变更 crates/jcode-desktop/src/session_launch.rs:34-82。
| 事件 | 描述 |
|---|---|
TextDelta(String) | 流式传输期间接收到的增量文本 crates/jcode-desktop/src/session_launch.rs:39。 |
ToolStarted { name } | 通知某个特定工具已开始执行 crates/jcode-desktop/src/session_launch.rs:41。 |
ToolFinished { .. } | 工具执行的摘要和错误状态 crates/jcode-desktop/src/session_launch.rs:50。 |
StdinRequest { .. } | 来自工具的交互式用户输入请求 crates/jcode-desktop/src/session_launch.rs:68。 |
ModelCatalog | 可用模型列表及当前选择 crates/jcode-desktop/src/session_launch.rs:60。 |
来源:crates/jcode-desktop/src/session_launch.rs:34-82
服务器集成与会话启动
session_launch 模块提供了与 jcode 二进制文件及其服务器端会话交互的函数。
关键函数
spawn_fresh_server_session:启动一个新线程,运行run_server_session以初始化一个全新的会话,包含初始消息和可选的图片crates/jcode-desktop/src/session_launch.rs:147-175。spawn_message_to_session:通过会话 ID 恢复现有会话并发送新消息crates/jcode-desktop/src/session_launch.rs:177-208。run_server_session:核心工作循环,通过 Unix 套接字连接到服务器,发送消息/图片,并将服务器的 JSON 协议转换为DesktopSessionEvent变体crates/jcode-desktop/src/session_launch.rs:244-328。
线程模型
会话通信被卸载到专用工作线程(例如命名为 jcode-desktop-fresh-session)上执行,以防止阻塞 WGPU 渲染循环 crates/jcode-desktop/src/session_launch.rs:160-161。这些线程通过 mpsc::channel 与主 UI 通信 crates/jcode-desktop/src/session_launch.rs:156-157。
来源:crates/jcode-desktop/src/session_launch.rs:147-208,244-328
剪贴板与图片附件
SingleSessionApp 支持通过剪贴板将图片附加到草稿中 crates/jcode-desktop/src/single_session.rs:112。
AttachClipboardImage:由KeyInput::AttachClipboardImage触发crates/jcode-desktop/src/workspace.rs:92。- 实现方式:应用使用
arboard访问系统剪贴板,将图片编码为 Base64 字符串,并存储在pending_images中crates/jcode-desktop/src/single_session.rs:112。 - 传输过程:当草稿被提交时,这些图片通过
spawn_*函数传递给服务器crates/jcode-desktop/src/session_launch.rs:149,180。
来源:crates/jcode-desktop/src/single_session.rs:112、crates/jcode-desktop/src/workspace.rs:92、crates/jcode-desktop/src/session_launch.rs:147-208
StdinRequest 与交互式输入
当某个工具需要交互式输入(例如 sudo 密码或确认)时,服务器会发送一个 StdinRequest crates/jcode-desktop/src/session_launch.rs:68-73。
- 状态转换:
SingleSessionApp将请求详情填充到stdin_response中crates/jcode-desktop/src/single_session.rs:115。 - UI 覆盖层:UI 会渲染一个专门的输入字段,如果
is_password为 true,则可能对字符进行掩码处理crates/jcode-desktop/src/single_session.rs:207。 - 提交过程:按下回车键后,客户端通过
DesktopSessionHandle向工作线程发送DesktopSessionCommand::StdinResponsecrates/jcode-desktop/src/session_launch.rs:98-102。
来源:crates/jcode-desktop/src/session_launch.rs:68-73,98-102、crates/jcode-desktop/src/single_session.rs:115,204-210
电源抑制器(PowerInhibitor)
为防止系统在长时间运行的代理任务(例如复杂构建或多步骤重构)期间进入休眠状态,桌面应用使用了 PowerInhibitor crates/jcode-desktop/src/main.rs:4。
- 激活条件:当
SingleSessionApp中的is_processing为 true 时,电源抑制器会被激活crates/jcode-desktop/src/single_session.rs:108。 - 平台支持:具体实现细节在
power_inhibit.rs中处理crates/jcode-desktop/src/main.rs:4。
来源:crates/jcode-desktop/src/main.rs:4、crates/jcode-desktop/src/single_session.rs:108
实体空间图:会话集成
此图将高层概念映射到桌面到服务器集成中使用的具体 Rust 实体和通信通道。
来源:crates/jcode-desktop/src/single_session.rs:98-135、crates/jcode-desktop/src/session_launch.rs:34-82,87-103,147-208