# dsh-approval-autofocus 让 Web / 桌面端 DSH 的**审批卡一出现就能直接按 Enter 批准**,不用先点一下卡片。 零依赖的 DSH 客户端小插件。装上以后: - `Enter` → **允许一次** - `Esc` → **拒绝** [English](README.md) ## 它修的是什么 审批卡(`@deepseek-ai/dsh-client-ui-approval`)本身已经绑定了 Enter / Esc,但它的键盘处理有一道前提——**焦点必须已经在卡片内部**: ```js if (event.defaultPrevented || !event.currentTarget.contains(document.activeElement) || ...) return; ``` 而审批卡是**接管 composer 位置**渲染的:被替换掉的输入框以 `display:none` 隐藏,浏览器随即把焦点退回 ``,卡片自己又不主动取焦点。于是 Enter 落空,必须先点一下卡片正文才有效。 **不装插件时的土办法**:审批卡出现后,先点一下卡片正文(不是按钮),再按 `Enter`。 ## 它做什么 监听 DOM,一旦审批卡出现就把焦点移进卡片正文区域;但只在「焦点本来就空闲」时才移动: | 当前焦点 | 行为 | | --- | --- | | ``,或已因 composer 被接管而丢失 | 移入卡片 | | 终端、对话框、任何输入框 / 可编辑区域 | **不动**,绝不抢焦点 | 卡片自身的行为完全不变:拒绝按钮、`Esc`、输入法组合状态、待处理请求锁都照旧。 ## 安全说明 审批是安全边界,而这个插件刻意把它变成一键操作——有几点值得知道: - 插件**只移动焦点**,不代按任何按键、不自动批准任何东西;`Enter` 必须还是你自己按的。 - 只在焦点空闲(`` 或已被隐藏的 composer)时才接管;你在终端、对话框、任何输入框里打字时它什么都不做。 - 如果模型的输出试图诱导你按 `Enter`(提示词注入),卡片预聚焦意味着误触一次 `Enter` 就会批准。介意的话可以点走焦点——插件不会抢回来——或直接停用插件。 - 兜底选择器永远不会落在「允许一次」按钮或其他操作控件上:按钮和表单控件都被排除在外,误触 `Enter` 最坏也只是落在卡片正文里没有任何效果。 ## 安装 ### 从压缩包安装(推荐) 1. 把文件夹解压到一个**不会删、不会挪**的位置,例如 `~/插件/dsh-approval-autofocus`; 2. 侧栏 → **插件** → **添加插件**,粘贴该文件夹的**绝对路径**; 3. 装完点 **立即启用**;若页面提示需要重启,重启一次 DSH。 > ⚠️ DSH 是链接到这个目录的:目录被删或挪走,插件就会失效。 ### 从 Git 仓库安装 侧栏 → **插件** → **添加插件**,粘贴仓库地址即可。仓库需要一个真实的远端。 ### 手动挂到 profile 把包加进 `~/.dsh/profiles//package.json` 的 `dsh.profile.bundles`,或在该 profile 的 `cordis.patch.yml` 里插一行: ```yaml - insert: - id: approval-autofocus name: dsh-approval-autofocus ``` ## 卸载 在插件页关闭或卸载该组合包即可,插件目录之外的东西一概没动。 ## 测试 ``` node test/focus.test.mjs ``` 用自带的 DOM 桩跑 14 项检查(不引入任何测试框架或依赖):出现即聚焦、不重复聚焦、夺回被 composer 接管弄丢的焦点、不抢终端/对话框/编辑器的焦点、换新卡片会重新聚焦、卸载后停止观察(有无生命周期钩子两种路径都覆盖)。 ## 实现方式 DSH 的插件包由两半组成:Node 半侧(`main`)与浏览器半侧(`dsh.client` + `exports["./client"]`)。本插件的 Node 半侧是空的——它的存在只是让 profile 里有一行 loader 记录,从而让浏览器半侧被投递并挂载。浏览器半侧是一个普通的 `window.__ModuleLoader__.load({ id, factory })` 包,不 import 任何模块。 ## 已知边界 - 依赖卡片内部的 `data-approval-scroll` 属性,另有 `[data-approval-key] [tabindex="0"]` 兜底(已排除按钮和各类操作控件)。DSH 若大改卡片结构,插件会静默失效——表现为退回「先点一下卡片再按 Enter」的旧行为。 - 针对 DSH `0.2.0-rc.2` 验证。这是社区非官方插件,不属于 DSH 本体。 - 焦点移入后你若手动点走,插件不会反复抢回来。 ## 许可 MIT,见 [LICENSE](LICENSE)。