12 KiB
Mac/Windows 设备 GUI+CLI 双能力接入与并行冲突控制设计
日期:2026-04-06
1. 背景
Boss 当前的设备执行主链已经稳定在:
- 设备 heartbeat 上报
local-agent -> codex exec resume- Web / Android 会话与设备控制面
但现状仍有两个结构性缺口:
-
设备模型还没有把 Codex GUI 与 Codex CLI 当成同一台设备下的两种能力。
- 用户可能只开 GUI
- 也可能只开 CLI
- 也可能同一台 Mac / Windows 同时开着 GUI 和 CLI
- 当前 Boss 还没有显式表达这种“双能力设备”
-
同一台设备的 GUI 与 CLI 同时推进同一项目时,缺少并行冲突控制。
- 主 Agent 可能通过 CLI 正在推进某个项目
- 用户本人也可能在 GUI 中继续操作同一项目
- 如果两边都对同一 worktree 写入,很容易出现覆盖、上下文漂移、重复修改、误判进度
本轮设计要解决的是:
- 让 Boss 正式支持
Mac / Windows的Codex CLI接入 - 让同一台设备同时支持
GUI + CLI - 让 GUI / CLI 可以切换默认执行模式
- 在同项目并行写入风险出现时,默认阻断并弹出风险确认
2. 调研结论
2.1 官方产品结论
基于官方公开说明,Codex app 与 CLI 的关系更像:
- 同一用户工作空间下的多个入口
- 共享
session history - 共享
configuration - 共享
skills - 额度与使用量也统一计入同一个产品账户体系
因此,Boss 不应把 GUI 与 CLI 理解成两个完全独立系统。
2.2 本地实测结论
在当前 macOS 开发机上,Codex 的核心状态位于:
~/.codex/state_5.sqlite~/.codex/logs_1.sqlite~/.codex/session_index.jsonl~/.codex/.codex-global-state.json
同时 GUI 还有自己的应用壳目录:
~/Library/Application Support/Codex
这说明:
~/.codex更像主状态库Application Support/Codex更像 GUI 壳层缓存/偏好/会话容器
2.3 Windows 实测结论
在局域网 Windows 设备 192.168.31.18 上实测:
C:\Users\kris\.codex存在- 且真实包含:
state_5.sqlitelogs_1.sqlitesession_index.jsonl.codex-global-state.jsonauth.jsonconfig.toml
这说明 Windows 上也存在同样的用户级 Codex 核心状态目录。
2.4 设计结论
因此在 Boss 中,GUI 与 CLI 应建模为:
- 同一台物理设备下的两种能力
- 不是两台设备
- 不是两套独立项目空间
3. 目标与非目标
3.1 目标
- 支持
Mac / Windows的 Codex CLI 接入。 - 同一台设备可同时在线:
GUICLI
- 设备级支持默认执行模式切换:
GUICLI
- 主 Agent 和用户都可以在 GUI / CLI 间切换执行入口。
- 检测同设备、同项目、同 folder/worktree 的并行写入风险。
- 当发生并行写入风险时:
- 默认阻断继续执行
- 弹出风险警告
- 提供三个动作:
禁止允许本次永久放行
- 这三个动作都必须是当前异常项目文件夹/线程级,不是全局开关。
- 整套冲突检测应尽量基于规则层完成,避免持续消耗 token。
3.2 非目标
- 本轮不把 GUI 与 CLI 拆成两台虚拟设备。
- 本轮不做 OS 级窗口焦点监测或键鼠监控。
- 本轮不重写现有
local-agent -> codex exec resume主链。 - 本轮不要求 GUI 与 CLI 对同项目绝对互斥。
- 本轮不做真正的多 worktree 自动编排,只做冲突识别与风险控制。
4. 用户体验结论
4.1 设备模型
一台物理设备在 Boss 中保持单条记录,例如:
Mac StudioWindows GPU
但设备详情里要新增两类能力状态:
GUICLI
每种能力分别展示:
- 是否已连接
- 最近在线时间
- 最近活跃项目
4.2 默认执行模式
设备级新增 默认执行模式:
GUICLI
说明:
- 这只是默认值
- 不会关闭另一种能力
- 同一台设备允许
GUI + CLI同时在线
4.3 前台切换语义
用户层的真实语义是:
- 可以只用 GUI
- 可以只用 CLI
- 也可以同一台设备同时使用 GUI 和 CLI
Boss 必须支持三种状态共存,而不是互斥二选一。
5. 数据模型设计
5.1 Device 新增能力字段
为设备增加能力层字段:
capabilities.gui.connectedcapabilities.gui.lastSeenAtcapabilities.gui.lastActiveProjectIdcapabilities.cli.connectedcapabilities.cli.lastSeenAtcapabilities.cli.lastActiveProjectIdpreferredExecutionMode
约束:
preferredExecutionMode仅允许:guicli
5.2 Project / Folder 级并行风险状态
新增项目级或文件夹级并行状态:
deviceIdfolderKeyprojectIdactiveCliExecutionrecentExternalActivityAtconflictStateallowPolicy
其中:
conflictState:nonewarningblocked
allowPolicy:forbidallow_onceallow_always
5.3 冲突动作生效粒度
这次风险警告上的所有动作都必须是局部策略,不是全局策略。
推荐主键:
deviceId + folderKey
如果没有稳定 folderKey,退化为:
deviceId + projectId
对于单线程项目,本质上仍然是该线程所在 folder/project 级别策略,而不是全账号或全设备策略。
也就是说:
禁止只表示当前这个异常项目/文件夹继续维持阻断允许本次只放行当前这个异常项目/文件夹的一次执行永久放行只放行当前这个异常项目/文件夹后续同类冲突
6. 并行冲突检测
6.1 冲突定义
满足以下条件时,视为并行冲突风险:
- 同一台设备
- 主 Agent 正通过
CLI执行某项目的写入型任务 - 同一项目 / folder / worktree 又出现新的外部活动
- 该外部活动并非当前 Boss 发起的同一 CLI 任务的正常进展
这里的“外部活动”不强行区分一定来自 GUI 还是外部 CLI 手工操作。产品语义统一视为:
- 非当前 Boss 任务所控制的人工/外部活动
如果设备同时具备 GUI connected = true,前台提示可优先表述为 GUI 并行操作;否则用更中性的“外部活动”提示。
6.2 检测方式
冲突检测应尽量走规则层,而不是 LLM 判断。
规则层输入:
- 当前 CLI 执行任务是否在跑
- 目标 deviceId / projectId / folderKey
- 线程 heartbeat / reply / activity 上报
- 最近外部活动时间
- 当前任务自己的 trace / taskId / targetThreadRef
输出:
- 是否冲突
- 冲突归属到哪个 folder/project
6.3 Token 策略
本设计要求:
- 冲突检测本身不调用 LLM
- 冲突提示文案模板化
- 只有用户主动要求“解释为什么冲突”或“请主 Agent 给建议”时,才允许主 Agent 读取线程状态文档与最近进展事件
因此,这套机制本身不应成为高 token 消耗来源。
7. 冲突拦截与用户确认
7.1 默认行为
发生并行冲突风险时:
- 默认不继续
- 先弹风险警告
- 不直接自动放行
7.2 风险警告文案
默认模板:
检测到该项目正在同一设备上发生并行操作。主 Agent 当前正通过 CLI 推进,而你也在同一项目中产生了新的人工活动。继续执行可能导致文件覆盖、上下文偏移或重复修改。
7.3 用户动作
警告卡必须提供三个动作:
-
禁止- 当前这个异常项目/文件夹本次不继续
- 当前这个异常项目/文件夹保持默认阻断
- 不影响其他项目/文件夹
-
允许本次- 只放行当前这个异常项目/文件夹的当前这一次执行
- 不改变当前项目/文件夹后续默认策略
- 不影响其他项目/文件夹
-
永久放行- 仅对当前异常项目/文件夹生效
- 后续同一
deviceId + folderKey再发生同类冲突时,允许继续 - 不影响其他项目/文件夹
7.4 永久放行撤销
永久放行 不是不可逆。
需要提供撤销入口,建议放在:
- 项目文件夹页 / 线程会话信息页
- 或设备详情中该项目的执行策略区
文案示例:
该项目已允许 GUI/CLI 并行继续关闭永久放行
8. 执行路由设计
8.1 默认执行模式
主 Agent 与普通线程调度时:
- 先读设备的
preferredExecutionMode - 优先走对应能力
8.2 执行能力选择
推荐行为:
- 写入型自动执行:优先
CLI - 人工观察 / 人工接管 / 人工窗口操作:优先
GUI
8.3 同时在线
当 GUI + CLI 同时在线时:
- 不自动断开其中一边
- 也不自动把设备拆成两个逻辑设备
- 只在同项目并行写入风险时触发冲突控制
9. 前台设计
9.1 设备详情页
新增两个可见区:
-
连接能力GUICLI
-
默认执行模式- 单选:
GUICLI
- 单选:
9.2 项目文件夹 / 线程会话
当项目存在永久放行策略时,当前页可见:
GUI/CLI 并行已允许
当项目发生实时冲突时,当前页显示风险卡:
- 风险说明
禁止允许本次永久放行
9.3 主 Agent 交互
主 Agent 遇到此类冲突时:
- 默认停止继续下发
- 生成风险卡
- 等用户明确动作
注意:
- 这不代表主 Agent 抢占线程控制权
- 主 Agent 只是协同与调度者
- 用户仍可继续直接控制线程
10. API 与状态变更建议
10.1 设备能力状态
新增或扩展设备详情接口字段:
capabilities.guicapabilities.clipreferredExecutionMode
10.2 项目并行策略
新增项目/文件夹级策略字段:
parallelConflictPolicyparallelConflictState
并提供更新入口:
forbidallow_onceallow_always
allow_once 应在当前任务完成或取消后自动清空。
这些策略更新都只允许作用在当前冲突对象上:
- 同一
deviceId + folderKey - 或退化到同一
deviceId + projectId
不得写成设备级或全局级默认行为。
10.3 冲突事件
建议在 SSE / APP 状态流里补一类事件:
project.parallel_conflict.detectedproject.parallel_conflict.clearedproject.parallel_conflict.policy_updated
11. 测试策略
11.1 服务端
覆盖这些场景:
- 同设备 GUI + CLI 同时在线
- CLI 正在执行,出现外部人工活动
- 默认阻断
允许本次只放行一次永久放行只对当前 folder/project 生效- 不同 folder 不受影响
allow_once自动清空
11.2 Android / Web
覆盖这些场景:
- 设备详情页能显示 GUI/CLI 双能力
- 默认执行模式切换
- 冲突卡三按钮行为
- 永久放行状态展示
- 撤销永久放行
12. 风险与边界
12.1 无法精确知道“是 GUI 还是手工 CLI”
本轮不做 OS 级窗口焦点和输入行为追踪,因此“人工活动”只能基于 Boss 可观察到的项目活动来判定。
这意味着:
- 有时只能判断为“外部人工/非 Boss 活动”
- 不能 100% 精确证明一定是 GUI
这在产品上是可以接受的,因为风险本质是:
- 同项目正在被外部人工推进
12.2 worktree 级精度
如果未来要支持同项目多 worktree 并行,本模型还需再细化到:
deviceId + folderKey + worktreeRef
本轮先按:
deviceId + folderKey
收口。
13. 最终结论
本轮正式采用以下设计:
- GUI 和 CLI 是同一设备下的双能力,不拆成两个设备。
- Mac / Windows 都按用户级
.codex主状态库模型接入。 - 默认执行模式按设备级切换。
- 同项目 GUI/CLI 并行写入风险由规则层检测。
- 默认阻断,不自动继续。
- 用户必须在当前异常项目/文件夹级别做出选择:
禁止允许本次永久放行
- 这三个动作都只对当前项目文件夹/线程生效,不做全局开关。
这套方案既符合 Codex GUI/CLI 的真实关系,也能最大程度避免“主 Agent 与人工开发同时写同一项目”带来的实际风险。