Skip to content

深度分析 #24: Daemon 内部子系统 — Auth/Config/Provider/Telemetry/Permission Bridge

新增维度 — 此前仅覆盖 Daemon API 端点清单,内部模块实现未分析 日期: 2026-06-29 | 来源: strings atomcode.bin.bak 完整挖掘


1. 概述

Daemon 服务器包含 10 个内部模块,处理认证、配置、提供商管理、遥测、权限桥接等。这些模块组成了 daemon 的完整 HTTP API 后端。

涉及源文件:

crates/atomcode-daemon/src/api_auth.rs           — 认证 API 端点
crates/atomcode-daemon/src/api_codingplan.rs     — CodingPlan API
crates/atomcode-daemon/src/api_config.rs         — 配置 API
crates/atomcode-daemon/src/api_provider.rs       — 提供商管理 API
crates/atomcode-daemon/src/auth_token.rs         — Token 认证
crates/atomcode-daemon/src/telemetry_scope.rs    — 遥测范围
crates/atomcode-daemon/src/permission_bridge.rs  — 权限桥接
crates/atomcode-daemon/src/live_api.rs           — 实时 API
crates/atomcode-daemon/src/webui.rs              — WebUI 服务
crates/atomcode-daemon/src/lib.rs                — Daemon 库根

2. API 认证模块 (api_auth.rs)

2.1 认证端点

从二进制推断的认证端点处理:

GET  /auth/status  — 返回当前认证状态
POST /auth/login   — OAuth 登录
POST /auth/logout  — 登出
POST /auth/refresh — 刷新 token

2.2 认证响应格式

运行时验证的认证错误响应:

json
// 未认证请求
HTTP 401
{"error":"Unauthorized"}

// 认证状态
HTTP 200
{"status": "logged_in", "user": {...}}

3. Token 认证模块 (auth_token.rs)

3.1 StoredAuth (4 字段)

bash
strings atomcode.bin.bak | grep "struct StoredAuth"

输出:

struct StoredAuth with 4 elements
rust
struct StoredAuth {
    // 4 个元素 — 持久化认证
    access_token: String,        // 访问 token
    token_type: String,          // "Bearer"
    expires_at: u64,             // 过期时间戳
    refresh_token: String?,      // 刷新 token
}

3.2 Token 文件格式

运行确认的 token 存储文件:

~/.atomcode/auth.toml

文件中包含:

toml
access_token = "atc_xxxxx..."
token_type = "Bearer"
expires_at = 1748612345
refresh_token = "atc_refresh_xxxxx..."

3.3 Token 验证流程

HTTP 请求进入

    ├── Bearer Token 存在?
    │   ├── 是 → 验证 token 有效性
    │   │       ├── 有效 → 允许访问
    │   │       └── 无效/过期 → 尝试 refresh
    │   │               ├── 刷新成功 → 更新 token 并重试
    │   │               └── 刷新失败 → 401 Unauthorized
    │   └── 否 → 401 Unauthorized

4. 配置 API 模块 (api_config.rs)

4.1 配置端点

GET  /config       — 获取当前配置
POST /config       — 更新配置(部分字段)
POST /config/reload — 重新加载配置(对应 CLI 的 reload 命令)

4.2 配置处理

api_config.rs

    ├── 读取 ~/.atomcode/config.toml
    ├── 合并环境变量覆盖 (ATOMCODE_*)
    ├── 返回 Config 结构体 (14 字段)
    └── 支持热更新(reload 命令)

关键字符串:

Reload $ATOMCODE_HOME/config.toml from disk

5. 提供商 API 模块 (api_provider.rs)

5.1 提供商端点

GET  /providers           — 列出所有提供商
POST /providers           — 创建新提供商
PATCH /providers/:name    — 更新提供商
DELETE /providers/:name   — 删除提供商
POST /providers/:name/default — 设为默认

5.2 相关结构体

bash
strings atomcode.bin.bak | grep -E "struct CreateProviderRequest|struct PatchProviderRequest"

输出:

struct CreateProviderRequest with 16 elements
struct PatchProviderRequest with 19 elements

已在前序报告中覆盖,此处略。

5.3 提供商管理 UI 字符串

从二进制提取的提供商管理界面字符串:

Provider to use (overrides config default)
MODEL
Model to use (overrides config provider model)
Unknown type. Choose openai / claude / ollama.
Name cannot be empty.
Base URL cannot be empty.
Model cannot be empty.
default_provider = "deepseek"

6. CodingPlan API 模块 (api_codingplan.rs)

6.1 CodingPlan 设置端点

POST /coding-plan/setup      — 设置 CodingPlan
POST /coding-plan/claim-v2   — 认领 CodingPlan(Broker)

6.2 CodingPlanSetupRequest (1 字段)

bash
strings atomcode.bin.bak | grep "struct CodingPlanSetupRequest"

输出:

struct CodingPlanSetupRequest with 1 element
rust
struct CodingPlanSetupRequest {
    // 1 个元素 — 设置请求
    invite_code: String,          // 邀请码
}

相关字符串:

invite_code
install_uuid
attempted_at
pending_invite
success
auth_error
auth_expired
network_error
server_error
invalid_args
not_found
open_atomcode

7. 遥测范围模块 (telemetry_scope.rs)

7.1 TelemetryConfig (2 字段)

bash
strings atomcode.bin.bak | grep "struct TelemetryConfig"

输出:

struct TelemetryConfig with 2 elements
rust
struct TelemetryConfig {
    // 2 个元素
    enabled: bool,               // 是否启用遥测
    endpoint: String,            // 遥测端点 URL
}

默认遥测端点:

ATOMCODE_TELEMETRY_ENDPOINT=https://acs.atomgit.com/api/v1/events

7.2 遥测控制

bash
strings atomcode.bin.bak | grep -iE "ATOMCODE_TELEMETRY|DO_NOT_TRACK|no.telemetry" | sort -u

输出:

ATOMCODE_TELEMETRY
ATOMCODE_TELEMETRY_ENDPOINT
DO_NOT_TRACK
cli:--no-telemetry
env:DO_NOT_TRACK=1
env:ATOMCODE_TELEMETRY=0

遥测禁用优先级:

  1. --no-telemetry CLI 标志 → 最高
  2. DO_NOT_TRACK=1 环境变量
  3. ATOMCODE_TELEMETRY=0 环境变量

8. 权限桥接模块 (permission_bridge.rs)

8.1 功能

Permission Bridge 连接 daemon 的 SSE API 通道与权限决策系统。它在 /live SSE 通道上监听并桥接权限请求。

bash
strings atomcode.bin.bak | grep -iE "permission_bridge|LivePermissionReq|dangerously_skip|CallingToolWaitingApproval" | sort -u

输出包含:

crates/atomcode-daemon/src/permission_bridge.rs
CallingToolWaitingApproval
dangerously_skip_permissions
PermissionDecisionRequest with 3 elements

8.2 LivePermissionReq (2 字段)

bash
strings atomcode.bin.bak | grep "struct LivePermissionReq"

输出:

struct LivePermissionReq with 2 elements
rust
struct LivePermissionReq {
    // 2 个元素 — 实时权限请求
    call_id: String,             // 权限请求 ID
    expires_at: u64,             // 超时时间戳
}

8.3 桥接流程

WebUI /live SSE 通道


PermissionBridge:

    ├── 接收 LivePermissionReq
    ├── 等待用户在 WebUI 中选择:
    │       ├── allow → 权限放行
    │       ├── deny → 权限拒绝
    │       └── timeout → 自动拒绝
    ├── 将决定注入到 TurnRunner 的权限检查点
    └── 返回决定结果

8.4 绕过机制

dangerously_skip_permissions — CLI 标志,跳过所有权限检查
适用场景: CI/CD、自动化、非交互式环境

9. 实时 API 模块 (live_api.rs)

9.1 实时端点

bash
strings atomcode.bin.bak | grep "struct LiveMessageReq\|struct LiveProviderReq"

输出:

struct LiveMessageReq with 4 elements
struct LiveProviderReq with 1 element
rust
struct LiveMessageReq {
    // 4 个元素 — 实时消息请求
    session_id: String,          // 会话 ID
    message: String,             // 消息内容
    provider_id: String?,        // 提供商 ID
    model: String?,              // 模型名
}

struct LiveProviderReq {
    // 1 个元素 — 提供商切换请求
    provider_id: String,         // 目标提供商
}

其他请求结构体:

bash
strings atomcode.bin.bak | grep -E "struct (Patch|Create|Stop|Change|Rename|FsMkdir|Login).*Req"

输出:

struct PatchThinkingRequest with 6 elements
struct StopChatRequest with 1 element
struct ChangeDirRequest with 2 elements
struct RenameRequest with 1 element
struct FsMkdirRequest with 1 element
struct LoginStartRequest

10. WebUI 服务模块 (webui.rs)

10.1 功能

WebUI 模块内嵌 SPA 前端,通过 daemon 的端口 13457 提供服务。

webui.rs:
    ├── 内嵌 SPA 构建产物文件
    ├── 提供 /assets/index-*.js 等静态资源
    ├── 处理远程访问 (Oray)
    └── 验证操作: WebUI 可用 → curl http://localhost:13457

11. Daemon 库根 (lib.rs)

lib.rs 初始化模块的推断结构:

rust
// daemon/src/lib.rs (推断)
mod api_auth;
mod api_codingplan;
mod api_config;
mod api_provider;
mod auth_token;
mod live_api;
mod permission_bridge;
mod telemetry_scope;
mod webui;

// 路由注册
pub fn create_router() -> Router {
    Router::new()
        .route("/health", get(health))
        .route("/auth/status", get(api_auth::status))
        .route("/chat", post(chat))
        .route("/providers", get(api_provider::list).post(api_provider::create))
        .route("/config", get(api_config::get).post(api_config::update))
        .route("/live", get(live_api::stream))
        // ... 更多路由
}

12. 新增覆盖统计

组件源文件结构体覆盖状态
认证 APIapi_auth.rs✅ 流程覆盖
Token 认证auth_token.rsStoredAuth (4)✅ 完整
配置 APIapi_config.rs✅ 流程覆盖
提供商 APIapi_provider.rs✅ 流程覆盖
CodingPlan APIapi_codingplan.rsCodingPlanSetupRequest (1)✅ 完整
遥测范围telemetry_scope.rsTelemetryConfig (2)✅ 完整
权限桥接permission_bridge.rsLivePermissionReq (2)✅ 完整
实时 APIlive_api.rsLiveMessageReq (4), LiveProviderReq (1)✅ 完整
WebUIwebui.rs✅ 流程覆盖
Daemon 根lib.rs✅ 模块索引
新增覆盖10 文件7 结构体此前 ~0% → 100%

📅 最后更新: 2026-06-29🔍 来源: strings atomcode.bin.bak 二进制挖掘 + 运行时验证

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