会话选择器与账号选择器
会话选择器与账户选择器
相关源文件
以下文件为本维基页面的生成提供了上下文:
crates/jcode-tui-account-picker/Cargo.tomlcrates/jcode-tui-account-picker/src/lib.rscrates/jcode-tui-session-picker/Cargo.tomlcrates/jcode-tui-session-picker/src/lib.rssrc/bin/session_memory_bench.rssrc/message_notifications.rssrc/protocol_memory.rssrc/provider/models_catalog.rssrc/session/crash.rssrc/tui/account_picker.rssrc/tui/account_picker_render.rssrc/tui/login_picker.rssrc/tui/memory_profile.rssrc/tui/session_picker.rssrc/tui/session_picker/filter.rssrc/tui/session_picker/loading.rssrc/tui/session_picker/loading_tests.rssrc/tui/session_picker/render.rssrc/tui/session_picker_tests.rs
会话选择器(Session Picker)和账户选择器(Account Picker)是专门的 TUI 覆盖层,用于管理工作空间和配置提供者。会话选择器提供了一个双窗格界面,用于浏览、筛选和预览历史或活跃的会话;而账户选择器则用于管理大语言模型(LLM)提供者的凭证和切换活跃账户。
会话选择器
SessionPicker 是一个交互式 TUI 组件,旨在通过按服务器对会话进行分组,并提供高性能的搜索和预览功能,来管理大量的会话 src/tui/session_picker.rs:1-129。
双窗格布局与预览
该选择器将屏幕分为左右两部分:左侧是会话列表,右侧是实时预览 src/tui/session_picker.rs:1-5。
- 会话信息:每个会话由一个
SessionInfo结构体表示,其中包含message_count(消息数)、estimated_tokens(预估 Token 数)、working_dir(工作目录)和SessionStatus(会话状态)等元数据crates/jcode-tui-session-picker/src/lib.rs:114-149。 - 实时预览:选中一个会话后,会渲染一个
PreviewMessage(预览消息)列表crates/jcode-tui-session-picker/src/lib.rs:163-169。这允许用户在不完全附加到会话的情况下,检查对话历史(包括工具调用及其结果)。 - 搜索索引:为了保持 TUI 的响应性,搜索索引是通过组合标题、短名称和消息内容的一部分(截断后)来构建的
src/tui/session_picker/loading.rs:90-129。索引大小受SEARCH_CONTENT_BUDGET_BYTES(12KB)限制src/tui/session_picker.rs:41。
会话分组与筛选
会话被组织到 ServerGroup(服务器组)结构中,将属于同一特定服务器实例的会话聚类在一起 crates/jcode-tui-session-picker/src/lib.rs:153-160。该选择器支持多种 SessionFilterMode(会话筛选模式)变体 crates/jcode-tui-session-picker/src/lib.rs:64-72:
| 筛选模式 | 描述 |
|---|---|
All | 显示所有发现的会话 crates/jcode-tui-session-picker/src/lib.rs:65。 |
CatchUp | 显示 needs_catchup 属性为 true 的会话 crates/jcode-tui-session-picker/src/lib.rs:66。 |
Saved | 筛选出明确标记为 saved 的会话 crates/jcode-tui-session-picker/src/lib.rs:67。 |
ClaudeCode / Codex / Pi | 根据会话的来源或模型类型进行筛选 crates/jcode-tui-session-picker/src/lib.rs:68-71。 |
外部会话支持
该选择器可以通过 ResumeTarget(恢复目标)发现并“恢复”来自其他工具的会话 crates/jcode-tui-session-picker/src/lib.rs:29-48。这包括:
- Claude Code:从
~/.claude/projects导入会话src/tui/session_picker/loading_tests.rs:74-129。 - Codex / Pi / OpenCode:将外部存储路径映射到 jcode 兼容的预览结构
src/tui/session_picker/loading_tests.rs:177-190。
来源: src/tui/session_picker.rs:1-212, src/tui/session_picker/loading.rs:90-129, crates/jcode-tui-session-picker/src/lib.rs:1-238
账户选择器
AccountPicker 是一个模态覆盖层,用于管理多提供者认证和切换活跃的 LLM 账户 src/tui/account_picker.rs:31-51。
命令结构
该选择器通过 AccountPickerCommand(账户选择器命令)进行操作,该命令封装了 TUI 对提供者执行的操作 src/tui/account_picker.rs:9-11:
Switch:切换某个提供者的活跃账户。Login:启动 OAuth 流程或 API 密钥输入。Remove:删除指定账户的凭证。
用户界面与摘要
该选择器会显示一个 AccountPickerSummary(账户选择器摘要),展示按状态分类的账户数量 src/tui/account_picker.rs:9-11。它使用专门的渲染逻辑来显示特定于提供者的样式(例如,Anthropic 与 OpenAI 的颜色) src/tui/account_picker.rs:13-19。
来源: src/tui/account_picker.rs:1-100
系统架构图
会话发现与选择流程
此图将用户选择会话的意图与底层文件系统和元数据结构联系起来。
来源: src/tui/session_picker.rs:36-39, src/tui/session_picker/loading.rs:1-129, src/tui/session_picker/filter.rs:153-185
账户选择器命令分发
此图将账户选择器 UI 操作映射到 AccountPickerCommand 实体空间。
来源: src/tui/account_picker.rs:42-46, src/tui/login_picker.rs:122-126, src/tui/account_picker_render.rs:1-20
会话状态与恢复
SessionStatus 枚举决定了会话在选择器中的视觉表示 src/tui/session_picker/render.rs:119-131。
| 状态 | 图标 | 描述 |
|---|---|---|
Active | ▶ | 会话当前正在服务器上运行 src/tui/session_picker/render.rs:120。 |
Closed | ✓ | 会话正常结束 src/tui/session_picker/render.rs:121。 |
Crashed | 💥 | 会话遇到 panic 或致命错误 src/tui/session_picker/render.rs:123。 |
Reloaded | 🔄 | 会话通过服务器 exec 重新加载 src/tui/session_picker/render.rs:125。 |
批量恢复
该选择器可以通过 crashed_sessions_from_all_sessions 识别多个崩溃的会话 src/tui/session_picker/loading.rs:36。用户可以触发 PickerResult::RestoreCrashedGroup 来尝试批量恢复这些会话,这将创建以 session_recovery_ 为前缀的新会话 src/tui/session_picker.rs:51, src/session/crash.rs:83-128。
来源: src/tui/session_picker/render.rs:119-131, src/session/crash.rs:14-129, src/tui/session_picker/loading.rs:36-39