UI Enhancements

dsh-composer-expand

13071301808/dsh-composer-expand · ★ 6

13071301808Curated

Composer expand/collapse toggle for the Web UI: a ⬆/⬇ button in the composer tool row grows the input to a tall 70vh writing view for long drafts.

README body is shown in Chinese.

License
MIT
Added
2026-08-16
Maintenance
active
Install kind
github
npm
dsh-composer-expand
Manifest details
Manifest status
Declared
Manifest path
package.json#dsh
Manifest checked
2026-08-19
Lifecycle scripts
None found

Static manifest checks report declarations only; they are not compatibility or security review.

安装

dsh plugin --profile web add github:13071301808/dsh-composer-expand

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

README

Source README · body: zh · Read Chinese README

Table of contents
  1. 为什么需要
  2. 功能
  3. 安装
  4. 通过 npm 安装(推荐)
  5. 源码本地开发
  6. 工作原理
  7. 构建
  8. 已知限制
  9. DSH STORE 兼容与权限声明(供自动复检读取)
  10. License

Listed on DSH Directory

为 DeepSeek Harness(dsh)打造的 composer 展开/收起插件。在 composer 工具行放一个 ⬆/⬇ 按钮,点击在「默认封顶高度」与「70vh 高书写视图」之间切换,长草稿不再挤在一个小窗口里滚动。

为什么需要

DSH 默认把 composer 文本框封顶在一个较小高度(seat 上定义了 --dsh-composer-text-max-height: 336px,限制文本框滚动容器)。草稿变长后,只能在小窗口里滚动几行。本插件对短草稿保持默认行为,写长 prompt 时一键切换到大视图。

功能

  • ⬆ 按钮在 composer 工具行 — 位于 conversation.input.right(发送按钮旁官方预留的可点击控件位)。
  • 展开到 70vh — 在会话滚动容器上切换 CSS class;composer 输入区同步放宽 max-height。再点一次恢复默认封顶高度。
  • 展开最小高度 300px — 输入内容较少时也保持足够的书写空间;内容变多后最高仍受 70vh 限制。
  • 展开状态回车换行 — 展开时普通回车只插入换行,不触发发送;Ctrl/Cmd + Enter 等带修饰键快捷键仍可用于发送;斜杠 / @ 触发菜单打开时不拦截,回车正常选候选。
  • 浏览器内持久化 — 状态写入 localStorage[dsh-composer-expand:expanded],刷新页面、切换工作区都保留。
  • 展开状态自愈 — 展开期间监听 DOM 重建:即使 harness 重建了会话滚动容器或 composer 卡片(切视图、切会话),展开样式与"回车换行"行为也会自动重新应用到新的输入框上。
  • 中英文双语 — 按钮文案与提示跟随 DSH 的 locale 服务。
  • 纯前端 — 无自定义协议、无 host 命令、无 LLM 调用、不进会话日志。
  • 不依赖构建哈希 — CSS 锚定 DSH 稳定的 data 属性(data-conversation-scroll / data-composer-seat / data-input-scroll / data-composer-input,并保留 textarea 时代的 data-input-mirror),同时兼容 Lexical 编辑器与旧 textarea 两代 composer,不碰每次构建都会变的哈希类名。
  • Lexical composer 适配 — 桌面版 0.1.2-alpha.1+ 的 composer 已换成 Lexical contenteditable:本插件改用 composer seat 上的 capture 阶段 keydown 拦截普通回车(先于 Lexical 的 bubble 监听),展开时回车仍是换行而不是发送。

安装

通过 npm 安装(推荐)

dsh plugin --profile web add dsh-composer-expand

已发布到 npm,包含预构建产物,无需本地构建。

源码本地开发

dsh CLI 必须在 PATH 上。若你只用 npx 跑过 harness,dsh 尚未全局安装,会报 zsh: command not found: dsh——先全局安装:

npm install -g @deepseek-ai/dsh

从本仓库安装:

# 1. 构建产物(tsdown 生成 lib/index.js + lib/client.js)
pnpm install
pnpm build

# 2. 加入 web profile
dsh plugin --profile web add ./

# 3. 以该 profile 重启 harness
dsh --profile web

重启后 ⬆ 按钮出现在 composer 工具行(发送按钮旁)。可在 设置 → 插件 中确认 dsh-composer-expand 已列出。

工作原理

环节 机制
按钮位 conversation.input.right 列表槽位(会话作用域);ctx.slots.inject 注册单个 React 组件
切换状态 React useState,初始值读 localStorage[dsh-composer-expand:expanded];变更时写回 localStorage
DOM 挂钩 document.querySelector('[data-conversation-scroll]').classList.toggle('dsh-composer-expand-on', on) — 会话滚动容器上的官方稳定属性
CSS 契约 .dsh-composer-expand-on 在 [data-composer-seat] 上覆盖 --dsh-composer-text-max-height(真正的 336px 上限)为 var(--dsh-composer-expand-height)(默认 70vh),并给 [data-input-mirror] 设 min-height: 300px,即使内容很少输入框也会明显变高
硬依赖 export const inject = ['slots', 'locale'] — 均为官方 harness 客户端服务
无 host 命令 lib/index.js 是空 apply(),整个插件纯客户端

构建

pnpm install
pnpm build   # tsdown: lib/index.js(ESM host)+ lib/client.js(ModuleLoader 客户端 bundle)

已知限制

  • 状态按浏览器记忆,不按会话。DSH 同一时刻只渲染一个 composer,目前无感知差异;若未来同时渲染多个,需要收窄 DOM 选择器。
  • 展开高度固定为 70vh。未来版本可在设置卡片里提供高度滑块。
  • --dsh-composer-text-max-height(336px)是 DSH 的设计选择。本插件只放宽 composer 文本框容器,不影响其他 disclosure 行。

DSH STORE 兼容与权限声明(供自动复检读取)

  • Node.js:^22.19.0 || >=24.0.0(见 package.json engines)。
  • DSH 范围:>=0.1.0-rc.7 <0.3.0;逐版本结论见 package.json → dsh.compatibility.dshReleases,官方最新三版(当前 0.2.1-alpha.1 / alpha.2 / alpha.3,另前瞻声明 alpha.4)均为 compatible。
  • dshOperations 诚实声明为 unknown:尚未提供一次性 Profile 的安装/启动/卸载/回滚证据,不虚构 passed。
  • 依赖:peerDependencies 仅 @deepseek-ai/cordis ^4.0.1 与 react ^18.2.0(由 harness 提供,不打包);客户端仅使用官方 slots、locale 服务,dsh.client.inject 仅声明 @deepseek-ai/dsh-client-ui-conversation;无 preinstall/install/postinstall/prepare 生命周期脚本。
  • 权限:无文件、无网络、无命令、无凭据访问;仅写浏览器 localStorage[dsh-composer-expand:expanded](插件私有展开状态),以及对 [data-conversation-scroll] / [data-composer-seat] 的 DOM class 与 capture 阶段 keydown 监听。无外部服务、无 host 命令、无 LLM 调用、不写会话日志。
  • Entry IDs:仅新增自有 ID —— Bundle Patch 插入 composer-expand,客户端 slots.register 为 conversation.input.right / composer-expand;不替换、不禁用任何 @deepseek-ai/* 官方包或受保护 entry。
  • 失败边界:localStorage 不可用(隐私模式)则回落为默认收起;找不到 DOM 锚点则 no-op;locale 注册失败则回落英文并 console.error;卸载时 loader 移除插件自有 <style>,observer disconnect 并移除已加 class。

License

MIT