Winter-And-You-Gone/dsh-deep-verbs

Winter-And-You-Gone/dsh-deep-verbs

把内置 'Deep diving...' 思考状态行扩展为 53 条 deep 系英/中双语短语池:回合开场随机一条,随新思考段/工具调用事件轮换(最短间隔 3 秒),点击状态行切换中英文。

UI Enhancementsdeepseek-harnessplugin

dsh-deep-verbs

简体中文(默认) | English

Tired of the built-in status line showing Deep diving... forever? Want the model to show some personality while it thinks? Then this plugin is for you.

A pure plugin for DeepSeek Harness (DSH) that only handles swapping the status line copy:

  1. Random phrase per turn: a bilingual (EN/ZH) pool of 73 "deep" phrases, drawn from a shuffled bag (no repeats within a bag, no same phrase across bag boundaries);
  2. Event-driven rotation: each new reasoning segment or tool call switches to the next phrase, at least 3 seconds apart (events inside the window merge into one catch-up switch at the window edge — rapid tool calls change the word only once);
  3. Click to toggle language: click the status line to re-display the current phrase in the other language (no re-draw), synced across all parallel sessions; the choice is stored in localStorage and restored on reload;
  4. The timer is untouched: the built-in "N分N秒" clock still appears after 15 seconds.

Does not modify any @deepseek-ai/dsh-* source code.

Design reference: the phrase-rotation play is inspired by Claude Code's spinner verbs — it samples a random gerund (Wandering… / Combobulating… / Noodling…) each time the spinner mounts, much like "one random phrase per turn"; 60 of this plugin's phrases are directly borrowed from that same word list.

Feature 1: random per turn + event-driven rotation

[user message]
Deep diving...            ← built-in: forever
        ↓ claimed by the plugin
Deep Seeking...           ← random phrase at turn start
Deep cooking...           ← switches on each new segment / tool call
深潜中…(1分23秒)         ← language toggles on click; timer still shows after 15s
  • Shuffled-bag draw: a bag of 73 indices is reshuffled only when exhausted — no short-term repeats, no same phrase across bag boundaries;
  • Random at turn start: the first status row of a turn draws a phrase; rows mounted in the same batch (parallel sessions) share it;
  • Event-driven: a newly mounted assistant-step (reasoning/answer segment) or tool-call (tool call, incl. retries) row advances the phrase; streamed tokens never mount rows, so no false triggers; re-inserted rows are deduped;
  • Throttle floor: at least 3 seconds between switches (MIN_SWITCH_MS); events inside the window merge into one catch-up switch at the boundary;
  • No rotation during long thinking: without new rows the phrase stays put until the next event.

Feature 2: click to toggle EN/ZH

Deep Seeking...            ← click the status line (pointer cursor + tooltip)
        ↓
深度求索中…               ← same phrase, other language; no re-draw
  • Same phrase, other language: Deep Seeking... ↔ 深度求索中… — the two pools are index-aligned, so the phrase never jumps;
  • Synced everywhere: all active status rows (parallel sessions) toggle together;
  • Persisted: the choice is stored in localStorage (dsh-deep-verbs:lang) and restored on reload;
  • User action wins: a click resets the 3-second floor, so an imminent auto-rotation can't instantly override the language you just picked.

Phrase pools

Original 13

ENZHmeaning
Deep diving...深潜中…the original: diving
Deep seeking...深度求索中…DeepSeek's official Chinese name
Deep delving...刨根问底中…delve into
Deep surfacing...喷涂彩虹中…coming up for air (whale spout)
Deep breaching...跃出海面中…breaching (whale logo nod)
Deep bubbling...海底冒泡中…bubbling on the seafloor
Deep singing...引吭高歌中…whale song
Deep fishing...摸鱼中…slacking off
Deep sinking...沉底中…sinking to think slowly
Deep sleeping...呼呼大睡中…sound asleep (long-thinking joke)
Deep napping...偷偷打盹中…sneaking a nap (long-thinking joke)
Deep dreaming...白日做梦中…daydreaming
Deep cooking...小火慢炖中…let me cook

60 more, borrowed from Claude Code's spinner verbs

The following 60 phrases are taken from Claude Code's spinner word list (40 introduced in v0.5.0, 20 added in v0.6.0) (github.com/ConardLi/easy-agent), grouped as culinary / exploration / brains / whale / whimsy / slacking / science / existential / free-spirited.

moodENZH
CulinaryDeep baking...烘焙中…
CulinaryDeep brewing...酿造中…
CulinaryDeep caramelizing...熬糖色中…
CulinaryDeep fermenting...发酵中…
CulinaryDeep flambéing...喷火炙烤中…
CulinaryDeep frosting...抹奶油中…
CulinaryDeep garnishing...摆盘中…
CulinaryDeep julienning...切丝中…
CulinaryDeep kneading...揉面中…
CulinaryDeep leavening...发面中…
CulinaryDeep marinating...腌制入味中…
CulinaryDeep proofing...醒面中…(dough resting = thinking)
CulinaryDeep sautéing...爆炒中…
CulinaryDeep seasoning...调味中…
CulinaryDeep simmering...咕嘟咕嘟中…
CulinaryDeep stewing...文火炖煮中…
CulinaryDeep tempering...回火中…
CulinaryDeep whisking...打发中…
CulinaryDeep zesting...削皮中…
ExplorationDeep spelunking...洞窟探秘中…(cave cousin of deep diving)
ExplorationDeep burrowing...挖洞中…
BrainsDeep ruminating...反刍中…(cud-chewing thoughts)
BrainsDeep incubating...孵化中…
BrainsDeep percolating...渗滤中…(coffee dripping)
WhaleDeep honking...哔哔鸣笛中…(whale honk)
WhimsyDeep noodling...瞎鼓捣中…
WhimsyDeep doodling...涂鸦中…
WhimsyDeep waddling...摇摇晃晃中…
WhimsyDeep frolicking...撒欢中…
WhimsyDeep moseying...溜达中…
WhimsyDeep moonwalking...太空步中…
SlackingDeep photosynthesizing...光合作用中…(sunbathing and zoning out)
ScienceDeep precipitating...沉淀中…
ExistentialDeep combobulating...拼拼凑凑中…
ExistentialDeep recombobulating...重组中…
Free-spiritedDeep levitating...悬空冥想中…
Free-spiritedDeep metamorphosing...蜕变中…
Free-spiritedDeep zigzagging...蛇皮走位中…
Free-spiritedDeep boondoggling...瞎忙活中…
Free-spiritedDeep gallivanting...到处浪中…
CraftDeep crafting...打磨中…
CraftDeep forging...锻造中…
BrainsDeep deliberating...斟酌中…
BrainsDeep inferring...推演中…
BrainsDeep puzzling...解谜中…
BrainsDeep reticulating...编织中…
WanderingDeep wandering...游弋中…
WanderingDeep meandering...漫步中…
WanderingDeep orbiting...绕飞中…
FluidDeep cascading...飞瀑中…
FluidDeep churning...翻腾中…
FluidDeep billowing...鼓涌中…
FluidDeep swirling...回旋中…
FluidDeep undulating...起伏中…
FlightDeep fluttering...扑棱中…
FlightDeep swooping...俯冲中…
GrooveDeep shimmying...扭摆中…
GrooveDeep grooving...踩点中…
SlackingDeep lollygagging...磨洋工中…
GrowthDeep sprouting...冒芽中…

Installation

pwsh install.ps1            # or: powershell -ExecutionPolicy Bypass -File install.ps1

The script prefers ~/.dsh/profiles/desktop (desktop build), falling back to profiles/web; junction-links this directory into profiles/node_modules/dsh-deep-verbs; registers the insert in the profile's cordis.patch.yml. When junctions are unavailable (permission / filesystem limits) it falls back to copying by the package.json files whitelist (no .git or other dev artifacts; re-run the installer to refresh the copy after plugin updates).

Then fully quit the DSH process and restart (closing the window is not enough); the desktop window restarts on its own, browser users just refresh.

Manual install is equivalent to:

  1. mklink /J %USERPROFILE%\.dsh\profiles\node_modules\dsh-deep-verbs <this directory>
  2. Append to <profile>\cordis.patch.yml:
    - insert:
        - id: dsh-deep-verbs
          name: 'dsh-deep-verbs'
    
  3. Restart DSH.

How it works (why no source changes)

  • The built-in TurnStatus renders <div role="status">Deep diving...<span>clock</span></div>; React re-renders every second but never writes back the DOM text node while the string child is unchanged — so rewriting that text node in the browser side sticks.
  • Rotation is event-driven: every chat row (ChatNodeSeat) carries a host-internal data-chat-flow-kind attribute (DSH's own scroll anchoring relies on it — a stable detail); a newly mounted assistant-step / tool-call / model-retry row counts as one rotation event.
  • The MutationObserver subscribes to childList only (streamed text changes never trigger scans) and both claims new turn status rows and captures rotation events; a 3-second maintenance scan only covers claim fallback, repairing the rare React write-back of the built-in text, and catching up pending switches when background-tab timers are throttled (it never advances the phrase).
  • The click listener is attached when a status row is claimed; cursor / title hints live outside React's vdom, so re-renders don't clobber them (same mechanism as the text node).
  • Every DOM write goes through a "same-value, no write" guard: assigning Text.data enqueues a mutation record even when the value is unchanged, so writing the built-in phrase back verbatim would spin a sweep→observe→sweep microtask storm (the 2026-08-17 freeze incident; fixed in v0.2.1 with a regression test).

Notes

  • If a future DSH release changes the built-in text Deep diving..., the plugin degrades to a no-op; if it drops the data-chat-flow-kind attribute, it degrades to "new phrase per turn, no in-turn rotation" — neither touches any other UI.
  • Phrase pools, the switch interval, and the language key all live in the constants at the top of client.js.

Customization

Edit the PHRASES_EN / PHRASES_ZH arrays in client.js: English phrases stay lowercase deep xxxing (auto-capitalized with ... on display); Chinese phrases keep the …中 suffix (auto-appended …); the two arrays are index-aligned — same index = same phrase, and the language toggle maps by index. The minimum switch interval is MIN_SWITCH_MS (3000ms default — a floor, not a beat: slower events mean slower rotation). Restart DSH after saving.

Dev self-test

node verify.mjs

Drives the bundle's rewrite / rotation / throttle / storm-regression / language-toggle paths with a tiny DOM shim and a fake clock — no browser needed.

Uninstall

Delete the profiles/node_modules/dsh-deep-verbs link and remove the matching - insert block from cordis.patch.yml, then restart DSH.