Skip to main content
M

dsh-progress-beat

mabinogi-cichol/dsh-progress-beat

Makes the agent narrate progress during long tool chains instead of staying silent until the final answer: a standing system-prompt rule that travels with every request, plus a notice injected after every N tool calls. A panel on the plugin page tunes the cadence, the reminder budget, and both texts; changes apply live.

Install

dsh plugin --profile web add github:mabinogi-cichol/dsh-progress-beat

README

dsh-progress-beat

DeepSeek Harness(DSH)插件:让 agent 在长时间「思考 + 工具调用」中途输出用户可见的进度说明,而不是一路静默到任务结束才说话。

它解决什么问题

较新的 flash 类模型(如 1017 版本)在 agent 任务里倾向于「连续调用工具、只在最终答复时输出文本」。UI 上就表现为:几十分钟里只有工具卡片在滚,用户不知道模型在干什么。

本插件用两条互补机制把进度说话重新塞回执行过程:

机制挂载位置作用
进度规则ctx.systemPrompt.section()(order 4)每次请求都带上的常驻规则:预计多次调用时先说计划;每约 N 次工具调用或进入新阶段,先说 1–2 句进度再继续。
兜底提醒tools/post-execute → additionalContexts按工具调用次数计数,每 N 次注入一条 notice。模型想沉默也会被硬提醒一次,同时会话里留下一条可见的合成消息。

两条都不改会话内容、不吞工具结果、不阻塞调用:注入的 notice 走 source.form = 'notice',模型可见、带归属、可审计。

控制面板

插件列表里 dsh-progress-beat 这一行会多出一个配置入口,打开就是可视化表单,不用手改 YAML:

控件字段说明
节奏预设every一键切换 安静 8 / 标准 4 / 密集 2
播报步频every累计多少次工具调用后强制播报(2–50)
单轮提醒上限maxRemindersPerTurn每个清零周期内最多注入多少条兜底提醒;0 表示关掉兜底
常驻进度规则injectPrompt是否注册 system prompt 规则
常驻规则文本promptText支持 {{every}} 占位符
兜底提醒文本nudgeText支持 {{every}} / {{count}} 占位符

面板是「暂存 + 保存」模型:改动先留在表单里,点保存才写入;每个字段可单独重置回默认,也可以全部重置。字段旁出现「已覆盖」徽标表示它被用户改过、不再跟随默认值。

保存走宿主的 settings 服务,写进 profile 的 cordis.patch.yml 并由 Loader 热应用——面板保存即生效,重启后仍然有效。插件侧的 Config schema 是这一切的依据:宿主把它投影成表单(ctx.configForms),面板只负责渲染与暂存,不自建存储。

面板注册在插件管理页的 plugins.row.config 插槽,键为 dsh-progress-beat#dsh-progress-beat。浏览器半侧随 Loader 行走,关掉这一行面板也随之消失。

配置

控制面板改的就是下面这份 Config;也可以直接在 profile patch 里写:

- insert:
    - id: dsh-progress-beat
      name: 'dsh-progress-beat'
      inject: [systemPrompt]
      config:
        every: 4                    # 累计多少次工具调用后强制播报(>=2)
        maxRemindersPerTurn: 12     # 单轮最多注入多少次提醒,防刷屏 / 刷 token
        injectPrompt: true          # 是否注册 system prompt 规则
        # promptText / nudgeText 可整段替换,支持 {{every}} / {{count}} 占位

安装

profile 名按你的入口选:桌面版 GUI 启动的是 desktop profile,dsh web / 浏览器版用的是 web profile。

方式一:从 GitHub 直接装(推荐)

dsh plugin --profile desktop add github:Mabinogi-Cichol/dsh-progress-beat

方式二:本地克隆后装

git clone git@github.com:Mabinogi-Cichol/dsh-progress-beat.git
dsh plugin --profile desktop add <克隆目录的绝对路径>

装完确认 profile 的 package.json 里 dsh.profile.bundles 含 dsh-progress-beat。运行中的 loader 会热加载新增条目;若 UI 的「插件列表」没刷新,切走再切回该标签页(它只在挂载时拉一次快照),或刷新页面让浏览器半侧重新入图。

注意:桌面版 GUI 启动的是 desktop profile(%USERPROFILE%\.dsh\profiles\desktop),dsh web 用的是 web profile。装错 profile 时插件在界面上完全不可见——「插件列表」是 cordis loader 条目的只读投影。

依赖解析:Host 半侧 import @deepseek-ai/schemastery(Config schema 需要可投影的 schema 对象)。以 link: 方式安装时,Node 从仓库目录向上解析,因此本机需要一个指向 DSH 安装的 node_modules:

$target = "<DSH>\resources\app\dsh\node_modules\@deepseek-ai"
New-Item -ItemType Junction -Path .\node_modules\@deepseek-ai -Target $target

node_modules/ 已在 .gitignore 内。缺少这一步时插件加载失败、进度播报整体不生效,而不仅是面板。

卸载

dsh plugin --profile desktop remove dsh-progress-beat
# 并从 profile package.json 的 dsh.profile.bundles 中删掉同名条目

自测

node test\smoke.mjs          # Host:注入节奏、配额、block 透传、轮次清零
node test\panel-smoke.mjs    # Client:注册键、注入面、summary/page 两视图

smoke.mjs 覆盖:section 注册与占位符替换、注入节奏、单轮配额、block 分支透传、无 agent 直连调用不计数、新用户提示词清零、关闭 prompt 注入。

panel-smoke.mjs 用 mock 的 ModuleLoader 与 React 执行浏览器半侧,覆盖:factory 能被 load() 接收、apply 不抛错、面板注册到 plugins.row.config 且键为 <包名>#<行 id>、注入面含表单控制器、五个字段与保存控件都被渲染。

限制

进度是否「说得好」本质仍是模型行为,插件只能通过常驻规则 + 周期提醒提高概率,不能 100% 程序化锁死。想让节奏更密就把 every 调到 2–3;觉得吵就调到 6–8 或把 injectPrompt 关掉只留兜底提醒。

Related plugins