[Feature] 统一 SSH Remote 与协同模式的内置工具开关语义
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 395
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
## 背景
用户反馈“设置 → 内置工具”中的开关状态与实际产品行为不一致:
1. SSH Remote 在项目中显示为关闭,但从产品逻辑看,用户没有明确设置时不应默认关闭;
2. 将“协同模式”关闭后,会话输入框仍然展示“协同”入口,用户仍可选择 Worker 并开启协同。
本问题与以下配置作用域问题相关,但还包含一个独立的开关覆盖范围缺口:
- Related: makecindy/cindy#36
- Related: makecindy/cindy#78
## 当前现象
### SSH Remote
在具体项目的内置工具列表中,SSH Remote 可能显示为关闭。
当前源码中 SSH Remote 的产品默认值实际为开启;只有 `android` 和 `computer` 属于默认关闭工具。因此,SSH Remote 显示关闭通常代表当前项目存在显式的 `ssh=false` override,而不是产品默认值为关闭。
设置页虽然显示“已自定义”,但当前 UI 对“项目 override / 用户默认值 / 产品默认值”的来源区分不够直观,容易让用户把项目自定义状态理解为系统默认状态。
### 协同模式
在内置工具中关闭“协同模式”后:
1. `collab=false` 会影响新 agent runtime 是否装载 `lizi_orca` MCP;
2. 但会话输入框仍然展示“协同”按钮;
3. 点击按钮仍可通过 `SESSION_ENABLE_ORCA` 创建 Team 和 Worker;
4. 用户因此可以继续使用被设置为关闭的协同能力。
## 源码分析
### SSH Remote 默认值
普通插件的启用顺序目前为:
1. 项目 override;
2. 产品默认值。
`DEFAULT_DISABLED_PLUGIN_IDS` 当前只包含 `android` 和 `computer`。`ssh` 不在默认关闭集合中,因此没有 override 时应默认为开启。
相关代码:
- `apps/desktop/src/main/maker-host/plugins/types.ts`
- `apps/desktop/src/main/maker-host/plugins/plugin-registry.ts`
- `apps/desktop/src/renderer/components/settings/BuiltinToolsSection.tsx`
实现 makecindy/cindy#36 的用户级默认配置时,应继续保持 SSH Remote 的产品默认值为开启,并采用:
1. Essential 工具;
2. Machine-wide 设置;
3. 项目 override;
4. 用户级默认 override;
5. 产品默认值。
用户未设置第 3、4 层时,SSH Remote 应回落为开启。
### 协同模式存在两条独立控制链路
设置页的 `collab` 开关只通过 `PluginRegistry` 控制 `lizi_orca` MCP provider 是否在新 runtime 中启用。
输入框手动开启协同则走另一条链路:
```text
CollaborationModeToggle
→ SESSION_ENABLE_ORCA
→ enableOrcaInternal
→ OrcaLifecycleService.enableTeam
```
这条路径目前没有读取 `collab` 的最终启用状态,因此可以绕过设置页开关。
相关代码:
- `apps/desktop/src/renderer/components/new-chat/ChatInput.tsx`
- `apps/desktop/src/renderer/components/new-chat/CollaborationModeToggle.tsx`
- `apps/desktop/src/main/maker-ipc/register.ts`
- `apps/desktop/src/main/mcp-integrations/mcp-providers.ts`
- `apps/desktop/src/main/maker-host/plugins/plugin-registry.ts`
## 期望行为
### SSH Remote
- SSH Remote 的产品默认值保持开启;
- 用户没有项目 override 或用户级 override 时,开关应显示为开启;
- 项目显式关闭后,应明确显示这是“项目已自定义”,而不是产品默认值;
- 恢复默认应清除 override,并重新跟随用户级默认值或产品默认值;
- 实现 makecindy/cindy#36 的用户级默认配置后,仍应保证未自定义用户默认启用 SSH Remote。
### 协同模式
关闭协同模式后,应统一限制所有协同入口,而不只是隐藏 Orca MCP 工具:
- 新建页和已有非协同会话的输入框不再提供可操作的“协同”入口,或明确展示为禁用;
- `SESSION_ENABLE_ORCA` main 侧必须执行同一份最终启用状态校验,不能只依赖 renderer 隐藏按钮;
- xdt-helper 或其他内部入口也不能绕过开关开启协同;
- 已经运行中的协同 Team 是否继续运行,应遵循现有“设置只对新 runtime 生效”的产品语义,不应在没有确认的情况下直接终止 Worker;
- 设置页应明确提示:关闭后不会强制终止已运行的协同任务,但不能再从关闭状态新建协同 Team。
## 建议实现原则
开关的最终判断应收敛到同一个可复用的 capability policy,而不是让以下入口分别判断:
- MCP provider 装载;
- renderer 协同按钮;
- `SESSION_ENABLE_ORCA` IPC;
- xdt-helper / 内部开启入口。
renderer 负责正确表达状态,main 侧负责最终权限校验,避免只隐藏 UI 后仍可通过 IPC 绕过。
## 验收标准
### SSH Remote
- [ ] 无项目 override、无用户级 override 时,SSH Remote 默认为开启。
- [ ] 项目显式关闭 SSH Remote 后,设置页明确显示为项目自定义状态。
- [ ] 清除项目 override 后,SSH Remote 重新跟随用户级默认值;没有用户级 override 时跟随产品默认值。
- [ ] 应用升级不会将未自定义用户的 SSH Remote 静默改为关闭。
- [ ] 实现 makecindy/cindy#36 后,用户级默认值与项目 override 的优先级符合约定。
- [ ] Claude Code 与 Codex 使用一致的最终启用结果。
### 协同模式
- [ ] 在项目中关闭协同模式后,新建会话不再提供可操作的协同入口。
- [ ] 已有非协同会话不能通过输入框按钮新建 Team。
- [ ] 直接调用 `SESSION_ENABLE_ORCA` 时,main 侧会检查 `collab` 的最终启用状态并拒绝绕过。
- [ ] xdt-helper、MCP 和其他内部入口遵循同一开关。
- [ ] 已经运行的 Team 不会因为修改开关而被静默终止。
- [ ] 设置页准确说明开关的生效范围和生效时机。
- [ ] 清除 override 后,所有入口同步恢复可用。
- [ ] 项目之间的开关状态不会串用。
- [ ] 新增回归测试覆盖“关闭后 UI 不可开启”和“IPC 无法绕过”。
- [ ] 新增或修改的 UI 文案同步覆盖 zh-CN、en、ja、ko。
- [ ] 明确评估远程连接和手机版是否展示协同入口,以及 device-link 调用是否经过同一门禁。
## 与 makecindy/cindy#36、#183 的关系
makecindy/cindy#36 和 makecindy/cindy#78 主要解决普通内置工具缺少用户级默认值、导致无项目或 Slack 新会话无法持续保存偏好的问题。
本 issue 在此基础上补充两点:
1. SSH Remote 的产品默认值必须继续保持开启,设置页应明确显示当前值来自项目 override、用户默认还是产品默认;
2. 协同模式的开关必须覆盖 MCP、输入框和 IPC 等全部入口,不能只影响 runtime 的 MCP provider 装载。
因此建议复用 makecindy/cindy#36 的配置优先级与持久化方案,但协同模式的 UI/IPC 绕过问题仍需在本 issue 中单独修复。
Contributor guide
Research direction
Start by tracing the configuration flow in apps/desktop/src/main/maker-host/plugins/types.ts, plugin-registry.ts, and renderer/components/settings/BuiltinToolsSection.tsx, then follow the collaboration path through ChatInput.tsx, CollaborationModeToggle.tsx, maker-ipc/register.ts, and mcp-providers.ts. Review related issues #36 and #78 for the configuration priority. Done means all listed SSH and collaboration acceptance checks pass, including regression coverage for UI blocking and IPC bypasses.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- desktop, tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100