需求背景
目前 WeSight 的 10 个 Agent 引擎(YdCowork / ClaudeCode / Codex / CodexApp / OpenCode / QwenCode / DeepSeekTui / Hermes / OpenClaw / GrokBuild)在「凭据来源」上的行为完全不一致:
- 7 个引擎有
WesightModel / LocalCli 二选一开关;
- 1 个引擎(
YdCowork)根本没有 LocalCli 路径,只能强制走 WeSight key;
- 1 个引擎(
OpenClaw)没有 LocalCli 开关,永远把 WeSight key 注入到 gateway;
- 1 个引擎(
CodexApp)走 OS 自己的 app 登录(这个可以保留)。
更糟的是,Renderer 探测只到 found | path | version(src/renderer/services/cowork.ts:659-667 + src/main/libs/externalAgentEnvironment.ts:324-358),不探测"是否已登录"——所以用户无法直观判断"我已经登录了 Claude Code,WeSight 不需要 key"。
说明:以下 path:line 形式的引用在 GitHub 中会自动渲染为可点链接。
一、详细需求
需求 2.1 — 所有引擎统一「已配置就不动 / 未配置才 bootstrap」
| 引擎 |
现状 |
期望 |
YdCowork |
无 LocalCli,永远走 WeSight key(src/main/libs/coworkRunner.ts:1690-1696) |
增加 LocalCli 路径:如果 ~/.claude/settings.json → env.ANTHROPIC_API_KEY 或 process.env.ANTHROPIC_API_KEY 存在,则走 env 注入(参照 Hermes LocalCli 模式) |
ClaudeCode |
有 LocalCli 但 sync 路径仍写 settings.json(src/main/libs/externalAgentConfigSync.ts:319-331) |
LocalCli 模式:只读 + env 注入;WesightModel 模式:参见姊妹 bug issue |
Codex |
auth.json 总是被覆写(src/main/libs/externalAgentConfigSync.ts:670-676) |
LocalCli:只读 auth.json + env;WesightModel:占位符 + env |
OpenCode / QwenCode / DeepSeekTui |
LocalCli 时 shouldInjectCoworkModelConfig 返回 false(src/main/libs/agentEngine/externalCliRuntimeAdapter.ts:580-585)—— 这一支已经是参考实现 |
把这个 gate 推广到 WesightModel 模式:永不写 key 到共享文件,只走 env 注入 |
Hermes |
已实现 marker + 只 env(src/main/libs/hermesConfig.ts:166-213) |
无需改动,作为参考实现 |
OpenClaw |
永远注入 WeSight key 到 gateway |
改为只把 WeSight 注册的 provider key 注入;user 自加 provider 走 OpenClaw 自己的解析 |
CodexApp |
走 OS app 登录 |
保留 |
需求 2.2 — Renderer 探测"本地 CLI 是否已认证"
新增 cliAuthStatus: 'unknown' | 'logged_out' | 'logged_in' | 'expired' | 'unconfigured' 字段,填充策略:
- Claude Code:检查
~/.claude/settings.json → env.ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN;非空 → logged_in
- Codex:检查
~/.codex/auth.json → OPENAI_API_KEY;非空 → logged_in
- OpenCode / Qwen / DeepSeek / Hermes / Grok:在
LocalCli 模式下 process.env 是否含对应 *_API_KEY
- OpenClaw:检查 gateway token 是否存在
- YdCowork:N/A(无 CLI)
把状态塞进 ExternalAgentEnvironmentSnapshot.engines[i].authStatus,Renderer 在 CoworkEngineSelector 和 Settings 卡片上显示绿/黄/红徽章。
需求 2.3 — 启动时自动迁移
CoworkService.init(src/renderer/services/cowork.ts:66-85)当前只 load config + engine status。新增一个轻量探测步骤:
- 启动时若
agentEngine 未设、且任意 CLI authStatus === 'logged_in',自动推荐用户"使用本地 CLI 凭据",并把推荐选项写入 onboarding。
- 不再依赖手动 "Import to Model Settings" 按钮(
src/renderer/components/Settings.tsx:3391-3408)。
需求 2.4 — 引擎选择器的 UI 提示
CoworkEngineSelector 渲染每张卡片时,根据 authStatus 显示"已登录 / 未登录 / 未配置":
- 已登录:绿色徽章 + "使用本地凭据" 副标题
- 未登录:黄色徽章 + "请在 CLI 中登录"
- 未配置:红色徽章 + 安装按钮
新增 i18n keys(zh + en,参考 src/renderer/services/i18n.ts 第 460-490 行附近的 coworkAgentEngine* 命名空间):
coworkAgentEngineAuthStatusLoggedIn
coworkAgentEngineAuthStatusLoggedOut
coworkAgentEngineAuthStatusExpired
coworkAgentEngineAuthStatusUnconfigured
coworkAgentEngineUseLocalCredentials(按钮文案)
需求 2.5 — 与姊妹 design proposal 的关系
本 issue 的"实现路径"会复用 design proposal 中抽离的 mergeWithManagedBlock helper。两个 issue 的执行顺序:先按 design proposal 完成 Stage 1(helper 化)→ 再实现本 issue 的 2.1 / 2.2;2.3 / 2.4 可以独立并行。
二、复现 / 用例
- 用户
claude login 之后启动 WeSight → CoworkEngineSelector 上 Claude Code 卡片显示绿色"已登录"徽章,无需任何 API key 弹窗。
- 用户在 WeSight 保存 model → 触发的是 LocalCli 路径(marker 化后),不会写
settings.json。
- 用户换一台机器、新装 WeSight、但本机已有
~/.codex/auth.json → 首次启动推荐"使用 Codex 本地凭据",无需在 WeSight 输 key。
YdCowork(默认引擎)现在能识别 shell 里的 ANTHROPIC_API_KEY,无需在 WeSight 重复输。
三、预计实现路径
阶段 A — Renderer auth probe(无破坏性)
- 在
src/main/libs/externalAgentEnvironment.ts 的 getExternalAgentEnvironmentSnapshot 中加 authStatus 字段。
- 对每个引擎在 main 进程内读本地文件 + 解析 env 状态(不发起网络请求,只读本地)。
- 复用现有的
buildCommandStatus 模式(src/main/libs/externalAgentEnvironment.ts:555-563)扩展字段即可。
- 新增单元测试
externalAgentEnvironment.test.ts(目前完全没有测试)。
阶段 B — LocalCli 路径统一
- 把
shouldInjectCoworkModelConfig(src/main/libs/agentEngine/externalCliRuntimeAdapter.ts:580-585)的 false 路径推广到所有外部 CLI 引擎。
YdCowork 引擎的 LocalCli 路径:在 runClaudeCodeLocal(src/main/libs/coworkRunner.ts:1665-1705)开头增加 if (process.env.ANTHROPIC_API_KEY) { use env; return; } 短路。
Codex LocalCli:只读 auth.json、不写。
阶段 C — UI 适配
src/renderer/components/cowork/CoworkEngineSelector.tsx:189-199 增加 authStatus 渲染分支。
src/renderer/components/Settings.tsx:2838-2903 的 renderAgentEngineMeta 增加 auth 行。
- i18n 增加新 key(zh + en 各一份)。
阶段 D — 启动时自动推荐
CoworkService.init(src/renderer/services/cowork.ts:66-85)末尾加 await this.refreshAuthRecommendations();,根据探测结果更新 Redux coworkSlice 的 recommendedEngine 字段。
AgentSetupWizard 读取 recommendedEngine 自动选中。
四、实施后可改进
- 首启体验:本机已登录 Claude/Codex 的用户从"必须输 key"变成"一键使用本地凭据",符合"零配置上手"的产品目标。
- 多工具共存:用户在 WeSight 之外的 Claude Code、Codex CLI 仍然独立可用,WeSight 不会污染它们的登录态。
- 降低引擎切换摩擦:以前切引擎要先输 key;现在 LocalCli 一路通。
- 降低 key 泄露面:所有 WeSight key 留在 WeSight sqlite,不下到其他工具能读的全局文件。
- 可观察性:Renderer 第一次能直接告诉用户"这个 CLI 没装 / 没登录 / 已登录"——减少 80% 的"为什么跑不起来"类工单。
五、验收清单
六、补充:相关 issue
- 实现细节、具体违规代码与受影响文件见姊妹 bug issue。
- 总体设计原则、原语复用、Stage 拆分见姊妹 design proposal。
需求背景
目前 WeSight 的 10 个 Agent 引擎(
YdCowork / ClaudeCode / Codex / CodexApp / OpenCode / QwenCode / DeepSeekTui / Hermes / OpenClaw / GrokBuild)在「凭据来源」上的行为完全不一致:WesightModel/LocalCli二选一开关;YdCowork)根本没有 LocalCli 路径,只能强制走 WeSight key;OpenClaw)没有 LocalCli 开关,永远把 WeSight key 注入到 gateway;CodexApp)走 OS 自己的 app 登录(这个可以保留)。更糟的是,Renderer 探测只到
found | path | version(src/renderer/services/cowork.ts:659-667+src/main/libs/externalAgentEnvironment.ts:324-358),不探测"是否已登录"——所以用户无法直观判断"我已经登录了 Claude Code,WeSight 不需要 key"。一、详细需求
需求 2.1 — 所有引擎统一「已配置就不动 / 未配置才 bootstrap」
YdCoworksrc/main/libs/coworkRunner.ts:1690-1696)~/.claude/settings.json → env.ANTHROPIC_API_KEY或process.env.ANTHROPIC_API_KEY存在,则走 env 注入(参照 HermesLocalCli模式)ClaudeCodesettings.json(src/main/libs/externalAgentConfigSync.ts:319-331)Codexauth.json总是被覆写(src/main/libs/externalAgentConfigSync.ts:670-676)auth.json+ env;WesightModel:占位符 + envOpenCode/QwenCode/DeepSeekTuiLocalCli时shouldInjectCoworkModelConfig返回 false(src/main/libs/agentEngine/externalCliRuntimeAdapter.ts:580-585)—— 这一支已经是参考实现WesightModel模式:永不写 key 到共享文件,只走 env 注入Hermessrc/main/libs/hermesConfig.ts:166-213)OpenClawCodexApp需求 2.2 — Renderer 探测"本地 CLI 是否已认证"
新增
cliAuthStatus: 'unknown' | 'logged_out' | 'logged_in' | 'expired' | 'unconfigured'字段,填充策略:~/.claude/settings.json → env.ANTHROPIC_API_KEY/ANTHROPIC_AUTH_TOKEN;非空 →logged_in~/.codex/auth.json → OPENAI_API_KEY;非空 →logged_inLocalCli模式下process.env是否含对应*_API_KEY把状态塞进
ExternalAgentEnvironmentSnapshot.engines[i].authStatus,Renderer 在CoworkEngineSelector和Settings卡片上显示绿/黄/红徽章。需求 2.3 — 启动时自动迁移
CoworkService.init(src/renderer/services/cowork.ts:66-85)当前只 load config + engine status。新增一个轻量探测步骤:agentEngine未设、且任意 CLIauthStatus === 'logged_in',自动推荐用户"使用本地 CLI 凭据",并把推荐选项写入 onboarding。src/renderer/components/Settings.tsx:3391-3408)。需求 2.4 — 引擎选择器的 UI 提示
CoworkEngineSelector渲染每张卡片时,根据authStatus显示"已登录 / 未登录 / 未配置":新增 i18n keys(zh + en,参考
src/renderer/services/i18n.ts第 460-490 行附近的coworkAgentEngine*命名空间):coworkAgentEngineAuthStatusLoggedIncoworkAgentEngineAuthStatusLoggedOutcoworkAgentEngineAuthStatusExpiredcoworkAgentEngineAuthStatusUnconfiguredcoworkAgentEngineUseLocalCredentials(按钮文案)需求 2.5 — 与姊妹 design proposal 的关系
本 issue 的"实现路径"会复用 design proposal 中抽离的
mergeWithManagedBlockhelper。两个 issue 的执行顺序:先按 design proposal 完成 Stage 1(helper 化)→ 再实现本 issue 的 2.1 / 2.2;2.3 / 2.4 可以独立并行。二、复现 / 用例
claude login之后启动 WeSight →CoworkEngineSelector上 Claude Code 卡片显示绿色"已登录"徽章,无需任何 API key 弹窗。settings.json。~/.codex/auth.json→ 首次启动推荐"使用 Codex 本地凭据",无需在 WeSight 输 key。YdCowork(默认引擎)现在能识别 shell 里的ANTHROPIC_API_KEY,无需在 WeSight 重复输。三、预计实现路径
阶段 A — Renderer auth probe(无破坏性)
src/main/libs/externalAgentEnvironment.ts的getExternalAgentEnvironmentSnapshot中加authStatus字段。buildCommandStatus模式(src/main/libs/externalAgentEnvironment.ts:555-563)扩展字段即可。externalAgentEnvironment.test.ts(目前完全没有测试)。阶段 B —
LocalCli路径统一shouldInjectCoworkModelConfig(src/main/libs/agentEngine/externalCliRuntimeAdapter.ts:580-585)的 false 路径推广到所有外部 CLI 引擎。YdCowork引擎的 LocalCli 路径:在runClaudeCodeLocal(src/main/libs/coworkRunner.ts:1665-1705)开头增加if (process.env.ANTHROPIC_API_KEY) { use env; return; }短路。Codex LocalCli:只读auth.json、不写。阶段 C — UI 适配
src/renderer/components/cowork/CoworkEngineSelector.tsx:189-199增加authStatus渲染分支。src/renderer/components/Settings.tsx:2838-2903的renderAgentEngineMeta增加 auth 行。阶段 D — 启动时自动推荐
CoworkService.init(src/renderer/services/cowork.ts:66-85)末尾加await this.refreshAuthRecommendations();,根据探测结果更新 ReduxcoworkSlice的recommendedEngine字段。AgentSetupWizard读取recommendedEngine自动选中。四、实施后可改进
五、验收清单
authStatus字段都能正确填充YdCowork引擎在 shell 有ANTHROPIC_API_KEY时不再要求 WeSight keyLocalCli模式下 spawn 出来的子进程有正确 env,但用户的本地文件不被改写claude已登录,onboarding 自动推荐 Claude Code六、补充:相关 issue