Skills Plugins MCP Prompt Model 导航 博客 资讯 我的中心
界面增强 #dsh-plugin

dsh-composer-keys

DeepSeek Harness Web 输入框键位自定义:把 Enter、Ctrl/Cmd+Enter、Shift+Enter 或任意组合键分配给发送、换行、打断三个动作,支持跨动作互斥迁移与持久化保存,默认保持 DSH 原生行为。

zlqd123 @zlqd123 ⬇ 1 ★ 0 main

安装

dsh plugin --profile web add github:zlqd123/dsh-composer-keys
下载安装清单

需要可复现安装时,可在仓库后追加 #commit 固定提交。

DeepSeek Harness Web 输入框键位自定义:把 Enter、Ctrl/Cmd+Enter、Shift+Enter 或任意组合键分配给发送、换行、打断三个动作,支持跨动作互斥迁移与持久化保存,默认保持 DSH 原生行为。

该插件未提供要点说明,请参考仓库 README。

dsh-plugin
  1. 安装并启动 DeepSeek Harness:npx @deepseek-ai/dsh web
  2. 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
  3. 用 dsh plugins list 确认已安装,必要时重启 Harness 生效

插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。

代码仓库github.com/zlqd123/dsh-composer-keys
许可证MIT
主要语言main
下载量1
GitHub 星标0
最近推送2026-09-17
收录日期2026-09-19
分类界面增强

事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。

以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。

# dsh-composer-keys

> **⚠️ AI 生成声明 / AI-Generated Notice**
> 本项目(代码、文档、测试)由 **AI 助手(DeepSeek Harness 智能体)** 生成,经人工在真实环境中测试验收。
> This project (code, docs, tests) was **generated by an AI assistant** (a DeepSeek Harness agent) and manually verified against a live environment.

  把「发送」和「换行」分配给你顺手的键 / Assign send & newline to the keys you like

中文 | [English below](#english)

`dsh-composer-keys` 是 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web 前端的输入框按键自定义插件:把 **Enter、Ctrl/Cmd+Enter、Shift+Enter 或任意自定义组合键**(如 Ctrl+S、Alt+Enter)自由分配给「发送」「换行」「打断」三个动作。

**默认保持 DSH 原生行为**——装上插件后一切照旧,只有你主动改绑才会变化。

## 效果图

![设置页中的「输入框按键」行](docs/setting1.png)

![键位配置面板](docs/setting2.png)

## 特性

- **自由分配**:「发送」「换行」「打断」各自绑定任意一组组合键;同一按键不能同时属于多个动作(录制时自动迁移,优先级:发送 > 换行 > 打断)。
- **任务打断**:「打断」中断当前打开会话正在运行的任务,等同于输入框的停止按钮——走同一条原生取消管线(含子代理地址路由)。任务运行时在页面**任意位置**生效;对话框/菜单打开、输入法组合中自动让路;空闲时按下不吞键、零副作用。默认无绑定。
- **快速预设**:`DSH 原生`(Enter=发送 / Shift+Enter=换行 / Ctrl+Enter=加速提交)与 `微信风格`(Ctrl+Enter=发送 / Enter 或 Shift+Enter=换行)一键切换。
- **两处入口**:Settings → General 的「输入框按键」一行;聊天输入框工具行右侧的小键盘按钮。两者打开同一个配置面板。
- **持久化**:键位存入 DSH 用户设置文档的 `composer-keys` 命名空间——与主题、语言等原生偏好同一条通道,重启保留、跨设备跟随用户文档。
- **深浅色自适应**:面板样式全部引用 DSH 官方语义 token,随主题自动切换。
- **即时生效**:改绑后无需刷新页面。

## 与原生「繁忙时 Enter 键行为」设置的关系

两层机制正交,互不冲突:

| 层 | 归属 | 管什么 |
| --- | --- | --- |
| 手势 → 动作 | **本插件** | 哪个键触发「发送」、哪个键触发「换行」 |
| 动作 → 忙碌语义 | **DSH 原生** | 智能体忙碌时提交是「排队」还是「转向」(即原生的 busy-Enter 设置) |

具体衔接规则:

1. 命中「发送」的手势会被重放为一个合成的普通 Enter 键事件,由 **DSH 原生的提交管线**完成发送——斜杠菜单仲裁、空草稿防抖、忙碌时的排队/转向判断全部保持原生逻辑;
2. **只要键位偏离出厂默认,所有发送键(含 Ctrl/Cmd+Enter)统一遵循原生设置的「本值」行为**——忙碌时按主设置排队或转向,不再保留 Ctrl/Cmd+Enter 的"另一行为"反向特性;
3. 仅当键位保持出厂默认时,插件完全不介入,一切手势(含 Ctrl/Cmd+Enter 的反向特性)保持纯原生。

一句话总结:**插件决定"哪个键发送",原生设置决定"忙碌时发送意味着什么"。**

## 安全与边界

- **零干预默认**:键位等于出厂默认时,所有原生手势直接放行,插件对页面没有任何行为影响;一旦改绑(含预设),全部已绑定手势统一接管并按普通 Enter 重放。
- **输入法安全**:中文/日文等 IME 组合输入期间的 Enter(选字)永远不会被拦截。
- **范围最小**:只作用于主聊天输入框(依赖其稳定的 DOM 锚点 `[data-input-scroll]`);审批面板、会话重命名框等其他输入区域不受影响。无活动会话的首屏(hero 界面)不渲染工具按钮属正常行为。
- **无循环风险**:插件自己重放的合成事件通过 `isTrusted=false` 识别并放行。
- **优雅降级**:settings 或 slots 服务不可用时,键盘引擎仍然工作(仅失去持久化或 UI 入口)。

## 安装

从本地 clone 安装:

```bash
dsh plugin --profile web add /path/to/dsh-composer-keys
```

> Git Bash / MSYS 下请使用正斜杠路径(如 `D:/net/GitHub/dsh-composer-keys`),反斜杠会被转义吞掉。

重启 `dsh web` 后生效。卸载:

```bash
dsh plugin --profile web remove dsh-composer-keys
```

已在 DSH `0.1.1-rc.2`(Node 26, Windows 11, pnpm 11 hoisted profile)上验证。

## 使用

1. 打开 Settings → General 找到「输入框按键」行(或点击输入框右下角的小键盘图标),点「配置…」;
2. 在「发送」「换行」「打断」区块点「+ 录制按键」,然后按下想要的组合键(Esc 取消;**录制打断键时按 Esc 即绑定 Esc**,取消改为再点一次按钮);
3. 点击已录制的键位标签上的 × 可移除;清空「发送」的全部键位后只能通过发送按钮发送(面板会提示);
4. 底部预设一键回到「DSH 原生」或切换「微信风格」。

## 工作原理

- 浏览器半件是手写的 lazy-CJS bundle(`window.__ModuleLoader__.load({id, factory})`),无构建步骤;
- 宿主半件只做一件事:向 Host 设置服务注册 `composer-keys` 命名空间 schema,让浏览器半件的 `ctx.settingsScope.bind()` 可以读写持久化配置(apiproxy 对所有注册命名空间一视同仁地提供给 Web 端);
- **客户端插件的 inject 契约**:工厂必须返回 `{ apply, inject: ['locale', 'slots', 'settingsScope'] }`——vendored cordis 对未声明服务的属性访问会直接抛 `cannot get property X without inject`,导致整个 entry 引导失败(页面横幅 "Failed to load plugins")。这是本插件踩过的坑,写在这里给其他插件作者参考;
- 「发送」=重放合成普通 Enter(见上文两层语义);「换行」=在 DSH ≥0.1.5 的 Lexical 编辑器中,从当前编辑器的命令注册表取出 `INSERT_LINE_BREAK_COMMAND` **对象本身**并 dispatch,保持草稿、选区及撤销历史同步;旧 textarea 仍使用原生编辑和 value setter 回退。命令按对象身份匹配,不能传命令名字符串,也不能用另一份 Lexical 导入的同名对象;
- 面板样式仅引用真实存在的 DSH token(`--dsw-alias-bg-layer-*`、`--dsw-alias-border-l*`、`--dsw-alias-label-*`、`--dsw-alias-interactive-bg-hover`、`--dsw-alias-brand-primary`、`--dsw-alias-bg-mask-1`)。

## 已知限制

- DSH 大版本升级若改变输入框 DOM 结构(目前锚点是 `[data-input-scroll]`)或调整语义 token 名,拦截/配色可能失效。Lexical 换行适配依赖 `__lexicalEditor`、`_commands` 与命令的 `type` 标签:若宿主不再提供这些字段或命令拒绝处理,插件会**阻止已绑定的换行键并输出控制台警告**(避免 Enter 意外发送草稿),不会绕过编辑器直接修改 DOM;
- 极端自定义主题下对比度可能欠佳(token 兜底为浅色值)。

## English

A [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) web-composer plugin that assigns **any chord** — Enter, Ctrl/Cmd+Enter, Shift+Enter, or custom ones like Ctrl+S — to the **Send**, **Newline**, or **Interrupt** actions. Ships with native behavior by default; nothing changes until you rebind.

- Two presets: **DSH native** and **Chat style** (Ctrl+Enter sends; Enter/Shift+Enter newline), plus free per-action recording with automatic cross-action migration.
- **Interrupt** aborts the open session's running task through the same native cancel pipeline as the composer stop button (subagent-address routing included). Works anywhere on the page while a task runs; yields to dialogs/menus/IME; idle presses pass untouched. Unbound by default.
- Bindings persist in the user-settings document (`composer-keys` namespace); two entries into one panel (Settings → General row + composer toolbar keyboard button).
- While busy, queue-vs-steer follows the native "Busy Enter behavior" setting uniformly for every bound send key once bindings deviate from defaults.
- Theme-aware styling via official DSW semantic tokens; zero-intervention while bindings stay pristine; synthetic replays are `isTrusted=false`; IME composition never intercepted.

Install: `dsh plugin --profile web add /path/to/dsh-composer-keys`, then restart `dsh web`.

> **AI-generated notice**: this project was generated by an AI assistant and verified manually in a live environment.

## 开发 / Development

```bash
npm test
```

测试用 Node 内置测试运行器直接评估 `client.js` 的真实源码(提取其中的纯手势引擎与换行路径),无需构建、无第三方依赖。覆盖:手势归一化、绑定解析(含 mod 别名)、动作解析、零干预判定、互斥迁移、脏数据清洗、显示格式化,以及 Lexical 命令对象身份匹配、不可用时防误发送、IME/合成事件放行。

本地浏览器回归(本地工具,不写入 package.json):playwright-core 从本地安装 / `$PLAYWRIGHT_CORE_PATH` / npm 全局目录自动解析,浏览器自动探测系统 Chrome/Edge(`CHROME_PATH` 可显式指定):

```powershell
node test/newline-regression.mjs '<本地 dsh-client-ui-conversation/lib/client.js 的绝对路径>'
```

该脚本针对本地 DSH bundle 的 Lexical 和原生 composer keymap 建立隔离页面,以真实浏览器按键验证换行、发送回调、选区替换和撤销/重做;不启动 DSH 服务、不改用户设置、不发起模型请求,不等同于完整在线 GUI 部署验证。

### 新版换行兼容修复(DSH ≥0.1.5)

修复了 DSH 0.1.6-alpha.1 中自定义换行失效:旧实现用**字符串** dispatch Lexical 命令(Lexical 按对象身份匹配命令,字符串永远失配),且 DOM 编辑回退可能不同步编辑器状态。新实现使用当前编辑器注册的命令对象;命令不可用时阻止已绑定的换行键,避免 Enter 意外发送草稿。已在 DSH `0.1.6-alpha.1`(Node 26, Windows 11, pnpm 11 hoisted profile)上验证。更新插件后重启加载该插件的 `dsh web` 并刷新浏览器即可;此插件为手写浏览器 bundle,无需额外编译。

## License

[MIT](LICENSE)

数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。