前言¶
在 DeepSeek Harness(DSH)里发消息,常见路径是点发送按钮或快捷键。输入框卡片面积不小,但「发送」往往仍是一个小目标;长对话里反复点按,也容易打断输入节奏。社区插件 dsh-pull-to-send 把发送改成一次拖拽:在输入框上按下、向上拉出一定距离后松手,即触发与发送按钮相同的主行为,并用 FLIP 动画把副本飞入新消息气泡。反悔时可以拖回输入框保留草稿,或拖出对话可投放范围直接作废。下面介绍它是什么、如何安装,以及手势与边界规则。
这是什么¶
dsh-pull-to-send 是 DSH 的客户端(web)插件,由维护者 dhdkfkfkf 发布在 GitHub(dhdkfkfkf/dsh-pull-to-send),社区目录页见 SkillHub 条目。实现为零构建、单文件 client.js,通过 bundle 的 cordis.patch.yml 注入桌面 Web 界面;当前 package 版本为 0.3.1,许可证 MIT。
它不改变后端协议,而是在界面上监听输入框(composer)区域的指针手势,在武装后调用发送按钮的程序化 .click(),从而在 React/Lexical 环境下走与手动点击相同的发送路径(README 称 CDP 探针已实测)。
核心功能¶
三种拖拽语义¶
README 用一张表概括行为,可归纳为:
| 操作 | 结果 |
|---|---|
| 拖出去:在输入框卡片(含周边 12px 缓冲区)按下,向上拉出卡片上边缘 ≥24px | 武装:输入框副本被拎起并跟随指针(阻尼、微放大、阴影);真输入框缩小变暗 |
| 武装后松手,且落点在可投放范围内 | 触发发送按钮当前主行为(空闲=发送,生成中=排队/插话);副本 FLIP 飞入新消息气泡,真气泡交叉淡入 |
| 拖回来:武装后指针回到输入框卡片内 | 解除武装:副本约 150ms 回位消失,草稿保留;同一按压内可再次拉出 |
| 拖出界:武装后指针离开对话区可投放范围 | 立即取消:副本弹回,本次按压作废,松手不会发送 |
未达拉出阈值、横向拖拽占优、松手时指针仍在卡片内、按 Esc 或 pointercancel 等情况,按取消处理,副本约 320ms 沿原路弹回。
可投放范围¶
松手发送有效,仅当指针落在下列矩形内(README 原文边界):
- 左:输入框卡片左缘
- 右:对话区背景右缘(为识别贴边越界,右边界内缩 8px 安全余量)
- 上:对话区顶格
- 下:输入框卡片顶缘
范围外(屏幕边缘、任务栏、其他窗口等)一律视为取消。
不打断原有输入¶
- 框内拖选:须越过上边缘并达到 24px 才武装,框内文本选择保持原生。
- 空输入或发送按钮禁用:不武装。
- IME 组合输入:组合开始即取消手势,避免半截拼音误发。
- 触屏:仅鼠标与笔;手指滚动不触发。
- 卡片上的按钮、链接、菜单:不抢事件。
- 拖到窗口外松手:视为取消。
界面无额外文字提示,武装状态仅靠视觉反馈(副本拎起)。
动画与可调参数¶
v1 无设置面板;参数为 client.js 文件顶部具名常量,例如:
| 常量 | 默认 | 含义 |
|---|---|---|
ARM_DISTANCE |
24px | 越过输入框上边缘多少距离才武装 |
EDGE_MARGIN |
8px | 可投放范围与窗口边缘的安全余量 |
DISARM_RETURN_MS |
150ms | 拖回卡片内时副本回位时长 |
HIT_PAD |
12px | 卡片四周隐形响应缓冲区 |
DAMPING |
0.95 | 副本跟随指针的插值系数 |
MAX_SCALE |
1.02 | 拎起时最大放大 |
FLIP_MS |
400ms | 松手后副本飞入气泡时长 |
BUBBLE_LEAD_MS |
80ms | 真气泡提前淡入提前量 |
RETURN_MS |
200ms | 真输入框回位时长 |
CANCEL_MS |
320ms | 取消回弹时长 |
改代码后可通过 dsh-hmr 热更;首次添加 bundle 仍需重启 DSH(见安装节)。
兼容性与排错¶
插件同时兼容 claude-style 与原生界面(共用 data-composer-* 锚点);多会话窗格各自绑定手势。锚点查找三层降级:语义属性 → aria-label / contenteditable → 类名模糊匹配。
若手势异常,可在浏览器控制台执行:
window.__DSH_PULLTOSEND__.disable() // 立刻停用手势(不用重启、不用卸载)
window.__DSH_PULLTOSEND__.version // 确认插件是否加载
disable() 会移除监听器并收回已拎起的副本;刷新页面后恢复。
安装与启用¶
在已安装 DSH CLI 的机器上,按 README 官方命令为 desktop profile 添加插件:
dsh plugin --profile desktop add "github:dhdkfkfkf/dsh-pull-to-send"
装完后重启一次 DSH(添加 bundle 需要重启)。之后若只改插件源码,可走 dsh-hmr 热更,无需每次重启。
典型用法¶
- 确认插件已加载(可选):控制台查看
window.__DSH_PULLTOSEND__.version。 - 在对话输入框卡片区域按下指针(注意 12px 缓冲区仍算有效起点)。
- 向上拖动,直到拉出上边缘至少 24px,看到输入框副本被拎起(武装)。
- 在可投放范围内松手 → 消息按当前发送按钮逻辑发出,并播放 FLIP 飞入动画。
- 若不想发送:武装后将指针拖回输入框内(保留草稿),或拖出对话区可投放范围(本次按压作废)。
生成中若发送按钮处于排队/插话行为,武装后松手会走同一主行为,与点小按钮一致。
适用场景与注意¶
适合:习惯大手势、希望减少「瞄准小发送按钮」操作的 DSH 桌面 Web 用户;需要在发送前用拖拽明确「确认/取消」、且能接受纯视觉反馈(无文案提示)的场景。
注意:
- 插件以当前 DSH 进程权限在客户端注入脚本运行;安装前请自行阅读 仓库源码 与 MIT 许可证,确认符合你的安全与合规要求。
- 社区目录 SkillHub 独立于 DeepSeek / 幻方,并非官方应用商店;DSH 生态理念是「一切皆插件」,选型以仓库 README 与版本为准。
- 触屏纯手指操作不适用;依赖鼠标或笔。
- 临时禁用手势用
disable(),卸载插件需走 DSH 插件管理流程(README 未展开卸载命令,以你本地 DSH 文档为准)。
结尾¶
dsh-pull-to-send 把发送收敛为「按住、上拉、松手」一次 stroke,并用拖回与拖出界两种取消路径降低误发;动画与阈值在单文件常量里可调。若要在桌面 DSH 里试用,从官方安装命令添加 bundle 并重启即可。