概览
dsh-browser
README / ZH
插件文档
目录摘要
dsh.pub 核对固定版本的组合包契约、运行时事实与分发语义;完整 README 请查看源仓库。
在 GitHub 阅读完整 READMELIMITATIONS
已知限制
- **只在 Windows 上验证过。** macOS 与 Linux 一次没跑过:`channel` 的查找、临时目录、进程回收是最可能出差异的部分。 - **面板显示它自己的页面,浏览器自己开/关的页面只有插件被告知时才被跟随。** 插件得知的页面(工具调用、被驱动页面的 `window.open`)各有自己的标签与镜像;带窗口的浏览器用它自己的标签条切页时,各个镜像都停在原地,因为插件并不知情。 - **侧栏里走 IME 的中文输入不工作。** 组合输入期间 `event.key` 是 `Process` 而不是字符,没有可转发的东西。非组合状态下,面板把可打印字符按文本发送、命名键按按键事件发送、带 Ctrl/Alt/Meta(或 Shift)的按键按它本来的组合键发送——所以 `Ctrl+A` 是选中页面而不是往页面里插一个 "a";AltGr 组合仍按文本发送,因为它在 Windows 上就是 Ctrl+Alt。粘贴与直接键入 ASCII 不受影响;agent 的 `browser_type` 也不受影响,它插入文本而不是重放按键。 - **剪贴板快捷键由面板自己处理。** `Ctrl/Cmd+C`、`Ctrl/Cmd+X`、`Ctrl/Cmd+V` 在面板里可用:复制/剪切把**镜像页里的选区**写进你的系统剪贴板,粘贴把你的剪贴板文本发给镜像页(`Input.insertText`,不重放按键)。镜像页自己收不到这些按键——Chromium 把剪贴板快捷键放在浏览器进程,注入的按键事件到不了那里(实测页面连 `keydown` 都没有)——所以走的是面板这一侧,那里的按键是可信事件。只搬纯文本;页面里 JS 调 `navigator.clipboard.writeText`(站点自己的"复制"按钮)写的仍是浏览器进程内部那个剪贴板,headless 下不会到系统剪贴板。 - **对话框在问题被读到之前就要回答。** 页面会阻塞到对话框被回答为止,所以答案必须由打开它的那次调用声明;没声明的那次调用会拒绝(dismiss)它并如实上报。常见形状是两次调用:第一次告诉你页面问了什么,第二次换成另一种回答。 - **只在页面重绘时出帧。** `Page.startScreencast` 是重绘驱动的,完全静止的页面几乎不出帧,面板保留最后一帧。这不是卡住。 - **最小化时不可交互。** 无头模式不受影响,但被最小化的带窗口浏览器会同时停掉画面与输入。 - **`maxInstances` 在面板上没有对应动作。** 到顶时工具调用会失败、新面板会被拒绝,错误信息里点名了这个上限,但面板没有提供释放一个槽位的操作;唯一办法是在某个面板里关掉浏览器,或者让那个会话被销毁。 - **工具作用页不会跟着面板走。** 在侧栏里点另一个浏览器标签只换你在看的那一页,不会换工具作用的页面——这是有意的(面板给眼睛、工具给 agent),要换就用 `browser_tabs` 的 `select`。 - **浏览器正在启动的那一瞬间连点两次入口只会得到一页。** 启动中的两次请求会 join 同一次启动,而一次启动只有一页初始页面;等它起来之后再点,每点一次就多一页。 - **没有 profile 选择器。** 会话的 profile 由它的 id 推导,因此无法让这个对话指向一个已有的 Chrome profile,也没有可供选择的 profile 列表。 - **不处理下载、上传、文件选择器与权限弹窗。** 这些发生在浏览器进程里,既没有呈现在面板上,也无法通过面板应答。 - **不做请求拦截与网络检查。** 这个插件驱动浏览器,它不是代理;要做这类事请用附加的 CDP 端口。 - **没有会话的调用会被拒绝。** 定时任务或没有自己会话的子代理会按设计失败;把它的调用算到别的对话的浏览器上,比失败更糟。 - **console 历史按页保存且有上限。** `browser_console` 保留当前文档最近 200 条(丢了多少会报出来),导航即清空:一条消息属于产生它的那份文档,和 ref 同一个道理。每条消息截到 500 字符,对象参数按协议自带的 preview 渲染——够看到 `{code: 500}`,不是深挖。 - **截图可以变成图片内容块**:当组合挂载了附件服务、且调用方模型声明了 image 输入时(`inline: true`);否则文件路径就是答案,而在读不了图的模型上要 `inline` 会被**明确拒绝并说明原因**,不会静默忽略。 - **没有发布到 npm。** 从 GitHub 或本地检出安装——见[安装](#install)。 ----- <a id="dev-note"></a>
