Preface¶
DeepSeek Harness (dsh for short) makes models, tools, sessions, sandboxes and UIs all replaceable plugins, with its official slogan being “Everything is a Plugin”. In practice, agents often engage in continuous thinking, tool calls and rethinking, but the terminal or Web UI only shows a static “Working”. You know it hasn’t crashed, but you have no way of telling if it’s reading a file, running a test, or stuck on a bash command.
The working-activity plugin was built to solve this exact problem. It aggregates session events into a real-time “status line”: you can directly see which tool is running, how long it has been thinking, and how many tools were used to wrap up the task. The repository is maintained by chimney (GitHub: ccch1mneyyy), and it’s a community-driven project, not an official DeepSeek offering. The same concept was also implemented for the pi CLI, with two separate npm packages published independently. This article only covers the DeepSeek Harness version.
The community plugin directory https://deepseek-harness-plugin.com is an independent website with no official affiliation to DeepSeek / Magic Square, and should not be treated as an official app store. As of 2026-08-17, the GitHub repository ccch1mneyyy/working-activity has 646 stars; the directory page categorizes it under “Development & Runtime”, and the npm package dsh-working-activity is currently at version 0.2.6.
What is this¶
In one sentence: it is a session event-driven working status line that translates the agent’s current phase (idle / waiting / thinking / tool use / wrap-up) into readable text, which can be displayed on the TUI, dsh-cc terminal or Web UI.
The source code is located at packages/activity/working-activity/ in the repository. The earlier standalone repository dsh-working-activity has been archived, and the documentation states that the code and development work have been merged into the current repository, while the npm package name remains `dsh-working-activity, and the installation method has not changed.
The state machine listens to dsh’s native session events: turn/start, assistant/chunk, tool/call, tool/result, turn/end, plus agent/status. It does not register new tools or modify the agent loop; the activity/status event is purely a log-only event, and the model cannot see this status line.
Core Features¶
The following capabilities are sourced from the repository README and the DSH version documentation. Features exclusive to the pi CLI version such as progress percentage, combo counter, and rainbow easter eggs have no equivalent events on the DSH side, and will not be covered in this article.
- Real-time status line. Short phrases rotate during the thinking phase, for example: “Hmm… let me sort this out”, “Let’s work through this”, interspersed with deadpan
lol/hm/ok. If thinking for too long will trigger different tiers: 30 seconds, 1 minute, 5 minutes thresholds; late-night copy will be mixed in between 00:00 and 06:00 local time. During the tool use phase displays “playful verb + parameter details + elapsed time”, for example:
Running command npm test · 12s
At the end of a turn, it becomes a wrap-up summary:
Done ✓ · 4 tools · 12s thinking, 11s execution
Failed tools will be replaced with phrases like “oops, that failed” instead of just showing a cross. Set phrases to false, and only plain labels will be shown, for example Thinking · Total 1m23s.
-
Model narration. By default
narrate: true, the plugin adds a convention to the system prompt: the model writes⏵ What you are doing (≤20 words)at the start of a step. It parses streaming output, places this line on the status line, and filters it out from the chat body (logs are still preserved). Turn offnarrateif narration is not needed. -
Two consumption outlets, which are disabled when the corresponding seam does not exist. One is the TUI prompt slot: the plugin registers
${activity}onctx.tuiPrompt, and writing it intotheme.leftPromptwill display it alongside cwd, model, and context. The other is the session eventactivity/status, for use by the Web UI and dsh-cc status bar. Once dsh-cc-tui is installed, the status bar will consume the same event stream and render animated indicators, scrolling text and context warnings. -
Adjustable publishing rhythm. Status line changes are published immediately; after stabilizing, it will be published at most once every
publishIntervalMs, so that the elapsed time for long-running tools stays up to date without spamming logs. The documentation recommends setting the interval to 500 milliseconds for dsh-cc, so that the second count updates more smoothly.
Installation and Activation¶
The installation command given on the directory page is as follows, executed in the DeepSeek Harness terminal:
dsh plugin add github:ccch1mneyyy/working-activity
For reproducible installations, pin the commit as per the directory page instructions:
dsh plugin add github:ccch1mneyyy/working-activity#commit
Replace #commit with the actual hash. The repository README also has an installation method via npm package, which installs the plugin to a specified profile and automatically hooks into the bundle tree via the built-in dsh.bundle.patch, eliminating the need for manual insert:
dsh plugin --profile <your profile> add dsh-working-activity
The prerequisite is that you have already installed the official CLI (npm install -g @deepseek-ai/dsh). The package’s engines requires Node.js ^22.19 || >=24. The plugin declares a bundle patch, and dsh plugin add will run pnpm add in the profile, then append the package name to dsh.profile.bundles; during startup, cordis.patch.yml will insert itself into the tree. The documentation explicitly does not recommend just running pnpm add manually, because the reconcile step only happens during the dsh plugin command.
If you are also using the author’s dsh-cc-tui, the recommended order is to install this plugin first, then the tui, so that the tui bundle can target the working-activity line and overwrite publishIntervalMs to 500:
dsh plugin --profile cc-tui add dsh-working-activity
dsh plugin --profile cc-tui add dsh-cc-tui
Reversing the order will skip the overwrite after a warning, and you will need to modify the configuration at the user level yourself.
Do not insert duplicate plugins when adjusting parameters. Override by id in the user patch $DSH_HOME/profiles/<your profile>/cordis.patch.yml:
- id: working-activity
config:
publishIntervalMs: 500
phrases: true
narrate: true
The main configuration items are as follows (refer to the plugin package README for the final say; there is an inconsistency where docs/dsh-working-activity.md writing publish default value to true, which conflicts with the package README and root README, so we follow the more up-to-date published package instructions):
| Key | Default Value | Meaning |
|---|---|---|
phrases |
true |
Pool of fun phrases; false only shows functional labels |
publish |
false |
Whether to append activity/status session events for Web / dsh-cc |
tickMs |
500 |
Status rendering tick interval |
publishIntervalMs |
2000 |
Minimum publish interval for stable status lines; dsh-cc recommends 500 |
detailLimit |
40 |
Maximum display length for details such as paths and commands |
customActions |
{} |
Phrase pool matched exactly by tool name |
narrate |
true |
Whether to inject the ⏵ narration convention |
There is a reason why publish defaults to false: the current session.append() cannot mark events as ignorable, and the resume read path will reject logs containing unknown and non-ignorable events. Once enabled, any session that has displayed the status line may fail to resume. The TUI real-time prompt does not depend on this event and is not affected. Only enable this when the host already supports ignorable append and you genuinely needs to be consumed by Web / dsh-cc.
Typical Usage¶
**1. Display status line in the official TUI
When the official dsh-tui is already bundled in your profile, add${activity}` to the left prompt at the user level:
- id: tui
config:
theme:
leftPrompt: '${cwd}${git/worktree}${activity}${model}${token_meter/cache_hit_rate}${context}'
If this slot is not present in the template, the plugin will not produce any visible effect in the TUI. The documentation gives sample displays: during thinking it shows Hmm… let me sort this out · Total 1m23s; during tool use it shows dsh main Running command npm test · 12s deepseek-chat …; wraps up briefly with Done ✓ · 4 tools · 12s thinking, 11s execution.
2. Custom tool copy
customActions matches tool names exactly, and regular expressions in the configuration will not be executed:
{
"customActions": {
"my_deploy": ["Deploying", "Starting deployment"],
"format_code": ["Formatting", "Cleaning up code"
}
}
3. Web UI (optional, depends on official rc.6 slot
The full DSH version documentation splits the Web UI setup into two parts: the runtime patch handles the data channel, and the slot plugin handles rendering. The slot plugin is distributed with the npm package and hooks into conversation.input.dock without modifying the official UI source code. However, ConversationSnapshot.activity requires patching the official client runtime to have runtime data, and the component will render empty without errors if no patch is applied. The patch is located at patches/webui-working-activity.patch in the repository, and the documentation requires running it from the root directory of the official rc.6 source code:
git apply <path-to-this-repository>/patches/webui-working-activity.patch
If the official team merges the activity field into the release line in the future, this patch can be removed. The Web UI capability is not available immediately after installation, and you will need to supplement the data channel as per the documentation.
Applicable Scenarios and Notes¶
This is suitable for users who are already using the dsh terminal or Web UI and want to see at a glance which step the agent is stuck on. When used together with dsh-cc-tui, the status bar is the most fully documented consumption endpoint. If you only care about “which command is running now and how long it has been thinking”, turn off phrases.
Be aware of the following boundaries before using:
1. There is only one status line per session, and the Web / terminal will display the most recently active session.
2. DSH has no tool progress events, and long-running tools only show elapsed time, no progress percentage. This differs from the pi CLI version, so do not look for a progress bar for DSH based on the pi CLI version README.
3. The TUI slot renders static text; frame animations are handled on the dsh-cc rendering side, not in this event payload.
4. Check the license separately. The GitHub repository and the pi CLI version use the MIT license; the package.json and npm page for the DSH plugin package packages/activity/working-activity/ use the BSD-3-Clause license. The directory page marks the entire project as MIT, referring to the root license of the repository. When installing the DSH package, refer to the license inside the package.
5. The plugin runs with the permissions of the current dsh process, and may execute code during installation. Inspect the source repository and license before installing. The author states that both versions do not collect or upload data, have no network requests or telemetry; activity/status only writes to local session logs, is invisible to the model, and is ignored during replay.
Summary¶
The working-activity plugin does one specific thing: it aggregates the existing thinking, tool use and wrap-up events from dsh sessions into a human-readable working status line. It does not replace the agent or add new tool surfaces, it only solves the problem of “what exactly is it doing right now.
Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/working-activity/
GitHub: https://github.com/ccch1mneyyy/working-activity
DSH version documentation: docs/dsh-working-activity.md inside the repository