🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

状态行自定义 WONGIII/dsh-turn-status-text

DeepSeek 客户端
WONGIII35 天前有提交已提供中文文档扫描:未发现敏感能力兼容 / 相关生态

改写聊天运行状态文字与颜色,保留实时用时

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/WONGIII/dsh-turn-status-text.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
该类项目不使用 dsh plugin add 安装,静态安装检查不适用
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@dsh-external/dsh-turn-status-text(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/8 09:41:13

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 自定义状态行文字
  • 自定义状态行颜色
  • 保留实时用时显示

自定义 DeepSeek Harness 聊天运行状态行的文字和颜色(「深度求索中,用时 12秒 ···」),在插件页面配置。

README

由 DeepSeek 最新模型翻译生成
dsh-turn-status-text 给 DSH(DeepSeek Harness)聊天区那行「深度求索中,用时 12秒 ···」换成你自己写的文字和你自己选的颜色,在侧栏「插件」页选中本插件后配置,保存即生效,不用刷新页面。 | 默认 | 改过之后 | | 默认状态行 | 自定义状态行 | 上图是同一台机器上的两次真实截屏:左边是部署原样(深度求索中,用时 6分29秒 ···),右边把文字换成 硬邦邦思考中…、颜色换成 #ff5500(左边的小鲸鱼、右侧的流光也一起换了色)。 文字里写 {duration} 时,实时用时会保留: 保留用时的自定义状态行 你能改什么 | 能改 | 说明 | | 文字 | 任意文字。写 {duration} 占位符可以保留实时用时,例如 宝宝正在努力思考… {duration} → 宝宝正在努力思考… 12秒;不写占位符就整行只显示你的文字。 | | 颜色 | 填颜色代码 #4d6bfe 或 #abc。整行统一上色——文字、左边的小鲸鱼、以及文字的流光都跟着走(原理见下)。 | | 恢复默认 | 每个字段各有一个:把草稿清空再保存,文字回到部署原文案,颜色回到主题色。
展开完整文档(README 剩余 1 节)
dsh-turn-status-text

给 DSH(DeepSeek Harness)聊天区那行「深度求索中,用时 12秒 ···」换成你自己写的文字和你自己选的颜色,在侧栏「插件」页选中本插件后配置,保存即生效,不用刷新页面。

| 默认 | 改过之后 |
| 默认状态行 | 自定义状态行 |

上图是同一台机器上的两次真实截屏:左边是部署原样(深度求索中,用时 6分29秒 ···),右边把文字换成 硬邦邦思考中…、颜色换成 #ff5500(左边的小鲸鱼、右侧的流光也一起换了色)。

文字里写 {duration} 时,实时用时会保留:

保留用时的自定义状态行

你能改什么

| 能改 | 说明 |
| 文字 | 任意文字。写 {duration} 占位符可以保留实时用时,例如 宝宝正在努力思考… {duration} → 宝宝正在努力思考… 12秒;不写占位符就整行只显示你的文字。 |
| 颜色 | 填颜色代码 #4d6bfe 或 #abc。整行统一上色——文字、左边的小鲸鱼、以及文字的流光都跟着走(原理见下)。 |
| 恢复默认 | 每个字段各有一个:把草稿清空再保存,文字回到部署原文案,颜色回到主题色。 |

改动由 Host 写进当前 profile 的 cordis.patch.yml——给这一行补一段 config:(实际落盘长这样),跨浏览器、重启后仍在;插件不联网,也不注册任何给模型看的内容。

- id: dsh-turn-status-text
name: "@dsh-external/dsh-turn-status-text"
config:
text: 宝宝正在努力思考… {duration} color: "#ff5500"

只改「进行中」那行。一轮结束后的「已完成,用时 …」「处理失败」等等保持原样。

安装

从 GitHub 安装(仓库自带已构建的 lib/,且刻意不声明 prepare 脚本,所以 pnpm 不会要求你放行构建权限):

dsh plugin --profile add github:WONGIII/dsh-turn-status-text

从本地 checkout 安装:

git clone https://github.com/WONGIII/dsh-turn-status-text.git
dsh plugin --profile add ./dsh-turn-status-text

桌面端也可以直接在侧栏 插件 页里填这个 GitHub 地址安装。

把 换成你自己的 profile 名即可(dsh web 常见是 web)。
桌面端那个 profile 由 Electron 应用独占管理(CLI 会拒绝:profile "desktop" is managed exclusively by the Electron application),所以桌面端请用侧栏 插件 页安装/卸载。

装完要重启一次 DSH(dsh web 或桌面端)。插件行是 host 侧的 Loader 行,浏览器半侧由它对外提供;只有让 DSH 重新组合一次配置,新的 Loader 行才会被挂上——只刷新页面不够。
(配置文件本身在运行期是"活"的,但新增一行所依赖的设置命名空间目录要等这次重组才会包含它。)

装上以后在侧栏 插件 → 已安装 里能看到 @dsh-external/dsh-turn-status-text,展开即可单独开关 dsh-turn-status-text 这一行。

卸载:

dsh plugin --profile remove @dsh-external/dsh-turn-status-text

怎么改

1. 插件页里配置(推荐):侧栏「插件」→ 在插件列表里点开本插件 → 点这一行那个带 › 的标题(即「配置 @dsh-external/dsh-turn-status-text」) → 两个输入框:自定义文字、文字颜色 → 保存。

插件页里的配置页

0.2.0-rc 的插件配置已经不在"设置 → 插件 → 可配置"里了:那个标签页与它 dispatch 的 settings.plugin.item 槽位在新版里已经不存在。
现在插件页只给注册了配置页的行一个配置入口:plugins.row.config 槽位,key 是 #,也就是 @dsh-external/dsh-turn-status-text#dsh-turn-status-text(ui-plugin-manager 里的 rowConfigKey() / configure.has(row))。
设置值走 configForms 服务(configForms.get(row id),whileServed 守卫),表单用平台自己的 SettingsFormModel / SettingsForm / SettingsValueField,所以这一页和部署自带的设置页长得一模一样。

两个字段都是这一行 Config 上的 volatile() 字段,保存后立即生效,不用重启也不用刷新页面。

2. 临时覆盖(DevTools 控制台,只在当前页面生效,优先级高于设置):

window.__DSH_TURN_STATUS_TEXT__ = '宝宝正在努力思考… {duration}'
window.__DSH_TURN_STATUS_COLOR__ = '#ff5500'
delete window.__DSH_TURN_STATUS_TEXT__ // 撤销文字覆盖 delete window.__DSH_TURN_STATUS_COLOR__ // 撤销颜色覆盖

两个全局都是每次渲染/每次样式表变动时实时读取的,改完立刻能看到效果。

优先级:window 覆盖 > 设置里的值 > 部署原文案 / 主题原色。

它是怎么做到的

文案:不碰词典,改 translate 这一层 The text on the "in progress" line comes from the dictionary key of the Chat target:

const label = startTime === undefined
? t('chat.deepDiving') // deep diving
: t('chat.deepDivingFor', { duration }) // deep diving, elapsed {duration} ···

The t that the framework gives to each slot component is created by ctx.locale.bind(ns), and its implementation is (key, params) => this.translate(ns, key, params)——
this.translate is resolved only at call time. So the plugin attaches an own property of the same name on the locale service instance to override translate:
it intercepts only these three keys (chat.deepDiving, chat.deepDivingFor, and message.turnProcess.deepDivingFor in version 0.1.7),
and forwards all other keys as-is (including the common fallback, parameter interpolation, and fallback to the key name for unknown keys); the plugin automatically restores it on unload.

{duration} is replaced by the plugin itself with the duration string passed in by the framework; when there is no duration parameter (such as the key for "the clock hasn't started yet"),
the placeholder is consumed and extra spaces are collapsed, so no curly braces leak out.

Color: a higher-priority rule + the platform's own coloring variables

In 0.2.0-rc, that line of text is not flat text, but a TextShimmer (a layer of text swept over by a mask): its coloring variable is --dsw-alias-label-shimmer,
and .X_running maps it from --dsw-alias-label-deep-diving-shimmer. So in the rule, the two custom properties are required (not just a nice-to-have),
while color handles older versions (when it really was a currentColor gradient) and also unifies the little whale along the way.

This is the one rule the plugin injects (the selector is written twice = 0,2,0, which reliably beats the generated class name's 0,1,0, regardless of stylesheet order):

[data-chat-running][data-chat-running]{
color:#ff5500; /* older versions rely on this for coloring, and it also unifies the little whale /
--dsw-alias-label-deep-diving:#ff5500; / the two variables used by the deployment itself /
--dsw-alias-label-shimmer:#ff5500;
}
[data-turn-process][data-turn-process]{color:#ff5500} / the turn-process line in 0.1.7 /

The shimmer geometry, animation, and rhythm are all kept as-is; only the color is changed.

The line itself is located using attributes (data-chat-running / data-turn-process), without relying on content-hashed class names that change with the build.
In older deployments (before 0.1.7), that line is ._turnStatus plus a gradient background; the plugin will find the real class name from document.styleSheets
using /\.([A-Za-z0-9_-]_turnStatus)(?![\w-])/, then rebuild a rule with the same gradient geometry,
with data-plugin-css="dsh-turn-status-text" on the element, removed on unload. When the color is left empty, the rule content is an empty string, which means it does not interfere with the deployment styles at all.

Configuration page

The setting item is exactly the Config for this line: the row id - id: dsh-turn-status-text in cordis.patch.yml is the key of the settings entry,
and the Host projects the row's Config schema into a settings section (a namespace in settings/describe), so no registration call like settings.register is needed,
and the three parties (Host projection, plugin page form, browser-side reading) naturally align on the same id.

Both fields carry volatile(): volatile means "the value can be changed without remounting this row, and the latest value is always read",
so the plugin page puts it into an editable form; an empty-string default value means "inherit" (the deployment's original text / the theme's original color).

But the settings section being provided ≠ the plugin page will provide an entry: the plugin page only renders that "Configuration" heading with a › for rows that have registered plugins.row.config,
and the key must be #. So the second thing the browser side needs to do is this registration:

const inject = ['slots', 'locale'] // required services: only these two
ctx.inject(['configForms', 'slots'], (scoped) => { // settings form optional: without it, the label override still works
scope = scoped.configForms.get('dsh-turn-status-text') // ConfigFormController: getSnapshot/ subscribe/ set/ mutate
const card = new TurnStatusTextCardController(scope) // wraps the platform's SettingsFormModel
scoped.configForms.whileServed([NS], () => scoped.slots.inject('plugins.row.config', () => scoped.slots.register({
name: 'plugins.row.config',
key: '@dsh-external/dsh-turn-status-text#dsh-turn-status-text',
locale: CARD_NS,
inject: () => card.inject(), // { hooks, edit, resetField, discard, save }
}, TurnStatusTextCard)))
})

whileServed is the guard provided by the platform that says "only mount this page when the Host actually provides this settings entry": in deployments that do not compose this row, the plugin page shows no trace of it.
The row configuration page will call the component with view: 'page' (the summary row in the row list is view: 'summary'), and the platform will also pass in a form ({state, mutate});
本插件用自己包好的 SettingsFormModel(同一份 configForms scope),因此暂存/保存/放弃/恢复默认的语义与部署自带设置页完全一致。

颜色规则为什么这样写

0.2.0-rc 那行的流光不是 background-clip: text 的渐变,而是一层用遮罩扫过的文字: TextShimmer 的着色变量是 --dsw-alias-label-shimmer,而 .X_running 把它映射自 --dsw-alias-label-deep-diving-shimmer。
所以规则里两个自定义属性是必需的(不是锦上添花):改了它们,流光就换成新颜色,而几何与动画完全不动。
color 一起写是为了兼容更老的版本(那时确实是 currentColor + background-clip:text),也顺手让小鲸鱼与整行统一。

结构

dsh-turn-status-text/
├── package.json # dsh.bundle.patch / dsh.client.platform = web;exports["./client"] → 浏览器 bundle ├── cordis.patch.yml # bundle 层:insert 一行 dsh-turn-status-text ├── lib/ │ ├── host.js # host 半侧:声明设置入口行的 Config(row id dsh-turn-status-text,text + color,volatile) │ ├── index.js # 包入口(package.json main):re-export ./host.js │ └── client.js # 浏览器半侧:改文案 + 上色 + 插件页配置卡片 ├── tools/ │ ├── selfcheck.mjs # headless 自检(假 DOM + 假 LocaleRuntime/ConfigForms 跑真实 bundle) │ ├── verify-live.mjs # 向运行中的实例查询/写入设置命名空间 │ ├── live-probe.mjs # 无依赖 CDP 探针:在真实页面里读状态行的文字与计算颜色,可截图 │ ├── preview.mjs # 渲染一张卡片对照页(浅色/深色) │ └── hmr-probe.mjs # 监听 /plugins/events 的热重载帧 ├── docs/ # README 用的实测截图 └── README.md / README.en.md / LICENSE

浏览器半侧不需要任何 node_modules:它 require("react") / require("react/jsx-runtime"),走页面里的模块表。
host 半侧只 import @deepseek-ai/schemastery(声明为普通依赖,harness 自带 3.18.4)。

开发与验证

1) 浏览器半侧自检:假 DOM + 与线上同语义的 LocaleRuntime/ConfigForms/设置表单跑真实 bundle
node tools/selfcheck.mjs
node tools/selfcheck.mjs # 检线上真正下发的字节

2) 向运行中的实例确认设置条目被提供(卡片会被挂上)
node tools/verify-live.mjs
node tools/verify-live.mjs --set "宝宝正在努力思考… {duration}"
node tools/verify-live.mjs --color "#ff5500"
node tools/verify-live.mjs --color - # 清掉颜色
node tools/verify-live.mjs --clear # 两个字段都清

3) 在真实页面里读状态行(无第三方依赖,自带 cookie 签名与 headless Chromium)
node tools/live-probe.mjs --wait 30 --shot probe.png

4) 生成卡片对照页(浅色/深色)
node tools/preview.mjs && start tools/preview.html

5) 观察浏览器侧热重载帧
node tools/hmr-probe.mjs 15

selfcheck.mjs 覆盖:文案优先级(含 {duration} 填充与"没填就吃掉占位符")、非目标键原样转发、颜色归一化(#ABC → #aabbcc、4d6bfe → #4d6bfe、red/#12345 拒绝)、两个属性选择器与旧版 _turnStatus 渐变规则的精确 CSS 文本、页面全局覆盖与回退、
configForms.get(row id) 的绑定、whileServed 守卫(没提供这个设置条目时不挂卡片)、
plugins.row.config 的槽位与 # key、摘要/整页两种 view、表单状态与动作的注入、字段编辑/恢复默认经平台表单保存后落到设置并渲染到状态行、没有 mutate 的 scope 退回 set/unset、清理后样式元素与词典都被移除。

verify-live.mjs 用本机 $DSH_HOME/.credentials.yaml 里的 browser-session 密钥签一个 loopback 页面 cookie,再调 settings/describe / settings/mutate(密钥不会被打印)。

live-probe.mjs 同样自带 cookie 签名,然后拉起 %LOCALAPPDATA%\ms-playwright\chromium-* 里的 headless Chromium,用 CDP(Node 自带 WebSocket)读 [data-chat-running] 的文本与计算颜色。注意:Web 应用没有 URL 路由,新开标签页永远落在空状态,所以探针只有在页面上已经打开着「正在跑的那轮对话」时才找得到状态行——它只读不点,找不到时会打印诊断 JSON(含页面当前可见文字)并以 1 退出。

本机实测记录

在 DSH 桌面端(0.2.0-rc.2)上,用 live-probe.mjs 对一个真实进行中的会话读数:

部署原样(未设任何覆盖) {"found":true,"rows":1,"rowClass":"xz4KEq_running","text":"深度求索中深度求索中,用时 6分29秒 ···",
"rowColor":"color(srgb 0.20549 0.367451 0.730196)",
"deepDivingVar":"color-mix(in srgb, #4176e6 70%, #172554)",
"shimmerVar":"color-mix(in srgb, #4176e6 30%, #172554)",
"ruleInjected":["…","dsh-turn-status-text/card","…"]}

打开插件的页面全局覆盖之后 {"found":true,"rows":1,"rowClass":"xz4KEq_running","text":"硬邦邦思考中…硬邦邦思考中…",
"rowColor":"rgb(255, 85, 0)",
"deepDivingVar":"#ff5500","shimmerVar":"#ff5500",
"ruleInjected":["…","dsh-turn-status-text","dsh-turn-status-text/card","…"]}

第一行文字里前半段是 aria-live 的无障碍播报(同一个键)、后半段是可见的那行;两组数据分别对应 docs/before.png 与 docs/after.png。

插件已按上面的 GitHub 地址装进这台机器的桌面端 profile(github:WONGIII/dsh-turn-status-text,由插件管理页写入 dsh.profile.bundles)后,
再对本会话自己(真正在跑的那轮)读一次,验证 {duration} 占位符:

{"found":true,"rows":1,"rowClass":"xz4KEq_running","text":"硬邦邦思考中…硬邦邦思考中… 34分21秒",
"rowColor":"rgb(255, 85, 0)","deepDivingVar":"#ff5500","shimmerVar":"#ff5500"}

即 docs/after-duration.png:文字是自定义的,用时仍是实时的。

在插件页里配置的整条闭环(实测)

重启 DSH 后,设置条目被正常提供(node tools/verify-live.mjs →

OK: dsh-turn-status-text is served -> {"text":"","color":""}

),然后用 headless Chromium 走了一遍真实 UI:

1. 侧栏 插件 → 插件列表里点开 @dsh-external/dsh-turn-status-text;
2. 该行标题变成带 › 的按钮,aria-label="配置 @dsh-external/dsh-turn-status-text"(没有 plugins.row.config 注册时它只是纯文本);
3. 点开 → 这一页渲染出 自定义文字 / 文字颜色 两个字段;
4. 填入 宝宝正在努力思考… {duration} 与 #ff5500,点 保存;
5. 回到会话读状态行:

{"found":true,"rowClass":"xz4KEq_running","text":"宝宝正在努力思考…宝宝正在努力思考… 6分43秒",
"rowColor":"rgb(255, 85, 0)","deepDivingVar":"#ff5500","shimmerVar":"#ff5500"}

前半段是 aria-live 播报、后半段是可见那行;配置页见 docs/plugins-config.png。
也就是说:从插件页保存 → 聊天区那行立刻按你的文字和颜色渲染,全程不需要刷新。

兼容性

| 部署 | 文案键 | 上色锚点 | 设置条目 | 支持 |
| 0.2.0-rc(当前桌面端) | chat.deepDiving / chat.deepDivingFor | [data-chat-running] | row id dsh-turn-status-text + configForms + plugins.row.config | ✅ 全链路实测 |
| 0.1.7-rc | message.turnProcess.deepDivingFor | [data-turn-process] | 旧版 settingsScope 服务 | ⚠️ 文案/颜色可用,配置页按 0.2.0-rc 契约实现 |
| 0.1.7 之前 | chat.deepDiving | ._turnStatus(运行时发现) | 同上 | ⚠️ 同上 |

host 半侧依赖 @deepseek-ai/schemastery@^3.18.4(harness 自带同版本);不声明 prepare,git 安装无需放行构建脚本。

限制

- 只改「进行中」那行;轮次结束后汇总行的文案(message.turnProcess.took 等)不在覆盖范围。
- 颜色作用于整行(含左侧小鲸鱼),因为它就是这一行的 color/着色变量;没有单独的小鲸鱼开关。
- 颜色字段是文本输入(平台设置表单给的控件),没有取色盘;填的颜色在渲染时归一化,非法值等于"不上色"。
- 内容哈希类名只在旧版路径上需要发现,极老的部署若把 _turnStatus 换了名字则拿不到颜色(文字覆盖仍然有效)。
- 0.1.7 及更早的部署:文案与颜色两条路径都还在,但配置页是按 0.2.0-rc 的 configForms + plugins.row.config 契约写的,在这些老版本上不会出现(那两版本来也没有这套设置 API)。
- {duration} 之外的占位符会被原样显示。

License

MIT © 2026 WONGIII
预览分享卡片长什么样 ↓WONGIII/dsh-turn-status-text
分享 · DeepSeek Harness Hub
WONGIII/dsh-turn-status-text

改写聊天运行状态文字与颜色,保留实时用时

这是你的仓库?认领条目

回到顶部