dsh-codinput
把聊天输入框换成 CodeMirror 6 的编辑器式输入面板:行号、编辑 + Markdown 预览分屏、悬浮窗与全高侧栏标签,同一时刻只有一个输入入口。草稿走官方输入机;宿主有语音输入按钮时原样渲染官方语音组件,数据行与上下文小圈与官方 dock 同源。
安装
dsh plugin --profile web add dsh-codinput
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
<p align="center">
<img src="./assets/icon.png" width="128" alt="DSH-Codinput" />
</p>
<h1 align="center">DSH-Codinput</h1>
<p align="center">
<a href="https://www.npmjs.com/package/dsh-codinput"><img src="https://img.shields.io/npm/v/dsh-codinput" alt="npm Version" /></a>
<a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/DSH-0.2.0--rc.2%2B-blue" alt="DSH Version" /></a>
<a href="https://www.npmjs.com/package/dsh-codinput"><img src="https://img.shields.io/npm/dm/dsh-codinput" alt="Downloads" /></a>
<a href="https://github.com/Witherwithwinter/DSH-Codinput/stargazers"><img src="https://img.shields.io/github/stars/Witherwithwinter/DSH-Codinput" alt="GitHub Stars" /></a>
<a href="./LICENSE"><img src="https://img.shields.io/github/license/Witherwithwinter/DSH-Codinput" alt="License" /></a>
</p>
<p align="center">中文 | <a href="./README.en.md">English</a></p>
<p align="center">把 DeepSeek Harness 的聊天输入框,换成编辑器式的输入面板。</p>
<table>
<tr>
<td width="50%"><img src="./assets/preview-normal.webp" alt="普通模式" /><br /><sub>普通模式(接管原输入位)</sub></td>
<td width="50%"><img src="./assets/preview-split.webp" alt="编辑 + 预览分屏" /><br /><sub>编辑 + 预览分屏(严格对半)</sub></td>
</tr>
<tr>
<td width="50%"><img src="./assets/preview-float.webp" alt="悬浮模式" /><br /><sub>悬浮模式(可拖动位置、八向缩放)</sub></td>
<td width="50%"><img src="./assets/preview-side.webp" alt="侧栏标签模式" /><br /><sub>侧栏标签模式(VS Code 面板式全高)</sub></td>
</tr>
</table>
特性
三态单实例——输入入口只有三种形态,任一时刻恰好一个,绝不与官方输入框共存:
形态 · 进入方式 · 说明
普通 normal · 默认 · 接管卡片在原输入位
悬浮 float · 按住卡片顶部行空白区拖动 · 脱出为悬浮窗:可拖动位置、可拖边界/角落缩放(位置与尺寸记忆)
侧栏标签 side · 打开右侧栏的「Codinput」标签 · 输入在侧栏面板内;侧栏收起不让位,由标题栏下方的圆形小球唤回;侧栏里 /codinput 直接退回官方输入框并关闭本标签
- 编辑器:行号(可关)、当前行与行号高亮、软换行、Tab 缩进、行列指示,编辑 + 预览分屏(markdown 实时渲染,严格对半)。
- 撤销历史跨形态保留:拖成悬浮、切到侧栏再回来,
Ctrl+Z依旧有效——三态共用同一台官方输入机,草稿即唯一事实源(形态切换、插件禁用、重启都不丢)。 /@触发管线:完全走官方链路(track → 官方 menu store → 逐项复刻的 MenuView),候选菜单、钻取、crumbs、骨架屏与官方逐一对齐;/codinput按字典序排入指令节首,其余保持官方使用序。- 模型与权限:模型与思考强度读官方共享目录(与
/model同一状态源);权限为官方三预设,含完全权限的风险确认模态。 - 附件:slash「添加 · 文件」、粘贴图片、拖文件进卡片三条路径;点图片缩略图弹原图预览(官方 ImageLightbox 同构);上传中/失败有状态芯片,失败可整卡重试。
- 语音输入同步(官方桌面版):官方桌面版的输入框带语音按钮时,Codinput 在一模一样的位置渲染一模一样的按钮——直接渲染官方语音组件本体(麦克风钮、录音波形、转写、未就绪引导与文案全部是官方代码);原生没有语音按钮的宿主(web 端各版本)同样不渲染。
- 性能与用量:复刻官方 stats dock——轮次/步数 · tok/s、累计 tok · 缓存命中、上下文占用小圈,取数与格式化逐值同官方,均可点开详情面板;三形态都有。三枚详情面板(会话统计 / Token 用量 / 上下文分段)经 portal 定位、滚动与尺寸变化跟随,Escape 与点外关闭,任意时刻至多一个展开。
- 用户消息 Markdown(0.3.7):右侧自己发出的消息按 Markdown 排版(GFM + breaks,marked + DOMPurify 净化),保留官方气泡形态——附件行、@文件/@会话//技能 引用 chip(可点开)、复制钮与时间戳、引用摘要、悬停显形;设置 → Codinput「用户消息 Markdown 渲染」开关默认开,关闭即还原官方纯文本、无需刷新页面。
- 插件页图标(0.3.7):包内
assets/icon.png经package.json顶层icon字段接入宿主插件列表(manifest 相对路径、限 SVG/PNG/JPEG/WebP、≤256 KiB),已装插件不再落默认图。 - 设置:设置 → Codinput——启用接管、行号、字体、发送/换行快捷键任意组合录制、默认视图;未启用时打开右侧栏的 Codinput 标签即直接启用。
安装
要求:宿主 @deepseek-ai/dsh(版本见下方[兼容性](#兼容性))。
方法 A:npm 包
dsh plugin --profile web add dsh-codinput
一条命令就够:dsh plugin 走官方 profile 包管理,装完会读这个包的 dsh.bundle 元数据、校验它自带的 cordis.patch.yml(dsh.bundle.patch),并把包名追加进 profile 的 bundles——不需要手写任何 patch 行。
然后 dsh web 启动(已在跑的话强刷页面即可,profile 默认 patchReload: live)。
方法 B:GitHub 源码
dsh plugin --profile web add github:Witherwithwinter/DSH-Codinput
仓库里带着构建产物 lib/,所以装源码同样不需要本地构建。如果 pnpm 提示需要构建授权(例如你换成自己的 fork 且删掉了 lib/),按它打印的键名写进 profile 的 pnpm-workspace.yaml 后重跑:
allowBuilds: esbuild@0.25.12: true
方法 C:本地源码(开发)
git clone https://github.com/Witherwithwinter/DSH-Codinput.git dsh plugin --profile web add link:/abs/path/to/DSH-Codinput
link: 安装不会复制文件,改完 npm run build 刷新页面即生效。
方法 D:等价的手写配置
想在 profile 里锁版本、或要手工维护时,等价于方法 A 的是(~/.dsh/profiles/web/package.json):
{
"dependencies": {
"dsh-codinput": "^0.3.8" // 本地开发用 "link:/abs/path/to/DSH-Codinput"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-codinput" // ← 追加在最后
],
"patchReload": "live" // 改完 lib/client.js 强刷页面即生效
}
}
}
改完手工配置后,在 profile 目录里 pnpm install(或 dsh plugin --profile web install),再 dsh web。
兼容性
宿主通过 npm 发的是 rc 版本:latest 是当前稳定 rc、next 是下个 rc、alpha 更超前(2026-10-30 实测 latest / next 同指 0.2.1-rc.5,alpha 为 0.2.2-alpha.2),所以普通用户装到的就是 rc。
宿主版本 · 状态
桌面版(Electron,0.2.1-rc.3) · ✅ 静态对齐(0.3.8 从该版 app.asar 取出官方 CSS Modules 与主题 token 逐值核对:Switch 规则、stats 面板 / ContextMeter 面板的 portal+fixed 与背景/圆角、--dsh-frame-top-clearance 均一致;macOS 的毛玻璃/不透明度差异未实机目检)。0.3.2 记录的 0.2.1-rc.2 实机实测仍有效(官方语音输入按钮同步——授权 → 录音 → 转写端到端验证;语音插件缺席或关闭时按钮自动隐藏)
web 0.2.0-rc.2 · ✅ 实机实测通过(本机当前 web 宿主;0.3.5–0.3.7 的座位镜像、模型座让位、用户消息 Markdown 与三面板互斥均在此版本以 Chromium 自动化探针实测;0.3.8 的 portal 面板定位/Escape/点外关闭与 Markdown 安全硬化另在隔离宿主以无头 Edge 探针复核,见 CHANGELOG)
0.1.7-rc.2 · ✅ 实机实测通过(候选菜单亚克力、上下文小圈挪位、dock 行布局即为此版对齐)
0.1.5-rc.2 · ✅ 实机实测通过
0.1.6-alpha.2 · ✅ 开发基线,全部功能端到端实测通过
其它(含现网 latest / next = 0.2.1-rc.5) · 未实测;旧宿主无 rc.2 新 token,回退链自动保持各版官方原形态
对 0.1.7-rc.2 / web 0.2.0-rc.2,除实机验证外,还从对应版本的客户端包(dsh-client-ui-theme / dsh-client-ui-input-trigger / dsh-client-ui-conversation / dsh-client-ui-chat)逐值提取了候选菜单、上下文小圈、stats dock 与用户消息气泡的官方 CSS 核对;桌面 0.2.1-rc.3 另从该版 app.asar 取出官方 CSS Modules 与主题 token 做静态逐值核对。插件依赖的契约按版本核对过:用到的槽位(conversation.composer.bar、sidebar.right.pane.tab、settings.section,以及 conversation.chat.node 与 conversation.input. 子座)、sidebarRight / sidebarRightTabs / locale 服务与 openTabIn、侧栏展开规划(dockkit planSetExpanded)、文件拾取与 tab 关闭契约(shell.bindFilePicker / tab.actions.close)、以及复刻所依据的官方原语(fileSizeText / fileExtension 与附件 glyph 路径,逐字一致)。插件对宿主内部结构的依赖较多(槽位遮蔽、useTabInfo、sidebarRight、--dsw- 令牌),代码里处处用 typeof 守卫 + try/catch 降级,但宿主大版本升级仍可能失效。*
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:10,最后更新 2026-10-30