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/start | POST | 发起 OAuth 登录 |
/auth/login/:id/poll | POST | 轮询登录结果 |
/auth/logout | POST | 登出 |
/auth/status | GET | 获取认证状态 |
/models | GET | 获取模型列表 |
/chat | POST | 发送聊天消息 (SSE) |
/chat/permission | POST | 权限审批答复 |
/sessions | GET | 获取会话列表 |
/sessions | POST | 创建新会话 |
/projects | GET | 获取项目列表 |
/project | GET | 获取当前项目 |
/projects/:hash/sessions/:id | GET | 获取会话详情 |
/projects/:hash/sessions/:id | DELETE | 删除会话 |
/projects/:hash/sessions/:id/rename | PATCH | 重命名会话 |
/providers | GET | 获取提供商列表 |
/providers | POST | 创建提供商 |
/providers/:name | PATCH | 更新提供商(含 thinking 设置) |
/providers/:name | DELETE | 删除提供商 |
/providers/:name/default | POST | 设为默认提供商 |
/config | GET | 获取配置 |
/skills | GET | 获取技能列表 |
/cd | POST | 切换工作目录 |
/fs/list?path= | GET | 列出目录内容 |
/fs/mkdir | POST | 创建目录 |
/tunnel/status | GET | 隧道/远程连接状态 |
/live/message | POST | 实时消息(在线会话注入) |
/live/provider | POST | 实时切换提供商 |
/live/reasoning_effort | POST | 实时设置推理力度 |
/live/permission | POST | 实时权限审批 |
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) - 设置面板(主题、语言)