dsh-advisor
在 DeepSeek Harness 输入框中提供行内写作建议与下一句建议。Inline ghost-text suggestions and next-message advice for the DSH composer.
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 24, 2026
- Updated
- Oct 24, 2026
Introduction
建议者 · DSH Advisor
在 DeepSeek Harness 的输入框里提供行内写作建议和下一句建议。默认跟随当前会话的模型,默认在 agent 一轮输出结束后猜你接下来想说什么;/suggest 可以打开多建议面板,最后一行还能输入你自己的方向。
English · 简体中文
┌────────────────────────────────────────────┐
│ ← 输入框(灰字为建议,Tab 接受) │
│ 帮我审一下这段代码,重点看▏并发安全 │
└────────────────────────────────────────────┘
功能
- 行内 ghost text:草稿末尾显示灰色建议,
Tab接受,一次 undo 可撤销。 - 回合结束建议:agent 一轮输出完成且输入框为空时,猜你下一句想说什么(可关)。
/suggest面板:列出多条建议,默认选中「建议」预设,支持模式与预设切换、↑↓选择、Tab/Enter应用。- 双击
Tab:在输入框里连续按两次Tab也能打开面板。 - 自定义方向:面板最后一行输入你的想法,例如“更具体一点,加个例子”,再按这个方向生成。
- 模式 + 预设:模式负责装配(代码、写作、翻译),预设是具体能力(建议、续写、润色、修 Bug、翻译……)。预设的 prompt、类型、温度、输出上限和推理强度单独编辑,所有模式共享。
- 模型可选:跟随当前会话 / 全局默认 / 固定 provider+model。
- 上下文可配:最近 N 条对话、工作区路径、时间,全部可开关。
- 分页设置页:在侧栏 Plugins → Installed plugins 打开 dsh-advisor,点插件行的 Configure 进入;分为通用、模式、预设、诊断四页,通用里包含模型、触发、上下文、面板和界面。
- 可选挂起:通用 → 界面里的「挂起到设置侧边栏」开关可以把同一套设置挂到 Settings 弹窗左侧,方便经常调整模型或预设。
- 本地优先:没有遥测、没有额外服务端;草稿只在浏览器里,自动触发或你主动打开面板时才会把必要内容发给你在 DSH 里配置的模型。
环境要求
- 已安装 DeepSeek Harness,并使用 Web GUI 或 Desktop 界面(插件依赖浏览器侧插槽,不支持纯 TUI)。
- 已在 DSH 里配置至少一个可用模型。
- 安装时需要能访问本机文件系统,通过 Harness 自带的
plugin_manager安装;安装动作会请求权限,按 Harness 提示批准即可。 - 开发和测试基于 DeepSeek Harness
0.2.1-rc.2。插件使用了 DSH 的内部扩展点,升级 DSH 后可能需要跟随调整;最低版本声明在plugin/package.json的engines.dsh里。
安装
-
克隆仓库:
git clone https://github.com/KristoffLiu/dsh-advisor.git cd dsh-advisor -
在 Harness 里让 agent 安装插件。安装目标必须指向仓库里的
plugin/子目录,并且用绝对路径:plugin_manager install_bundle target=/absolute/path/to/dsh-advisor/plugin例如:
plugin_manager install_bundle target=/Users/me/code/dsh-advisor/plugin -
重启 Harness(Host 侧代码在启动时加载),然后刷新页面。插件会出现在侧栏 Plugins → Installed plugins。
打开 dsh-advisor 的 bundle 页,在插件行点 Configure 编辑设置。Settings → Built-in plugins 只提供只读清单,不是插件配置入口。
为什么是
plugin/而不是仓库根目录?仓库根目录只放文档和开发文件,可安装的 Harness 插件包在plugin/里,这样plugin/package.json的files和exports只暴露运行所需文件。
更新
cd dsh-advisor
git pull
然后在 Harness 里对同一个 plugin/ 路径重新执行 install_bundle,并重启 Harness。只刷新页面不够:Host 侧的 host.js 会在重启后生效;Client 侧刷新页面即可,但重新安装可以确保版本号更新、避免模块缓存。
卸载
在 Harness 里执行:
plugin_manager remove_bundle target=dsh-advisor
然后重启 Harness。配置文件 ~/.dsh/dsh-advisor.json 不会被删除,需要的话可以手动清理。
使用
| 操作 | 效果 |
|---|---|
| agent 输出结束、输入框为空 | 自动出现下一句建议(默认开) |
| 输入框里有草稿 | 默认不自动打扰;可在配置里打开 auto.onTypingPause |
Tab | 接受灰色建议 |
连续两次 Tab | 打开建议面板 |
/suggest | 打开建议面板 |
面板里 ↑ ↓ | 切换高亮 |
面板里 Tab / Enter | 应用当前建议 |
Esc | 关闭面板 / 关闭模式菜单(不直接清除行内灰字) |
| 输入框左侧 ✦ 按钮 | 等同于 /suggest |
| Plugins → dsh-advisor → Configure | 图形化修改配置 |
重写类预设(修 Bug、补测试、解释、重构、润色、精简、扩写、正式、翻译)通常只在面板里出现,应用时会整段替换草稿;续写和下一句走行内灰字。只有在配置里完全没有 next 类预设时,回合结束建议才不会触发。
配置
首次请求配置时(打开页面或设置页)会生成:
$DSH_HOME/dsh-advisor.json
默认是 ~/.dsh/dsh-advisor.json。可以直接改文件,也可以在 Plugins → dsh-advisor → Configure 里改;配置文件有 2 秒缓存,保存或改文件后最多 2 秒生效。
下面是常用字段的节选;完整默认配置(归一化后的实际生效值,含所有模式、预设和 order 字段)见 examples/dsh-advisor.default.json。
{
"model": {
"mode": "session", // session | default | fixed
"fallbackToSession": true
},
// "model": { "mode": "fixed", "provider": "deepseek", "model": "deepseek-chat", "fallbackToSession": true },
"auto": {
"onTurnEnd": true, // 一轮结束后给下一句建议
"onTypingPause": false, // 打字停顿后给续写建议(默认关)
"delayMs": 1400,
"minChars": 8,
"cooldownMs": 4000,
"turnEndDelayMs": 600
},
"panel": { "count": 3, "maxHeight": 380, "directionDelayMs": 400 },
"context": {
"sessionMessages": 4, // 0 = 不带对话
"maxContextChars": 6000,
"workspace": true,
"time": false
},
"limits": { "maxDraftChars": 20000, "requestTimeoutMs": 20000, "fixedTimeoutMs": 20000 },
"ui": { "mountSettingsInSidebar": false }, // 开启后 Settings 侧边栏出现「建议者」
"defaultMode": "code"
// "modes" / "presets" 见下方说明
}
模式与预设
内置三套模式:
| 模式 | 默认预设 | 可用预设 |
|---|---|---|
代码 code | suggest | suggest continue fix tests explain refactor |
写作 writing | suggest | suggest continue polish shorten expand formal |
翻译 translate | to-en | to-en to-zh |
内置预设的 kind 决定应用方式:
next:用于空输入框,给出下一句消息(suggest)。continue:用于草稿续写(continue)。rewrite:用于整段改写(fix、tests、explain、refactor、polish、shorten、expand、formal、to-en、to-zh)。
modes 和 presets 的完整默认值见 examples/dsh-advisor.default.json:
- 模式只保存装配关系:标题、描述、默认预设和预设 id 列表;模式描述会作为上下文交给模型。
- 预设是全局能力库,存 prompt、类型、温度、上限和推理强度。多个模式可以共用同一个预设。
modes和presets两个数组分别整体替换内置数组,二者互不影响:- 只写
modes:模式列表被替换,presets仍是内置预设库;引用不到预设的模式会被丢弃。 - 只写
presets:预设库被替换,内置模式里引用不到新预设的模式会被丢弃;如果一个模式都不剩,整体回退到内置默认配置。 - 最稳妥的做法是同时提供完整的
modes和presets,也就是以完整默认配置为起点修改。
- 只写
- 旧版
groups+tabs配置会在读取时自动迁移:prompt 相同、id 相同的 tab 合并成一个预设;prompt 不同的 tab 会生成新 id(前缀为 group id),标题追加(group 标题)。设置页的「恢复默认模式与预设」可随时回到内置配置。 ui.mountSettingsInSidebar为true时,Settings 弹窗左侧会多一个「建议者」入口;关闭并保存后移除。这只影响设置界面挂载位置,不影响建议行为。- 数字字段会被夹到安全范围;未知字段忽略。
它是怎么工作的
- Host 半边
host.js注册/api/dsh-advisor这条带登录鉴权的 RPC 通道(ctx.connection.fetch.register),请求体是{ endpoint, payload },端点包括complete、config、reload、settings、save、models、probe、diagnostics、ping。它负责读配置、取会话上下文、解析模型、拼 prompt、调用ctx.llm。 - Client 半边
client.js注册conversation.input.overlay(灰字/面板)、conversation.input.left(✦ 按钮)和plugins.row.config(插件设置页),并用commandUi注册/suggest。ui.mountSettingsInSidebar为真时再动态挂载一个settings.section。 - 草稿和光标来自插槽标准 props:
useInput/inputActions.captureInsertion();写回统一走inputActions.insertText(),因此每次应用都是一步可撤销编辑。 - 行内灰字是编辑器段落上的 CSS
::after/::before,和 Harness 自己的命令提示共用同一机制,不改编辑器 DOM;DSH 若调整段落结构,灰字会静默失效,不影响其他功能。 - 模型调用使用
ctx.llm.prepareCall()+stream()。模型解析:fixed用配置里的 provider/model;default用 DSH 的全局默认模型(agentDefaultModel,取不到时回退到会话模型);session先用当前会话的requestHeader().config,再回退到agentDefaultModel。固定模型失败且打开了model.fallbackToSession时,会回退到会话模型。
开发
没有构建步骤,也没有运行时依赖:插件是直接加载的 ES 模块。
plugin/host.js Host:HTTP 路由、配置、上下文、模型调用
plugin/config.js 默认模式/预设、合并、校验与旧配置迁移
plugin/prompts.js prompt 拼装、输出清洗
plugin/client.js Client:灰字、面板、按钮、/suggest
本地迭代方式:
- 用
plugin_manager install_bundle target=<绝对路径>/plugin把当前工作区装进 profile(安装会建立到工作区的 link)。 - 改 Host 文件后重启 Harness;改
client.js后刷新页面即可。 - 改版本号(
plugin/package.json与client.js/host.js里的版本常量)可以绕开模块缓存。
提交前可本地检查:
node --check plugin/host.js && node --check plugin/client.js && node --check plugin/config.js && node --check plugin/prompts.js
node scripts/check-default-config.mjs
node -e "JSON.parse(require('node:fs').readFileSync('plugin/package.json')); console.log('JSON OK')"
(cd plugin && npm pack --dry-run)
CI(GitHub Actions)会跑同样的语法检查、JSON 校验、打包检查和「示例配置是否与内置默认同步」的检查。注意 plugin/package.json 里的 private 是有意保留的:插件通过路径安装,不发布到 npm。
修改默认模式、预设或归一化逻辑后,用下面的命令重新生成示例配置:
node -e "import('./plugin/config.js').then(({DEFAULT_CONFIG,normalizeConfig})=>require('node:fs').writeFileSync('examples/dsh-advisor.default.json', JSON.stringify(normalizeConfig(DEFAULT_CONFIG), null, 2) + '\n'))"
已知限制
- 草稿里带
@文件chip 时,整段改写会把 chip 压平成文本;建议先只改纯文本。 - 行内灰字依赖
[data-composer-input] > p:last-child结构,属于非公开 API。 - 客户端与 Host 只通过一条自定义 RPC 通道通信,因此只支持 Web GUI / Desktop,不支持纯 TUI。
- 建议不会写入会话日志,也不会消耗会话上下文。
- 插件注册的插槽(
conversation.input.overlay等)和ctx.llm是 DSH 的内部扩展点,DSH 升级后可能需要跟随调整。
隐私
- 没有遥测、分析或远程配置。
- 草稿和光标只存在于当前浏览器页面。请求建议时,会向你选择的模型提供商发送:当前草稿与光标位置、最近 N 条对话(默认 4 条,可设为 0)、当前模式和预设的提示、工作区路径(默认开)、时间(默认关),以及面板里输入的自定义方向。
- 请求时机:默认在每一轮 agent 输出结束且输入框为空时自动请求一次(
auto.onTurnEnd);可选在打字停顿后请求(auto.onTypingPause,默认关);/suggest、双击Tab或点击 ✦ 按钮时按需请求。 - 配置保存在本机
~/.dsh/dsh-advisor.json;建议内容不会写入会话记录。
目录
dsh-advisor/ 项目仓库
├── README.md
├── README.en.md English README
├── LICENSE MIT
├── CONTRIBUTING.md 贡献指南
├── CHANGELOG.md 变更记录
├── examples/
│ └── dsh-advisor.default.json 完整默认配置
├── scripts/
│ └── check-default-config.mjs 检查示例配置是否与内置默认同步
└── plugin/ 可安装的 Harness 插件包(dsh-advisor)
├── host.js Host:HTTP 路由、配置、上下文、模型调用
├── config.js 默认模式/预设、合并、校验与旧配置迁移
├── prompts.js prompt 拼装、输出清洗
├── client.js Client:灰字、面板、按钮、/suggest
├── cordis.patch.yml Bundle patch
├── locale/ Settings/Plugins 页面元数据
└── icon.svg
贡献
欢迎 issue 和 PR。提交前请阅读 CONTRIBUTING.md,变更历史见 CHANGELOG.md,并尽量保持改动小而聚焦。
许可证
MIT © 2026 Zhikang Liu