Skip to content

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/messageLiveMessageReq (4字段)发送消息
POST/live/providerLiveProviderReq (1字段)切换提供商
POST/live/permissionLivePermissionReq (2字段)权限决策
POST/live/reasoning_effortLiveReasoningEffortReq设置推理努力度
POST/api/providerCreateProviderRequest (16字段)创建提供商
PATCH/api/providerPatchProviderRequest (19字段)更新提供商
PATCH/api/thinkingPatchThinkingRequest (6字段)更新思考设置
POST/api/codingplan/setupCodingPlanSetupRequest (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 轮盲区挖掘

基于 VitePress 构建 · AtomCode v4.25.3 逆向工程分析文档