DeepSeek Harness plugin

working-activity

Live model working-status line: playful copy, running tool, turn elapsed — for TUI prompt and Web UI

Jump to install

Source facts

Repository
ccch1mneyyy/working-activity
Latest update
Aug 20, 2026
Category
Development & Runtime
GitHub stars
654
Format
plugin
Package path
packages/activity/working-activity
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
packages/activity/working-activity/package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-20

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/ccch1mneyyy/working-activity/tree/HEAD/packages/activity/working-activity
Plugin: working-activity
Author: ccch1mneyyy

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

dsh-working-activity

A live "working line" for DeepSeek Harness: the model's real-time activity — playful thinking copy, the tool actually running, elapsed time, and a turn-end summary — shown while the agent works.

What it does

Folds the durable session stream (turn/start, assistant/chunk, tool/call, tool/result, turn/end) plus agent/status into one status line, refreshed on a render tick:

  • Thinking: short colloquial copy rotates every few seconds (嗯…让我捋捋, 盘一下盘一下, 大脑转起来了, deadpan lol / hm / ok), tiered when thinking runs long (30s / 1min / 5min), night-owl copy mixed in between 00:00–06:00 local time.
  • Tool activity: the running tool renders as 俏皮动词 + 参数细节 + 已耗时 (跑个命令 npm test · 12s); failed tools show 翻车了-style copy in the done line.
  • Turn summary: on turn/end the line becomes 搞定 ✓ · N 工具 · 想Xs 干Ys (thinking/tool split), with the last tool's fragment pinned for a few seconds.
  • Minimal mode: phrases: false renders plain functional labels (思考中 · 总1m23s, bash npm test · 12s).

Two optional sinks, both off by default only when their seam is absent:

1. TUI prompt slot — registers the ${activity} template value on ctx.tuiPrompt when the TUI is composed. Add ${activity} to theme.leftPrompt to see it next to cwd/model/context. 2. Session events — appends log-only activity/status events (never surface events: the model never sees them) for Web and other UI consumers; replay ignores them.

Installation

The package is a self-mounting bundle: it declares dsh.bundle.patch (cordis.patch.yml), so the official CLI both installs it and appends it to the profile's bundle layer stack:

dsh plugin --profile <profile> add dsh-working-activity

At boot, app-boot applies the bundle's patch list over the profile root and the package inserts its own working-activity row — no manual configuration required. To tune a value, override the row's config by id in the profile's user layer ($DSH_HOME/profiles/<profile>/cordis.patch.yml) instead of inserting a second same-id row:

- id: working-activity
  config:
    publishIntervalMs: 500

TUI usage

Install the plugin into a profile that composes the official dsh-tui, then add the ${activity} slot to the left prompt template in the profile's user layer ($DSH_HOME/profiles/<profile>/cordis.patch.yml):

- id: tui
  config:
    theme:
      leftPrompt: '${cwd}${git/worktree}${activity}${model}${token_meter/cache_hit_rate}${context}'

While a turn runs, the prompt line shows e.g. dsh main 跑个命令 npm test · 12s deepseek-chat …; while thinking, 嗯…让我捋捋 · 总1m23s; after the turn, 搞定 ✓ · 4 工具 · 想12s 干11s briefly. Without ${activity} in the template, the plugin is inert in the TUI (the slot is unregistered values are omitted by the template renderer).

Web usage

The Web client renders the live line two ways, both fed by the activity/status events:

  • The turn-level status label (TurnStatus, formerly the static "Deep diving...") shows the live line while a turn runs, keeping its sweep animation.
  • A working-line dock entry (WorkingLine on conversation.input.dock) renders the turn-end statistics (token/elapsed/tool summary) above the composer after a turn settles; live phases stay on the turn label.

Both fall back to the previous static label while the plugin is absent, so the Web UI is unaffected by disabling it.

Configuration

KeyTypeDefaultMeaning
phrasesbooleantruePlayful copy pool; false renders plain functional labels
publishbooleanfalseAppend activity/status session events for UI consumers. Off by default: appended events currently make session logs unresumable (see note below)
tickMsnumber500Status render tick interval (100–5000)
publishIntervalMsnumber2000Minimum interval between published events while the line is stable (500–30000)
detailLimitnumber40Max displayed detail length (paths/commands/patterns), 8–120
customActionsobject{}Exact tool-name → action-copy pools, e.g. {"my_deploy": ["部署一下", "上线中"]}
narratebooleantrueInject the self-narration contract into the system prompt; the line is surfaced live and stripped from the chat body

Event contract

activity/status is a log-only session event (merge-extensible SessionEventMap member, no surfaceOp):

{
  phase: 'idle' | 'waiting' | 'thinking' | 'tool' | 'done'
  line: string            // plain-text status line, no ANSI
  label?: string          // current work label (tool action / stage)
  detail?: string         // path / command / pattern fragment
  phrase?: string         // current playful phrase
  toolCount: number       // tools completed this turn
  turnElapsedMs: number   // ms since turn start
  phaseStartedAt: number  // epoch ms the phase started (animation anchor)
}

> Why publish is off by default: session.append() cannot mark events ignorable, and the resume read path refuses any log containing unknown non-ignorable event types — so with publish: true, every session that rendered a status line fails to resume. Re-enable only for a log-replaying consumer on a harness that supports ignorable appends. The live TUI prompt line is unaffected.

Publishing rules: line changes publish immediately; a stable line republishes at most every publishIntervalMs so a long tool's elapsed time stays live without flooding the log. All data is lossless JSON; optional fields are omitted when absent.

Export shape

A function/namespace plugin: name / Config / apply, no default export. The state machine (ActivityTracker) and copy pools live in ./status and ./phrases (pure, clock-injected, unit-tested). The invariant companion registers under ./invariant.

Model Experience

Prompt and tool surface

Nothing. The plugin injects no prompt sections, registers no tools, and appends no surface events. activity/status is UI state only: it never enters derived model history, so the model cannot see its own working line.

Token effect

Zero per request.

KV Cache effect

No system-prompt contribution, so no cache-stability effect.

Known Limitations and Deferred Work

  • Single active line: the plugin keeps one status line per session; the TUI slot shows the most recently active session.
  • Narration is opt-in: the self-narration contract (model writes a short status line at the top of each reply) is injected by default (narrate: true); set narrate: false for a purely event-derived line.
  • No progress percentages: DSH has no tool progress events; a long tool shows elapsed time only.
  • No animated frames: the TUI slot renders a static text fragment; frame animation (moon/comet/braille presets) is deferred until the prompt-slot contract supports a frame callback.
  • Web dock entry duplicates the turn label: the input-dock WorkingLine and the chat TurnStatus show the same snapshot; the dock entry exists for session views where the turn label is not visible.