dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)

动图两镜头(真机录制,纯净 profile:只有官方插件 + 本插件):① 新会话里写围栏 ```py 再打 def —— 弹层顶上标「本文围栏 · py」,给的是 Python 词表;② 对话里已经有 Java 代码时打 pub —— 顶上标「据对话推断 · java」,首条直接是 public。依据行就是「凭什么给这张词表」的答案。
把 DeepSeek Harness(DSH)Web 输入框的手感对齐 VS Code:括号引号自动配对、选中一段再打括号就环绕起来、 光标右边已是闭符时再打它直接跳过、退格删掉一对空括号;再给一个补全弹层——草稿里出现过的词、各语言关键字与标签、 工作区文件路径、settings 里配的模型名,打满两个字母自己弹。
标准 DSH bundle 插件:一条命令安装、不 require 任何第三方包、不写任何文件、不改宿主一行源码,也不需要任何令牌。 浏览器半边是纯 DOM(不依赖 react、不引编辑器库),服务端半边只有两个只读路由。
| 你要装在哪 | 装法 | 注意 |
|---|---|---|
DSH Web(dsh web) | dsh plugin --profile web add https://github.com/mengge237-labs/dsh-composer-ease | 推荐。也可以装本机源码目录:dsh plugin --profile web add "E:/S_Software/deepseek-harness/plugins/dsh-composer-ease" |
| 官方桌面端(Electron) | 用桌面端自己的插件管理器装 | 别用 dsh plugin --profile desktop(那条路被 Electron 独占,CLI 会拒绝);桌面端会话里让 DSH 自己装 |
| 开发(改代码) | 源码目录 + file: 装法 | 客户端半边每次请求现读磁盘,改完刷新页面即生效;服务端半边(lib/index.js、lib/words.js)改完要重启 dsh web |
卸载:dsh plugin --profile web remove dsh-composer-ease(不留任何数据文件,没有要清理的东西)。
( [ { " ' 反引号成对插入,光标落在中间;全角也一样(( 【 「 《 “ ‘),中文输入法下走 input 事件补配对(IME 合成的字符不一定带对应 keydown);光标前是标识符或路径字符时不配对(保护 call( 与 E:/path 这类写法)(选中内容),并且选区还原到内层内容上,接着打字就是改内容;
半角走 keydown、全角/中文输入法走 beforeinput(IME 合成的字符没有可用的 keydown,只有 beforeinput 能在 DOM 变更前拿到要插的字符);Shift 组合键打出的 { " 同样有效Tab 收下、Esc 收起() 中间按退格,一次删掉两侧```js / ```python)就按该语言上词表lib/fuzzy.js 逐字取自 microsoft/vscode(MIT,见 THIRD-PARTY.md)——
前缀、词边界、驼峰、连续命中都加分,间隔与分散扣分;命中位置由它给出,列表里命中的字符加粗(就是 VS Code 那个样子)def/import/.py → python,<div> → html,const/await → javascript),
猜不出再退到习惯```js 或接受过某套词表的候选都会记一笔(存本机 localStorage,不上传任何东西)node_modules,按路径段前缀匹配(见「候选匹配规则」)Ctrl+Space 手动弹;行首或空白后打 /、@ 也弹Tab 接受(或鼠标点某一行);↑↓ 选择;Esc 关闭| 操作 | 键 / 触发 | 行为 |
|---|---|---|
| 自动配对 | ( [ { " ' 反引号;全角 ( 【 「 《 “ ‘ | 光标前是路径/标识符字符时不配对;光标右边紧跟文字时只插这一个开符(在一段文字前打前引号就只出一个引号);右边已是同一个闭符时跳过 |
| 环绕选区 | 选中后打任意开括号 | 选区 → (选区),选区保持在内层 |
| 跳过闭合 | 光标右已是应得的闭符时再打它 | 不重复插,移过去 |
| 删空对 | 光标夹在 () 中间按退格 | 一次删两侧 |
| 补全 | 打满 2 个标识符字符 / Ctrl+Space | 弹层:本文词优先,其后语言词表 / 文件 / 模型 / 片段 |
| 接受 | 只有 Tab 或点击某一行 | 回车保持发送;接受后弹层不会自己复开 |
| 关闭与选择 | Esc / ↑ ↓ | Shift+Enter 仍是换行 |
attrib → 5_临时/attrib-index.diff 排第一;段内中段匹配要求查询 ≥3 个字符dsh web(ESM 已载入内存不重读);客户端半边刷新页面即生效inp → input)在服务端,因此首次装好或改完词表后,要重启一次才全线生效textarea 形态的输入框只有离线测试覆盖,真机上没样本Alt+↑/↓ 移动行、Ctrl+D 复制行、Ctrl+/ 注释切换这类要动 Lexical 文档模型的操作没有做,别当已有功能| 路径 | 用途 |
|---|---|
lib/index.js | 服务端半边:两条只读路由(/dsh-composer-ease/words、/config.json)与本机信任栅栏 |
lib/client.js | 浏览器半边:keydown 捕获层、配对与环绕、补全弹层(纯 DOM,无第三方依赖) |
lib/words.js | 各语言词表(静态数组,出处与 commit 写在文件头) |
test/ | 五支测试 + 真机验收报告(REPORT-2026-10-16.md) |
docs/ | README 配图 |
THIRD-PARTY.md | 借用数据的来源与许可证原文 |
cordis.patch.yml | DSH bundle 声明(dsh.bundle.patch) |
npm test # 五支,61 项,0 网络:数据层 / 路由与信任栅栏 / bundle 形状 / 假 DOM 行为测试 / 许可与合规
test/selftest.mjs:候选排序、模型 id 解析、文件收集封顶、workspace.json v2 形状、词表命中test/server-routes.mjs:路由形状、本机信任栅栏(非 loopback Host 与跨站 Origin 一律 403)、方法闸、config.json 载荷test/client-smoke.mjs:bundle 头与导出形状、键位判据、本文词与围栏识别test/client-behavior.mjs:假 DOM 驱动真监听——配对、环绕、跳闭合、删空对、Ctrl+Space 取数、Tab 接受替换、回车放行、接受后不复开test/compliance.mjs:许可与条例自检(9 项)——自家 MIT 署名、每个借用件在 THIRD-PARTY.md 里都有仓库+许可+钉住的 commit、
MIT/CC0 原文照录、逐字搬来的代码带出处头(含「改了什么」)、运行时零第三方依赖、仓里没有密钥、版本号与更新日志对得上、
登记表那侧 npm 键合法、上游版权声明原样保留且排在我们的说明之前。反向对照过:删掉台账里一行、把版本号改成 9.9.9,它都会红改这块前先读 README 的「形态与边界」与语言词表文件头:宿主 composer 是 Lexical,它不认 sel.modify(...),
选区操作必须走「摊平字符偏移 + 显式 Range」,且我们的监听在捕获阶段、早于宿主处理,插入后改选区要推一拍。
inp 没出现 input? 语言词表在服务端半边:装好之后(或改过词表之后)要重启一次 dsh webTab(0.2.2 起如此,之前回车也算接受,会连插候选)/ 或 @ 触发dsh plugin --profile desktop 会被拒)dsh-composer-ease。上下文候选改为只读对话正文区(宿主的 [data-conversation-scroll] 与 [data-slot="conversation.chat.node"]):左侧栏、设置面板里的词不再进补全池子,也不再自我喂养已经画出来的候选;弹层顶上新增依据行(据对话推断 · java / 本文围栏 · python / 历史习惯 · javascript),让「凭什么给这张词表」看得见;回车发送时同步收掉弹层与灰字wordGate 后连弹层都不开;碰撞测试改为断言整条为空lib/cjk-lexicon.js,jieba MIT 的常用词子集):前缀必须是词表里的词或更长词的前缀,碎片(如「档管」)一律不提示;n-gram 只留给草稿/上下文兜底。新增碰撞测试(文档/档管/单字三种输入)ye)不再被 JS 关键字 yield 抢,
弹层与行内灰字一起收起,上屏后再按中文内容重新判一次(本人 2026-10-16 报的「后面显示 eld」)lib/fuzzy.js 顶部原样补回上游逐字的版权与许可头(MIT 要求保留声明,之前被我自己的出处说明顶掉了);
合规闸加一条判据盯死它。排序实现仍直接用上游那份(MIT 合规,不存在侵权,无需另写一套)test/compliance.mjs(8 项:署名/出处/许可证原文/出处头/零依赖/无密钥/版本一致/登记表条例),挂进 npm test;仓公开前先跑它( 【 「 《 “ ‘,中文输入法下走 input 事件补配对);补全弹层改成贴光标定位(优先下方、放不下才翻上方 6px、宽度固定、高度封顶可滚、列表没变不重画)