DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

Witherwithwinter /

Witherwithwinter/DSH-Codinput

Verified

把 DeepSeek Harness 的聊天输入框,换成编辑器式的输入面板。| An editor-style input panel, right where the DeepSeek Harness chat composer used to be.

★ 14 Stars3 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@5eb29c7d

DSH-Codinput

DSH-Codinput

npm Version DSH Version Downloads GitHub Stars License

中文 | English

把 DeepSeek Harness 的聊天输入框,换成编辑器式的输入面板。

普通模式
普通模式(接管原输入位)
编辑 + 预览分屏
编辑 + 预览分屏(严格对半)
悬浮模式
悬浮模式(可拖动位置、八向缩放)
侧栏标签模式
侧栏标签模式(VS Code 面板式全高)

特性

三态单实例——输入入口只有三种形态,任一时刻恰好一个,绝不与官方输入框共存:

形态 进入方式 说明
普通 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.9"          // 本地开发用 "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-11-06 实测 latest / next 同指 0.2.2-rc.1,alpha 为 0.2.2-alpha.3),所以普通用户装到的就是 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)
web 0.2.2-rc.1 ✅ 实机实测通过(0.3.9 菜单修复专项:隔离宿主 + 无头 Edge 自动化探针,33/33 断言通过——菜单 portal 到 body、模型 / 权限 / 设置下拉几何逐像素吻合、祖先 transform 免疫、布局位移 2 帧内跟随、连点开合正常;见 CHANGELOG)
0.1.7-rc.2 ✅ 实机实测通过(候选菜单亚克力、上下文小圈挪位、dock 行布局即为此版对齐)
0.1.5-rc.2 ✅ 实机实测通过
0.1.6-alpha.2 ✅ 开发基线,全部功能端到端实测通过
其它(含现网 latest / next = 0.2.2-rc.1) 未实测;旧宿主无 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 路径,逐字一致);0.3.9 的菜单修复另在隔离 web 0.2.2-rc.1 上以无头 Edge 自动化探针验收(33/33 断言通过)。插件对宿主内部结构的依赖较多(槽位遮蔽、useTabInfo、sidebarRight、--dsw-* 令牌),代码里处处用 typeof 守卫 + try/catch 降级,但宿主大版本升级仍可能失效。升级宿主后请按 TESTING.md 走一遍冒烟清单。

主题 / 皮肤插件兼容(皮肤作者必读)

Codinput 不自带配色:全部颜色取自宿主的 --dsw-* 设计 token(亮暗主题随宿主切换)。给宿主做主题/皮肤的插件与 Codinput 的相处方式:

  • 改宿主 token 即全盘生效——覆写 --dsw-* 变量后,Codinput 的卡片、菜单、按钮、徽章与官方 UI 一同跟随,无需单独适配。注意宿主把 token 定义在 body(body[data-ds-dark-theme])上,覆写要写在同一层:写在 :root 会被 body 上的定义盖掉。
  • 官方写死的值 Codinput 同样写死(发送钮图标的前景白、上下文仪表 tools 分段的紫等),与官方在换肤下的表现保持逐值一致——这些不跟 token 变,属预期行为。
  • 要精确点妆 Codinput:所有元素类名都是稳定的 dci- 前缀(卡片 .dci-card、发送钮 .dci-send、菜单 .dci-menu / .dci-slash-menu、数据行 .dci-stat-root、唤回小球 .dci-ball 等),可直接作皮肤选择器;插件样式一次性注入 <style id="dsh-codinput-styles">,皮肤在其后注入即可按常规 CSS 权重覆盖。
  • 编辑器(CodeMirror)的字体是用户偏好(默认等宽栈),不跟随皮肤字体;其颜色同样走 token。

已知限制

  • / @ 的候选内容来自宿主目录(技能 / 命令 / 文件 / 会话);宿主不提供时为空,插件侧无法补。
  • 没有语法高亮、没有 Esc 功能——产品决策(输入面板不是代码阅读器)。
  • Codinput 标签存在期间主输入整体隐藏(唯一输入入口约定,浏览同栏其他标签也不恢复);官方 stats dock 与上下文小圈都渲染在官方输入框内部,因此随之消失、由本插件的复刻数据行接管。
  • 第三方子座位的镜像边界:左右座(list)与模型座(single)已镜像;input.attachments / overlay / dock 生态暂无租客,留扩展位。模型座上带 inject 面且依赖宿主 ctx 服务的插件(如 dsh-model-accordion)在插件侧无法复现其 inject 绑定,会降级回自绘模型芯片(不空、不崩,__dshCodinputErrs 记一条 slot.inject 诊断);纯 UI 替换类(reasoning-slider、dsh-effort-dial)已实测可正常显示与交互。
  • 同一 pane 复制出第二个「Codinput」标签时,第二个面板只出提示、不渲染第二个编辑面(输入入口唯一)。
  • 悬浮模式的手势只保留「拖回底部输入区 = 普通」;「拖入右侧栏 = 侧栏模式」已按产品决策舍弃。
  • 页面重载后,若侧栏布局恢复了 Codinput 标签但尚未被点开过,主输入会先出现——dockkit 对重载恢复的标签是惰性挂载,点一次标签即恢复侧栏承载。

开发

npm install
npm run build        # 压缩产物 → lib/client.js(发布用)
npm run build:dev    # 未压缩 + 内联 sourcemap(浏览器里直接看 TS 源码)
npm run typecheck
  • src/client/ 是全部客户端源码;宿主 API 用本地结构类型描述(运行时零宿主依赖,只把 react/react-dom 当平台外部模块)。
  • lib/index.js 是宿主半边(纯挂载载体);lib/client.js 由构建产出,并入库随源码一起发(源码安装才能免构建)。
  • CI 只做静态把关:npm ci + tsc --noEmit + 发布构建 + 产物自检(bundle 非空、含 __ModuleLoader__.load、无内联 sourcemap)。它不加载页面、不连宿主,运行时行为零覆盖——行为验证走 TESTING.md 的手动清单。
  • 诊断口(调试用,生产也在):window.__dshCodinputDebug / __dshCodinputErrs / __dshCodinputSessionId / __dshCodinputTriggers / __dshCodinputKeyboard / __dshCodinputShell / __dshCodinputCtx。
  • 开发辅助脚本:node scripts/extract-official-css.mjs <宿主某包 client.js> [out.css] 抽取官方 CSS module 原文,用于逐值复刻。

改代码前值得先知道的宿主事实

  • 接管点:conversation.composer.bar(single 槽位,priority:-1 遮蔽官方条目)。卸载条目即官方输入框原样恢复。
  • 遮蔽 ≠ 渲染:官方 InputBar 条目在自己的条身体内声明并渲染 conversation.input.* 子座位(left / right / model / activity / permission / plan / …)。Codinput 遮蔽 bar 条目后,这些座位声明还在、第三方注册照常成功、条目还是赢家,但没有任何 renderSlot 会读它们——表现是「插件装了、不报错、永不上屏」。解法是在自绘工具行的对应位置按官方语义复刻合成(InputLeftSlot / InputRightSlot 走 list 座,ModelSlot 走 single 座)。
  • 单值座让位判据:宿主动态包守卫对非 chain 槽位的第三方 register 强制分配页内遮蔽秩(options.priority 为唯一负数)并给 fiber 名打 dyn/ 前缀;出厂占用者(如 client-ui-model-selection 的 ModelSelect)不带 priority(≡0)。ModelSlot 只镜像「第三方遮蔽者」,出厂占位继续由自绘模型芯片代表。
  • 第三方 inject 的 ctx 边界:条目的 inject(sessionId) 必须在宿主 fiber 上下文里调用;插件侧直接调会丢条目所属插件的 ctx 绑定,依赖 ctx.* 服务面的 inject 会抛 without inject(实测 dsh-model-accordion 的 directoryFor)。单值座据此走 entryInjectFailed 预检,失败即降级回自绘芯片。
  • 唯一输入入口:侧栏标签 body 挂载即承载(不是按可见性——收起侧栏是 CSS 隐藏 + translate,body 仍挂载),主条目据此渲染 null;形态由 承载 ? 'side' : prefs.mode 派生,构造上不可能并存。承载声明挂在 body 生命周期上,因此标签定义必须 keepMounted: true:dockkit 默认会把非激活标签的 body 卸载,一旦切到同栏其他标签声明就消失、主输入回来(官方浏览器标签同款开关;注意重载后恢复的标签要激活过一次 body 才挂载)。
  • 撤销历史:三态切换会重挂载编辑器,故按会话暂存 EditorState(take/putEditorSnapshot);扩展回调走模块级 hooks 槽,避免复用旧 state 时调到已卸载实例的 props。
  • 官方侧灌入(pick/claim/提交清空)用 externalAnnotation + Transaction.addToHistory.of(false):不进撤销栈,撤销只记用户自己敲的内容。
  • 画圆要写 corner-shape: round:宿主根节点设了 corner-shape: superellipse(1.5)(全局超椭圆),只写 border-radius:50% 会渲染成圆角方。
  • 小球不占槽位:conversation.session.header.corner 是官方侧栏展开按钮的座位(single,占它会把官方按钮顶掉),故小球 portal 到 body、量标题栏矩形定位到标题栏下方。
  • slash「文件」行靠 filePicker 绑定活着:官方 file 贡献的 available 读 shell.canPickFiles(),而 filePicker 由官方 InputBar 挂载时 bindFilePicker 绑上、卸载解绑——接管面挂载时必须补绑(attachments.bindSessionFilePicker),否则该行消失。不要注册同名 contribution:宿主 register 时即查重、直接 fail-loud。
  • 关标签走 tab 域动作面:useTabInfo().tab.actions.close() 关自己标签(dockkit 语义,唯一 docked 标签时自动垫 guide);会话定位别用诊断 __dshCodinputSessionId(表面卸载会清成 null),用 sideinput 总线的承载快照。

第三方归属

本项目的部分视觉素材与样式取值复刻自 DeepSeek Harness(@deepseek-ai/dsh,MIT License,Copyright (c) 2026 DeepSeek),包括若干 SVG 图标路径(权限盾牌系列、plus / paperclip / close / arrow-up 等)与输入框卡片、原图预览层的 CSS 取值。依 MIT 许可使用,原始版权与许可声明见仓库根目录 NOTICE 与 LICENSE。

内置第三方依赖:CodeMirror 6(MIT)、marked(MIT)、DOMPurify(Apache-2.0 / MPL-2.0 双许可,按 Apache-2.0 使用)——压缩产物不保留许可注释,其版权与许可声明集中保留在 NOTICE。

许可

MIT

—/ 5

No ratings yet

Verified DSH bundle

Commit 5eb29c7dba19

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout