← Back to home@nubeslove

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(来自槽位 sessionId props)。
    • 按会话生效:把某会话设成 L2、默认档留 L3 后重新装配,该会话的 system/message 里出现 [grillme · L2 简报],另一个会话仍是 L3 —— 从会话日志 session.v4.jsonl.zstd 里可直接查到。

卸载

  1. 从 profile package.json 的 dsh.profile.bundles 里删掉 dsh-grillme;
  2. 删掉 package.json 里的 link: 依赖,并删除 node_modules\dsh-grillme junction;
  3. 可选:删除 ~/.dsh/grillme.json、~/.dsh/grillme-status.json。

边界与注意事项

  • 等级按会话独立:每个会话一份;没单独设置过的会话用 defaultLevel(默认 L3)。新会话不会继承上一个会话的选择。
  • 等级只影响「问多少」,不影响权限与安全确认;权限提示、沙箱拦截、不可逆操作的确认照常。
  • 明确写了「子代理不要向用户发问」,避免 L4/L5 把 subagent 也变成提问机器。
  • 系统提示词按会话前缀缓存,切换等级会让缓存从改动处失效,这是预期代价。

反馈与联系

遇到 bug、安装失败、行为和文档对不上,或者想要某个功能,直接发邮件:1992335297@qq.com。邮件里带上插件版本、DSH 版本和报错原文,定位会快很多。

也可以走 GitHub Issues。