dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
简体中文 | Français | Deutsch | Italiano | Русский | Español
= 0.12.2 (optional)"> = 22">
仓库:github.com/drscrewdriver/dsh-browser-cdp(原名dsh-ego-browser,源自上游 Fisfzy/dsh-ego-browser)|版本历史见 CHANGELOG.md
依赖 · 最低版本 · 推荐版本 · 说明 DSH (DeepSeek Harness) · 0.1.7-rc.1 · 0.1.7-rc.1 ~ 0.2.1-rc.1(精确枚举) · 精确枚举 5 个 rc 版本,engines 与全部 dsh peer 同串(无区间/caret):0.1.7-rc.1 · 0.1.7-rc.2 · 0.2.0-rc.1 · 0.2.0-rc.2 · 0.2.1-rc.1 · 0.2.1-rc.2;宿主对插件 API 向后兼容(0.2.0 的 composer/forkSession 为签名扩展,插件仅作调用方,免改)。声明式设置面自 0.1.7 引入(Config .volatile() 字段自动生成设置表单),0.2.0/0.2.1 延续该形态。DSH 0.1.2-rc.1 ~ 0.1.5-rc.3 请使用 0.17.x 版本线,0.1.0-rc.x / 0.1.1-rc.x 请使用 v0.8.0 及更早版本 dsh-better-sidebar · 0.12.2(可选) · ≥ 0.17.1 · 未安装时自动回退浮动观察球;< 0.12.2 可运行但外部链接拦截(urlTarget)静默降级 Node.js · 22 · — · harness 环境自带
DSH 全版本适配说明:本版本(1.2.1 起;1.2.2 起追加 0.2.1-rc.2)面向 DSH 0.1.7-rc.1 ~ 0.2.1-rc.2(精确枚举 6 个 rc):相对 0.1.7 线(v0.17.x)零代码改动,纯依赖/元数据换代——0.2.0 宿主对插件 API 向后兼容,本插件经 ctx.get('conversation').input 门面投递选区(不调 submit()、不 override),不在 0.2.0 变更影响面内。声明式设置面自 0.1.7 引入:插件不再注册任何设置节(ctx.settings 注册类 API 已被宿主删除),改为在 Config schema 上以 .volatile() 标记可配置字段,由宿主设置页自动生成表单;volatile 字段变更通过 loader/volatile-update 事件热生效,无需重载插件。核心宿主 API(defineTool、ctx.tools.register、ctx.subprocess.spawn、ctx.webServer.register、ctx.inject、ModuleLoader CJS factory、cordis.patch.yml)沿用 0.1.2 以来形态。DSH 0.1.2-rc.1 ~ 0.1.5-rc.3 请使用 0.17.x 版本线。
dsh-better-sidebar 适配说明:本插件通过 ctx.betterSidebar 服务(try-catch 防御性获取)注册侧边栏 Tab 并监听外部链接。关键 API 引入版本:
API · 本插件用法 · better-sidebar 引入版本 registerTab() / openTab() / ctx.betterSidebar · Tab 注册 + 打开 · v0.9.0+ TabDescriptor.single · 单实例 Tab · v0.9.0+ TabDescriptor.urlTarget · 外部链接拦截 · v0.12.2+(低于此版本链接拦截静默失效)
DSH 版本支持详情:v0.8.2 → v0.8.3 主要变更:合并 6 个社区 PR(root/xvfb/macOS headless 适配、rc.1 兼容、Windows 稳定性),修复无认证 /api/bcdp/* 路由安全漏洞、无 dsh-better-sidebar 宿主 client 启动失败(#29)、Windows 冷启动回归(#22 引入的 Xvfb 误判),并修复 gateway 设置白名单缺 runtimeArgs/chromeArgs。适配点:client 运行时改名(@deepseek-ai/dsh-client-store)、client 模块注册 id 与装载行名按声明包名、dsh.client.inject 仅声明真实模块图行、webServer 以嵌套注入交付(可选服务),并同步侧边栏 Tab(dsh-better-sidebar)模式。
侧边栏支持(dsh-better-sidebar):当宿主安装了 dsh-better-sidebar(推荐 ≥ v0.12.2)时,实时观察窗注册为侧边栏原生 Tab——「Agent 浏览器」出现在侧边栏「+」菜单中,点击即打开并随侧边栏抽屉固定展示;agent 首次调用 bcdp_* 工具时会自动打开该 Tab(v0.8.5 起按调用会话作用域打开,多会话不再弹错位置)。未安装 dsh-better-sidebar 时自动回退为右下角浮动观察球(#dsh-ego-fab)模式。两种形态共用同一套 SSE 实时推流 / 点击 / 输入 / 下载捕获能力。观察窗还提供一个「弹出窗口」按钮:无头(headless)运行的 agent 浏览器可一键替换为同 Profile 的有头窗口(标签页保留),方便手动接管。
登录态导入(v0.8.5 新增):工具 bcdp_login_import,把你日常 Chrome/Edge/Brave 里的登录 cookie 按域名复制进 agent 浏览器(真实二进制无头启动 + CDP 透传读取,兼容 Chrome 127+ 的 App-Bound Encryption,不做离线解密;源浏览器运行中可选择优雅关闭后导入,窗口下次启动自动恢复)。cookie 值不出现在任何日志与输出中;导入前自动备份源 cookie 库,异常清空自动还原。配合默认的磁盘持久化 Profile,导入的登录态跨重启永久保留。
一款 CDP 浏览器代理:把 CitroLabs/ego-lite(给 AI Agent 用的 Chromium)作为内置运行时接入 DeepSeek Harness,以 **34 个结构化 bcdp_* 工具驱动浏览器,并配一套实时观察前端口**——agent 后台操作网页时,你能像看直播一样看到它正在浏览的每个页面,还能直接操作它。
一点私藏的独特之处(self-observation):agent 用的就是这一个 Chromium——连它操作 DSH 自身(管理会话、任务看板、调设置)时,观察窗也实时显示、你能随时接手。不只是"看得见 agent 在网页上干活",连 agent 操作 DSH 界面本身都是全程可见、可掌控的。
开箱即用:插件包内置 ego 运行时(runtime/,MIT,见 THIRD_PARTY_NOTICES.md)——无需克隆官方仓库、无需手动构建,--no-sandbox wrapper 随包自带,root / Docker / 无显示器一键跑。
同样把 ego-lite 接进 DSH,市面上已有同类插件用它只做了 3 个工具——一个 run 脚本、一个 help 指南、一个 status 体检,浏览器仍是后台黑盒。本插件走的是另一条路:把黑盒打开,并且一上来就把"看"和"控"的能力做到位。
能力 · 本插件(本仓库) · 同类插件(Da1dr1em/dsh-ego-browser) 结构化工具数 · 34 个,职责单一、可确定性调用 · 3 个(run/help/status) 实时观察窗(CDP JPEG / FFmpeg H.264 双后端 + 标签条 + 历史抽屉) · ✅ 有 · ❌ 无 监控窗鼠标直接操作真实浏览器(点击/拖拽/滚动回传 CDP) · ✅ 有 · ❌ 无 观察窗点选元素 → 捕获并引用进对话输入框([CDP-PICKS] 结构化块,人工指认目标) · ✅ 有 · ❌ 无 worker 单实例守卫 + 崩溃/重复自愈 · ✅ 有 · ❌ 无 下载捕获 bcdp_download / 人机验证检测 bcdp_captcha/bcdp_page_info · ✅ 有 · ❌ 无 平台自适应(Linux/macOS/Windows 自动探测 + root/无头/--no-sandbox 兜底) · ✅ 全平台 · 仅 Windows 预览宿主,需手动配 登录态落盘持久化 bcdp_auth_flush · ✅ 有 · ⚠️ 仅文档级说明
关键差异三条:
backendNodeId/tag/id 与语义描述,以 [CDP-PICKS] 结构化块并入对话输入框草稿(同页多元素自动合并编号)——agent 拿到的是精确目标,不用猜"你说的按钮是哪个"。以上对比基于公开可见的可核实事实:本仓库代码(bin/cdp-cast-worker.mjs实时推流 + CDP 输入回传、lib/index.js34 个注册工具、lib/cast-server.jshost 桥接、lib/client.js的deliverPickToConversation点选引用)与同类插件的源码/README(其src/tools.ts仅注册ego_browser_run/ego_browser_help/ego_browser_status)。此文档不含对任何他人的贬低——我们只陈述自己多实现并验证了哪些能力。
相对 ego-lite 本体,我们多做了这些(都可对照本仓库代码核实):
能力 · 说明(对应代码) 观察窗前端口 · ego-lite 本体是无头 CLI(只有 heredoc 脚本 + 文本输出);我们在其上加了 SSE 实时推流 + 标签条 + 历史抽屉 + 监控窗鼠标直操 + 点选元素引用进输入框(bin/cdp-cast-worker.mjs、lib/cast-server.js、lib/client.js 的 createPickControl/deliverPickToConversation),让"看"、"控"、"指"成为一等能力 开箱即用 + 跨平台自足 · resolveEgoEnv 自动探测 Chrome/Edge/Brave,内置 --no-sandbox wrapper,root / Docker / 无显示器免配置(lib/index.js);不必像官方那样先装一个 GUI 宿主 健壮性层 · 冷启动自动重试(只重试 CDP 瞬态,不吞真错)、worker 单实例守卫 + 崩溃自动重启、插件卸载 fire-and-forget 不阻塞宿主退出、前端帧缓存上限(withWarmupRetry / makeEnsureWorker / frameCache) 运维型工具 · bcdp_doctor(环境体检)、bcdp_captcha(人机验证探测)、bcdp_auth_flush(登录落盘)、bcdp_login_import(系统浏览器登录态导入)、bcdp_http(浏览器上下文请求)等,是原生 CLI helper 没有的一层 self-observation · agent 操作 DSH 自身界面时同样实时可见、可接手
我们不声称媲美官方 macOS App 的内核级快照或原生多窗口体验;本仓库解决的是"把同一套浏览器能力带进 DSH + Linux/WSL + 看得见"这件事。
通用浏览器不是为 agent 设计的,而 Web 上大量交互(登录态、验证码、动态渲染、表单、需真人会话的站点)只有真浏览器能面对——这正是本插件继承自上游 ego 系的 "让 agent 用你已登录的浏览器,而不打扰你"(官网)的由来。
本插件把它接进 DSH,并把最痛的一点——你看不见 agent 在干什么、也插不上手——用一套观察窗解决:
🌐 小球一点看直播;🟦 标签条切换/关闭;🕘 历史抽屉回看;🔍 缩放拖拽;🖱️ 监控窗直接接管真实浏览器。一句话:让 agent 在浏览器里干活,你在旁边既看得见、又随时能接手。
要求 · 说明 Node ≥ 22 · harness 环境自带 任意 Chrome / Chromium / Brave / Edge · 自动发现,或 EGO_LINUX_CHROME 指定;root 下用自带 wrapper DSH + dshx · 插件装载机制 带图形界面的 DSH Web(观察窗) · headless 会话仍可用 bcdp_* 工具,仅无观察窗
方式一:GitHub 直装(推荐)
dsh plugin --profile web add github:drscrewdriver/dsh-browser-cdp
# 也可锁定到某个 commit / tag:
dsh plugin --profile web add github:drscrewdriver/dsh-browser-cdp#v0.9.0github:安装由 pnpm 经codeload.github.com拉取仓库 tarball,无需向 npm registry 发包;直接使用仓库中预构建入库的 `lib/`(files仅含lib/、bin/、runtime/、cordis.patch.yml、dsh-plugin.json),因此不触发任何构建脚本,也不需要 devDependencies。host 入口lib/index.js、客户端lib/client.js、workerbin/cdp-cast-worker.mjs均随仓库分发。
方式二:本地 tarball / git URL
dshx install dsh-browser-cdp <dsh-browser-cdp.tgz> # tarball 或 git URL 均可
dshx list # 应显示:[on] dsh-browser-cdp包名迁移说明:本插件包名是 `dsh-browser-cdp`(曾用名dsh-ego-browser、别名@dsh-external/ego-browser)。DSH Desktop 2.0.5 起增加了「profile 依赖名 == 包实际 name」的一致性校验,若 profile 仍用旧名引用,启动会挂进恢复模式。升级后请把 profile 的package.json依赖键 和dsh.profile.bundles条目两处都改为dsh-browser-cdp:
- "dsh-ego-browser": "github:Fisfzy/ego-browser",
+ "dsh-browser-cdp": "github:drscrewdriver/dsh-browser-cdp",- "dsh-ego-browser",
+ "dsh-browser-cdp",观察窗设置中可选 captureBackend=auto|cdp|ffmpeg(默认 auto,当前解析为 CDP)、画质档位、CDP FPS/JPEG 质量/最大宽度,以及 FFmpeg FPS/最大宽度/码率/编码器/自定义路径。插件先检测自定义路径、系统 PATH 和托管缓存;GitHub 下载可用 githubMirror 替换 https://github.com,例如 https://gh-proxy.com/github.com。FFmpeg 码率范围为 500-20000 kbps,低/平衡/高档默认 2000/4000/8000 kbps。
无需宿主侧任何配置:resolveEgoEnv 自动探测 root / 无显示器并兜底。观察窗 host 路由(/api/bcdp/spaces 等)仅在有 HTTP server 时注册,headless 是安全 no-op。
连接目标直接在设置里增删改(0.18.1 起,与 0.17.x 线同源):设置卡有两处入口——「起子插件设置」family 区的本插件 tab(装了 dsh-thinking-levels 时),以及插件详情页的设置卡(plugins.bundle.config,不装 thinking-levels 时的独立入口);两处渲染同一份组件。每行支持:启用开关、激活、标签/端点/CLI 路径就位编辑、逐行探测、上移/下移、删除(删激活行会同时清空激活,绝不顺延);底部内联表单直接添加 CDP 端点或本机 ego CLI(第二条本机 CLI 会被拒绝)。写回落在活动 profile 的 cordis.patch.yml,跨重启保留。0.18.1 之前,连接序列只能在 profile 的 cordis.patch.yml links 中手工维护。
设置面板里的连接列表是有序的——顺序即优先级,被激活的那一项驱动每一次 bcdp_* 调用。列表元素有两种类型:
类型 · 它做什么 · 约束 CDP 端点 · 把一个已开调试端口的浏览器地址交给内置运行时(注入 EGO_LINUX_CDP_URL),运行时附着上去 · 可多条 本机 ego CLI · 由本机 ego CLI 自己驱动它本机的 ego-lite 浏览器——不注入任何端点 · 仅限本机,全局至多一条
为什么需要第二种:注入用的 EGO_LINUX_CDP_URL 是内置 Linux 移植版的私有契约,macOS 上用 ego lite app 附带的那个原生 ego-browser 根本不读它。所以在只有"CDP 端点"这一种类型时,macOS 用户无法用上自己那个已登录的 ego-lite——只能连远端端口,或让移植版另起一个 stock Chromium。本机 CLI 类型补的就是这条路。
解析顺序(cliPath 留空时):显式路径 → PATH 上的 ego-browser → macOS app 包内 helper(/Applications/ego lite.app/…/Helpers/ego-browser)→ 插件内置运行时。
两个默认值值得知道:
--sdk-path 。这一点很关键:只在探测时带、执行时不带,脚本首行就会崩 ReferenceError: taskSpaces is not defined(1.2.4 修复的 P0)。若 CLI 不认这个旗标,探测会记一条提示并自动重试一次不带它;此时只有 CLI 自带的 harness 确实暴露 taskSpaces / browser 门面才算就绪,否则显式判失败并给出缺失的门面名——不再假阳性。taskSpaces / browser / page 全局,不启动也不等待浏览器,实测约 300 ms;bcdp_status 走同一判据。本插件通过注入 SDK 使用 taskSpaces.*(插件侧 API),而官方 ego-browser skill 脚本使用原生 taskSpace()(app 侧 API)。二者驱动的是同一个 ego lite,task space 也是共享的:同时用插件工具和官方 skill 脚本操作同一空间,可能互相抢控制权。建议二选一,以插件为准;确需跑官方脚本时,先停用本插件的 ego-cli link。
与其它开关的关系:
cdpMode:auto 按激活项(两种类型都行);remote 只接受 CDP 端点,激活项是本机 CLI 时会显式报 mode-kind-mismatch;local 走受管本地启动器。remoteEnabled(远端总开关)只管远端 CDP,不影响本机 CLI 连接。allowLocalFallback / localHeadless / localUserDataDir 只作用于 CDP 端点的回落与受管启动。bcdp_doctor 会报告当前序列类型计数、CLI 实际解析到的路径与形态,以及(若同机装了上游 dsh-ego-browser)一条共存提示。
Lightpanda 是面向 AI 的无头文本渲染浏览器(AGPL-3.0,本插件仅作 CDP 客户端使用)。它对插件来说就是一个普通 CDP 端点:设置面板添加并激活后,probe 会从 /json/version 的 Browser: Lightpanda/… 自动识别引擎,badge 与 bcdp_doctor 显示 engine,能力降级自动生效(无需任何配置)。
系统 · 方式 Linux(建议本机直装测试) · curl -fsSL https://pkg.lightpanda.io/install.sh \ · bash(装入 ~/.local/bin,确保 PATH 含它)→ lightpanda serve --host 127.0.0.1 --port 9222 macOS(建议本机直装测试) · 同上一键脚本(aarch64)→ 同 serve 命令 Windows(内置方案 = WSL2,无原生版) · 管理员 PowerShell wsl --install → 重启 → wsl --install -d Ubuntu → WSL 内同 Linux 一键脚本 → WSL 内 lightpanda serve …;WSL2 自动把端口映射到 Windows localhost(二进制只存在于 WSL 内,宿主侧没有文件,属预期) Docker(备选) · docker run -d --name lightpanda -p 127.0.0.1:9222:9222 lightpanda/browser:nightly
装好后在本插件设置面板添加 CDP 端点 http://127.0.0.1:9222 并激活即可。可选:export LIGHTPANDA_DISABLE_TELEMETRY=true 关遥测。
能力 · Lightpanda 上的行为 导航 / JS / 点击 / 填表 / 键鼠 / 快照(AX 树)/ HTTP / 登录导入 / 等待族 · 无损可用 bcdp_screenshot · PNG 文本级渲染(无像素引擎,视觉保真低于 Chrome;runtime 本就发 png,零改动兼容) jev 视觉链(bcdp_jev_frame 等) · 投影自动改发 PNG;输出带 engine / rendering: text 元数据 观察窗实时画面 · 关闭——无 screencast 且无窗口,worker 不启动采集循环,面板显示降级提示 面板点选(inspect 路径) · 关闭——无 Overlay 域 / bindingCalled 事件,返回 engine-unsupported(i18n);坐标回退路径保留 bcdp_download · 关闭——无 Page 下载事件,调用即返回结构化错误(不会挂起超时) bcdp_auth_flush · 返回 degraded: true——引擎无 Storage.flushCookies,cookie 仅随引擎进程存活
识别失败的端点(engine: unknown)保持全能力——误判只应"少给",不应"错给"。
bcdp_,完整索引见 bcdp_help)类别 · 工具 任务空间 · bcdp_space(open / close / list / handoff / takeover) bcdp_status 页面读取 · bcdp_snapshot(语义树) bcdp_page_info bcdp_read_element 导航/标签/等待 · bcdp_navigate(复用 tab / reload) bcdp_tab(list/current/new/switch/close) bcdp_wait(duration / selector / url / response / load / function / request / event) 交互 · bcdp_click bcdp_fill bcdp_hover bcdp_drag bcdp_select bcdp_check bcdp_key(type/insert) bcdp_scroll 执行/调试 · bcdp_js(页面求值) bcdp_cdp(原始 CDP) bcdp_script(多步脚本;verbatim:true = 原 bcdp_cli 的裸 heredoc) 输出 · bcdp_screenshot bcdp_download bcdp_upload 会话/安全 · bcdp_auth_flush(登录落盘) bcdp_login_import(跨浏览器登录态导入) bcdp_captcha bcdp_dialog 元工具 · bcdp_help bcdp_doctor bcdp_http 评审(JEV/Laya,外接判定服务可选) · bcdp_jev_status bcdp_jev_frame bcdp_jev_ask bcdp_jev_run bcdp_jev_attempt
wait / space / escape 三族已按 op 合并,旧工具名移除(不保留别名——别名同样吃 schema 预算,等于没省)。其余工具名不变。
旧调用 · 新调用 bcdp_wait {ms} · bcdp_wait {op:"duration", ms} bcdp_wait_for_selector {selector, state, timeout} · bcdp_wait {op:"selector", selector, state, timeout} bcdp_wait_for_url {pattern, timeout} · bcdp_wait {op:"url", pattern, timeout} bcdp_wait_for_response {url, body, timeout} · bcdp_wait {op:"response", url, body, timeout} bcdp_wait_page {op:"load"\ · "function"\ · "request"\ · "event", …} · bcdp_wait 同名 op(op 取值不变,直接搬家) bcdp_space_open {name} · bcdp_space {op:"open", name} bcdp_space_close {name, keep} · bcdp_space {op:"close", name, keep} bcdp_cli {script} · bcdp_script {script, verbatim:true}
op合并后各 op 的必需参数写在工具描述里;缺参会返回带 op 名的reason(如bcdp_wait: selector is required for op=selector),不会静默降级。
34 个工具全量注册时,每个会话每一轮都要为它们的 schema 付费(挂载级实测 description + parameters 序列化 = 22,224 字符 ≈ 6.4K token;1.3.2 的 38 工具基线用同一口径实测为 20,951,1.5.0 三族合并后仅高出 +6.1%,远低于 ≤+15% 门禁),而不碰浏览器的会话一个也用不上。插件因此把「谁能出现在模型面前」收成一处策略(src/toolTiers.ts),分八批注入。
8 批 ≠ 8 个开关。批次是*注入时机*,开关是*用户面*(§9.3「开关与批次解耦」)。当前 4 个开关管 8 批:toolBrowse管 act+observe+wait 三批并按波次放行,toolExtended管 power+session,toolEscape、toolJudge各管一批。所以「toolBrowse= 14 个」指的是并集上限,实际第一波只放 9 个。
批次 · 成员 · schema · 何时出现 core 常驻(6) · bcdp_status bcdp_doctor bcdp_help bcdp_space bcdp_navigate bcdp_snapshot · 3,589 · 永远在场,不可封印——否则 lazy 模式连解锁入口都没有 act 动手(9) · click / fill / key / hover / scroll / select / check / drag / tab · 5,243 · lazy 下首次活动放第一波 observe 观察(4) · screenshot / page_info / read_element / js · 2,037 · 第二次活动 wait 等待(1) · bcdp_wait(duration / selector / url / response / load / function / request / event) · 1,925 · 第三次活动 power 重量级(5) · raw CDP / http / upload / download / dialog · 3,283 · 首次活动(同 toolExtended) session 登录态(3) · captcha / auth_flush / login_import · 1,694 · 首次活动(同 toolExtended) escape 逃生舱(1) · bcdp_script(verbatim:true = 原 cli 的裸 heredoc) · 1,389 · 冷启动即在,不吃活动闸(见下) judge 评审链(5) · bcdp_jev_* · 3,064 · 除解锁外,还要求配了 JEV 或 Laya Key 合计 · 34 · 22,224 · —
设置项在插件设置页最上方的「工具封印」分块(全部 volatile,翻完当场生效,不重启插件)——一个开关管一组批次,形状照 dsh-prime-memory 的「工具封印」:
lazy(默认:常驻 core + escape,其余首次 bcdp_* 调用后按开关注入)/ always(挂载即全量,历史行为)。core 级不给开关(封了就没了活动入口)。escape 批为什么单独成组、且不等活动:bcdp_script 是唯一能在一次调用里干完任意多步任务的入口(page / browser / taskSpaces / fetch / cdp 全预置),其余 33 个工具能做的事它都能做。所以它必须始终可达——否则模型遇到「结构化工具没覆盖」的情形时手里没有任何逃生手段。这也让它成为按需只开逃生舱的合法姿势:关掉 toolExtended、留着 toolEscape,只留 1 个工具。
行为要点:
bcdp_* 调用的公共出口上,工具体不知道分级存在;bcdp_status / bcdp_help / bcdp_doctor 自身也算活动信号(读了指南就得有工具可用)。lazy + idleTimeoutMin > 0 时,空闲回收把后台浏览器停掉的同一刻收回扩展面;下次活动重新铺开。always 模式不受影响。legacyEgoToolNames 的 ego_* 别名跟随其 bcdp_* 本体的级别。bcdp_doctor 报告首行(tool injection: mode=lazy browse=open extended=open escape=open judge=open judgeKey=none active=no → live 7 / sealed 27),不用猜。toolInjection 改成 always(34 件全在场需再配一个评审 Key)。.default():volatile 字段的表单描述符直接拿 schema 默认值,不写默认会出现「面板显示 A、运行时用 B」。取舍提醒:窄工具(一个动作一个工具)是模型写对参数、少重试的护栏。1.5.0 只合并了 wait / space / escape 三族同源冗余(41 → 34,省 1,869 字符 schema):五个 wait 共用同一 preamble 与 timeout 语义、三个 space 本就是同一个 op 工具的碎片、cli/script 是同一 heredoc 运行时。代价是这三族的旧工具名不再存在(见上方迁移表);交互原子(click/fill/key…)不合并,因为它们是模型写对参数的护栏。