DeepSeek Harness Plugin: dsh-plugin-composer-expand

前言

DeepSeek Harness(DSH)默认的输入框高度受限,写字区仅 36px,且上限定死为 336px。在需要撰写长文本时,这种高度会压缩视线,导致输入体验不佳。

dsh-plugin-composer-expand 插件在输入框右上角增加了一个展开按钮。点击后,输入卡片会从文档流中脱离,变为一个浮层,高度设定为对话区高度的 50%。在这个展开态下,输入框获得独立滚动能力,且键盘行为从“发送”变为“换行”,只有发送按钮会提交消息。

核心功能

  • 展开入口:在输入卡片右上角添加常驻的展开按钮。
  • 浮层交互:展开后,输入卡片高度变为对话区高度的 50%(最小 200px,最大为对话区高度减 48px),以绝对定位贴底,不挤压或压缩下方的消息区。
  • 键盘行为变更:展开态下,Enter 键变为换行(走官方 Shift+Enter 路径),Ctrl/Cmd+Enter 保持发送语义,Esc 键收起浮层。
  • 滚动隔离:展开态下,面板内独立滚动,不带动对话列表,且支持滚轮事件拦截。
  • 动画效果:使用 FLIP 动画技术实现高度过渡,过渡时长 250ms,系统开启“减弱动态效果”时自动跳过。

技术实现要点

  • 布局策略:将输入座位设为绝对定位,同时将消息区的滚动容器 [data-conversation-scroll] 保持为 position: static。这是为了避免官方预设的 position: relative 钩子导致滚动容器高度为 0,从而保证消息区始终可滚。
  • 动画原理:由于折叠态的高度是 auto,无法直接使用 CSS transition。插件通过 FLIP 技术(先读当前高度,施加新布局,再读新高度,最后在两者之间补间)实现动画。
  • 按键拦截:在 document 捕获阶段拦截 Enter 键事件,阻止默认的发送行为,并通过 Lexical 的命令系统派发换行命令。
  • 按钮定位:按钮中心与输入框第一行文字(placeholder)垂直居中,且按钮上、右留白相等,通过 CSS 变量 --dsh-content-font-delta 适配不同字号。
  • 选择器依赖:依赖 Chrome 105+ 的 :has() 选择器来定位目标元素。

安装与启用

通过命令行安装该插件。安装后需重启 App 以生效。

dsh plugin --profile desktop add github:d

典型用法

  1. 展开:在输入框右上角点击图标按钮,输入卡片展开为浮层。
  2. 输入:在展开态下,按下 Enter 键进行换行,按下 Ctrl/Cmd+Enter 发送消息。
  3. 收起:点击发送按钮,或直接按下 Esc 键,浮层收回到默认高度。

适用场景与注意

该插件适合需要撰写较长文本的会话场景。插件仅修改视觉层与键盘语义,不接管官方组件。展开后,卡片会覆盖下方部分消息内容,需按 Esc 收起才能阅读被遮挡的消息。

已知取舍

  • 高度记忆:展开后的高度仅在当前会话内存中有效,刷新页面或重启 App 后恢复默认。
  • 真机位移:在真机上展开时,消息区会有约 55px 的上移,收回后可精确复原。该位移来自应用自身的滚动管理机制,并非插件补偿造成。
  • 收起方式:展开态下,点击按钮、Esc 或发送消息均可收起,不支持点击外部区域收起。
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye