DeepSeek Harness 插件

working-activity

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

跳到安装方式

来源信息

GitHub 仓库
ccch1mneyyy/working-activity
最近更新
2026年8月20日
分类
插件开发工具
GitHub stars
654
载体类型
plugin
包路径
packages/activity/working-activity
目录证据
上游声明已找到 dsh.bundle
证据路径
packages/activity/working-activity/package.json#dsh.bundle
核对版本
0.1.0-rc.8
上游核对日期
2026-08-20

该证据由上游目录提供。本站没有安装、运行或安全审核这个插件。

安装

默认先复制一段 Prompt,让 Agent 读 GitHub 仓库和源码;需要自己装时再切到命令。

复制这段 Prompt,发给 DSH、Codex 或其他 Agent,让它先读 GitHub 仓库和源码。

请先不要安装或执行任何命令。阅读这个插件的 GitHub 仓库、README 和关键源码,然后用清楚、直接的方式回答以下问题,帮助我判断它是否适合我的需求:

1. 这个插件是什么,解决什么问题;
2. 适合哪些用户和典型使用场景;
3. 安装后如何使用,并给出一个最小使用示例;
4. 有哪些已知限制,以及隐私、安全、兼容性或维护风险;
5. 给出“推荐 / 有条件推荐 / 不推荐”的明确建议和理由。

请区分仓库明确说明、根据源码推断和未知信息。证据不足时请明确说明,不要猜测或照抄 README。

GitHub:https://github.com/ccch1mneyyy/working-activity/tree/HEAD/packages/activity/working-activity
插件名:working-activity
作者:ccch1mneyyy

检查来源文件

安装前先看这个插件目录里的 README 和其他文件。

文件资源管理器3 个文件
README.md来源说明 · 只读预览

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.