# src `src/` 现在承载两套运行时的源码: - 本地模式 - 本地代理脚本 - 本地管理台后端 / 前端 - Hugging Face 模式 - 单进程远端安全服务 - OAuth 保护的 `/admin` - 写入 private hf dataset 的加密池存储 ## 当前目录结构 ```text src/ ├── README.md ├── hf-space/ │ ├── admin-auth.mjs │ ├── encrypted-pool-store.mjs │ ├── encrypted-pool-store.test.mjs │ ├── server.mjs │ └── server.test.mjs ├── proxy/ │ ├── api-endpoint-pool.mjs │ ├── api-endpoint-pool.test.mjs │ ├── codex-account-pool.mjs │ └── codex-account-pool.test.mjs ├── scripts/ │ ├── api-pool-proxy.mjs │ ├── check-symlink-skills.sh │ ├── clean-codex-home.sh │ ├── codex-local-proxy.mjs │ ├── migrate-codex-acc-pool.mjs │ ├── probe-llm-endpoint.mjs │ └── run-hf-local.sh ├── shared/ │ ├── pool-crypto.mjs │ └── secret-sanitizer.mjs ├── ui-app/ │ ├── App.jsx │ ├── components/ │ ├── main.jsx │ ├── pages/ │ │ ├── ConfigSwitchPage.jsx │ │ ├── PoolManagePage.jsx │ │ ├── ProbePage.jsx │ │ ├── ProxyPage.jsx │ │ └── RemoteServicePage.jsx │ ├── styles.css │ └── view-helpers.js └── ui-server/ ├── api-pool-proxy-manager.mjs ├── api-pool-proxy-manager.test.mjs ├── config-switch-store.mjs ├── config-switch-store.test.mjs ├── dev.mjs ├── history-store.mjs ├── pool-store.mjs ├── pool-store.test.mjs ├── proxy-manager.mjs ├── run-manager.mjs ├── server.mjs ├── server.test.mjs ├── tool-registry.mjs └── tool-registry.test.mjs ``` ## 模块说明 ### `proxy/` - `proxy/codex-account-pool.mjs` - 账号池核心模块 - 负责: - 加载 `acc_pool/pool.json` - 识别账号结构 - 预检账号完整性 - refresh token 刷新 - 上游探活 - 失败分类与冷却 - 当前账号切换 - 支持可注入的快照加载 / 持久化接口,供远端模式复用 - `proxy/codex-account-pool.test.mjs` - 账号池核心测试 - 覆盖: - 失败分类 - JWT 解析 - refresh token 必填规则 - `auth.json` 结构账号加载 - `pool.json` 数组加载 - `pool.json` 刷新持久化 - `proxy/api-endpoint-pool.mjs` - API 节点池核心模块 - 负责: - 加载 `api_pool/codex/pool.json` 和 `api_pool/claude-code/pool.json` - 校验 `apiUrl + apiKey` 节点结构 - 支持数组格式和旧的单文件单节点格式 - 当目录里存在 `pool.json` 时优先只读取它 - 按 provider 过滤可用节点 - 探活、失败分类、冷却和顺序轮询切换 - 选择下一个用于主动定时轮换的健康节点 - 支持可注入快照源,供远端模式复用 - `proxy/api-endpoint-pool.test.mjs` - API 节点池测试 ### `scripts/` - `scripts/codex-local-proxy.mjs` - 本地 Codex 账号池代理入口 - 默认监听 `127.0.0.1:8787` - 同时导出可复用的 `createProxyService` / `createProxyServer` - `scripts/api-pool-proxy.mjs` - 本地 API 池轮询代理入口 - 默认监听 `127.0.0.1:8789` - 同时导出可复用的 `createApiPoolProxyService` / `createApiPoolProxyServer` - 现在负责: - 失败后切换 - 定时切活跃节点 - 在途请求计数和“忙时延后切换” - 返回定时切换状态字段 - `scripts/migrate-codex-acc-pool.mjs` - 把旧的 `acc_pool/*.json` 合并成 `acc_pool/pool.json` - `scripts/probe-llm-endpoint.mjs` - LLM 地址兼容性探测脚本 - `scripts/clean-codex-home.sh` - 保守清理 `~/.codex` ### `shared/` - `shared/secret-sanitizer.mjs` - 敏感信息打码和日志脱敏 - 处理: - `Authorization` - `x-api-key` - `access_token` - `refresh_token` - `apiKey` - `OPENAI_API_KEY` - `shared/pool-crypto.mjs` - AES-GCM 加密 / 解密池文件 ### `ui-server/` - `ui-server/server.mjs` - 本地脚本管理台后端入口 - 提供: - `/api/tools` - `/api/config-switch` - `/api/pools` - `/api/runs` - `/api/history` - `/api/proxy/*` - `/api/api-pool/*` - `/api/app-config` - `ui-server/config-switch-store.mjs` - 本地配置切换预设存储 - 负责: - 读写 `.local-ui-data/config-switch.json` - 维护 Codex / Claude Code 配置预设 - 判断当前预设是否 `已启用`、`已偏离` 或 `未启用` - 启用时写入 `~/.codex` / `~/.claude` 本机配置文件 - `ui-server/tool-registry.mjs` - 本地模式工具注册表 - `ui-server/proxy-manager.mjs` - 本地 Codex 账号池代理子进程管理器 - `ui-server/api-pool-proxy-manager.mjs` - 本地 API 池代理子进程管理器 - `ui-server/run-manager.mjs` - 本地短时脚本执行和日志收集 - `ui-server/pool-store.mjs` - 本地 `pool.json` 读写和校验 ### `ui-app/` - `ui-app/App.jsx` - 管理台主入口 - 同时支持: - 本地模式 - 远端 `/admin` 模式 - `ui-app/pages/PoolManagePage.jsx` - 池管理页 - 远端模式下支持导入 JSON、保存加密池、显示只读提示 - `ui-app/pages/ProxyPage.jsx` - 本地代理页 - `ui-app/pages/ConfigSwitchPage.jsx` - 本地配置切换页 - 支持: - `Codex 配置` / `Claude Code 配置` 双 tab - 配置预设列表 - 新增、编辑、复制、删除、启用 - JSON 格式化和启用前二次确认 - `ui-app/pages/RemoteServicePage.jsx` - Hugging Face 远端服务页 - 用于展示状态、日志、定时切换信息和 `Reload 配置` - API 池远端页面支持直接修改定时切换开关与切换间隔,并保存后自动 reload 当前服务 - `ui-app/components/UiShared.jsx` - 共享表格、编辑器、导入弹窗、日志卡片 ### `hf-space/` - `hf-space/server.mjs` - Hugging Face 单进程远端服务入口 - 负责: - `/healthz` - `/admin` - `/oauth/start` - `/admin/api/*` - `/proxy/codex-account/*` - `/proxy/codex-api/*` - `/proxy/claude-api/*` - 远端 API 池同样会继承本地模式的定时切活跃逻辑 - 远端 API 池运行配置支持通过 `/admin/api/api-pool/config` 读写,并在保存后立即 reload 当前服务 - `hf-space/admin-auth.mjs` - 管理员会话签名、OAuth state 处理、白名单检查 - 当前登录逻辑会先显示中转页,再要求用户在新标签页中完成 OAuth - `hf-space/encrypted-pool-store.mjs` - 远端池存储层 - 把池数据加密后写到 private hf dataset - 路径: - `pools/codex-accounts.enc` - `pools/codex-api.enc` - `pools/claude-code-api.enc` - `config/api-pool-runtime.json` - 如果 `HF_TOKEN` 或 `HF_DATASET_REPO` 缺失,会自动退化为只读 - `hf-space/*.test.mjs` - 远端模式测试 - 覆盖: - 管理员鉴权隔离 - 代理 Bearer Key 隔离 - 导入 / 保存加密池 - reload - 公网隐藏 `/proxy/status` ## 常用命令 | 用途 | 命令 | 说明 | | --- | --- | --- | | 迁移 Codex 账号池 | `npm run migrate:codex-pool` | 生成 `acc_pool/pool.json` 并备份旧文件 | | 启动本地 Codex 代理 | `npm run proxy:codex` | 默认监听 `127.0.0.1:8787` | | 启动本地 API 池代理 | `npm run proxy:api-pool -- --provider=codex --pool-dir=api_pool/codex --port=8789` | 默认监听 `127.0.0.1:8789` | | 启动本地脚本管理台 | `npm run ui:dev` | 启动本地 Web 管理台开发环境 | | 构建管理台前端 | `npm run ui:build` | 构建 React 界面产物 | | 启动 HF 远端服务 | `npm run hf:server` | 启动 Hugging Face 单进程安全代理和管理台 | | 测试代理逻辑 | `npm run test:proxy` | 只跑 `src/proxy/*.test.mjs` 和 `src/scripts/*.test.mjs` | | 运行全部测试 | `npm test` | 运行仓库内全部测试,包括 `src/hf-space/*.test.mjs` | ## 设计备注 - 本地模式和远端模式共享同一套池逻辑,不重复维护两份切换策略 - 远端模式不暴露本地 `start/stop` 风格接口,而是改成常驻托管服务 + 手动 `reload` - 远端模式下的池数据永远以加密文件形式落到 private hf dataset - 远端 API 池的定时切换参数可以在管理台里直接修改,并持久化到 `config/api-pool-runtime.json` - 公开代理入口和管理员登录是两套完全独立的鉴权边界 - API 池默认每 `15 分钟` 尝试切换一次活跃节点;若存在在途请求,则延后到空闲窗口执行