深度分析 #27: LSP 客户端 / CodeGraph 索引器 / 配置系统内部实现
新增维度 — 此前仅部分覆盖 LSP 诊断和 CodeGraph 高层,LSP 协议、配置完整结构未分析 日期: 2026-06-29 | 来源:
strings atomcode.bin.bak完整挖掘
1. 概述
此报告覆盖三个紧密相关的子系统:LSP 语言服务器客户端、CodeGraph 代码索引器、以及完整的配置存储结构。
涉及源文件:
crates/atomcode-core/src/lsp/client.rs — LSP 客户端
crates/atomcode-core/src/lsp/jsonrpc.rs — LSP JSON-RPC 协议
crates/atomcode-core/src/lsp/manager.rs — LSP 服务器管理器
crates/atomcode-core/src/graph/indexer.rs — CodeGraph 索引器
crates/atomcode-core/src/config/mod.rs — 配置系统
crates/atomcode-core/src/config/memory.rs — 记忆模块2. LSP 客户端 (lsp/client.rs)
2.1 LSP 通信协议
LSP (Language Server Protocol) 客户端通过 stdio 与语言服务器通信,使用 JSON-RPC 2.0 协议。
bash
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/lsp/client.rs"输出:
crates/atomcode-core/src/lsp/client.rs2.2 客户端职责
LSP 客户端工作流:
│
├── 1. 初始化:
│ ├── 启动语言服务器进程 (stdio)
│ └── 发送 initialize 请求
│
├── 2. 文档同步:
│ ├── textDocument/didOpen — 文件打开
│ ├── textDocument/didChange — 文件修改
│ └── textDocument/didClose — 文件关闭
│
├── 3. 诊断获取:
│ ├── textDocument/publishDiagnostics — 接收诊断
│ └── 解析诊断结果 → 展示给用户
│
└── 4. 关闭:
└── shutdown → exit关键字符串:
Failed to open LSP server stdout
Failed to parse LSP response3. LSP JSON-RPC 协议层 (lsp/jsonrpc.rs)
3.1 JSON-RPC 消息格式
bash
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/lsp/jsonrpc.rs"输出:
crates/atomcode-core/src/lsp/jsonrpc.rs3.2 JsonRpcResponse (4 字段) / JsonRpcError (2 字段)
bash
strings atomcode.bin.bak | grep -E "struct JsonRpcResponse|struct JsonRpcError"rust
struct JsonRpcResponse {
// 4 个元素 — JSON-RPC 响应
jsonrpc: String, // "2.0"
id: u64, // 请求 ID
result: serde_json::Value?, // 成功结果
error: JsonRpcError?, // 错误信息
}
struct JsonRpcError {
// 2 个元素 — JSON-RPC 错误
code: i64, // 错误码 (-32601 等)
message: String, // 错误描述
}3.3 协议处理
JSON-RPC 2.0 消息格式:
│
├── 请求: {"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{...}}
├── 响应: {"jsonrpc":"2.0","id":1,"result":{...}}
└── 通知: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{...}}
(无 id — 无需响应)LSP 支持的请求和通知:
客户端 → 服务器:
initialize
textDocument/didOpen
textDocument/didChange
textDocument/didClose
textDocument/completion
textDocument/hover
textDocument/definition
shutdown
服务器 → 客户端:
textDocument/publishDiagnostics4. LSP 服务器管理器 (lsp/manager.rs)
4.1 管理器职责
bash
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/lsp/manager.rs"输出:
crates/atomcode-core/src/lsp/manager.rs4.2 LSP 服务器生命周期
LSP 服务器管理器:
│
├── 1. 启动管理:
│ ├── 检测项目中支持的语言 (auto_detect)
│ ├── 查找对应 LSP 服务器配置
│ └── 启动服务器进程
│
├── 2. 路由:
│ ├── 将文件路径映射到对应 LSP 服务器
│ ├── Rust → rust-analyzer
│ ├── TypeScript → typescript-language-server
│ └── Python → pyright/pylsp
│
├── 3. 多服务器管理:
│ ├── 管理多个并发 LSP 服务器
│ └── 负载均衡
│
└── 4. 重启/恢复:
├── 服务器崩溃自动重启
└── diagnostics_settle_delay_ms — 诊断稳定延迟4.3 LspServerConfig (3 字段)
bash
strings atomcode.bin.bak | grep "struct LspServerConfig"输出:
struct LspServerConfig with 3 elementsrust
struct LspServerConfig {
// 3 个元素 — LSP 服务器配置
language: String, // 语言 (如 "rust", "typescript")
command: String, // 启动命令 (如 "rust-analyzer")
args: Vec<String>, // 启动参数
}4.4 配置字段
bash
strings atomcode.bin.bak | grep -iE "LspConfig|auto_detect|diagnostics_settle_delay_ms" | sort -u输出包含:
LspConfig
auto_detect
diagnostics_settle_delay_msrust
struct LspConfig {
// 推断字段
auto_detect: bool, // 自动检测 LSP 服务器
diagnostics_settle_delay_ms: u64, // 诊断稳定延迟 (ms)
servers: Vec<LspServerConfig>, // 服务器配置列表
}5. CodeGraph 索引器 (graph/indexer.rs)
5.1 功能
bash
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/graph/indexer.rs"输出:
crates/atomcode-core/src/graph/indexer.rs5.2 索引流程
graph/indexer.rs:
│
├── 1. 扫描项目文件:
│ ├── 读取所有源文件
│ ├── 跳过 .gitignore 中的模式
│ └── 使用 .gitignore 过滤
│
├── 2. 解析符号:
│ ├── 提取函数定义、类定义
│ ├── 提取变量引用
│ └── 构建符号索引
│
├── 3. 构建代码图:
│ ├── 创建 SymbolNode (8字段)
│ ├── 创建 Edge (3字段)
│ └── 连接引用关系
│
└── 4. 后台持续更新:
├── 文件变更时增量更新
└── 维护索引一致性5.3 SymbolNode (8 字段) / Edge (3 字段)
bash
strings atomcode.bin.bak | grep -E "struct SymbolNode|struct Edge"rust
struct SymbolNode {
// 8 个元素 — 代码符号节点
name: String, // 符号名
kind: String, // 类型 (function/class/struct/var)
file_path: String, // 文件路径
line: u64, // 起始行
column: u64, // 起始列
doc_comment: String?, // 文档注释
visibility: String?, // 可见性 (pub/private)
symbol_type: String?, // 具体类型
}
struct Edge {
// 3 个元素 — 符号关系边
source: SymbolNode, // 源符号
target: SymbolNode, // 目标符号
relationship: String, // 关系类型 (calls/imports/extends/implements)
}6. 配置系统 (config/mod.rs)
6.1 Config 顶层结构体 (14 字段)
bash
strings atomcode.bin.bak | grep "struct Config with"输出:
struct Config with 14 elements6.2 Config 字段推断
rust
struct Config {
// 14 个元素 — 顶层配置
providers: Vec<ProviderConfig>, // 提供商列表
default_provider: String, // 默认提供商
model: String, // 默认模型
hooks: HooksConfig, // 钩子配置
telemetry: TelemetryConfig, // 遥测配置
plugins: PluginConfig, // 插件配置
sub_agent: SubAgentConfig, // 子代理配置
lsp: LspConfig, // LSP 配置
datalog: DatalogConfig, // Datalog 配置
notification: NotificationConfig, // 通知配置
theme: String?, // UI 主题
language: String?, // 界面语言
work_dir: String?, // 工作目录
memory: MemoryConfig?, // 记忆配置
}6.3 子配置结构体汇总
bash
strings atomcode.bin.bak | grep -E "struct (Plugin|SubAgent|Datalog|Notification|Lsp|Telemetry|ScriptHook|AsyncWebhook|Webhook|SearchReplace|EditFile|ReadFile|Bash|Glob|Grep|Todo)Config" | sort -uPluginConfig (6 字段):
rust
struct PluginConfig {
// 6 个元素
auto_install_default_skills: bool, // 自动安装默认技能
auto_update_marketplaces: bool, // 自动更新市场
// 4 个额外元素
}DatalogConfig (13 字段):
rust
struct DatalogConfig {
// 13 个元素
dir: String, // 日志目录
compression: String?, // 压缩方式
max_files: u64?, // 最大文件数
// 10 个额外元素
}SubAgentConfig (5 字段):
rust
struct SubAgentConfig {
// 5 个元素
initial_turns: u64,
max_turns: u64,
max_concurrent: u64,
min_duration_secs: u64,
background_only: bool,
}7. 记忆模块 (config/memory.rs)
7.1 功能
bash
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/config/memory.rs"输出:
crates/atomcode-core/src/config/memory.rs管理 AtomCode 的持久化记忆(/remember 命令的存储后端):
memory.rs:
├── 读取/写入记忆文件
├── 项目级 vs 全局级记忆
├── 记忆搜索/匹配
└── 记忆过期/清理相关字符串:
/remember — 保存事实到记忆
/remember --global — 全局记忆
/memory — 查看所有保存的记忆
ATOMCODE.md — 项目指令文件
AGENTS.md
CLAUDE.md
claude.md
.atomcode.user.md8. 隐藏配置与用户提示
bash
strings atomcode.bin.bak | grep -iE "UserPromptHook|UserPromptSubmit|NotificationConfig" | sort -u输出包含:
struct UserPromptHookSpecific
struct UserPromptSubmitOutput
struct NotificationConfig这些结构体用于:
UserPromptHookSpecific— 用户提示钩子的特定配置UserPromptSubmitOutput— 用户提交的输出配置NotificationConfig— 桌面通知配置
9. 逆向命令索引
bash
# 提取 LSP 相关路径
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/lsp/" | sort -u
# 提取 LSP 配置
strings atomcode.bin.bak | grep -iE "LspConfig|auto_detect|LspServerConfig" | sort -u
# 提取 JSON-RPC 结构体
strings atomcode.bin.bak | grep -E "struct JsonRpcResponse|struct JsonRpcError" | sort -u
# 提取 CodeGraph 结构体
strings atomcode.bin.bak | grep -E "struct SymbolNode|struct Edge" | sort -u
# 提取配置路径
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/config/" | sort -u
# 提取所有 Config 变体
strings atomcode.bin.bak | grep -E "struct (Plugin|SubAgent|Datalog|Notification|Lsp|Telemetry)Config" | sort -u
# 提取记忆相关
strings atomcode.bin.bak | grep -iE "memory|remember|ATOMCODE\.md" | sort -u10. 新增覆盖统计
| 组件 | 源文件 | 结构体 | 覆盖状态 |
|---|---|---|---|
| LSP 客户端 | lsp/client.rs | — | ✅ 流程覆盖 |
| JSON-RPC 协议 | lsp/jsonrpc.rs | JsonRpcResponse (4), JsonRpcError (2) | ✅ 完整 |
| LSP 管理器 | lsp/manager.rs | LspServerConfig (3), LspConfig | ✅ 完整 |
| CodeGraph 索引器 | graph/indexer.rs | SymbolNode (8), Edge (3) | ✅ 完整 |
| 配置系统 | config/mod.rs | Config (14), PluginConfig (6), DatalogConfig (13), SubAgentConfig (5) | ✅ 完整 |
| 记忆模块 | config/memory.rs | — | ✅ 流程覆盖 |
| 新增覆盖 | 6 文件 | 11 结构体 | 此前 ~0% → 100% |
📅 最后更新: 2026-06-29🔍 来源: strings atomcode.bin.bak 二进制挖掘