Agent 控制提示层

agent 操作 macOS 原生窗口时,OpenProgram 在该窗口上方画两样东西:一个说明 agent 正在控制的状态胶囊,以及停在上一动作处的 agent 指针。agent 操作网页时显示同一个指针。本文规定两者的外观与动效、使用的颜色,以及保证它们不妨碍用户的规则。

预览

同一时刻的聊天应用:agent 刚点击了输入框。左边是之前的渲染,右边是现在的渲染。用按钮播放点击、输入和结束状态。

之前

现在

强调色 #5b5bd6,是占位值(见强调色)。其余部分都是中性色。

绘制位置

目标画什么代码位置
macOS 原生窗口(computer_use 窗口动作)状态胶囊和 agent 指针,画在一个无边框、不激活、点击穿透的 NSPanel 里;每个受控窗口由一个 helper 进程负责。gui_harness/adapters/mac_indicator.py,由 mac_window.py 的 _WindowControlIndicator 启动。OpenProgram 在固定的 Harness 提交之上通过 program-patches/gui_harness.patch 交付它。
桌面 App 中的网页标签页agent 指针,画在网页上方一个透明、不可聚焦、点击穿透的窗口里。apps/desktop/main/action-cues.js 负责摆放窗口;menu-overlay/action-cue 负责渲染。
对话预览(PiP)和 Web 版agent 指针,画在预览图上方一个 pointer-events: none 的图层里。browser-control-bar.tsx 中的 ActionCueTravel。

三处 Web 界面使用同一个组件 AgentCursor。网页的控制状态(Active、Pausing…、Paused)仍显示在网页工具栏和浮动控制条上,见 GUI Agent。网页不再另加状态胶囊。

状态胶囊

Agent 指针

强调色

产品正在放弃之前的橙色与陶土色强调色,改用自己的配色,围绕深靛蓝、紫罗兰和青绿色,这套配色另行设计。因此提示层先使用冷色的靛紫 #5b5bd6 作为占位。这个值只出现在两处,两处必须保持一致:

只有指针填充、波纹、标签和活动圆点使用强调色。胶囊、文字和描边都是中性色,所以换成最终品牌强调色时不会牵动其他部分。

安全规则

与 GUI Agent 设计的关系

GUI Agent 设计规定了本文遵循的规则:提示层不激活应用、忽略鼠标,跟随窗口,在遮挡下仍可见;点击显示短暂的圆环;提示属于目标,不移动用户的指针;减弱动态效果时使用静态标记。之前的渲染遵守了这些规则,但外观不符合:

方面之前的渲染现在
位置窗口左上角,压在窗口自己的控件上。窗口顶部居中,位于标题栏区域。
文字“控制中 · WeChat · 34327”:只有中文,并带窗口 id,看起来像进程 id。按系统语言显示“OpenProgram 正在操作 WeChat”,不显示 id。
尺寸固定 224 × 28pt,长名称被截断。高 26pt,宽度随文字。
颜色徽标和标记都用饱和紫色填充。中性深色玻璃;只有指针和圆点用强调色。
指针42pt 紫色圆环,里面是随动作变化的白色 SF Symbol。强调色箭头,尖端落在动作点上,另加小动作标签。
动效标记在位置之间直接跳动。缓动滑动;第一次动作前指针停靠在中央。
点击反馈没有;圆环一直存在。按压或选择后播放一次短波纹。
停止提示层上没有入口。提示层上仍然没有入口,这是有意的设计(见下)。

本文与所回应需求的不同之处

实现状态

原生 helper(通过 Harness 源码补丁)和三处 Web 界面均已按本文实现。原生面板已用真实 AppKit 画在一个桌面窗口上并从屏幕截取:胶囊、箭头、标签和结束状态都按规定绘制。尚未在安装版 App 驱动微信等真实应用时验收。波纹和滑动只通过运动规则的单元测试(Harness 中的 tests/test_indicator_presentation.py)检查过,没有在屏幕上观察。