Skip to content

[Feature] 所有引擎统一「已配置就不动 / 未配置才 bootstrap」的 LocalCli 行为,并在 Renderer 显示本地 CLI 认证状态 #32

@stephenlzc

Description

@stephenlzc

需求背景

目前 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 | versionsrc/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_KEYprocess.env.ANTHROPIC_API_KEY 存在,则走 env 注入(参照 Hermes LocalCli 模式)
ClaudeCode 有 LocalCli 但 sync 路径仍写 settings.jsonsrc/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 LocalClishouldInjectCoworkModelConfig 返回 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 在 CoworkEngineSelectorSettings 卡片上显示绿/黄/红徽章。

需求 2.3 — 启动时自动迁移

CoworkService.initsrc/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 可以独立并行。

二、复现 / 用例

  1. 用户 claude login 之后启动 WeSight → CoworkEngineSelector 上 Claude Code 卡片显示绿色"已登录"徽章,无需任何 API key 弹窗。
  2. 用户在 WeSight 保存 model → 触发的是 LocalCli 路径(marker 化后),不会写 settings.json
  3. 用户换一台机器、新装 WeSight、但本机已有 ~/.codex/auth.json → 首次启动推荐"使用 Codex 本地凭据",无需在 WeSight 输 key。
  4. YdCowork(默认引擎)现在能识别 shell 里的 ANTHROPIC_API_KEY,无需在 WeSight 重复输。

三、预计实现路径

阶段 A — Renderer auth probe(无破坏性)

  • src/main/libs/externalAgentEnvironment.tsgetExternalAgentEnvironmentSnapshot 中加 authStatus 字段。
  • 对每个引擎在 main 进程内读本地文件 + 解析 env 状态(不发起网络请求,只读本地)。
  • 复用现有的 buildCommandStatus 模式(src/main/libs/externalAgentEnvironment.ts:555-563)扩展字段即可。
  • 新增单元测试 externalAgentEnvironment.test.ts(目前完全没有测试)。

阶段 B — LocalCli 路径统一

  • shouldInjectCoworkModelConfigsrc/main/libs/agentEngine/externalCliRuntimeAdapter.ts:580-585)的 false 路径推广到所有外部 CLI 引擎。
  • YdCowork 引擎的 LocalCli 路径:在 runClaudeCodeLocalsrc/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-2903renderAgentEngineMeta 增加 auth 行。
  • i18n 增加新 key(zh + en 各一份)。

阶段 D — 启动时自动推荐

  • CoworkService.initsrc/renderer/services/cowork.ts:66-85)末尾加 await this.refreshAuthRecommendations();,根据探测结果更新 Redux coworkSlicerecommendedEngine 字段。
  • AgentSetupWizard 读取 recommendedEngine 自动选中。

四、实施后可改进

  • 首启体验:本机已登录 Claude/Codex 的用户从"必须输 key"变成"一键使用本地凭据",符合"零配置上手"的产品目标。
  • 多工具共存:用户在 WeSight 之外的 Claude Code、Codex CLI 仍然独立可用,WeSight 不会污染它们的登录态。
  • 降低引擎切换摩擦:以前切引擎要先输 key;现在 LocalCli 一路通。
  • 降低 key 泄露面:所有 WeSight key 留在 WeSight sqlite,不下到其他工具能读的全局文件。
  • 可观察性:Renderer 第一次能直接告诉用户"这个 CLI 没装 / 没登录 / 已登录"——减少 80% 的"为什么跑不起来"类工单。

五、验收清单

  • 10 个引擎的 authStatus 字段都能正确填充
  • YdCowork 引擎在 shell 有 ANTHROPIC_API_KEY 时不再要求 WeSight key
  • LocalCli 模式下 spawn 出来的子进程有正确 env,但用户的本地文件不被改写
  • 启动时若本机 claude 已登录,onboarding 自动推荐 Claude Code
  • i18n key 双语齐全,zh + en 都有翻译

六、补充:相关 issue

  • 实现细节、具体违规代码与受影响文件见姊妹 bug issue。
  • 总体设计原则、原语复用、Stage 拆分见姊妹 design proposal。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status
    In Progress

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions