AtomCode 深度盲区分析 #9 — WebUI Live API 协议与丰富数据类型系统
持续分析循环 — 2026-06-24 14:26
发现 40+ 个 WebUI Live API 请求/响应结构体和 ChatEvent 信息类型未被文档覆盖
1. WebUI Live API 请求结构体完整清单
此前文档仅覆盖了 daemon REST API 端点,但 LiveWire SSE 协议有大量独立的请求结构体未记录。
1.1 会话管理
rust
struct ChatRequest {
// 5 个字段
// 发送聊天消息到 LLM 会话
}
struct CreateSessionRequest {
// 创建新会话
}
struct RenameRequest {
// 1 个字段
// 重命名会话
}
struct StopChatRequest {
// 1 个字段
// 停止当前 LLM 回复
}
struct FsMkdirRequest {
// 1 个字段
// 在文件系统中创建目录
}
struct ChangeDirRequest {
// 2 个字段
// 切换工作目录
}1.2 权限与决策
rust
struct PermissionDecisionRequest {
// 3 个字段: call_id, decision, 等
// 审批或拒绝工具调用权限请求
}
struct LivePermissionReq {
// 2 个字段
// 权限桥接请求
}1.3 提供商与模型配置
rust
struct CreateProviderRequest {
// 16 个字段 ← 非常大的结构体
// 创建新的 LLM 提供商配置
}
struct PatchProviderRequest {
// 19 个字段 ← 最大的结构体
// 部分更新提供商配置
}
struct PatchThinkingRequest {
// 6 个字段
// 更新思考/推理设置
}
struct LiveProviderReq {
// 1 个字段
// 切换当前提供商
}
struct LiveReasoningEffortReq {
// 推理努力度请求
}
struct CodingPlanSetupRequest {
// 1 个字段
// CodingPlan 设置请求
}1.4 消息与图像
rust
struct LiveMessageReq {
// 4 个字段
// 发送消息到 Live 会话
}
struct ImageInput {
// 2 个字段: data (base64), media_type (MIME)
// 图像输入附件
}2. WebUI Live API 响应结构体完整清单
rust
struct SessionDetail {
// 会话详情
}
struct ConfigResponse {
// default_workdir: 默认工作目录
// 返回当前配置
}
struct HealthResponse {
// service: 服务状态
// 健康检查响应
}
struct ChangeDirResponse {
// current_dir: String
// project_hash: String
// 目录变更响应
}
struct ToolResultInfo {
// line_count: usize
// 工具结果信息(用于 UI 显示)
}
struct McpServerStatus {
// tool_count: usize
// MCP 服务器状态
}3. ChatEvent 信息类型完整枚举
ChatEvent 是 LiveWire SSE 协议的核心类型,包含丰富的子类型系统:
rust
enum ChatEvent {
// 内容事件
Text, // 纯文本内容
Reasoning, // 推理过程内容
ReasoningEffort, // 推理努力度更新
// 工具事件
ToolStart, // 工具调用开始: { id, name, arguments }
ToolOutput, // 工具输出流: { chunk }
ToolResult, // 工具结果: { id, name, output, success, duration_ms }
// Token 统计
Tokens, // Token 用量: { prompt, completion, total }
// 错误
Error, // 错误: { message }
// Artifact (制品)
ArtifactStart, // 制品开始: { artifact_type }
ArtifactEnd, // 制品结束
// 状态
State, // 运行状态: { running: bool }
Provider, // 提供商切换: { provider }
Snapshot, // 会话快照: { session_id, messages }
// 权限
PermissionRequest, // 权限请求: { tool_name, reason, call_id, arguments }
// 其他
User, // 用户消息
}3.1 信息类型(Info Types)
这些是嵌入在 ChatEvent 中的结构化数据:
rust
struct ModelInfo {
provider_type: String,
is_default: bool,
effort_applicable: bool,
}
struct ProviderInfo {
has_api_key: bool,
ephemeral: bool,
// 提供商配置信息
}
struct ToolCallInfo {
display: String,
// 工具调用显示信息
}
struct SkillInfo {
name: String,
// 技能信息
}
struct MessageInfo {
// 消息元信息
}
struct ArtifactInfo {
// 制品信息
}
struct ProjectInfo {
session_count: usize,
last_updated: String,
// 项目信息
}
struct ProjectState {
previous_dir: String,
recent_dirs: Vec<String>,
// 项目状态
}
struct TunnelStatus {
bind_host: String,
reachable: bool,
remote_url: String,
qr_svg: String,
// 隧道/tunnel 状态
}4. Live Wire SSE 协议事件流(补充)
4.1 发送端(LiveMessageProvider)
LiveWireEvent 驱动端事件:
rust
enum LiveWireEvent {
Running, // 运行状态变更
// ... 其他事件
}4.2 接收端(WebUI SPA)
WebUI 接收 ChatEvent 的完整状态机:
ChatEvent::State { running: true }
→ 设置 loading 状态
→ 清空输出缓冲区
ChatEvent::Snapshot { session_id, messages }
→ 初始化会话状态
→ 渲染历史消息
ChatEvent::Text { content }
→ 追加到当前助手回复
ChatEvent::Reasoning { content }
→ 追加到推理区域
ChatEvent::ToolStart { id, name, arguments }
→ 显示工具调用 UI
→ 设置等待状态
ChatEvent::ToolOutput { chunk }
→ 流式更新工具输出
ChatEvent::ToolResult { id, name, output, success, duration_ms }
→ 完成工具结果显示
ChatEvent::Tokens { prompt, completion, total }
→ 更新 token 用量显示
ChatEvent::PermissionRequest { tool_name, reason, call_id, arguments }
→ 显示权限请求对话框
→ 等待用户决策
ChatEvent::ArtifactStart / ArtifactEnd
→ 包裹制品内容
ChatEvent::Error { message }
→ 显示错误信息
ChatEvent::State { running: false }
→ 结束加载状态5. 新发现 API 端点(Live API)
除了此前文档的 REST 端点,Live API 支持以下操作:
| 方法 | 端点 | 请求体 | 说明 |
|---|---|---|---|
| POST | /live/message | LiveMessageReq (4字段) | 发送消息 |
| POST | /live/provider | LiveProviderReq (1字段) | 切换提供商 |
| POST | /live/permission | LivePermissionReq (2字段) | 权限决策 |
| POST | /live/reasoning_effort | LiveReasoningEffortReq | 设置推理努力度 |
| POST | /api/provider | CreateProviderRequest (16字段) | 创建提供商 |
| PATCH | /api/provider | PatchProviderRequest (19字段) | 更新提供商 |
| PATCH | /api/thinking | PatchThinkingRequest (6字段) | 更新思考设置 |
| POST | /api/codingplan/setup | CodingPlanSetupRequest (1字段) | CodingPlan 设置 |
6. 此前分析遗漏的数据量统计
| 类别 | 此前文档覆盖 | 本次发现新结构体 |
|---|---|---|
| Live API 请求体 | 无 | 15 个 |
| Live API 响应体 | 无 | 6 个 |
| ChatEvent 类型 | 20+ 字段(部分) | 完整枚举 + 16 个变体 |
| Info 类型 | 无 | 12 个 |
| 总计新增 | — | ~49 个新增数据结构 |
逆向命令索引
bash
# 提取 ChatEvent 枚举变体
strings atomcode.bin.bak | grep -iE "ChatEvent|ToolStart|ToolResult|ToolOutput" | sort -u
# 提取 Live API 结构体完整列表
strings atomcode.bin.bak | grep -E "struct (Live|Chat[A-Z]|Stop|Rename|Create|Patch)[A-Za-z]*Req" | sort -u
# 运行时抓取实际 SSE 事件
curl -N -X POST http://localhost:13456/chat \
-H "Authorization: Bearer $(cat ~/.atomcode/auth.toml | grep access_token | cut -d'"' -f2)" \
-H "Content-Type: application/json" \
-d '{"message":"写出数字1到5"}' \
2>&1 | grep "^data:" | while read line; do
echo "$line" | python3 -m json.tool 2>/dev/null || echo "$line"
done
# 提取 done 事件字段
strings atomcode.bin.bak | grep -E "session_id|tool_calls|tokens" | grep -v "https\?://\|crates/" | sort -u | head -10本报告由持续分析循环生成 — 第 9 轮盲区挖掘