dsh-progress-beat: Enable agents to output progress during long-running tasks.

Foreword

When running long toolchains, agents often exhibit a common phenomenon: the model calls tools consecutively, causing the interface to scroll with tool cards for tens of minutes without visible output, only revealing a result at the very end. Newcomers don’t know what the model is doing and can only wait. dsh-progress-beat is the DSH plugin designed to solve this problem: it inserts user-visible progress explanations during the “thinking + tool calling” phase, allowing the agent to speak while it works, rather than remaining silent until the end. The plugin is maintained by Mabinogi-Cichol and categorized as “Workflow”.

What is this

One-sentence positioning: A DSH plugin that injects progress reporting back into the agent execution process. It does not alter session content, swallow tool results, or block calls. The injected reminders use source.form = 'notice', making them visible to the model, attributed, and auditable.

It targets the behavioral tendency of newer flash-style models (e.g., version 1017) in agent tasks to “consecutively call tools and only output text in the final response”. The plugin does not attempt to rewrite the model but only increases the probability of it speaking by adding persistent rules and periodic reminders.

Three Complementary Mechanisms

The plugin provides three mechanisms. By default, “Persistent Progress Rule + Silent Nudge” are enabled, while “User Turn Nudge” is disabled.

  1. Persistent Progress Rule: Hooked onto ctx.systemPrompt.section(). Every request carries a rule requiring the model to announce its plan before multiple calls, or when entering a new stage or remaining silent for a long time. The rhythm is controlled by promptEvery (the “N” in “approximately every N times” in the text, default 6) and sectionOrder (insertion position, default 4).
  2. User Turn Nudge: Hooked onto agent/pre-step, injecting a reminder in the messages of that turn. The switch field is nudgeOnUserTurn, default off; once enabled, reminders are injected at the rhythm of nudgeEveryTurns (default 1, range 1-20), without repetition for subsequent steps in the same turn.
  3. Silent Nudge: Also hooked onto agent/pre-step, but it is calculated based on silence, not total calls: if the cumulative number of calls since the last announcement reaches N, or silence exceeds T seconds, whichever comes first is calculated. The rhythm fields are every (default 8), silentSeconds (default 180 seconds), and additionally minGapSeconds / maxRemindersPerTurn / dripSeconds control intervals and budget. In practical tests with 200 calls, only 6 reminders were injected along this path.

When all three are turned off, the plugin only contributes a system prompt section and does not even register the agent/pre-step hook.

Control Panel & Configuration

The “Configuration” entry appears next to dsh-progress-beat in the plugin list. Opening it reveals a visual form, eliminating the need for manual YAML editing. The panel is divided into three collapsible groups corresponding to the three mechanisms. In the collapsed state, only the mechanism name and the switch are visible; expanded states reveal the details. The panel follows a “Staging + Save” model: changes are kept in the form until the user clicks save; each field can be reset individually, or all can be reset, with an “Overridden” indicator appearing next to modified fields.

Saving goes through the host’s settings service, writing to the profile’s cordis.patch.yml, which is hot-applied by the Loader and remains effective after a restart. The plugin-side Config schema (each field declares .volatile()) serves as the basis for this form; the host projects it into the form, while the panel is only responsible for rendering and staging, not for custom storage. The panel is registered in the plugins.row.config slot of the plugin management page, with the key dsh-progress-beat#dsh-progress-beat.

You can also write the configuration directly in the profile patch, which is equivalent to the result of saving via the panel:

- insert:
    - id: dsh-progress-beat
      name: 'dsh-progress-beat'
      inject: [systemPrompt]
      config:
        # ① Persistent Progress Rule (system prompt section)
        injectPrompt: true        # Whether to register the persistent rule
        promptEvery: 6            # The "N" in "approximately every N times" in the rule text (2–50, only affects process reporting)
        sectionOrder: 4           # Section sort order (0–99, default 4, tool declarations start at 100)
        # ② User Turn Nudge (agent/pre-step)
        nudgeOnUserTurn: false    # Whether to inject with user input (default off)
        nudgeEveryTurns: 1        # Reminder frequency: 1 every turn, 3 every three turns (1–20)
        # ③ Silent Nudge (agent/pre-step, based on silence rather than total calls)
        nudgeOnToolCalls: true    # Whether to enable (default on)
        every: 8                  # Silent call threshold: cumulative calls since last announcement (2–100)
        silentSeconds: 180        # Silent time threshold (seconds), calculated together with call count
        maxRemindersPerTurn: 6    # Per-turn budget; 0 means turning off this path
        minGapSeconds: 60         # Minimum interval between two reminders (seconds)
        dripSeconds: 300          # Slow reminder interval after budget is exhausted (seconds), won't go completely silent
        # promptText / userTurnText / nudgeText can be replaced entirely, supporting {{every}} / {{count}} / {{seconds}} / {{remind}} placeholders

Installation & Enablement

Profile names depend on the entry point: the Desktop GUI starts the desktop profile, while dsh web / Browser versions use the web profile. Install directly from GitHub:

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

You can also clone locally and install:

git clone git@github.com:Mabinogi-Cichol/dsh-progress-beat.git
dsh plugin --profile desktop add <absolute path of cloned directory>

After installation, verify that dsh.profile.bundles in the profile’s package.json contains dsh-progress-beat. The running loader will hot-load the new entry; if the “Plugin List” doesn’t refresh, switch tabs and switch back (it only pulls a snapshot upon mounting), or refresh the page to let the browser re-render. If a wrong profile is installed, the plugin is completely invisible in the interface because the “Plugin List” is a read-only projection of the cordis loader entries.

Dependency Resolution: The Host imports @deepseek-ai/schemastery. When installing via the link: method, Node resolves upwards from the repository directory, so a junction pointing to the DSH installation’s node_modules is required on the local machine:

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

node_modules/ is already in .gitignore. If this step is missing, the plugin fails to load and progress reporting fails to work entirely, not just the panel.

Uninstall:

dsh plugin --profile desktop remove dsh-progress-beat
# And remove the same entry from dsh.profile.bundles in the profile's package.json

Self-Testing

The repository includes two smoke scripts:

node test\smoke.mjs          # Host: injection rhythm, quota, block passthrough, turn zeroing
node test\panel-smoke.mjs    # Client: registration key, injection surface, summary/page two views

smoke.mjs covers section registration and placeholder replacement, injection rhythm, per-turn quota, block branch passthrough, non-agent direct calls not counting, new user prompt zeroing, and disabling prompt injection. panel-smoke.mjs uses a mocked ModuleLoader and React to execute the client side, covering that the factory can be received by load(), apply throws no errors, the panel is registered to plugins.row.config, the injection surface includes the form controller, and the fields and save controls are all rendered.

Applicable Scenarios & Notes

Suitable for DSH users who need visible feedback during long toolchain tasks, or for agent scenarios where only tool cards scroll on the interface and no one knows the progress. To make the rhythm denser, set every to 2–3; if it’s too noisy, set it to 6–8, or turn off injectPrompt to keep only the fallback reminder.

It is worth noting that whether progress is “said well” is essentially still a model behavior; the plugin can only increase the probability through persistent rules and periodic reminders, it cannot programmatically lock it 100%. The plugin runs with the current DSH process permissions; before installation, check the source code and license (MIT); the license, version number (0.3.1), and field default values are based on the repository README and package.json.

Conclusion

The value of dsh-progress-beat lies in changing “silent execution” to “speak while doing”, and not being overly intrusive by default: persistent rules + silent nudge are sufficient; adjust parameters if you need a denser or quieter rhythm. Directory page: https://www.skillhub.cn/plugins/Mabinogi-Cichol/dsh-progress-beat ; Repository: https://github.com/Mabinogi-Cichol/dsh-progress-beat . The community directory is an independent site and has no official affiliation with DeepSeek / Huansuan.

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye