Skip to content

AtomCode SPA 前端分析报告

基于对 daemon 嵌入式 SPA JS bundle (assets/index-2VWO9kfe.js) 的反编译分析 2026-06-21


1. OAuth Token 提取机制

javascript
var Ae = new URLSearchParams(location.search).get('token') ?? ''
// → 从 URL 参数 `?token=xxx` 中提取 OAuth token

function G() {
  let e = { "X-..." }  // 构造请求头
  // → 将 token 注入 Authorization header
  if (Ae) {
    e.Authorization = 'Bearer ' + Ae
  }
  return e
}

关键发现: SPA 从 URL 参数 ?token=xxx 提取 OAuth token,所有 API 请求通过 Authorization: Bearer <token> 传递。


2. 前端调用的全部 API 端点

端点方法用途
/auth/login/startPOST发起 OAuth 登录
/auth/login/:id/pollPOST轮询登录结果
/auth/logoutPOST登出
/auth/statusGET获取认证状态
/modelsGET获取模型列表
/chatPOST发送聊天消息 (SSE)
/chat/permissionPOST权限审批答复
/sessionsGET获取会话列表
/sessionsPOST创建新会话
/projectsGET获取项目列表
/projectGET获取当前项目
/projects/:hash/sessions/:idGET获取会话详情
/projects/:hash/sessions/:idDELETE删除会话
/projects/:hash/sessions/:id/renamePATCH重命名会话
/providersGET获取提供商列表
/providersPOST创建提供商
/providers/:namePATCH更新提供商(含 thinking 设置)
/providers/:nameDELETE删除提供商
/providers/:name/defaultPOST设为默认提供商
/configGET获取配置
/skillsGET获取技能列表
/cdPOST切换工作目录
/fs/list?path=GET列出目录内容
/fs/mkdirPOST创建目录
/tunnel/statusGET隧道/远程连接状态
/live/messagePOST实时消息(在线会话注入)
/live/providerPOST实时切换提供商
/live/reasoning_effortPOST实时设置推理力度
/live/permissionPOST实时权限审批

3. 模型/提供商配置的客户端处理

SPA 支持在客户端创建和配置 provider:

javascript
// 创建 provider 的请求体结构
{
  name: "...",
  type: "openai",       // 支持: openai, claude, ollama
  model: "...",
  base_url: "...",
  api_key: "...",
  context_window: 128000,
  is_default: false
}

SPA 管理页面允许用户添加自定义 LLM 提供商(包括 API key),这些配置会通过 POST /providers 保存到 daemon。


4. 会话管理前端逻辑

javascript
// 创建会话
async function Fe(e, t) {
  let n = {}
  let r = await fetch(`/sessions`, {
    method: 'POST',
    headers: { "Content-Type": "application/json", ...G() },
    body: JSON.stringify(n)
  })
  return r.json()
}

// 获取会话列表
async function Pe() {
  return (await fetch(`/sessions`, { headers: G() })).json()
}

5. 技术栈信息

  • 框架: Preact (类似 React 的轻量框架)
  • 打包工具: Vite (产物 assets/index-2VWO9kfe.js)
  • Markdown 渲染: marked
  • 哈希算法: fnv64 (Fowler–Noll–Vo 哈希)

6. UI 功能点

  • 聊天界面(SSE 流式回复)
  • 侧边栏会话管理(列表、删除、重命名)
  • 模型/提供商选择器
  • 登录/登出 UI
  • 文件附件上传
  • 图片上传(msg-images
  • 技能列表视图

逆向命令索引

bash
# 从运行时 daemon 提取 SPA JS
curl -s http://localhost:13457/assets/index-*.js 2>/dev/null > /tmp/spa.js 2>/dev/null
wc -c /tmp/spa.js
# 输出: ~800KB+

# 提取 SPA 中使用的 API 端点
grep -oP '"[a-z]+/[a-z_-]+"' /tmp/spa.js 2>/dev/null | sort -u
# 输出: auth/status chat chat/permission config fs/list fs/mkdir live ...

# 提取 SPA 翻译键
grep -oP '`settings\.[a-z]+`' /tmp/spa.js 2>/dev/null | sort -u | head -10

# 分析 SPA 路由
grep -oP '"[a-z]+/[a-z]+"|"[a-z]+"' /tmp/spa.js 2>/dev/null | sort -u | head -30
  • 文件浏览(/fs/list 实现的目录树)
  • 隧道状态显示(/tunnel/status
  • 设置面板(主题、语言)

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