dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
输入框 ghost 补全:停笔后 FIM 建议内联流式渐显(SSE,首 token 即上屏),Tab 逐词采纳、Shift+Tab 全量,重新输入或 Esc 会真正取消在途请求;错别字双层检查:浏览器本地词典扫描(中文错词、英文错拼与专名大小写、本浏览器自定义词条)叠加防抖 LLM 上下文校对,文中红波浪线标注、逐条导航、点击修正。
English | 中文
DeepSeek Harness(dsh)输入助手插件:

/beta/completions),灰色建议内联在光标后(NovAI 同款:镜像层透明占位 + 灰字),SSE 流式逐字渐显(首 token 到即上屏,边生成边变长),Tab 逐词采纳(流中采纳不断流)、Shift+Tab 全量采纳、Esc 关闭data/ 下纯文本维护,可叠加浏览器本地自定义词库;200ms 即时标红、离线零成本)+ LLM 上下文校对(中英混排:在/再、的/得/地及英文拼写,800ms 防抖与补全同节奏)。文中红字标注(红色波浪线,当前项高亮,点红字选中),导航条逐条修正,绝不全量替换| 动作 | 快捷键 |
|---|---|
| 采纳一词(中文按词切分) | Tab |
| 全量采纳 | Shift+Tab |
| 关闭建议 | Esc |
快捷键说明会在建议出现时显示在输入框外侧的 dock 行(与错别字导航条同位),输入框内无任何浮层。
| 动作 | 快捷键 |
|---|---|
| 下一个 / 上一个错字 | Ctrl+Shift+. / Ctrl+Shift+, |
| 修正当前选中项 | Ctrl+Shift+F |
| 标记该处为正确输入(不替换) | Ctrl+Shift+G |
| 本次输入不再提醒 | Esc |
要求 dsh ≥ 0.2.1-rc.2(engines.dsh 声明,宿主安装/启动时自动拦截不满足的版本;0.1.x 用户请继续用本插件 0.7.x)。
dsh plugin --profile web add dsh-input-assist # 或 @honlnk/dsh-input-assist,内容完全相同
dsh --profile web # 启动,打开 http://127.0.0.1:3080
本地开发(从源码装):
git clone https://github.com/honlnk/dsh-input-assist && cd dsh-input-assist
npm install && npm run build
dsh plugin --profile web add "$PWD"
官网(功能演示 + 安装指引):https://honlnk.github.io/dsh-input-assist/
API key 三选一(补全与 LLM 检查层需要;词典层无需任何配置):
DEEPSEEK_API_KEY(.credentials.yaml)或环境变量DEEPSEEK_API_KEY=sk-… dsh web(旧版 ~/.dsh/settings.yaml 写 input-assist.* 的方式在 0.2.x 已废止)所有配置都可在插件管理页图形化修改:侧边栏 Plugins → 点开 dsh-input-assist 详情页,「配置」区展开 Input Assist 卡片即可。交互与官方卡片同构:暂存编辑 → 统一「保存 / 放弃修改」,数字与必填文本本地校验,字段行带「未保存」蓝点与单项撤销(×)。卡片注册走官方 plugins.bundle.config 插槽(keyed by bundle 包名;0.2.x 起插件设置统一收纳进插件管理页,旧 settings.plugin.item 插座已删除),无需新增任何服务依赖;配置持久化进 profile 的插件 entry(profiles/<name>/cordis.patch.yml),外部修改仍会热同步进卡片。
模型字段支持从 API 拉取目录:点字段旁的 ▾ 方块按钮打开自定义下拉面板,每次打开都自动拉取最新目录,点选即填入;输入框始终是自由文本,任何 OpenAI 兼容端点的自定义模型名都可手填。拉取失败(未配 key、端点不可达)自动退回手填。默认模型已跟随官方迁移:deepseek-chat 于 2026-07-24 停用,现为 deepseek-flash(V4.1 Flash)。
设置卡底部「自定义词库(仅本浏览器)」区块是一张成对词条列表:左列错词、右列正词,中英文皆可。点「+ 添加词条」在末尾追加一对输入框,× 删除该行,拖拽行首把手调整顺序(或聚焦后 ↑/↓ 移动),增删与移动都有平滑动画:
dsh-input-assist:user-dict:v1,存储格式仍为 错词 => 正词 一行一条),不随插件配置同步.txt 文件(一行一条 错词 => 正词,与内置词库同格式、# 注释),同错词就地更新、其余追加进暂存列表,过目后仍要点保存;导出把当前列表(含未保存修改)下载为同格式 .txt,复制走剪贴板——换浏览器/换机器搬运全靠它们| 键 | 默认 | 说明 |
|---|---|---|
completionEnabled | true | 输入补全开关(输入框「补」按钮同效) |
completionBaseUrl | https://api.deepseek.com/beta | FIM 端点(OpenAI 兼容可换) |
completionApiKey | '' | 留空则走凭证回退 |
completionModel | deepseek-flash | 补全模型(输入框可下拉选择,⟳ 从 API 拉取目录) |
completionDebounceMs | 800 | 停笔多久后请求建议(与 LLM 校对同节奏) |
completionMaxTokens | 64 | 建议长度上限 |
completionStream | true | 补全走 SSE 流式逐字渐显;接口不支持流式时关闭改整段返回 |
proofreadEnabled | true | 错别字检查开关(「校」按钮同效) |
proofreadUseLlm | true | 是否叠加 LLM 检查层(关掉则完全不花钱) |
proofreadModel | deepseek-flash | LLM 检查模型(同上,下拉选择) |
proofreadDebounceMs | 800 | LLM 层防抖(与补全同节奏,两路同时返回) |
proofreadDictDebounceMs | 200 | 词典层防抖(浏览器本地扫描,零成本) |
源码在 src/*.ts(TypeScript strict 模式),构建用 tsdown 双入口:
src/index.ts → lib/index.js(ESM + .d.ts,host 半边,cordis loader 直接 import)src/client.ts → lib/client.js(CJS,banner/footer 自动包 window.__ModuleLoader__.load 壳,react / dsh-client-runtime 保持外部依赖,词典等本地模块打包进 bundle)npm install
npm run build # tsdown 双入口构建,产物落 lib/(不含 tsc 严格检查)
npm test # build → tsc --noEmit → node --test(类型错在本地即拦截)
词库数据在 data/ 下纯文本维护(zh-wrong-phrases.txt + en-wrong-spellings.txt + en-proper-nouns.txt 行式词库 + zh-context-rules.json 上下文规则),构建前由 scripts/gen-dict.mjs 解析校验并生成 src/proofread-dict-data.generated.ts(提交进 git,CI 用 gendict + git diff 守卫同步)——更新词库只改 data/ 文件,npm run build 自动生效。test/client-bundle.test.js 用假 ModuleLoader 真正执行 bundle 产物,验证 data → bundle 全链路;用户自定义词库(localStorage)在浏览器侧与内置词库合并扫描。
浏览器半边(lib/client.js,tsdown 从 src/client.ts 打包) host 半边(lib/index.js)
input.overlay 仅错误提示(无浮层) loopback Config schema(volatile 字段)
input.dock 错别字面板+修正 ───RPC(0.1.5+:fetch 路由 /api/input-assist/rpc;
input.right 补/校 开关 ≤0.1.1:rpc.handle /input-assist)───▶
fetch POST /api/input-assist/stream complete → FIM /beta/completions(非流式)
↳ SSE 帧驱动 ghost 逐字渐显 proofread → LLM 层(llmOnly)
plugins.bundle.config 设置卡(Plugins→插件详情页) cancel → 断开在途请求(RPC 与流式一视同仁)
useInput 读草稿 · inputActions.insertText / setDraft 写回 settings.update(entryId, patch) 持久化进 profile
镜像层(body 挂载):文中红字 + 光标处灰色 ghost 建议(rAF 合帧渲染)
词典层本地运行(单源 src/proofread-dict.ts,构建时打进 client bundle)
自带 snapshot store(src/snapshot-store.ts,结构满足宿主 ObservableSnapshot 契约)
settings.update(entryId) 持久化进 profile、设置卡迁移 plugins.bundle.config 插槽、Tab 采纳改走 insertText 句中采纳光标不再跳到草稿末尾、engines.dsh 版本门禁;124 测试全绿 + 隔离环境 dsh 0.2.1-rc.2 真机验收通过,详见 docs/19)推 v* tag 自动触发(版本号须与 package.json 一致):
dsh-input-assist(裸名)+ @honlnk/dsh-input-assist(scope 镜像),内容相同。认证走 npm Trusted Publishing(OIDC),无需 NPM_TOKEN;已发布的名字自动跳过(幂等)。docs/ 下的站点文件部署到 GitHub Pages。前置(一次性):npmjs.com 上为两个包名各配置一条 Trusted Publisher(repo honlnk/dsh-input-assist、workflow release-npm.yml、environment 留空);GitHub Settings → Pages → Source 选 "GitHub Actions"。
git tag v0.1.0 && git push origin v0.1.0 # 即发布
dsh-plugindsh plugin --profile web remove dsh-input-assist