dsh-grillme
DSH 插件:输入框底部的提问等级(关闭 / L1 全权委托 → L5 拷问),按会话生效,等级直接写入系统提示词。
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 22, 2026
- Updated
- Oct 22, 2026
Introduction
dsh-grillme
在 DSH 输入框底部加一个「提问」按钮,用六档提问等级控制 AI「先问还是先做」。
等级越低,AI 自主性越强(自己拍板,尽量不打扰你);等级越高,AI 越会停下来问,最高档要求它把每一个决策点都问到,禁止任何默认值。

图为界面示意,按插件
lib/client.js的同一套样式与 DSH 输入区结构渲染,不是运行截图。可用node scripts/make-screenshots.mjs重新生成。
六档等级(默认 L3)
| 档位 | 名称 | 行为要点 |
|---|---|---|
| 关 | 关闭 | 不注入任何指令,行为退回宿主默认 |
| L1 | 全权委托 | 自己拍板,只在「不可逆损失 / 只有你才有的信息 / 指令自相矛盾」时才问;结尾列出「自主决策」清单 |
| L2 | 简报 | 动手前一条消息自报计划与 2–4 个关键取舍,说完就干,不等确认;只问影响范围或验收的歧义 |
| L3 | 平衡(默认) | 开工前一次性批量问清关键缺口(≤5 条,带候选与推荐),然后连续执行;只在高影响分叉上再问 |
| L4 | 详尽 | 先做深度访谈;每一阶段先给 2–3 个方案等确认再实现;命名、目录、选型、交互、测试范围逐项确认 |
| L5 | 拷问 | 先列「决策点普查」清单并给用户看,然后每批 3–5 条逐条追问,直到每一项都有明确选择;执行中冒出的新决策点立刻补问;用户说「你看着办」也要回问确认 |
设计理由:
- 5 档而不是 3 档或 7 档:这条轴的两端是「完全不问」和「全部要问」,中间的差别主要是「问的时机」和「问的粒度」。3 档分不出「先问再干」和「问完再干」的差别;7 档则出现语义重叠、档位说不清。5 档刚好覆盖:不问(L1)→ 只报告(L2)→ 开工前问一次(L3)→ 分阶段问(L4)→ 逐条拷问(L5)。
- 默认 L3:默认档要能应付日常任务,既防止 AI 瞎猜方向,也不至于每句话都打断。
- 「关闭」单独作为 0 档:不想要这个插件的行为时不必卸载插件。
实现方式
- 按会话生效:等级存在
~/.dsh/grillme.json(v2:{ version: 2, defaultLevel: 3, sessions: { "<sessionId>": <level> } })。没单独设置过的会话沿用defaultLevel;弹层里选档只写当前会话那一条。v1 的全局level会自动迁移成defaultLevel。 - host 侧(
lib/index.js)- 通过
ctx.systemPrompt.section({ name: 'grillme:level', order: 9800, text: (context) => … })注册一段系统提示词。text是函数,每次装配都从context.agent.session.id(scope.id兜底)取出当前会话 id,再查该会话的等级,每次装配重新求值,所以切换等级后下一轮对话就生效,无需重启或重开会话。等级为「关闭」时 section 渲染为空串,会被装配自动丢弃。 - 暴露 HTTP 接口(都接受
?session=/ body 里的session):GET /api/grillme/state?session=S→{ level, defaultLevel, levels, section, storePath }PUT /api/grillme/state{ session, level }→ 写该会话的等级;不带session时改默认档GET /api/grillme/directive?level=N | ?session=S→ 该等级/该会话将来注入的完整文本(用于自检/预览)POST /api/grillme/ping→ 客户端挂载心跳(带上自己解析到的 session)GET /api/grillme/health
- 自检文件:
~/.dsh/grillme-status.json记录mountedAt/sectionRegistered/defaultLevel/sessions/clientMounted/clientPingAt/clientSession,以及lastAssembly(真实装配一次的探针结果)。没有浏览器也能确认 host 与客户端两侧是否真的挂上。
- 通过
- client 侧(
lib/client.js)- 注册到
conversation.input.left槽位(order: 56,与「精炼」按钮相邻),即输入框底部工具栏。 - 会话 id 来源:槽位 props 的
sessionId(实测存在)→useSession钩子 → 会话根节点data-conversation-session属性,三级兜底。 - 按钮显示当前会话的档位(
提问 L3·平衡),点击弹层选择等级;L1 绿色、L4 琥珀、L5 红色做视觉提示。弹层顶部会注明「只作用于当前会话;未单独设置的会话沿用默认档 L3」。 - 弹层里「查看注入内容」可直接看到该会话写入模型系统提示词的原文。
- 注册到
安装
一条命令
dsh plugin --profile desktop add "github:nubeslove/dsh-grillme"
然后在 $DSH_HOME/profiles/desktop/package.json 的 dsh.profile.bundles 里追加 "dsh-grillme",重启 DSH。插件是纯 JS,没有构建步骤,也没有运行时依赖。
本地开发:手工 link
桌面端由 Electron 独占管理 profile 时,dsh plugin add 会被拒绝(profile "desktop" is managed exclusively by the Electron application)。这时手工接线:
$profile = "C:\Users\云\.dsh\profiles\desktop"
# 1. 建立 link 依赖(pnpm 的 link: 等价物就是 node_modules 下的 junction)
New-Item -ItemType Junction -Path "$profile\node_modules\dsh-grillme" -Target "E:\project\便捷工具组\dsh-grillme"
# 2. 在 $profile\package.json 里加依赖
# "dsh-grillme": "link:E:/project/便捷工具组/dsh-grillme"
# 3. 把 dsh-grillme 追加到 $profile\package.json 的 dsh.profile.bundles 末尾
HMR 监视 dsh.profile.bundles 列表:改完保存,应用会当场重组(host 侧挂载 + 浏览器侧加载新模块),不需要重启应用;页面若没刷新到最新前端代码,刷新一次即可。
自检与验证
cd E:\project\便捷工具组\dsh-grillme
node tests/host.test.mjs # 30 项断言:section 注册、会话 id 解析、按会话读写、落盘结构、v1 迁移、非法输入、关闭档
- 运行时不依赖浏览器也能核验:
~/.dsh/grillme-status.json记录mountedAt、sectionRegistered、defaultLevel、sessions、clientMounted/clientPingAt/clientSession,以及lastAssembly(用真实systemPrompt.assemble()跑一遍,报告grillme:level是否真的入选、多少字、首行是什么)。 - 实测结果(2026-10-20):
- host:section 已注册;装配结果 9 个 section 中含
grillme:level(L3 470 字 / L5 671 字)。 - client:
clientSession上报到真实会话 id(来自槽位sessionIdprops)。 - 按会话生效:把某会话设成 L2、默认档留 L3 后重新装配,该会话的
system/message里出现[grillme · L2 简报],另一个会话仍是 L3 —— 从会话日志session.v4.jsonl.zstd里可直接查到。
- host:section 已注册;装配结果 9 个 section 中含
卸载
- 从 profile
package.json的dsh.profile.bundles里删掉dsh-grillme; - 删掉
package.json里的link:依赖,并删除node_modules\dsh-grillmejunction; - 可选:删除
~/.dsh/grillme.json、~/.dsh/grillme-status.json。
边界与注意事项
- 等级按会话独立:每个会话一份;没单独设置过的会话用
defaultLevel(默认 L3)。新会话不会继承上一个会话的选择。 - 等级只影响「问多少」,不影响权限与安全确认;权限提示、沙箱拦截、不可逆操作的确认照常。
- 明确写了「子代理不要向用户发问」,避免 L4/L5 把 subagent 也变成提问机器。
- 系统提示词按会话前缀缓存,切换等级会让缓存从改动处失效,这是预期代价。
反馈与联系
遇到 bug、安装失败、行为和文档对不上,或者想要某个功能,直接发邮件:1992335297@qq.com。邮件里带上插件版本、DSH 版本和报错原文,定位会快很多。
也可以走 GitHub Issues。