深度分析 #2: 流式协议、Hook 事件系统与 LSP/CodeGraph 体系
日期: 2026-06-23 | 循环分析第 2 轮
概述
本轮分析发现了多个之前未文档化的核心子系统细节,包括流式协议、Hook 事件生命周期、LSP 语言支持体系、CodeGraph 索引引擎、以及 Headless 模式与抓包调试功能。
1. 流式协议(SSE 事件流)
1.1 Streaming Event Types
AtomCode 使用与 Anthropic API 兼容的 SSE 流式格式,包含以下事件类型:
| 事件类型 | 说明 |
|---|---|
message_start | 消息开始 |
message_delta | 消息增量更新 |
message_stop | 消息结束 |
content_block_start | 内容块开始 |
content_block_delta | 内容块增量 |
content_block_stop | 内容块结束 |
text_delta | 文本增量(核心内容) |
thinking_delta | 思考过程增量 |
signature_delta | 签名增量(用于 extended thinking) |
1.2 Streaming 参数
stream_options- 流选项include_usage- 包含 token 使用统计protocolVersion: 2024-11-05- MCP 协议版本anthropic-version: 2023-06-01- Anthropic API 版本
1.3 Wire Dump 调试
- 环境变量:
ATOMCODE_WIRE_DUMP - 输出路径:
.atomcode/wire-dump - 启用后抓取所有 API 通信的原始数据,用于调试
2. Hook 事件生命周期(完整覆盖)
之前文档覆盖了 Hook 系统的概览,但缺少事件触发时序。二进制中发现的完整事件序列:
2.1 Hook 事件类型
| 事件 | 阶段 | 触发时机 |
|---|---|---|
session_start | 会话 | 会话初始化 |
session_end | 会话 | 会话结束 |
turn_complete | 回合 | 每回合完成 |
model_response | 模型 | LLM 响应到达 |
tool_call_start | 工具 | LLM 请求调用工具 |
pre_tool | 工具执行前 | 工具执行前拦截 |
post_tool | 工具执行后 | 工具执行后处理 |
2.2 Hook 过滤机制
PreHookResult::Block(带 1 元素) - 阻止工具执行PreHookResult::Modify(带 1 元素) - 修改参数后放行- 钩子按
hook_name注册,通过trigger条件匹配
2.3 CCHookGroup 结构
CCHookGroup包含 2 个字段- 钩子组可以批量启用/禁用
- 关键配置路径:
~/.atomcode/hooks/
3. LSP 语言服务器集成(完整语言支持清单)
3.1 支持的语言和对应 LSP 服务器
| 语言 | LSP 服务器 | 项目标记文件 |
|---|---|---|
| Rust | rust-analyzer | Cargo.toml |
| TypeScript/JavaScript | typescript-language-server --stdio | tsconfig.json, package.json |
| Python | pylsp | pyproject.toml |
| Go | gopls serve | go.mod |
| Java | jdtls | pom.xml, build.gradle |
| Kotlin | (Kotlin LSP) | build.gradle.kts |
| C# | (C# LSP) | .csproj |
| Scala | (Scala LSP) | build.sbt |
| Swift | (Swift LSP) | Package.swift |
| Vue | (Vue LSP) | package.json |
| Svelte | (Svelte LSP) | package.json |
3.2 LSP 客户端架构
lsp/client.rs— LSP 客户端实现,处理 JSON-RPC 消息lsp/jsonrpc.rs— JSON-RPC 2.0 协议层lsp/manager.rs— LSP 服务器生命周期管理
3.3 LSP 协议消息
| 消息 | 方向 | 说明 |
|---|---|---|
textDocument/didOpen | 客户端→服务器 | 文件打开通知 |
textDocument/didChange | 客户端→服务器 | 文件变更通知 |
textDocument/publishDiagnostics | 服务器→客户端 | 诊断结果发布 |
initialize | 客户端→服务器 | 握手初始化 |
initialized | 客户端→服务器 | 初始化完成通知 |
3.4 LSP 配置
toml
[lsp]
auto_detect = true
diagnostics_settle_delay_ms = 500 # 诊断稳定等待时间LspServerConfig结构体: 3 个字段(含root_markers)- 超时: LSP 请求 30 秒超时
4. CodeGraph / 代码索引引擎
4.1 索引文件
- 输出文件:
graph.bin(位于项目根目录) - 触发条件: 需要项目标记文件(
.git,Cargo.toml,package.json,pyproject.toml,go.mod,pom.xml,build.gradle) - 跳过条件: 父目录有多个项目且没有直接标记文件
4.2 CodeGraph 功能
- 构建函数调用关系图
- 支持 BFS 搜索调用链(最多 10 跳)
- 为
find_references,trace_callees,trace_callers,trace_chain工具提供数据 - 支持
ATOMCODE_GRAPH_TOOLS环境变量(可能控制启用/禁用)
4.3 索引范围
- 函数/方法定义 (
fn pub fn class function func struct type interface) SymbolNode结构: 8 个字段(符号名称、位置、类型、子符号等)
5. Headless 模式
5.1 工作模式
- 交互模式 (TUI): 默认启动完整终端 UI
- Headless 模式: 通过
-p参数或headlessflag 启用
5.2 Headless 行为
[headless] auto-approved— 自动批准所有工具调用(等价于--dangerously-skip-permissions)- WSL 检测: 检查
WSL_DISTRO_NAME,/proc/version,microsoft关键词 - CI 检测:
GITHUB_ACTIONS,GITLAB_CI,BUILDKITE环境变量
5.3 Headless 输出
- stderr verbose:
-v/--verbose显示 tool calls、token 使用、回合摘要 - stdout: 仅输出助手回复
- headless 模式下的
open_file: 检测到无 GUI 时拒绝,给出清晰提示
6. 项目类型检测与构建命令
6.1 自动检测的项目类型
| 框架 | 检测文件 | 构建命令 | 测试命令 |
|---|---|---|---|
| Node.js | package.json, pnpm-lock.yaml, yarn.lock | npm install / yarn install / pnpm install | npm test / yarn test / pnpm test |
| React | "react" 依赖 | (同 Node.js) | (同 Node.js) |
| Vue | "vue" 依赖 | (同 Node.js) | (同 Node.js) |
| Next.js | "next" 依赖 | (同 Node.js) | (同 Node.js) |
| Python | requirements.txt, pyproject.toml | pip install -r requirements.txt | pytest |
| Go | go.mod | go build ./... | go test ./... |
| Java/Maven | pom.xml | mvn compile | mvn test |
| Java/Gradle | build.gradle | ./gradlew build | ./gradlew test |
| Rust | Cargo.toml | cargo build | cargo test |
6.2 智能构建修复
auto_fix.rs自动捕获编译错误,尝试修复- 捕获命令:
npm run build 2>&1 | head -30,cargo check 2>&1 | tail -20,mvn compile -q 2>&1 | tail -20,go build ./... 2>&1 | tail -20
7. 架构约束与安全层
7.1 网络访问控制
Only http:// and https:// URLs are allowed; requests to localhost,
private networks, and cloud metadata endpoints are blocked.阻止访问:
- localhost / 127.0.0.0/8
- private networks (100.64/10, 240.0.0.0/4)
- cloud metadata endpoints
- link-local / multicast
7.2 敏感路径保护
阻止写入的系统路径包括 50+ 个,涵盖:
/System,/sbin,/private/etc,/var/root~/.gnupg,~/.ssh/id_rsa,~/.ssh/id_ed25519~/.bashrc,~/.bash_profile,~/.zshrc,~/.npmrc,~/.pypirc- Windows:
\Program Files,\Program Files (x86),\ProgramData
7.3 环境变量验证
| 变量 | 用途 | 优先级 |
|---|---|---|
ATOMCODE_TELEMETRY | 遥测禁用 | 配置覆盖 |
DO_NOT_TRACK | 遥测禁用 | 标准 |
ATOMCODE_PLATFORM_SERVER | 平台服务器地址 | 配置覆盖 |
ATOMCODE_CODINGPLAN_API_BASE | CodingPlan API | 配置覆盖 |
ATOMCODE_CODINGPLAN_LLM_BASE_URL | CodingPlan LLM | 配置覆盖 |
ATOMCODE_WIRE_DUMP | 调试抓包 | 调试 |
8. 新发现的 search_replace 工具细节
之前未文档化的参数:
| 参数 | 类型 | 说明 |
|---|---|---|
search | string | 要搜索的文本或正则 |
replace | string | 替换内容(支持 $1, $2 等捕获引用) |
glob | string | 文件通配符(如 *.vue, *.css) |
dir | string | 搜索目录(默认工作目录) |
regex | boolean | 是否使用正则匹配(默认 false) |
结论
本轮分析填补了 10 个新的细分领域:
| # | 领域 | 之前状态 | 本次发现 |
|---|---|---|---|
| 1 | 流式 SSE 事件协议 | 未覆盖 | 10 种事件类型 + 参数 |
| 2 | Hook 事件生命周期 | 部分覆盖 | 7 种触发事件 + Block/Modify 结果 |
| 3 | LSP 语言栈 | 路径已知 | 14+ 语言 + 完整配置 |
| 4 | CodeGraph 索引引擎 | 路径已知 | graph.bin + 项目标记 + BFS |
| 5 | Headless 模式协议 | 未覆盖 | 自动批准 + CI 检测 |
| 6 | Wire Dump 抓包 | 未覆盖 | ATOMCODE_WIRE_DUMP |
| 7 | search_replace 工具参数 | 未覆盖 | 5 个完整参数 |
| 8 | 项目类型自动检测 | 未覆盖 | 7 种 + 构建命令映射 |
| 9 | WebUI 主题系统 | 未覆盖 | atomcode.theme + atomcode.lang localStorage |
| 10 | LSP 超时和错误恢复 | 未覆盖 | 30s 超时 + JSON-RPC 层 |
仍有盲区需要下一轮分析: graph/indexer.rs 索引格式、open_file 平台特定实现、WebUI SPA 的组件树细节、auto_commit 的 staged 升级流程等。