会话持久化与后台任务
会话持久化与后台任务
相关源文件
本章引用的主要源码文件:
src/agent.rssrc/background.rssrc/main.rssrc/message/notifications.rssrc/protocol.rssrc/server.rssrc/server/tests.rssrc/session.rssrc/tool/bash.rssrc/tool/bg.rssrc/tui/app/remote_notifications.rs
本节介绍 jcode 如何确保代理对话的持久性,并管理那些生命周期超过单次用户交互的长时间运行操作。该系统结合了结构化 JSON 快照、仅追加日志和基于 PID 的进程跟踪,为自主代理提供了一个弹性运行环境。
存储布局
所有持久化数据都集中在 jcode 主目录下,通常为 ~/.jcode/。系统使用平台感知逻辑来解析这些路径,并应用严格的权限加固来保护敏感凭证和会话数据 src/session.rs:3-17。
| 路径 | 描述 |
|---|---|
~/.jcode/sessions/ | 会话 JSON 和 JSONL 日志文件的主要存储位置 src/session.rs:42。 |
~/.jcode/active_pids/ | 活跃会话的 PID 文件,用于检测崩溃 src/session.rs:8-10。 |
~/.jcode/tasks/ | 后台任务输出和状态 JSON 文件的存储位置 src/background.rs:31-33。 |
~/.jcode/auth.json | 提供商凭证和 OAuth 令牌的存储位置。 |
~/.jcode/config.toml | 全局用户配置和安全设置。 |
来源: src/session.rs:1-43, src/background.rs:31-48
会话持久化模型
jcode 采用混合持久化策略,以平衡性能与崩溃恢复能力。每个对话都由一个 Session 结构体表示 src/session.rs:64-155。
- JSON 快照: 定期对会话进行完整状态序列化,包括元数据、压缩状态和消息历史
src/session.rs:72-76。 - JSONL 日志: 通过
SessionPersistState实时、仅追加地记录新消息和事件src/session.rs:142。这确保了即使在保存完整快照之前进程被终止,对话也可以被重建src/session.rs:25-26。 - 易记 ID: 通过
new_memorable_session_id为会话分配人类友好的 ID(例如 "fox"、"oak"),以便于手动恢复和多会话管理src/session.rs:1,src/session.rs:112-113。
关于序列化格式和恢复逻辑的详细信息,请参阅 会话生命周期与日志。
会话状态转换
SessionStatus 枚举跟踪会话的生命周期,允许 TUI 和服务器检测崩溃或重新加载 src/session.rs:114-116。
来源: src/session.rs:64-125, src/session.rs:18-21, src/agent.rs:38
后台任务管理
BackgroundTaskManager 允许工具(如 bash)生成进程,这些进程即使在 TUI 断开连接或服务器重启后也能继续运行 src/background.rs:36-40。
- 任务跟踪: 每个任务通过
generate_task_id分配一个唯一 IDsrc/background.rs:57-77,并通过.status.json文件进行跟踪src/background.rs:83-84。 - PID 核对: 系统使用
active_pids来检查分离的任务在系统重载后是否仍然存活src/session.rs:8-10。 - 输出流式传输: 任务的标准输出和标准错误被重定向到
.output文件src/background.rs:79-81。BgTool允许代理对这些文件执行tail或wait操作src/tool/bg.rs:42-98。 - 进度解析:
bash工具解析标准输出中的JCODE_PROGRESSJSON 标记或基于正则表达式的模式(例如42%),以更新 UIsrc/tool/bash.rs:26-91。
关于进程接管和后台事件总线的详细信息,请参阅 后台任务与进程管理。
后台任务逻辑流程
此图展示了 BackgroundTaskManager 如何使用代码实体将 Agent 的请求桥接到操作系统进程状态。
来源: src/background.rs:36-192, src/server.rs:45-47, src/tool/bash.rs:19-30
会话恢复与发现
Session 模块提供了发现和预览历史会话的工具。它通过 detect_crashed_sessions 检查是否存在 PID 文件但对应的进程未运行,从而识别崩溃的会话 src/session.rs:18-21。
来源: src/session.rs:1-38, src/session.rs:64-155