服务端与客户端生命周期
服务器与客户端生命周期
相关源文件
本章引用的主要源码文件:
src/agent.rssrc/main.rssrc/network_retry.rssrc/process_memory.rssrc/protocol.rssrc/protocol_tests.rssrc/provider/tests/auth_refresh.rssrc/provider/tests/fallback_failover.rssrc/server.rssrc/server/client_actions.rssrc/server/client_comm.rssrc/server/client_comm_tests.rssrc/server/client_lifecycle.rssrc/server/client_session.rssrc/server/client_session_tests/resume/busy_existing_attach.rssrc/server/client_state.rssrc/server/client_state_tests.rssrc/server/comm_control.rssrc/server/comm_session.rssrc/server/comm_sync.rssrc/server/debug.rssrc/server/debug_command_exec.rssrc/server/debug_help.rssrc/server/debug_server_state.rssrc/server/debug_swarm_write.rssrc/server/debug_testers.rssrc/server/debug_tests.rssrc/server/reload_state.rssrc/server/socket.rssrc/server/socket_tests.rssrc/server/swarm.rssrc/session.rssrc/tool/communicate.rssrc/tui/app/debug.rssrc/tui/app/debug_cmds.rssrc/tui/app/helpers_tests.rssrc/tui/backend.rs
本文描述了 jcode 服务器及其客户端的生命周期。jcode 采用单服务器、多客户端架构,由一个持久的后台守护进程管理大语言模型(LLM)会话、工具执行和集群协调,而多个客户端(终端界面(TUI)、无头代理或调试器)通过 Unix 域套接字进行连接。
1. 服务器架构总览
服务器运行时通过 ServerRuntime 结构体进行管理 src/server/runtime.rs:16-45。它充当以下功能的核心枢纽:
- 会话管理:在
SessionAgents中维护会话 ID 到Agent实例的映射src/server.rs:96。 - 客户端注册表:通过
ClientConnectionInfo跟踪已连接的客户端,该结构体存储client_instance_id、connected_at和处理状态等元数据src/server/debug.rs:47-57。 - 集群协调:管理多个代理之间的共享上下文、计划和成员状态
src/server/client_lifecycle.rs:104-110。 - 事件广播:利用
broadcast::Sender<SwarmEvent>将集群更新流式传输到所有已连接的客户端src/server/client_lifecycle.rs:109。
1.1. 套接字设置与发现
服务器主要通过 Unix 域套接字进行通信。
- 主套接字:由
Listener特质实现管理src/transport.rs:1-10。 - 调试套接字:用于管理和诊断访问的辅助接口,由
handle_debug_client处理src/server/debug.rs:171。
src/server/socket.rs 中的服务器初始化逻辑负责绑定到 Unix 套接字并进入接受循环 src/server.rs:37。
1.2. 服务器启动到客户端连接
下图展示了从服务器初始化到处理新客户端的转换过程。
图示:服务器初始化与客户端握手
来源:src/server/runtime.rs:16-45、src/server/client_lifecycle.rs:53-122、src/agent.rs:157-158
2. 客户端生命周期(handle_client)
当客户端连接时,服务器会生成一个异步的 handle_client 任务 src/server/client_lifecycle.rs:53。该函数管理单个客户端连接的整个持续时间。
2.1. 初始化与会话附加
每个新连接最初都会创建一个新的 Agent 和一个唯一的 client_connection_id src/server/client_lifecycle.rs:111-122。
- 身份生成:服务器为连接分配一个以
conn_为前缀的 IDsrc/server/client_lifecycle.rs:122。 - 会话映射:该连接被映射到
client_connections注册表中的session_idsrc/server/debug.rs:49。 - 中断注册:代理的
SoftInterruptQueue和InterruptSignal处理器通过register_session_interrupt_queue注册,以允许外部控制src/server/client_lifecycle.rs:39-41。
2.2. 请求-响应循环
handle_client 的核心是一个循环,该循环使用 decode_request 从套接字读取以换行符分隔的 JSON Request 对象 src/protocol.rs:49。
| 请求类型 | 处理函数 | 用途 |
|---|---|---|
Message | handle_agent_task | 向大语言模型(LLM)发送提示并流式传输响应 src/server/client_actions.rs:2 |
Subscribe | handle_subscribe | 将终端界面(TUI)附加到现有会话 src/server/client_session.rs:14 |
ResumeSession | handle_resume_session | 将当前连接切换到之前保存的会话 src/server/client_session.rs:14 |
Cancel | graceful_shutdown | 触发 InterruptSignal 以停止当前代理轮次 src/agent.rs:170 |
SoftInterrupt | soft_interrupt_queue | 向代理队列注入消息而不停止执行 src/agent.rs:166 |
来源:src/server/client_lifecycle.rs:53-200、src/protocol.rs:1-2
3. 会话持久化与附加
jcode 中的会话与客户端连接是解耦的。客户端可以通过 ResumeSession 请求"附加"到现有会话。
3.1. 会话附加逻辑
当调用 handle_resume_session 时:
- 服务器在
SessionAgents映射中查找Agentsrc/server/client_session.rs:27。 client_connections映射会被更新,以反映该client_id的新session_idsrc/server/debug.rs:49。- 服务器通过
handle_get_history将完整的对话历史发送给客户端,以同步终端界面(TUI)src/server/client_session.rs:3。
3.2. 有头会话与无头会话
- 有头会话:连接到终端界面(TUI)客户端的标准会话。
- 无头会话:通过
create_headless_session创建src/server.rs:50。这些会话在后台运行,没有终端界面(TUI),通常用于集群成员src/server/comm_session.rs:9。
来源:src/server/client_session.rs:1-100、src/server/comm_session.rs:1-24
4. 通过 exec 实现热重载
jcode 支持近乎零停机时间的重载,服务器进程会替换自身为新编译的二进制文件,同时尝试保留状态。
4.1. 重载流程
- 信号:客户端发送由
handle_reload处理的Reload请求src/server/client_session.rs:14。 - 优雅关闭:服务器触发所有活动代理的
graceful_shutdown信号src/agent.rs:170。代理会在其历史记录中附加中断标记src/server/client_session.rs:31-51。 - 状态序列化:服务器通过
write_reload_state写入重载状态src/server/client_session.rs:99-105。 - Exec:服务器调用
replace_process(在 Unix 上使用execvp)切换到新的二进制文件src/server/reload.rs:33。 - 恢复:新进程启动并使用
reload_recovery恢复会话状态src/server.rs:34。
图示:服务器热重载(Exec)
来源:src/server/reload.rs:33-51、src/server/client_session.rs:31-105、src/server/runtime.rs:16-45
5. 调试套接字与管理控制
调试套接字提供了一个原始接口,用于在不使用终端界面(TUI)的情况下检查和控制服务器。
5.1. 调试能力
在 src/server/debug.rs 中处理,它支持:
- 状态检查:访问
ClientConnectionInfo和ClientDebugStatesrc/server/debug.rs:41-57。 - 直接命令执行:通过
execute_debug_command运行管理命令src/server/debug.rs:8。 - 集群监控:通过
SwarmEvent广播监控实时事件src/server/debug.rs:21。
5.2. 调试客户端注册表
服务器维护一个 ClientDebugState src/server/debug.rs:41-44,用于跟踪哪些调试客户端处于活动状态,以及哪个是命令的"焦点"目标 src/server/debug.rs:72-86。
来源:src/server/debug.rs:1-150、src/server/debug_command_exec.rs:1-10