
jcode macOS 最大控制权 computer 工具从 AX 后台操作到 TCC 权限设计的技术路线图【免费下载链接】jcodeThe most RAM efficient harness项目地址: https://gitcode.com/GitHub_Trending/jcod/jcode本文以 jcode 仓库中docs/proposals/computer-use-maximal-control.md这份路线图文档为主线完整解读 jcode 如何为 macOS 设计一套尽可能可靠、且不打扰用户当前视线的桌面控制能力为什么坐标输入天然是前台可见的、AX 语义动作如何实现后台点按、Tier 05 各层级分别解锁什么能力、TCC 权限为何是绕不过去的门槛以及渐进式披露progressive disclosure的工具接口如何把常驻 token 成本压到约 370。读完你能掌握jcodecomputer工具的分层能力模型、Rust 侧无 Swift 构建步骤的底层机制选型、以及一套可直接落地的高权限工具安全模型。1. 目标与背景在用户正在看的屏幕上安全地工作路线图开篇给出了明确目标让 agent 获得 macOS 平台允许范围内的最大可靠控制权核心诉求之一是后台控制background control——不打扰用户当前正在看的窗口。它建立在 v1computer工具PR #345之上v1 已提供screenshot主显示器、感知 point/pixel 缩放、move/click/double_click/right_click/drag/scroll、type/key和弦、ui通过 osascript 读取 AX 树、cursor、check_permissions。v1 的设计与动机在 computer-use-tool.md 中有更完整的提案描述computer use agent 只需要三个原语——读屏幕、读 UI 结构、合成输入macOS 恰好通过 Accessibility / Quartz Event Services / ScreenCaptureKit 三层栈全部暴露了这三者。2. 唯一的硬约束一个 HID 光标、一个键盘焦点这是整份路线图的技术基石决定了后面所有机制的分类方式macOS 整个登录会话共享一个 HID 光标和一个键盘焦点。因此合成坐标输入CGEvent永远是可见的它会移动真实光标并把字符打进当前获得焦点的应用。由此得出后台控制的三条通路——必须绕开 CGEvent改走AccessibilityAX动作按元素引用操作特定 UI 元素Apple Events / 脚本化无 UI 地驱动可脚本化应用按窗口截屏不提升窗口层级就能看见某个窗口。文档特别指出真正的你工作 我并行独立工作需要独立显示器或独立登录会话对应 Tier 4 的高级选项。这条机制决定可见性的原则在源码中被完整保留mod.rs 的模块注释明确写着——坐标输入click/type/key/scroll/drag走 Core Graphics CGEvent、位于共享 HID 流是可见的而 AX 动作press/set_value/select_menu与脚本化run_applescript按引用作用于应用可以后台工作、不移动光标。3. Tier 05分层能力路线图Tier 0 —— 已完成v1PR #345即上文 v1 清单主显示器截屏、坐标鼠标/键盘、滚动、AX 树读取、光标位置、权限检查。Tier 1 —— AX 语义动作后台控制的最大杠杆按引用读写元素不移动光标目标应用甚至不必处于前台。文档规划的 API 基于accessibility-sys的AXUIElementPerformAction、AXUIElementSetAttributeValue、AXUIElementCopyElementAtPosition、AXUIElementCopyAttributeValue动作签名说明find_element{ role?, title?, value?, pid?, app? }返回稳定元素句柄element_at{ x, y }某点下的元素AXUIElementCopyElementAtPositionpress{ element }后台窗口上的AXPress点按按钮set_value{ element, value }无需焦点向字段写入get_value{ element }读取字段值perform_action{ element, ax_action }任意已声明的 AX 动作select_menu{ app, path: [File,Export…] }驱动任意应用的菜单栏句柄格式pid AX 路径索引链或会话级元素 id 缓存——让模型按结构而非按像素操作。文档原话点出了它的价值这就是真正的『点按你没在看的东西』能力。Tier 2 —— 应用 / 窗口 / 系统管理主要基于objc2-app-kitNSWorkspace、NSRunningApplication AX 窗口属性 CoreGraphics 窗口列表list_apps/activate_app { app }/hide_app/quit_applist_windows { pid? }CGWindowList带 id、标题、bounds、on/off-screenfocus_window/move_window/resize_window/minimize_window/close_windowAX 窗口动作——可指向后台窗口window_screenshot { window_id }即使窗口被遮挡也截特定窗口先用CGWindowListCreateImage后续换 ScreenCaptureKitSpaces 感知应用所在 Space激活可能导致 Space 切换——可见副作用。Tier 3 —— 剪贴板、输入保真、观察get_clipboard/set_clipboard { text }经 objc2-app-kit 的NSPasteboardkey_down/key_up按住修饰键、游戏式输入type_into { element, text }AX 设值 确认比盲打更可靠wait_for { element|condition, timeout }基于AXObserver*通知如等待一个 sheet 出现替代 sleep-and-pollpaste_type { text }写剪贴板 Cmd-V快速输入大段文本。Tier 4 —— 真后台 / 并行操作进阶代价更高的真正离屏、零干扰控制Apple Events 脚本桥run_applescript { script }/run_jxa。对可脚本化应用Mail、Notes、Safari、Finder、Music、系统设置面板、Terminal、多数专业软件完全无头无光标、无焦点抢占按目标应用做 Automation 权限首次触发时提示。虚拟 / 无头显示器把 agent 的光标窗口路由到用户不看的第二虚拟显示器。选项包括虚拟显示器驱动如 BetterDisplay /CGVirtualDisplay私有 API或一块闲置真实显示器agent 可把窗口移过去并放心使用坐标输入。独立登录 / 屏幕共享会话第二个 macOS 会话拥有自己的光标与焦点agent 驱动那个会话。隔离最强、配置最重。Shortcuts 集成调用用户Shortcuts自动化shortcuts run …作为高层、被授权的动作。Tier 5 —— 传感器 / 扩展可选、默认关ocr { region|window }Vision 框架读图内/非 AX 应用文本screen_record { seconds }ScreenCaptureKit 短片段音频进出控制、通知、do_not_disturb开关走脚本摄像头/麦克风是独立的 TCC 权限严格保持 opt-in。4. 落地现状仓库中的computer工具实现路线图不是纸面规划——当前仓库已在 crates/jcode-app-core/src/tool/computer/ 落地了相当完整的实现工具注册名为macos_computer_use在 mod.rs 的 base_tools 列表 中通过computer::ComputerTool::new注册。模块划分与 Tier 规划一一对应源文件对应能力mod.rs单工具 action 分发、输入结构、dry_run 门控、输出截断input.rsCGEvent 可见坐标输入move/click/drag/scroll/type/keyax.rsTier 1 AX 树 dump 与后台语义动作经 System Eventswin.rsTier 2 窗口/应用管理sys.rsTier 3/4 剪贴板、脚本桥、wait_for、通知setup.rs权限检查 / 请求 / 深链 / 轮询discover.rs渐进式披露按类别返回完整 action 规格osa.rsAppleScriptosascript执行辅助screen.rs截屏与 OCR全部原生实现被cfg(target_os macos)门控非 macOS 平台返回清晰的 unsupported 错误保持跨平台工具列表稳定。4.1 分发与参数一个action字段驱动全部能力ComputerInputmod.rs是扁平参数结构action必需 可选的x/y/to_x/to_y、text/keys、dx/dy、depth、app/role/title/value/element/ax_action/menu_path、window_id、script、contains/timeout_ms、region、level、dry_run。dispatch按 action 字符串路由到各子模块未识别的 action 会提示调用actiondiscovercategoryall查看全部动作。从 mod.rs 的 dispatch 分支 可以看到 Tier 04 的动作已基本齐备observescreenshot/ocr/window_screenshot/ui/cursor、坐标输入move/click/double_click/right_click/drag/scroll/type/key/key_down/key_up、AX 后台动作find_element/element_at/press/get_value/set_value/perform_action/select_menu、窗口应用list_apps/list_windows/activate_app/hide_app/quit_app/focus_window/move_window/resize_window/minimize_window/close_window、剪贴板与脚本get_clipboard/set_clipboard/run_applescript/run_jxa/wait_for/notify/system_state/set_brightness。4.2 Tier 1 实现细节结构化元素句柄ax.rs 中的ElementHandle正是路线图所说按结构而非像素操作的落点/// A structural handle to an AX element. pub struct ElementHandle { /// Application process name (e.g. Safari). pub app: String, /// 1-based child index chain from the apps front window to the element. /// Empty path the front window itself. pub path: Vecu32, }工具 schema 中element参数就是{app, path:[child indices]}。实现上ui动作会向 AX 树中输出#a.b.c形式的索引路径#1.2.3表示从应用主窗口起的 1-based 子元素索引链press/set_value/get_value/perform_action再把同样的句柄解析回 System Events 脚本表达式UI element N of (...)执行——也就是说当前实现走的是osascript System Events这条 AX 通道见模块注释 drives other apps UI elements by reference throughSystem Events与路线图v1 用 osascript 读 AX 树一脉相承路线图规划的accessibility-sys直连 C API 是更进一步的优化方向。4.3 可见输入路径CGEvent 的权限耦合input.rs 通过core_graphics的CGEventSource::new(CGEventSourceStateID::HIDSystemState)创建事件源失败时直接报错Grant Accessibility permission (run thesetupaction)。这印证了路线图权限表格中Accessibility 解锁 CGEvent 输入的绑定关系同一权限既支撑 AX 动作也支撑坐标输入。click实现里先 post 一个MouseMoved事件、等待 10ms、再按点击次数循环 down/up——细节保证了合成事件序列的可靠性。5. 权限TCC守门人的现实路线图给出了四权限总表这是本文最重要的可操作信息完整继承权限解锁什么能否程序化授予AccessibilityCGEvent 输入、全部 AX 读/写、窗口控制不能——用户需手动开关一次可提示 深链Screen Recording截屏、窗口/OCR 捕获存在请求 APICGRequestScreenCaptureAccessAutomationApple Events按应用脚本化首次发送时按目标应用弹提示Input Monitoring读取全局输入流仅当加入捕获功能时存在请求 APIsetup/check_permissions动作的设计一等公民动作分四步报告AccessibilityAXIsProcessTrusted、Screen RecordingCGPreflightScreenCaptureAccess、Automation按应用、经首次 Apple Event、外加安装/包健康状态程序化请求AXIsProcessTrustedWithOptions(prompttrue)弹出 Accessibility 对话框并把 jcode 预加入列表开关为关、CGRequestScreenCaptureAccess()、对目标应用发首个 Apple Event 触发 Automation 提示深链到精确的系统设置面板x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility…?Privacy_ScreenCapture…?Privacy_Automation轮询AXIsProcessTrusted()直到授予然后报告 ready。硬限制Accessibility 的开关本身没有任何 API 可以翻动Apple 的反恶意软件边界tccutil只能重置、不能授予。所以能做到的最好 UX 是一次或两次提示 一次手动开关永远不可能零接触。当前 setup.rs 已实现这一闭环accessibility_ok()通过 System Events 的UI elements enabled探测screen_recording_ok()实际调用/usr/sbin/screencapture -x验证产物非空setup()未授权时用/usr/bin/open深链到Privacy_Accessibility/Privacy_ScreenCapture面板随后最长约 30 秒、每秒一次地轮询 Accessibility 状态直到报告 granted 或提示still not granted (toggle it, then re-run check_permissions)。权限的宿主绑定问题TCC 权限挂在运行 jcode 的宿主二进制/终端上。路线图指出为了稳定体验大概率需要分发签名的 jcode.app、固定 bundle id如com.jcode.app Designated Requirement让 Accessibility / Screen Recording 授权跨版本更新持续有效——否则每次二进制路径/签名变化都会重新弹提示。setup还应检测正从不稳定/未签名路径运行并建议安装正式 bundle让用户只授权一次。6. 安全模型高爆炸半径工具的分层约束路线图把 computer 工具类比为bash级别的工具约束包括权限门控缺少必需权限时早期拒绝变更动作支持dry_run解析并报告目标、但不真正执行优先 AX 语义动作而非盲坐标点击可审计、更稳健破坏性坐标点击时回传截屏/元素回显默认不做全局输入捕获避开 Input Monitoring 权限每动作审计日志可选目标应用 allowlist/denylist。源码里dry_run已实现为统一的变更门控is_mutating 列举了全部 26 个变更动作click、type、press、set_value、select_menu、quit_app、set_clipboard、run_applescript……run()在dry_run true且动作属于变更集时直接返回[dry_run] would perform {action} (no action taken)不触达任何子模块。此外cap_output会把过大的文本输出巨型 AX 树/剪贴板/OCR dump截断到 16000 字符并标注丢弃量防止撑爆上下文——这是路线图未明说、但实现中补上的工程细节。7. 工具接口设计渐进式披露压 token 成本文档已拍板的接口设计Tool interface design (decided)是这篇路线图中工程含金量最高的部分之一单工具、action 分发仿browser工具schema 采用渐进式披露让常驻上下文成本与 Tier 数量无关常驻核心约 370 token用 tiktoken cl100k_base 实测screenshot, ui, ocr, click, type, key, press, set_value, run_applescript, setup, discoverdiscover { category }按需返回高级动作的完整规格类别为mouse|keyboard|ax|windows|apps|clipboard|scripting|displays|system|all每类别约 130 token只在用时付费共享句柄类型element、window_id、region只定义一次、多动作复用参数不随动作数膨胀。实测常驻成本对比设计可见动作数常驻 token当前 v1 工具12~720平铺全部 Tier约 46 动作46~1,020渐进式核心11~370文档同时强调一个关键认知后台控制是机制的属性不是 Tier 的属性——CGEvent 可见AX 动作press/set_value/select_menu Apple Events 后台。在实现中mod.rs 的 parameters_schema 正是这一设计的体现常驻 schema 只写常见动作 各字段语义category枚举扩到了[mouse,keyboard,observe,ax,windows,apps,clipboard,scripting,system,setup,all]而 discover.rs 用若干常量文本MOUSE/KEYBOARD/OBSERVE/AX/WINDOWS/APPS/CLIPBOARD/SCRIPTING/SYSTEM按类别输出完整动作规格例如 AX 类别直接告诉模型Element handle {app, path} 来自 find_element/ui。工具描述本身也内嵌了操作策略act only on the requested task (not proactively) and prefer BACKGROUND AX/scripting over moving the cursor or stealing focus。8. 技术选型与构建顺序Rust crate 依赖全部为 lockfile 已有或 crates.io 可得无需 Swift/ObjC 构建步骤accessibility-sys0.2 —— AX 读/写/观察crates.ioscreencapturekit7 —— 现代截屏crates.iocore-graphics窗口列表作兜底objc2-app-kit/objc2-foundation0.3 —— 已在 lockfileNSWorkspace、NSPasteboardcore-graphics0.23 —— 已是直接依赖CGEvent、CGWindowList、CGDisplay。仓库可验证的部分工作区 Cargo.toml 声明了objc2-app-kit { version 0.3, ... }jcode-app-core/Cargo.toml 声明了core-graphics { version 0.23, features [highsierra] }与文档所列版本一致。更新后的构建顺序v1 工具的渐进式披露重构核心 discoversetup动作检查 请求 深链 轮询Tier 1 AX 动作后台控制Tier 2 窗口/应用管理 按窗口截屏Tier 3 剪贴板 AXObserver 等待run_applescript/JXA 桥Tier 4 无头脚本签名应用 bundle持久权限Tier 5 OCRVision——摄像头/音频被刻意排除虚拟显示器 / 第二会话真正并行工作进阶。对照当前 dispatch 分支第 16 步的动作在源码中均已可路由属于框架已立、持续打磨的状态签名 bundle、虚拟显示器等则仍是路线图上的待办。9. 小结computer-use-maximal-control.md的价值在于把agent 操作真实 macOS 桌面这件高爆炸半径的事拆解成了一条可验证的工程阶梯先用一个光标一个焦点的物理约束划清可见 vs 后台的机制边界再用 Tier 05 逐级兑现能力用 TCC 权限表 setup动作把授权体验压缩到一次提示 一次开关的硬下限用dry_run 语义动作优先 审计把安全兜住最后用渐进式披露把工具 schema 的常驻 token 成本从约 1020 压到约 370。仓库中 crates/jcode-app-core/src/tool/computer/ 的实现工具名macos_computer_use已覆盖 Tier 04 的主要动作分发是继续深入这套设计最直接的入口——阅读顺序建议mod.rs分发与 dry_run→ ax.rs后台 AX 通道→ setup.rs权限闭环→ discover.rstoken 成本控制。【免费下载链接】jcodeThe most RAM efficient harness项目地址: https://gitcode.com/GitHub_Trending/jcod/jcode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考