dsh-plugin-browserskill
Tencent/BrowserSkillBrowserSkill 的 DeepSeek Harness 浏览器自动化桥接插件,通过原生浏览器工具控制可见的 Chrome 和 Edge Agent Window,支持可访问性与 VOM 页面观察、截图、隔离的多会话控制和 Web UI 实时观察浮层。
自包含浏览器运行时:Playwright(chromium)+ OpenCLI 作为插件本地依赖(全局复用回退),提供 `browser` 服务与 9 个交互式浏览器工具。
本地整合候选的修复、工具清单与安全边界见 AUDIT.md。allowedDomains 只限制认证状态装载,不是网络防火墙或 Agent 隔离边界。
自包含的浏览器运行时插件 for DeepSeek Harness(DSH)。
把 Playwright / Patchright(可选 Chromium 驱动) 与 OpenCLI 作为插件自身的 npm 依赖打包(优先插件本地,缺省回退全局复用),对外提供一个 browser 服务 + 一组交互式浏览器工具。dsh-web-search-pro 通过 inject: ['browser'] 注入该服务,驱动它的浏览器 / OpenCLI 后端——不再依赖全局 CLI。
插件发布通道 · DSH 基线 · 兼容承诺 0.1.12 及更早的维护版本 · dsh-v0.1.1-rc.2 至 dsh-v0.1.2-rc.1 · 旧基线;不与新插件混装 0.1.15 · dsh-v0.1.7-rc.2 · 精确锁定该宿主版本;组合安装、真实 Web profile 与设置持久化已验证 0.1.17 · dsh-v0.1.7-rc.2 ~ dsh-v0.2.0-rc.2 · peer 收口为「实测过的两条线」(上界 =0.2.0-rc.2 =0.2.0-rc.2 <0.2.1-0)不变,只含两项:(1) 参数无效的调用不再先弹审批:审批钩子先判断动作是否被当前 automationMode 禁用(禁用仍直接拒绝),再用与 runAction 相同的校验检查参数,无效则不询问,执行层再校验一次并返回带精简 schema 的 INVALID_ARGS,不执行任何页面动作;参数有效时的审批规则与理由不变。(2) “探索转草稿”(draft_from_journal)的指导文本补充。不改动作、参数 schema 与审批规则。在 0.2.0-rc.2 上完成 337 项测试与 66 项真实浏览器 e2e
0.1.17 把 DSH 运行时依赖由精确锁定改为范围声明(^0.1.7-rc.2 || >=0.2.0-rc.1 =0.2.0-rc.2 <0.2.1-0,正式版 0.2.0 起即采用这个范围。0.1.17 的范围不变,旧宿主继续用它。
这个写法同时满足两种解析,缺一不可:
semver.satisfies(host, range, { includePrerelease: true }),所以「单范围能不能过宿主」不是关键。真正决定装机成败的是 npm/pnpm 的默认 semver:预发布版本只有在某个比较符自带同号(同 major.minor.patch)预发布时才被判为满足。 于是 >=0.1.7-rc.2 =0.2.0-rc.2 这个比较符自带 0.2.0 的预发布,是承重的,必须保留。
<0.2.1-0 而不是 <0.2.1:后者放行 0.2.1-alpha.1 这类 0.2.1 的预发布。收口后,若 0.2.1 真出现破坏,会在组装期直接报 is incompatible with dsh 0.2.1 并点名,而不是拖到用户机器上变成运行期怪错 (0.1.5 → 0.1.7 曾一次性打断所有按 0.1.5-alpha.1 构建的插件)。
pnpm run test:peers(已并入 pnpm verify)用两种解析模式逐个断言受管 peer:0.2.0-rc.2 必须通过, 0.1.7-rc.2、0.2.0-rc.1、0.2.1-alpha.1 必须被拒绝;并自带 --selftest 已知行为自校验。
0.1.15 使用 DSH 新客户端分包:状态存储来自 dsh-client-store,设置契约来自 dsh-client-ui-settings,客户端 Context 来自 Cordis。npm 上 0.1.15-alpha.2 仍声明旧版 DSH peer,不能与本版混用。
设置的读取不再对宿主版本做适配:Host 半边直接使用 Loader 传给 apply 的条目配置(设置页由条目的 Config schema 派生, 条目 id 为 browser),浏览器设置卡片使用 ConfigForm/ctx.configForms,devDependencies 锁定 0.2.0-rc.2。 可编辑字段都是 .volatile():保存后新值写入运行中的引用,但浏览器进程、工具暴露与审批规则在启动时一次读取, 所以保存后仍需重启 profile 才生效(只有提示文本覆盖里的目录、错误提示等按调用实时读取,见「自定义提示文本」)。
插件只声明 inject: ['tools'],不依赖宿主的 `settings` 服务:Cordis 4.0.4 把声明了的 inject 一律当作必需,若声明 settings, 在没有该服务的组合(如 sdk-minimal,或关了 settings 行的 profile)里插件会一直挂起。插件的 Host 半边从不读取 ctx.settings, 配置来自 Loader 条目;没有 Settings 服务时按 Config 默认值运行,设置卡片只是不显示(客户端只在宿主提供 browser 命名空间时才挂载它)。
# 默认安装(新的 browser_index / browser_call 工具体系,面向 dsh-v0.2.0-rc.2 宿主):
dsh plugin --profile web add @anweat/dsh-browser@0.2.1
# 宿主仍是 0.1.7 线(dsh-v0.1.7-rc.2)时,固定安装 0.1.17(旧的 browser_* 工具体系):
dsh plugin --profile web add @anweat/dsh-browser@0.1.17
# 或本地目录 / tarball:
dsh plugin --profile web add ./dsh-browser
# 重启(web profile 关闭了 HMR):
dsh --profile web0.2.0与0.2.1只支持dsh-v0.2.0-rc.2(peer>=0.2.0-rc.2 <0.2.1-0);范围之外的宿主版本未经验证,
旧宿主(dsh-v0.1.7-rc.2线)请固定使用0.1.17。预发布通道@next不再用于安装,0.2.0-rc.1仅作历史记录。
若你的 harness 是包含未发布提交的本地源码 checkout,版本号可能有出入——用
dsh plugin --profile web add ./并在 profile 的pnpm-workspace.yaml
里对齐版本后重装即可。
0.2.0 直接升级即可,DSH 基线、peer 范围、动作、参数 schema、面向模型的文本与审批规则都没有变化,已保存的资产、配置与提示文本覆盖照常使用。act.select 把 values 写成 value)不再先弹审批、等用户点“允许”之后才返回 INVALID_ARGS;现在直接返回 INVALID_ARGS(带精简 schema),页面没有任何改动,模型改对后只会询问一次。被当前 automationMode 禁用的动作仍直接拒绝。browser_open、browser_click 等工具名不再注册。模型通过 browser_index 查看动作目录,再用 browser_call 执行,例如 {"action":"act.click","args":{...}}。需要一次性看到全部动作时,把 toolSurface 设为 flat。automation.develop 的 convert,它只生成新草稿,不改原资产。automationAssets.minInputSetsForActivation(默认 2,范围 1–5):带 inputSchema 或 inputNames 的资产,当前版本的通过凭据必须覆盖至少这么多组不同输入(automation.develop 的 test 传 inputSets;设置面板的“测试输入 JSON”填 2 到 5 个对象的数组),否则激活被拒绝,错误里写明原因。只用一组输入测试通过的 recipe 可能把那组输入写死,换一组就失败。没有输入的资产不受影响;升级前已通过测试的旧资产带“旧版”凭据,视为满足,不会因升级而无法激活。要恢复旧行为,把它设为 1。BrowserService 上供其他插件调用的方法(render、snapshot、searchResults、opencli、close)签名不变。>=0.2.0-rc.2 <0.2.1-0(插件自身不再覆盖 0.1.7-rc.2 与 0.2.0-rc.1)。dsh-v0.2.0-rc.2。宿主更旧时,dsh plugin add 会因 peer 不满足而拒绝,或在组装期点名报 incompatible;这类宿主继续使用 0.1.17。settings 服务:插件只声明 inject: ['tools'];有 Settings 服务时设置卡片照常显示,没有时按配置默认值运行。Web Search Pro 与浏览器插件应同步升级;面向 dsh-v0.1.7-rc.2 不要混用仍声明旧 peer 的 Browser 0.1.15-alpha.2;两者都升到 0.1.17 即可。
dsh plugin --profile web add @anweat/dsh-browser@0.1.17 dsh-web-search-pro@0.1.17升级后完整停止并重启 Web profile,再调用 runtime.status、opencli.status 和 web_backend_status;仅刷新网页不会重新加载插件服务或 Web Search Pro 配置面板。尤其不要只升级 Web Search Pro:新的工具目录、Patchright 运行时和调用缓冲都来自浏览器插件。
安装并重启后,模型通过 browser_index 查看能力目录、用 browser_call 执行动作(runtime.status 可查看运行时状态),再按任务选择动作。默认 automationMode: standard:读取直接执行,点击、输入、按键、选择、勾选、悬停、文件上传及页面写操作走 DSH 原生一次性审批。页面脚本和本地文件上传在 autonomous 下仍需审批,只有 unrestricted 会跳过确认。
情形 · 推荐方式 · 关键边界 公开网页读取、截图 · target.open → observe.read / observe.screenshot · 不需要登录态 表单、分页、懒加载 · act.click / act.fill / act.type / act.clear / act.press / act.select / act.check / act.scroll · CSS 或 role/text/label/testId 语义定位,默认严格唯一;standard 下审批 SPA 条件等待 · act.wait · 支持 locator、URL glob、networkidle 或最多 10 秒固定等待 悬停菜单与提示 · act.hover · 与直接页面交互使用相同审批策略 文件上传 · act.upload · 只接受现有绝对文件路径;最多 20 个、合计 512 MiB;除 unrestricted 外审批会显示路径 页面脚本表达式 · script.evaluate · 使用当前页面来源和登录态;可访问 DOM、非 HttpOnly Cookie、Web Storage 和浏览器允许的网络 API 页面故障排查 · target.open(capture=[console,network]) → inspect.console / inspect.requests · 只在内存保留最多 200 条;网络仅记录失败及 4xx/5xx,不记录 body/header 登录后站点 · authProfile · 必须配置 allowedDomains;默认不回写 Cookie 固定站点增强 · rulePack · 只允许有界步骤;本地 init script 必须 SHA-256 固定且 ≤64KB 模型生成的多步操作 · automation.run_recipe · 声明式步骤;审批策略由 automationMode 决定 默认只读脚本 · script.catalog → script.run_builtin · 内置 article/links/JSON-LD/forms,不执行外来代码 外部模型生成 UserScript · script.validate → script.run_userscript · 必须 @match + @grant none;除 unrestricted 外执行前审批 有限站点遍历 · crawl.crawl · 页数、深度、并发、突发与退避始终受 usagePolicy 约束 Reddit/小红书等 OpenCLI 平台 · opencli.status → opencli.catalog → opencli.run · 先发现精确 adapter;通用调用除 unrestricted 外需审批 普通站点兼容性不佳 · browserRuntime: patchright · Chromium-only;建议专用 Chrome profile,不与指纹注入库叠加
所有网页访问、交互、脚本、Cookie 使用、上传和下载都必须由调用方或操作者根据目标网站规则及适用要求判断并使用。插件只执行被请求或批准的浏览器操作,不判断具体用途是否获得网站授权,也不承担调用方的合规责任。限流、审批、域名和文件边界用于约束执行面,不能替代目标网站规则。
DSH 会话示例:
先调用 browser_call({action:"runtime.status"});然后用 target.open 打开目标页。
若页面需要登录,使用 authProfile=forum;不要把 Cookie 放进工具参数。层 · 实际是什么 · 打包还是复用 chromium 内核 · 共享缓存 %LOCALAPPDATA%\ms-playwright(约 400MB) · 永远复用共享缓存,不塞进插件、不重复下载;缺失时 runtime.install 一键补 playwright 驱动(JS 包) · playwright npm 依赖 · 插件本地 node_modules 优先,缺省回退全局 npm patchright 驱动(可选) · 与 Playwright 同版本的 Chromium 兼容驱动 · 插件内置;配置 browserRuntime: patchright 才启用 opencli(纯 Node CLI) · @jackwener/opencli npm 依赖 · 同上,本地优先 / 全局复用
共享缓存默认落在 %LOCALAPPDATA%\ms-playwright(Windows 上即系统盘,约 400MB)。 若要把内核放在别的盘、或直接复用一份已有的内核,在 loader 条目上显式给出可执行文件路径:
- id: browser
config:
executablePath: 'E:/caches/ms-playwright/chromium-1234/chrome-win64/chrome.exe'executablePath 必须指向真实的内核可执行文件(不是目录);设置后 runtime.status 会显示该路径, runtime.install 不再需要执行。browserRuntime: patchright 时同样适用。 注意该字段在插件挂载时解析:改完需要重新加载 profile(重启 Web profile),仅刷新网页不生效。
browserdsh-browser 在 apply() 里 ctx.provide('browser', service)。任何插件声明 inject: ['browser'] 即可消费:
export const inject = ['tools', 'browser']
export function apply(ctx: Context) {
const browser = ctx.get('browser') as BrowserService
// browser.render / snapshot / searchResults / opencli / recipe /
// runBuiltinScript / runUserscript / open / click / type / scroll / read / screenshot / close
}服务接口(结构性,无需共享类型包)见 src/browser-service.ts。
browser 服务是单实例:apply() 只 ctx.provide 一次,所有消费者拿到同一个 BrowserService。因此交互式页面状态不能是全局的。
宿主在工具执行时带上 exec.agent,它是 session 身份(agent.session.id, 基础契约里也声明 agent.id: SessionId)。插件据此为每个 session 分配独立的 BrowserContext + Page:
BrowserContext 正是 Chromium 自身的多配置文件模型。
BrowserContext、页面、auth profile、rule pack、以及 console / network 抓取缓冲。
注意隔离单位是 context 而不是标签页:同一个 context 里的多个标签页共享 cookie 与 storage,跨 session 串号正是要防的事。
由此得到的行为边界:
工具 · 作用域 target.open / act.* / script.evaluate / observe.* / target.close · 仅调用方 session inspect.console / inspect.requests · 仅返回调用方 session 抓到的记录 runtime.status 的 activeUrl · 仅报告调用方 session 的页面 render / snapshot / searchResults / crawl / OpenCLI · 每次调用自建临时 context,本就无共享状态
target.close 关闭的是调用方的页面,不影响其他 session;插件卸载时 close() 才整体拆掉所有 session 的 context 与进程。
会话槽位上限由 maxSessions(默认 8)控制,超出后关闭最久未使用的 session。 读取类调用(runtime.status / inspect.console / inspect.requests)不会 创建槽位,也不会触发淘汰——否则一次查询就会挤掉别人的页面。
不带 exec.agent 的调用方(例如其他插件直接消费服务)落在共享桶里,行为与 引入隔离之前一致。
automationMode 控制模型可见的工具集合和执行审批。建议从 standard 开始,仅在完全只读任务或受控自动化环境中切换:
模式 · 浏览器与 Web Search Pro 写操作 · 仍需审批或拒绝 · 不可取消的安全底线 read-only · 只读工具与只读 Recipe;缓存清理、规则写入和安装拒绝 · 页面交互、写 Recipe、UserScript、OpenCLI run 均隐藏或拒绝 · 只能读取、校验、截图及运行只读脚本/Recipe standard(默认) · 页面交互、写 Recipe、缓存清理和规则写入均需一次性审批 · UserScript、通用 OpenCLI、浏览器/后端安装也需审批 · 所有安全校验持续启用 autonomous · 页面交互、写 Recipe、缓存清理和规则写入可直接执行 · 外部 UserScript、通用 OpenCLI、浏览器/后端安装仍强制审批 · 所有安全校验持续启用 unrestricted · 所有上述工具均不触发审批,适合隔离环境中的无人值守测试 · 无审批提示 · 仍执行域名、元数据、参数、大小和步骤数校验
unrestricted 会允许模型直接运行外部脚本、通用 CLI 和安装命令,只应在隔离的测试 profile 或明确授权的自动化环境中使用;日常 profile 保持 standard。它只取消人工确认,不会取消 `usagePolicy` 的并发、突发、页数、深度、重试与冷却保护。模式改变后需要重启 DSH profile,工具目录才会按新配置重新注册。
模型可见的工具面由 toolSurface 决定:
toolSurface · 注册的工具 · 常驻上下文 · 用途 indexed(默认) · browser_index、browser_call 两个 · 约 0.3k token · 渐进披露:先看目录,再按需查看单个动作的 schema flat · 每个可用动作一个工具,名为 browser__ · 约 14.5k token(34 个工具;recipe 的 v2 schema 在 automation.develop / automation.run_recipe 里内联展开) · 对照与调试;与 indexed 共用同一份动作注册表和同一个分发入口
indexed 下:browser_index() 列出能力组和当前环境状态(automationMode、Chromium 是否已安装);browser_index({group}) 列出该组动作;browser_index({action}) 给出完整参数 schema;browser_index({query}) 按关键词检索。browser_call({action, args}) 执行动作,服务端按 schema 校验参数,校验失败返回 INVALID_ARGS 并附上精简 schema。所有动作的返回值使用同一信封:
{ "ok": true, "action": "act.click", "executionStatus": "completed", "result": { } }
{ "ok": false, "action": "act.click", "executionStatus": "failed", "error": { "code": "LOCATOR_NOT_FOUND", "message": "<Playwright 原始信息>", "hint": "…" } }错误码:INVALID_ARGS、UNKNOWN_ACTION、CAPABILITY_UNAVAILABLE、POLICY_DENIED、LOCATOR_NOT_FOUND、LOCATOR_AMBIGUOUS、NOT_ACTIONABLE、TARGET_CLOSED、DEADLINE、CANCELLED、NOT_FOUND、ACTION_FAILED,以及 recipe 专用的 VALIDATION_FAILED、OUTCOME_UNKNOWN、INVALID_RECIPE。会产生副作用的动作超时时 executionStatus 为 outcome_unknown,调用方应先核验页面再决定是否重试。
recipe 的执行结果:automation.run_recipe、automation.run、automation.develop 的 test 总是把完整的运行报告放在 result 里,失败时也一样(此时 ok 为 false,并附带 error):executionStatus(completed / failed / cancelled / outcome_unknown)、validationStatus(not_checked / passed / failed)、completedSteps、failedStep{index, action, errorCode, message, candidates?}、effects(none / observed / unknown)、outputs。ok 只在“执行完成且没有断言失败”时为 true。extract 和 screenshot 的值只放在 outputs(v2 的 extract 带 as 时有 name),completedSteps[].output 是指向它的下标,不再重复一份。fill、clear、type、click、press、select、check 视为有副作用:如果超时发生在已命中元素、动作已开始之后,executionStatus 为 outcome_unknown、effects 为 unknown;如果 Playwright 的 call log 显示一直只在 “waiting for locator”(元素从未出现),该步没有动手,判为 failed、LOCATOR_NOT_FOUND,effects 不受影响;没有 call log 的超时无法证明元素从未命中,仍按 outcome_unknown。取消和整体 deadline 在每一步开始前以及最后一步之后检查;正在执行的 Playwright 步骤无法中断,调用会等它返回,已完成的步骤不回滚,session 页面保持打开。测试或运行只有在执行完成且没有断言失败时才算通过;没有 assert 步骤的旧式(v1)recipe 仍可通过测试,但资产记为 evidenceLevel: 'legacy-unverified'。
严格定位:原子动作和 v2 recipe 步骤共用同一套定位(src/locator.ts)。locator 必须只匹配一个元素;匹配多个时该动作不执行,返回 LOCATOR_AMBIGUOUS,error.candidates 给出总数和前 5 个候选(role、name、文本片段、visible)。确需选其中一个时写 index 并同时写 indexReason,否则拒绝。
Recipe schema v2:资产和内联 recipe 用 schemaVersion: 2 启用,缺省为 1,v1 的语义(CSS selector、永远取第一个匹配、fill 不允许空串)一律不变。v2 的变化:
locator({role,name?,exact?} / {label} / {text} / {testId} / {css},可加 framePath);严格唯一,歧义时该步不执行且 effects 不变。goto(URL 必须落在资产的 domains 内,保存时和运行时各查一次,也检查重定向落点;内联 recipe 可停留在起始页同源,或落在显式的 allowedDomains)和 clear;fill 的空串必须写 allowEmpty: true,或改用 clear。extract 和 assert 默认最多等 5 秒(可用 timeoutMs 调整),选择器不存在时不再等约 30 秒;extract 可用 as 命名输出。inputSchema(string / number / enum,可带 required、example、enumValues,运行前按 schema 校验并转换)、outputSchema(命名输出及类型 string / number / json)、postconditions({selector} / {text} / {urlIncludes} / {output, nonEmpty|allowEmpty})、requiredCapabilities(只记录,不门控)。validationStatus 为 passed 当且仅当所有 assert 和 postconditions 都成立。没有任何 assert 或 postcondition 的 v2 资产可以保存为草稿,但测试不会记为 passed,testMessage 会说明原因。automation.develop 的 convert 把 v1 recipe 资产转成新的 v2 草稿:CSS selector 变成 {css, explicitFirst: true}(仍取第一个匹配),全部列入 pendingDisambiguation,草稿记录 sourceAssetId / sourceRevision,原资产(含 active)不会被修改;未知的 extract mode 或 wait condition 会拒绝转换并说明哪一步。审批按动作判断:Host 的审批理由写明动作和关键参数(例如 act.click role="button" name="Submit"),browser_index 直接放行,browser_call 解析出动作后适用与下表相同的规则,不可用的动作在 browser_call 中再拒绝一次。判断顺序:先看动作是否被当前模式禁用(禁用则拒绝),再按动作的参数 schema 校验参数(与执行层是同一个校验;无效则不询问,直接交给执行层返回 INVALID_ARGS,不会执行任何页面动作),最后才是审批规则。Host 里按工具名设置的“总是允许”不会跳过插件策略。运行或回放资产(automation.run、automation.develop 的 test)时,审批理由写资产名称、版本和短 id,例如 automation.run "Host check: docs search" r1 (5fdc912d);名称去掉换行并截断到 60 个字符。
旧的 30 个 browser_* 工具名已不再注册(flat 形态中 browser__ 与个别旧名相同,但它们现在就是注册表里的动作,返回统一信封)。
动作 · 作用 target.open · 打开 URL,返回标题/可读文本/全页截图路径;可显式启用 console/network 内存捕获 target.close · 关闭当前页(下次 open 全新) target.list · 列出本 session 的页面(自己打开的页加上弹窗),含 id、url、title、active target.select · 把本 session 的某个页面(target.list 里的 id)切换为当前页;弹窗不会自动成为当前页 observe.read · 读当前页 URL/标题/文本(不截图) observe.screenshot · 当前页、locator 或区域截图;普通文件名固定落在 snapshotDir act.click · 按 CSS 或结构化 Playwright locator 点击 act.fill · 向 CSS 或语义定位的 input/textarea 填入文本,整体替换(原 browser_type) act.type · 逐键输入(pressSequentially),触发每个按键事件;用于自动补全、掩码输入框 act.clear · 清空输入框并触发 input 事件,受控输入的状态会同步 act.wait · 等待 locator 状态、URL glob、networkidle 或固定时间 act.press · 对 locator 或全局键盘发送按键 act.select · 按 locator 选择一个或多个 option value act.check · 按 locator 勾选或取消勾选控件 act.hover · 悬停 CSS 或语义 locator 并返回页面状态 act.scroll · 纵向滚动(触发懒加载) act.upload · 把现有本地文件设置到 input[type=file];绝对路径、数量和总大小受限 inspect.console · 读取本次显式捕获的脱敏 console 记录 inspect.requests · 读取本次显式捕获的失败及 HTTP 4xx/5xx 请求;无 body/header script.evaluate · 在当前页执行最长 20,000 字符的 JavaScript 表达式,返回最多 100,000 字符 JSON script.catalog · 列出内置只读脚本及其 SHA-256 script.validate · 解析外部 UserScript 的元数据、域名、grant、能力与哈希,不执行 script.run_builtin · 在独立 Playwright context 中运行内置只读脚本 script.run_userscript · 运行外部 UserScript;强制域名匹配,审批策略由模式决定 runtime.status · 运行时状态(含 automationMode、已暴露工具/动作及各类审批策略) runtime.install · 安装 playwright chromium(runtime.status 报缺失时执行一次) automation.run_recipe · 最多 25 步 Playwright Recipe;支持等待、定位、表单、键盘、提取、断言和截图;schemaVersion: 2 启用严格定位、goto、clear 与 postconditions automation.search · 只有显式关键词调用才检索;可限定 active/draft/all、域名和类型,最多返回 retrievalTopK 条摘要 automation.develop · 按确切 ID 读取源码,或显式保存、静态校验、真实回放、convert(v1 转 v2 新草稿);永远不能激活资产 automation.run · 按 ID 运行已激活资产;再次执行限域和输入大小校验,审批由 automationMode 决定 opencli.status · 实际运行 OpenCLI doctor,报告 daemon/extension/profile 连通性 opencli.catalog · 对 OpenCLI 大目录按 query/site/access/strategy 过滤,单次最多返回 100 条 opencli.run · 通用 OpenCLI argv 网关;除 unrestricted 外触发 DSH 原生一次性审批 crawl.crawl · 匿名、有限广度遍历;默认同源,强制使用全局调用缓冲和单次页数/深度预算