Skip to content

AgnesCode 逆向分析报告

报告日期: 2026-07-24 目标版本: v1.0.15 ~ v1.0.23 目标: 分析授权登录机制、AI交互协议,为构建反向代理提供依据


1. 概述与架构

1.1 架构总览

AgnesCode 是一个 Electron 桌面应用,采用 前后端分离架构

┌─────────────────────────────────────────────────────────┐
│  Electron Shell (Main Process)                          │
│  ┌─────────────────────────────────────────────────┐   │
│  │  Renderer (React + Vite)                        │   │
│  │  - 用户界面                                     │   │
│  │  - Chat UI / Skill Editor / Artifact Manager    │   │
│  └──────────────┬──────────────────────────────────┘   │
│                 │ IPC (contextBridge)                   │
│  ┌──────────────▼──────────────────────────────────┐   │
│  │  Main Process (Node.js)                         │   │
│  │  - 窗口管理 / 系统托盘                          │   │
│  │  - 文件系统操作                                  │   │
│  │  - 启动/管理 agnesd 后端进程                     │   │
│  │  - 处理 Deep Link (agnes:// 协议)                │   │
│  │  - 密钥链存储 (macOS Keychain)                   │   │
│  └──────────────┬──────────────────────────────────┘   │
│                 │ HTTPS (localhost) + WebSocket         │
│  ┌──────────────▼──────────────────────────────────┐   │
│  │  agnesd (Rust 后端)                              │   │
│  │  - HTTP API 服务器 (localhost:随机端口)           │   │
│  │  - ACP (Agent Client Protocol) 代理              │   │
│  │  - AI 提供商路由                                 │   │
│  │  - 会话管理 / 文件索引                           │   │
│  │  - 技能执行引擎                                  │   │
│  └─────────────────────────────────────────────────┘   │
│                                                        │
│  Agnes Account (Web) ← OAuth/Deep Link → 桌面应用      │
└─────────────────────────────────────────────────────────┘

1.2 核心组件

组件技术用途
Electron ShellElectron 41 + Vite 7应用容器,主进程管理
RendererReact 19 + Radix UI + Tailwind 4用户界面
agnestRust (Rust binary)本地后端服务器
ACPAgent Client Protocol代理与AI交互
goose-sdk@aaif/goose-sdkACP 客户端 SDK

2. 技术栈分析

2.1 前端技术栈

  • Electron: 41.0.0 (2025年最新)
  • Node.js: >=24.10.0 <24.16.0
  • 包管理器: pnpm@10.30.0
  • 构建工具: Electron Forge + Vite 7
  • UI 框架: React 19.2.4 + Radix UI + Ant Design 5
  • 状态管理: Zustand 5 + SWR 2
  • 样式: Tailwind CSS 4 + Framer Motion
  • 终端: xterm.js + node-pty
  • I18n: react-intl (支持多语言)
  • PDF: pdfjs-dist 6
  • 公式: KaTeX

2.2 后端依赖

  • @aaif/goose-sdk: 内部 ACP 客户端 SDK (workspace 引用)
  • @agentclientprotocol/sdk: ACP 协议 SDK v0.19.0
  • @modelcontextprotocol/sdk: MCP SDK v1.27.0
  • @mcp-ui/client: MCP UI 客户端 6.1.0
  • koffi: FFI 库 (用于调用本地二进制)
  • node-pty: 伪终端 (用于执行命令)

2.3 打包与分发

  • Windows: NSIS 安装器 (AgnesCode-Setup.exe) + Squirrel 框架 (AgnesCode-Installer.exe)
  • macOS: DMG 安装器 + ZIP 压缩包
  • 更新: electron-updater 6.8.3 + 自建更新服务器

3. 授权登录机制

3.1 登录流程 (OAuth2 变体)

┌──────────┐         ┌──────────────┐         ┌──────────────┐
│  Desktop │         │  Web Browser │         │  Agnes Auth  │
│   App    │         │  (User)      │         │  Server      │
└────┬─────┘         └──────┬───────┘         └──────┬───────┘
     │                      │                        │
     │ 1. 生成 state (32B)  │                        │
     │ 2. 构造登录URL       │                        │
     │    ?state={state}    │                        │
     │    &client=agnes-code│                        │
     │    &redirect_uri=    │                        │
     │    agnes://auth/cb   │                        │
     ├──────────────────────►                        │
     │   shell.openExternal │                        │
     │                      │                        │
     │ 3. 用户在浏览器中登录│                        │
     │                      ├──── 登录/授权 ────────►│
     │                      │                        │
     │                      │◄─── 302 Redirect ─────┤
     │                      │   agnes://auth/callback│
     │                      │   ?code={auth_code}    │
     │                      │   &state={state}       │
     │                      │                        │
     │ 4. macOS: open-url   │                        │
     │    Windows: deep link│                        │
     │◄──────────────────────┤                        │
     │                      │                        │
     │ 5. 验证 state 匹配   │                        │
     │ 6. 将 code 发送到    │                        │
     │    renderer 进程      │                        │
     │ 7. Renderer 通过 ACP │                        │
     │    将 code 发送给    │                        │
     │    agnesd 后端       │                        │
     │                      ├──── 交换 token ───────►│
     │                      │◄──── JWT/Token ────────┤
     │                      │                        │
     │ 8. Token 保存在      │                        │
     │    密钥链 (Keychain)  │                        │
     │    或加密文件中      │                        │
     │                      │                        │
     │ 9. 后续请求使用      │                        │
     │    Bearer Token      │                        │
     │    通过 agnesd 路由  │                        │

3.2 关键代码分析

登录 URL 构建 (Oj 函数):

javascript
// main.js 中
function Oj(e) {
    const t = process.env.AGNES_SA_WEB_LOGIN_URL?.trim();
    // 默认值: AGNES_SA_WEB_LOGIN_URL 环境变量
    const r = new URL("/login", t);
    r.searchParams.set("client", "agnes-code");
    r.searchParams.set("redirect_uri", "agnes://auth/callback");
    r.searchParams.set("state", e); // 32字节随机 hex
    return r.toString();
}

IPC 处理:

  • ipcMain.handle("start-auth-login", ...) - 启动登录流程
  • ipcMain.on("auth-listener-ready", ...) - 监听器就绪通知
  • ipcRenderer.send("auth-deeplink", {code, state}) - 发送 auth code 到渲染进程

Deep Link 协议: agnes://auth/callback?code={code}&state={state}

3.3 登录数据流

  1. 主进程生成 32 字节随机 state (hex 编码)
  2. 构造 URL: {AGNES_SA_WEB_LOGIN_URL}/login?client=agnes-code&redirect_uri=agnes://auth/callback&state={state}
  3. 通过 shell.openExternal() 在系统浏览器中打开
  4. 用户在浏览器中完成登录
  5. 浏览器重定向到 agnes://auth/callback?code={auth_code}&state={state}
  6. 操作系统处理 agnes:// 协议 → 唤起 Electron 应用
  7. 主进程验证 state 匹配
  8. 主进程通过 IPC 将 code 发送到渲染进程
  9. 渲染进程通过 ACP 将 code 发送到 agnesd 后端
  10. agnesd 后端与 Agnes Auth Server 交换令牌
  11. 令牌存储在系统密钥链中

3.4 注意事项

  • AGNES_SA_WEB_LOGIN_URL 通过环境变量注入,未在代码中硬编码
  • 该环境变量通常在开发/打包时由 scripts/brand-dev-electron.cjs 脚本设置
  • 生产环境中可能指向 https://auth.ag.ai 或类似地址
  • 支持 AGNES_EXTERNAL_BACKEND 环境变量指向外部后端

4. 后端(agnest)架构

4.1 agnest 进程

  • 二进制名称: agnesd (Linux/macOS) / agnesd.exe (Windows)
  • 语言: Rust (编译为本地二进制)
  • 通信协议: HTTPS (自签名证书) + WebSocket
  • 端口: 随机分配 (通过监听端口 0 获取)
  • 认证: X-Secret-Key 请求头 + 自签名证书指纹验证

4.2 启动流程

javascript
// 环境变量传递给 agnesd:
const env = {
    AGNES_PORT: port.toString(),
    AGNES_SERVER__SECRET_KEY: secretKey,
    AGNES_KEYRING_SERVICE: "com.agnes.code.secrets"  // 或 dev 版本
};
// 启动命令: agnesd agent
// 通信: HTTPS + 自签名证书
// 健康检查: GET /health_check 端点

4.3 API 客户端配置

javascript
// 创建 API 客户端
const client = (baseUrl, secretKey) => {
    return createClient({
        baseUrl,
        headers: {
            "Content-Type": "application/json",
            "X-Secret-Key": secretKey
        }
    });
};

4.4 证书验证

  • 使用自签名证书
  • 通过 stdout 输出 GOOSED_CERT_FINGERPRINT=
  • Electron 主进程解析指纹并添加到允许列表
  • 使用 certificateVerifyProccertificate-error 事件进行验证
  • 支持 sha256/ 格式的指纹

5. AI交互协议(ACP)

5.1 ACP 协议概述

ACP (Agent Client Protocol) 是 AgnesCode 的核心协议,用于:

  1. 前端 Renderer 与后端 agnesd 之间的通信
  2. agnesd 与底层 AI 模型提供商之间的路由
  3. 工具调用 (MCP) 的编排

5.2 ACP WebSocket 连接

javascript
// WebSocket URL 构建函数
function Vj(baseUrl, token) {
    const r = new URL(baseUrl);
    r.pathname = `${r.pathname.replace(/\/+$/, "")}/acp`;
    r.protocol = r.protocol === "https:" ? "wss:" : "ws:";
    r.searchParams.set("token", token);
    return r.toString();
}
// 示例: wss://127.0.0.1:{port}/acp?token={secretKey}

5.3 路由与代理

ACP 支持多模型路由:

Renderer (React) → ACP WebSocket → agnesd (Rust) → 第三方 API
                                                    ├── Agnes 自有模型
                                                    ├── OpenAI (GPT-4, o1, etc.)
                                                    ├── Anthropic (Claude)
                                                    ├── DeepSeek
                                                    ├── Qwen
                                                    ├── MoonshotAI
                                                    ├── Cohere
                                                    ├── Ollama (本地)
                                                    └── ... (可扩展)

5.4 MCP 集成

  • 支持 MCP (Model Context Protocol) 标准
  • 本地工具: 文件系统、终端、Git 等
  • 外部 MCP 服务器: 浏览器、设计工具、文档等
  • MCP 传输层: 通过 agnesd 代理

5.5 ACP 协议特性

  • 双向流: 基于 WebSocket 的全双工通信
  • Token 认证: WebSocket URL 中携带 token 参数
  • 会话管理: 支持多会话并行
  • 工具调用: 支持 MCP 工具链
  • 技能执行: 内置技能引擎

6. 密钥管理

6.1 密钥存储

平台存储方式服务名称
macOSKeychain (钥匙串)com.agnes.code.secrets
macOS (dev)Keychaincom.agnes.code.dev.secrets
WindowsCredential Manager类似 Keychain 接口
Linuxlibsecret / 加密文件同 Keychain 接口

6.2 密钥用途

  • AGNES_SERVER__SECRET_KEY: 本地 agnesd API 认证密钥
  • OAuth Token: 用户登录后的访问令牌
  • AI Provider API Keys: 各 AI 服务商的 API 密钥

6.3 密钥传递

  • 写入: 通过 AGNES_KEYRING_SERVICE 环境变量指定服务名称
  • 读取: Renderer 通过 IPC get-secret-key 获取
  • 使用: 在 ACP WebSocket 连接中作为 token 参数

7. 反向代理设计要点

7.1 拦截点分析

要实现反向代理,有以下几个关键拦截点:

方案 A: 替换 agnesd 后端

优点: 完全控制所有 API 调用
难点: 需要实现完整的 ACP 协议
      需要处理自签名证书
      需要替换 agnesd 二进制文件

流程:
1. 启动自定义后端替代 agnesd
2. 设置 AGNES_EXTERNAL_BACKEND 环境变量
3. 或修改 AGNES_PORT 指向自定义后端

方案 B: 代理 ACP WebSocket

优点: 只需实现 WebSocket 代理
难点: 需要维持 WebSocket 连接状态
      需要处理 token 认证

流程:
1. 监听本地端口
2. 接收 ACP WebSocket 连接
3. 转发到目标 AI 服务
4. 返回结果

方案 C: 替换环境变量

优点: 最简单
难点: 需要能够在启动前设置环境变量
      需要了解所有环境变量的用途

关键环境变量:
- AGNES_SA_WEB_LOGIN_URL: 登录页面 URL
- AGNES_EXTERNAL_BACKEND: 外部后端 URL
- AGNES_SERVER__SECRET_KEY: 后端密钥
- AGNES_DEFAULT_PROVIDER: 默认 AI 提供商
- AGNES_DEFAULT_MODEL: 默认模型
- AGNES_PREDEFINED_MODELS: 预定义模型列表

7.2 环境变量清单

环境变量用途示例值
AGNES_SA_WEB_LOGIN_URL登录页面地址https://auth.ag.ai
AGNES_EXTERNAL_BACKEND外部后端地址https://127.0.0.1:3000
AGNES_SERVER__SECRET_KEY后端通信密钥随机 32 字节 hex
AGNES_DEFAULT_PROVIDER默认 AI 提供商openai
AGNES_DEFAULT_MODEL默认模型gpt-4o
AGNES_PREDEFINED_MODELS预定义模型列表JSON 字符串
AGNES_PORT后端监听端口3000
AGNES_PATH_ROOT工作目录~/Documents/AgnesCode
AGNES_KEYRING_SERVICE密钥链服务名com.agnes.code.secrets
AGNES_INITIAL_THEME初始主题dark/light
AGNES_LOCALE语言设置zh-CN
AGNES_VERSION版本号1.0.17

7.3 推荐的反向代理方案

推荐方案: 代理 agnesd (类似 Claude Code 的 proxy)

1. 自建一个符合 ACP 协议的后端服务
2. 通过环境变量 AGNES_EXTERNAL_BACKEND 指向自定义后端
3. 自定义后端负责:
   - 处理认证 (可绕过 OAuth 直接使用 API Key)
   - 路由到目标 AI 服务
   - 实现工具调用 (MCP)
   - 提供会话管理

或者更简单的方案:
1. 保留 agnesd 后端
2. 在 agnesd 和 AI API 之间插入代理
3. 通过环境变量配置代理地址

7.4 需要关注的端口

连接方向协议
Electron → agnesd本地HTTPS (127.0.0.1:随机端口)
Electron → agnesd (WS)本地WSS (127.0.0.1:随机端口)
agnesd → AI API外部HTTPS
agnesd → Auth Server外部HTTPS
Electron → GitHub外部HTTPS (更新检查)

8. 更新与分发机制

8.1 更新流程

  • 使用 electron-updater 进行自动更新
  • 更新配置文件: latest.yml (Windows) / latest-mac.yml (macOS)
  • 更新服务器: https://github.com/AgnesAI-Labs/AgnesCode/releases/latest/download/
  • 更新检查: 通过 IPC check-for-updates / download-update / install-update

8.2 文件结构

AgnesCode.app/
├── Contents/
│   ├── Info.plist              # Bundle 配置 (bundleId: com.agnes.code)
│   ├── MacOS/
│   │   └── AgnesCode           # Electron 可执行文件
│   ├── Frameworks/
│   │   ├── AgnesCode Helper.app
│   │   ├── AgnesCode Helper (Renderer).app
│   │   └── AgnesCode Helper (GPU).app
│   └── Resources/
│       ├── app.asar            # 核心应用代码
│       ├── electron.icns       # 应用图标
│       └── bin/                # 本地二进制文件
│           └── agnesd          # Rust 后端

8.3 发布版本

版本日期包含资产
1.0.232026-07-209 个文件
1.0.192026-07-159 个文件
1.0.172026-07-1410 个文件 (含额外 Intel 包)
1.0.152026-07-138 个文件

9. 附录:关键文件清单

9.1 下载的安装包

data/
├── 1.0.23/
│   ├── AgnesCode-Setup.exe          (Windows NSIS, 14 MB)
│   ├── AgnesCode-Installer.exe      (Windows Squirrel, 93 KB)
│   ├── AgnesCode.dmg                (macOS Apple Silicon, 544 MB)
│   ├── AgnesCode-intel.dmg          (macOS Intel, 562 MB)
│   ├── AgnesCode.zip                (macOS AS ZIP, 未完整下载)
│   └── AgnesCode-darwin-x64.zip     (macOS Intel ZIP, 1.3 MB)

├── 1.0.15/
│   ├── AgnesCode-Setup.exe          (Windows NSIS, 21 MB)
│   ├── AgnesCode-Installer.exe      (Windows, 376 MB)
│   ├── AgnesCode.dmg                (macOS, 540 MB)
│   ├── AgnesCode-intel.dmg          (macOS Intel, 376 KB)
│   └── AgnesCode.zip                (未完整下载)

├── 1.0.17/                          (已完整解压分析)
│   ├── AgnesCode.zip                (macOS ZIP, 551 MB - 已解压)
│   ├── extracted_zip/               (解压后的 .app 包)
│   │   └── AgnesCode.app/
│   │       └── Contents/Resources/
│   │           └── app.asar         (核心应用代码)
│   └── extracted_asar/              (app.asar 解压内容)
│       ├── package.json
│       ├── .vite/build/
│       │   ├── main.js              (主进程代码, 1.4 MB)
│       │   └── preload.js           (预加载脚本)
│       └── .vite/renderer/main_window/
│           ├── index.html
│           └── assets/
│               ├── index-BXTNYseC.js (渲染进程代码, 320 KB)
│               └── App-Bm0R8Z-4.js   (应用主代码, 6.4 MB)

└── 1.0.19/
    ├── AgnesCode-Setup.exe          (Windows NSIS, 440 MB)
    ├── AgnesCode-Installer.exe      (Windows, 376 MB)
    ├── AgnesCode.dmg                (macOS AS, 540 MB)
    └── AgnesCode.zip                (macOS ZIP, 551 MB)

9.2 关键发现摘要

发现项详情
应用类型Electron 41 + Vite 7 + React 19
后端语言Rust (agnest 二进制)
通信协议ACP (Agent Client Protocol) over WebSocket
认证方式OAuth2 变体 + Deep Link (agnes://)
密钥存储系统密钥链 (Keychain/Credential Manager)
AI 路由通过 agnest 后端代理到多个 AI 提供商
更新机制electron-updater + GitHub Releases
代理关键AGNES_EXTERNAL_BACKEND 环境变量
协议关键ACP WebSocket + X-Secret-Key 认证
证书自签名证书 + 指纹验证

注意: 本报告基于对 v1.0.17 版本的静态分析。实际行为可能因版本更新而变化。agnest 后端是闭源的 Rust 二进制文件,其内部实现细节需要通过动态分析或反编译进一步确认。

基于 MIT 协议发布