OpenWork 浏览器任务机制深度解析:会话级标签、WebMCP 站点工具与四重权限边界

📅 发布时间:2026/9/13 5:59:51
OpenWork 浏览器任务机制深度解析:会话级标签、WebMCP 站点工具与四重权限边界
OpenWork 浏览器任务机制深度解析会话级标签、WebMCP 站点工具与四重权限边界【免费下载链接】openworkThe open-source alternative to Claude Cowork (powered by opencode)项目地址: https://gitcode.com/GitHub_Trending/ope/openwork本文以 OpenWork 桌面端内置浏览器任务Browser Tasks机制为核心剖析其如何在网站工具、DOM 控件与图像之间保持对话上下文、标签与登录状态的一致并讲解导航同意、读取访问、操作批准与结果披露四类权限如何独立生效。读完本文你将掌握browser_tabs/browser_open/browser_observe/browser_act/browser_navigate/browser_handoff六类工具的执行契约、WebMCP 兼容层的 Schema 安全子集以及execution.browserOrigins与blockBrowserUploads等托管策略的精确匹配语义可用于理解或扩展同类安全浏览器代理的设计。一、核心模型会话、标签与持久登录上下文浏览器任务的第一个设计决策是每个任务conversation拥有自己的标签集合且所有标签共享同一个持久化浏览器分区。文档 task-experience.md 明确指出一个浏览器任务会在网站工具、DOM 控件和图像之间持续保留其对话、选中标签与已登录上下文内置浏览器使用 Electron 的持久浏览器分区persistent browser partition。标签所有权tab ownership隔离的是控制权与可见性它并不会为每个对话创建不同的网站账户——这正是它与账户隔离在语义上的根本区别。这一设计在源码中有直接印证。桌面端执行器 browser-task.mjs 在文件头声明了三个执行常量const MAX_OPERATION_MS 30_000; // 单次操作超时含首次打开等待批准 const OBSERVATION_MS 15_000; // DOM 观察快照的有效期 const TRUST untrusted-site-content; // 页面内容一律视为不受信任也就是说一次打开操作的等待窗口是 30 秒一次 DOM 观察最多 15 秒有效。这两个数值会贯穿本文后续的用户体验流程与执行契约两个章节。标签所有权与共享登录的边界从browser-task.mjs的错误码可以看到所有权检查的执行位置wrong_conversationThat tab belongs to another conversation——其他会话无法检查该标签或复用其工具句柄paused用户接管浏览器后会话的所有浏览器操作被暂停needs_attention需要批准但目标标签不可见在后台返回该码让用户切到标签后重试sign_in_required页面含密码或一次性代码字段必须由真人接管。对应关系可以在 openwork-chrome-devtools.ts 的服务端工具定义中看到六个工具全部通过uiBridgeRequest(/browser/task, ...)走桌面端 UI 桥并且请求上下文强制要求sessionID缺少请求会话时返回missing_session。这说明会话 ID 是可信执行上下文提供的而不是模型参数——模型无法伪造它来访问别的会话的标签。二、用户体验流程六步标准化操作路径文档描述了一个稳定的六步用户体验评测测试 webmcp-browser-agent.e2e.test.ts 将其完整固化为断言第 1 步打开并确认导航。任务先列出本会话的标签browser_tabs若存在完全匹配的页面则复用否则在新建的属主标签中打开请求的 URLbrowser_open。加载一个新 origin 之前浏览器面板会出现Allow website navigation?审查面板用户点击Allow origin in this tab表示授权该标签、该会话下精确的 scheme、host 与 port——注意它不授予读取也不授予任何操作。被批准之前新标签保持空白测试中断言label: New tab且pageRequests为空。测试还特别验证了localhost 预览同样需要显式批准不存在本地豁免或私有网络一律禁止的兜底规则——测试中http://localhost:${port}需要单独的Allow origin in this tab才能放行。此外测试要求模糊引用必须使用真实标签上下文工具总是携带具体的tabId绝不猜测这个标签指哪个。第 2 步批准读取访问。打开成功后面板出现Allow reading this origin它授权的是在当前桌面进程内、本会话对该 origin 的读取。测试断言在点击该按钮之前不会发生任何 GET 请求、不会出现站点工具列表。第 3 步发现站点工具。站点工具通过webmcp_list_tools发现。宿主优先使用结构化的集成或站点工具若没有则退回到 DOM 观察与页面可见控件browser_observe。当控件没有可用的 DOM 引用时例如 canvas、iframe 内部一张新的页面图像可以支撑坐标式操作browser_act的x/y点击。第 4 步逐操作批准。每个网站动作都要单独审查Allow once。网站的只读注解readOnlyHint只是建议性的不构成信任声明。批准会把操作绑定到它的标签和当前页面。站点回调返回后结果先留在本地用户在浏览器面板审查完整的有界结果后再点Share result——这一步单独授权向对话及其模型提供商披露结果。拒绝披露Deny保持 payload 私有但它不会撤销已发生的动作也不允许自动重试。评测测试 webmcp-browser-agent.e2e.test.ts 用受控 fixture 验证了这一点在点 Allow once 之前 fixture 记录数为 0点后出现一条已登录的 webmcp 调用但模型与转录中都还没有结果点 Share result 之后引擎才收到结果并再通过一次browser_observe观察到页面上的 Saved 1 后才给出最终答案。第 5 步接管Take over与恢复。当页面需要登录、验证码等真人操作时用户选择Take over暂停会话的浏览器操作直接在页面内完成登录再点Resume browser。恢复后的下一个动作必须重新观察页面。测试 webmcp-browser-agent.e2e.test.ts 验证了接管期间observe/open全部返回paused真人通过表单提交建立 fixture 会话后同一属主标签恢复并显示 Session active。打开另一个标签无法绕过接管——paused是按会话级别生效的。第 6 步观察结果。任务必须通过新的观察确认用户期望的结果。输入事件被分发dispatched: true和站点回调返回都与用户想要的结果已达成是两回事。动作返回的是派发回执outcome: not_yet_verified引擎必须再观察一次页面才能宣告完成。后台标签与弹窗语义后台标签保留其会话归属且不能切换可见会话。测试 webmcp-browser-agent.e2e.test.ts 验证了后台打开会分配一个审查标签但保持原可见会话不变此时对原标签的act/site_tool全部返回needs_attention且dispatched: false用户切回该会话的标签后才出现批准按钮。首次打开可以停在空白标签上等待面板挂载与属主选择但必须在任务 30 秒超时内超时或取消会驳回待处理批准并释放新标签浏览器面板对话框更长的 60 秒限制也无法复活它。普通弹窗窗口停留在属主内置标签中复用相同的 profile 与 opener非 HTTP(S) 的弹窗被拒绝。被关闭的标签是一个显式错误tab_closed从不静默替换。三、执行契约工具面、观察生命周期与禁止项工具面浏览器任务暴露六个工具openwork-chrome-devtools.ts工具作用关键参数browser_tabs列出本会话的内置浏览器标签不含其他会话与外部浏览器 profile无browser_open在本会话打开网站复用完全匹配 URL 的既有标签不读取页面、不授权动作url完整 URL、tabId可选、provider: builtin | autobrowser_observe读取当前页面与可见控件返回新的observationId与短生命周期元素引用可选返回图像tabId、includeImagebrowser_act针对一次新鲜观察派发一个动作每个动作都需要单独用户批准返回派发回执而非任务成功tabId、observationId、actionclick/fill/key/scrollbrowser_navigate导航本会话选中标签组织策略适用于导航与重定向导航后需重新观察与发现站点工具tabId、urlbrowser_handoff暂停浏览器操作以便用户直接登录或完成步骤绝不在聊天中索要凭据只有用户能在面板恢复tabId站点工具保持webmcp_list_tools与webmcp_call_tool两个入口见 openwork-extensions-preview.ts 的参数定义tabId可省略表示活动标签toolId是最近一次webmcp_list_tools返回的不透明句柄。认证的 loopback 桥是内部桌面能力不是外部浏览器连接browser_open的参数枚举里只有builtin与autounsupported_browser错误明确写着External browser control is not connected。禁止暴露的能力支持的工具不暴露任意代码求值、原始 CDP、cookies、存储、网络响应体、上传或系统剪贴板。注意这是浏览器工具边界——它不会为无关的 shell 工具或用户自行添加、拥有独立机器权限的插件提供沙箱。执行器文件头也写明No model-specific API, arbitrary script execution, cookies or raw CDP surface.观察生命周期与动作约束每标签单操作一个标签同一时刻只允许一个操作不存在变更队列。busy错误要求等待其结果不要排队另一个动作。观察快照过期DOM 观察携带随机 ID在 15 秒后、DOM 变更页面内嵌了 MutationObserver、导航、滚动或视口变化时全部失效browser-task.mjs 同时校验 ID、Date.now() - observed.at OBSERVATION_MS、webMCP 修订号与当前 URL。坐标点击基于图像的坐标点击要求图像按页面视口缩放并在派发前重新检查像素prepareAction中还会拒绝指向input[typepassword]、input[typefile]、input[autocompleteone-time-code]的命中返回sign_in_required。动作消费观察动作在派发前消耗其观察快照失败或取消会清除它。超时与不确定结果禁止自动重放包括切换到另一种方法去重复该动作——这正是outcome: not_yet_verified与result_withheld语义存在的意义。四、权限边界四类独立批准与托管策略这是整个机制安全性的核心。文档强调导航同意、浏览器读取访问、操作批准与结果披露是互相独立的四件事任何一环都不能推导出另一环。导航授权的生命周期导航授权是内存态、按标签与属主作用域生效并在接管、取消或关闭时全部撤销它永远不会被新标签或弹窗继承。接管会中止待处理的任务加载只有显式的地址栏输入、后退、前进或刷新操作才能启用无任务授权的手动导航——网页内的鼠标和键盘输入不会产生导航授权评测中专门用 CDP 注入的点击与键盘事件尝试触发重定向结果目标请求数为零webmcp-browser-agent.e2e.test.ts。恢复Resume之后需要新的导航同意。请求级拦截唯一的 onBeforeRequest 监听器Electron 现有的installPolicyRequestHook是唯一的onBeforeRequest监听器覆盖所有网络请求重定向、frame、子资源、脚本化请求与上传。blockBrowserUploads是权威性的——用户同意不能绕过它被拒绝的请求也从不回退到外部浏览器。同一个监听器还会在派发前扣住任务控制的主框架请求包括跨源重定向直到目标 origin 被批准批准后会重新检查托管策略并在放行前检查取消、标签身份与归属。暂停的任务既不能获取新授权也不能把迟到的重定向当作手动浏览。遗留的自动化打开legacy automation open同样要经过任务宿主的 pre-load 同意门。边界声明这不是完整的出口沙箱origin 同意门只作用于主框架导航不作用于每个子资源frame、图片、脚本、fetch 等仍由既有的托管请求策略管辖。如果该策略允许一个已加载的网站可以自行联系其他 origin 而不再弹出导航提示。此外精确的 URL origin 匹配不是DNS/IP 分类也不是DNS-rebinding 防御内置浏览器仍然跨会话共享其持久登录 profile。这些都是设计上有意保留的边界。托管策略的精确语义execution.browserOrigins与blockBrowserUploads的 schema 定义在 desktop-policies.tsbrowserOrigins最多 100 个条目每个值必须是http/https 且无路径、无凭据、无查询、无 hash的 URL并会被new URL(value).origin规范化——因此它匹配的是精确的 scheme、host 与 port多策略求值采用交集intersectresolveDesktopExecutionPolicy在多个团队策略都存在browserOrigins时取它们的交集desktop-policies.ts绝不 union 主机模式或通配符blockBrowserUploads布尔值多个策略中任一为true即生效||。服务端策略裁决在 managed-policy-rules.ts 中实现browserOrigins存在时非精确 origin 的browser/webfetch一律拒绝This website is not approved by your organization.并且webfetch/websearch也会被整体改写为请使用内置浏览器打开已批准的网站managed-policy-rules.tsblockBrowserUploads开启时wss://请求、携带上传的动作或非 GET/HEAD/OPTIONS 方法都会被拒绝。executionPolicyTargetsmanaged-policy-rules.ts则把这些执行策略映射到引擎权限规则browserOrigins - [engine.webfetch, browser.request]blockBrowserUploads - [browser.request]。这些批准永远不能扩大组织的托管策略——现有的异步checkPolicy边界检查任务访问、DOM 动作、站点工具发现与调用以及结果共享不存在渲染器管理的网站授权或并行的策略缓存。五、WebMCP 兼容层命令式 API 与有界 Schema命令式document.modelContext路径宿主实现的是命令式imperative的document.modelContext路径通过隔离的 preload 桥接入。当运行时本身不提供该 API 时兼容实现会补上它——这一逻辑位于 browser-content-preload.cjs脚本被序列化注入网站的独立 JavaScript 世界先检查document.modelContext是否存在不存在时才安装兼容实现且只安装一个隔离、沙箱化的桥绝不向网站 JavaScript 暴露 Node APIrequire、process、Buffer全部为undefined测试对此有逐项断言。兼容实现还会通过 Permissions Policy 桥__openworkWebMcpPolicyV1校验文档是 origin-keyed 且被允许。发现与执行的每次校验宿主侧 broker 位于 webmcp-host.mjs。发现阶段会验证工具名^[A-Za-z0-9_.-]{1,128}$、有界 JSON Schema、frame 策略与 origin每次调用在批准前和批准后都会重新检查文档、frame、schema 与注册状态。句柄handle携带请求会话与导航修订号跨越导航的发现会被拒绝而不是发布过期句柄stale_tool。Schema 子集与 rejectedTools输入 schema 使用有界 JSON Schema 2020-12 子集webmcp-host.mjspattern、patternProperties以及所有format验证器包括regex不支持——包括嵌套 schema 与definitions内部主线程永远不会编译网站提供的正则$ref只允许指向命名的本地$defs或definitions条目任意 JSON 指针、远程引用、$dynamicRef均不支持复杂度有硬性上限schema 最大 64KB、嵌套深度 32、节点数 5000webmcp-host.mjs另有每 tab 128 个工具、每 frame 32 个工具、每 tab 同时最多 4 个执行等配额。被拒绝的描述符会在rejectedTools中逐个报告而不会隐藏仍有效的工具这类 schema 是在编译或操作批准之前就被拒绝的绝不会静默接受但忽略约束。注意字面数据与属性名中仍可包含这些词限制的是关键字本身。支持范围与信任模型支持同源 frame 与显式委托的安全跨源 frame声明式 HTML 表单工具、旧的navigator.modelContextAPI 与外部浏览器 WebMCP 均不支持返回的能力元数据会显式命名这些限制。网站结果始终是不受信任的trust: untrusted-site-content即使其工具注解声称只读——readOnlyHint仅作参考不能作为跳过审查的依据。测试对 frame 委托有完整覆盖允许的同源 frame 注册工具、被 Permissions Policy 拒绝的 frame 抛NotAllowedError、四个 frame 全部验证require/process/Buffer为undefinedwebmcp-browser-agent.e2e.test.ts。结果披露与收据语义站点回调可能在任意字段名下返回机密例如 session token因此按 key 名脱敏是不够的——回调结果保持本地直到单独的披露审查成功。缺少审查支持、用户拒绝、取消或策略丢失时宿主会扣留 payload 并保留不确定操作的收据result_withheld错误消息明确指示不要重复该动作webmcp-host.mjs。测试验证了拒绝分享后result为undefined且序列化结果不包含 fixture 会话串webmcp-browser-agent.e2e.test.ts。六、集成边界与既有实现复用浏览器任务刻意复用既有实现而不是重新发明轮子会话属主标签、后台视图停放、视口恢复、团队执行策略、原生计算机使用、工作流仪表板面板继续由各自当前实现拥有外部 profile 同步由合并的#4452单独提供#4481 的浏览器访问机制已被合并的执行策略#4564取代此功能不新增Den 策略字段也不提供登录导入 API。原生边界整体遵循 Electron 的 sandbox contract弹窗无论网站提供什么特性都被强制应用与普通标签相同的沙箱、上下文隔离与同源安全主进程强制导航控制、渲染器保持隔离、弹窗创建受控。browser-task.mjs中的页面观察代码运行在隔离世界WORLD 1001拥有 DOM 访问但没有任何页面全局、Node、IPC、profile 或网络能力引用也从不进入页面 DOM。原生计算机使用独立拥有 OS 应用与窗口会话浏览器工具不会获取 OS 指针控制。七、验证体系与已知限制评测旅程Journeyswebmcp-browser-agent是浏览器任务的主评测真实引擎插件 确定性 provider 受控网站 witnesses覆盖导航同意、登录态调用、DOM/图像回退、弹窗隔离、精确 iframe 委托、取消、过期观察与观察到的完成webmcp-browser-agent.e2e.test.ts其测试世界与策略设置工具在 browser-webmcp.ts可动态下发browserOrigins与blockBrowserUploads并触发 Den 设置变更事件。browser-tabs-owned-by-thread与browser-panel-viewport-recovery负责后台可见性与视口恢复。托管策略覆盖必须通过既有 native/server 边界验证精确 origin、交集与上传限制。仅源码检查不是运行时证明——这些旅程在重构后需要重新产出新鲜证据。明确的限制实现与模型无关纯文本模型可以使用页面文本与站点工具视觉工作图像观察、坐标操作需要图像能力的模型或用户协助。桌面与本地服务器必须在同一台机器上运行没有自带桌面浏览器的远程服务器会返回不可用结果且不会去连接另一台机器的外部浏览器。确定性 provider 能验证工具可用性、执行上下文、结果交付与会话内的已验证完成答案但不证明每个 provider 的开放式规划质量。以下内容明确不在浏览器任务子集内对外部浏览器 profile 的直接控制、声明式 WebMCP、封闭 shadow-root 的 DOM 引用、文件传输以及重启后活动标签句柄的恢复登录同步保留其单独记录的支持限制。结语OpenWork 的浏览器任务机制把模型可控的浏览器收敛为一套纪律严明的执行契约会话级标签所有权保证并发安全四重独立批准把导航、读取、操作与披露彻底解耦document.modelContext兼容层用有界 Schema 把网站输入限制在可验证的安全子集内而installPolicyRequestHook与execution.browserOrigins则把组织策略钉在请求流的唯一咽喉。对希望实现同类安全浏览器代理的工程师而言这份设计的核心启示是信任边界要落在宿主进程与请求拦截层而非模型或页面代码——观察快照有时效、动作必须消费观察、结果必须单独披露、失败永不自动重试这四个规则共同构成了可审计、可回放、可验证的浏览器任务体验。【免费下载链接】openworkThe open-source alternative to Claude Cowork (powered by opencode)项目地址: https://gitcode.com/GitHub_Trending/ope/openwork创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考