在 dsh Web 聊天视图中自定义智能体运行时的"思考中"状态文案,无需重启即时生效。
- Language
- TypeScript
- License
- MIT
- Branch
- master
Install
$ dsh plugin --profile web add github:alingalingling/ui-status-labelRun the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial
一句话定位
把 dsh Web 聊天视图里智能体运行时的"思考中"提示文案(官方硬编码的 Deep diving...)替换成你自己输入的文字,输入即生效,无需重启或保存。
核心能力
- 在 General(通用)设置区新增一行文本输入,允许自定义聊天视图运行状态栏的文案
- 通过浏览器 DOM 注入作为兜底路径,在官方未提供扩展点的版本上直接改写硬编码文字
- 提供可选的
conversationStatus服务,上游合入扩展点后聊天视图直接渲染配置文案,DOM 注入自动让位 - 把设置值持久化到
$DSH_HOME/settings.yaml,跟随同一用户 home 跨 Web 端口生效 - 支持中英文界面文案(
settings.status.title、settings.status.description字典)
技术实现
- 语言: TypeScript
- 关键依赖: @deepseek-ai/dsh-settings(设置命名空间持久化)、@deepseek-ai/schemastery(节点端 schema 校验)、react(设置行组件)、@deepseek-ai/cordis(插件运行时)
- 架构模式: 插件分两半边注入——node 半边(
src/index.ts)通过 cordis.patch.yml 注册到 Web roster,向 settings 服务注册持久的ui-status-label命名空间;client 半边(src/client/index.ts)由package.json#dsh.client自动发现,注册设置行、提供conversationStatus服务、启动 DOM 注入器 - 入口文件:
src/index.ts(node 半边)+src/client/index.ts(浏览器半边)
适用场景
想让 dsh Web 聊天视图里的"思考中"提示更有个性——比如改成"努力干活中""小鱼正在游泳"——而不用每次都盯着英文 Deep diving...。也适合需要把鲸鱼娘品牌文案嵌入状态栏的运营或本地化场景;对模型回复内容无任何影响。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | >=0.0.1-rc.1 <0.2.0(peer 依赖声明) | 官方正式版含 0.1.0-rc.6 可直接生效;DSH 会自动注入 cordis 与 dsh-client-* 等 peer 依赖 |
| Node | 未声明 | 源码未指定 Node 最低版本 |
| 平台 | 跨平台(macOS / Windows / Linux) | 仅依赖浏览器交互面,无原生模块 |
| 原生模块 | 无 | 全部依赖均为 JS/TS 包 |
安装方式
dsh plugin --profile web add github:alingalingling/ui-status-label
配置项
本插件无需额外配置——所有用户可见的设置项都在 dsh Web 的 General 设置区内通过 UI 调整。
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
ui-status-label.statusLabel | string | 聊天视图智能体运行时显示的状态文案 | 小难梁在0721(输入框最大长度 40 字符,清空输入框回退到默认值) |
常见问题
Q: 安装后需要重启 dsh Web 吗?
A: 需要。当前运行中的 GUI 不会热加载新插件 bundle,装完重启 dsh web 进程、刷新页面才能在设置里看到「运行状态文案」入口。
Q: 默认文案是什么?
A: 默认文案是「小难梁在0721」。设置行清空后也会回到这个默认值——空白输入框永远不会渲染为空状态行。
Q: 输入框有长度限制吗?
A: 有上限 40 字符。这一限制来自设置行的 maxLength 属性,用来避免聊天视图布局被超长文案撑开。
Q: 修改后还需要点保存按钮吗?
A: 不需要。输入即生效——修改会立即同步到聊天视图的运行状态栏,无需手动保存。
Q: 这个插件会改变模型回复内容吗?
A: 不会。插件只替换浏览器渲染层显示的状态文案,不触及任何模型请求、推理或回复内容。
Q: 用 git 安装时被 pnpm 阻止 prepare 脚本怎么办?
A: 仓库已把预构建的 lib/(含类型声明)随源码一起提交,git 安装即使跳过 prepare 也能直接用产物;只有在你想从源码重新构建时,才需要把包加入 pnpm-workspace.yaml 的 allowBuilds。
Q: 已经内置了该插件的定制 dsh 构建能再装一次吗?
A: 不能。会重复注册 ui-status-label 设置命名空间;只有官方未内置的发布版可以正常安装。
Q: 怎么卸载?
A: 运行 dsh plugin --profile web remove dsh-ui-status-label,然后重启进程即可。
上手难度
入门 — 装完改一行文本就生效,没有任何编程或配置操作,零风险可逆。
已知问题与限制
- DOM 注入路径是字符串级别匹配官方硬编码的
Deep diving...:如果上游未来把那段文字改成别的字符串,DOM 兜底会自动失效(届时conversationStatus服务路径会接管) - 必须在 dsh Web profile 下安装,headless 或 TUI profile 装它没有意义
- 与「内置了本插件的定制 dsh 构建」(如本地构建的 deepseek-harness)会重复注册 settings 命名空间,这种场景不要重复安装
- 输入文案只影响 UI 渲染层,无法基于不同会话/不同模型区分文案
把你的鲸鱼娘思考时的 deep diving 自定义成任意你想要的样子。
为 dsh Web 聊天视图提供可配置的运行中轮次状态文案:General 设置区的一行文本输入,插件把聊天视图运行状态栏的文案替换为你输入的文字(支持 DOM 注入和上游 conversationStatus 服务两条路径,见兼容性)。插件注册持久的 ui-status-label settings 命名空间(默认 小难梁在0721);在设置行输入新文字后,聊天视图在轮次运行期间(等待首 token、工具执行、流式输出)显示的状态文案随之更新。选择持久化在 $DSH_HOME/settings.yaml,跟随同一个用户 home 跨越 Web 端口。
前提
- dsh Web(
dsh --profile web或自定义 Web 组合)。本插件只面向浏览器交互面;headless/TUI profile 装它没有意义。 - 依赖分两类:
@deepseek-ai/cordis、dsh-client-*等为 peer 依赖(由 dsh 安装提供);@deepseek-ai/dsh-settings、schemastery为直接依赖(从 npm 安装)。仓库内的pnpm-workspace.yaml已关闭 peer 自动安装(autoInstallPeers: false),clone 后直接pnpm install即可完成直接依赖。
安装
本包声明了 dsh.bundle,dsh plugin add 会自动激活它的 cordis.patch.yml 层(把 dsh-ui-status-label 行插入 Web roster)。
# ① tarball(需要先在仓库根执行 pnpm pack 生成 dsh-ui-status-label-0.1.0.tgz)
dsh plugin --profile web add ./dsh-ui-status-label-0.1.0.tgz
# ② git 仓库直装
dsh plugin --profile web add github:alingalingling/ui-status-label
# ③ npm(当前 npm 上尚未发布,发布后可用)
dsh plugin --profile web add dsh-ui-status-label
git 安装注意:pnpm ≥10 默认阻止运行 git 依赖的 prepare 脚本——首次 add 可能报 "Ignored build scripts",报错会打印一个包 key。把它加入 profile 目录下 pnpm-workspace.yaml 的 allowBuilds 后重新 add 即可(这是允许执行该包构建代码的授权,只对你信任的包开启):
allowBuilds:
dsh-ui-status-label: true
不过本仓库已把预构建的 lib/(含类型声明)随源码一起提交,git 安装即使跳过 prepare 也能直接用产物;allowBuilds 只在你想从源码重新构建时才需要。
卸载用 dsh plugin --profile web remove dsh-ui-status-label。
仅在使用内置了本插件的定制 dsh 构建(如 deepseek-harness 仓库本地构建)时,不要重复安装——
ui-status-labelsettings 命名空间会注册两次。官方发布版未内置本插件,正常安装即可。
安装后生效
装完需要重启 dsh web 进程(当前运行中的 GUI 不会热加载新插件 bundle),重启后刷新页面即可在设置里看到入口。
兼容性
本插件同时提供两条生效路径,官方正式版(含 0.1.0-rc.6)即可直接生效:
- DOM 注入(默认兜底):插件监听聊天视图的运行状态元素(官方标记
role="status"+ 硬编码Deep diving...),把文本替换为你配置的文案。不依赖官方任何新机制,装完即用。 conversationStatus可选服务:当 ui-conversation 带上了扩展点(随UPSTREAM-EXTENSION.patch合入官方后),聊天视图直接渲染你配置的文案,DOM 注入自动让位,两者不会冲突。
设置
安装并重启后,修改入口在 dsh Web 页面里:
- 打开 dsh Web 页面(默认
http://127.0.0.1:3080) - 点击页面左下角的齿轮图标,打开设置面板
- 在左侧导航选择 General(通用) 分区
- 找到「运行状态文案」一行,在输入框里输入你想要的文字(例如"努力干活中")
- 输入即生效,无需保存——下次智能体运行期间,聊天视图的状态行就会显示你输入的文字
清空输入框会回到默认文案 小难梁在0721。文案按用户而非按会话,上限 40 字符。
从源码构建
pnpm install # 安装直接依赖(dsh-settings、schemastery 等,均已发布 npm)
pnpm run bundle # 重建 JS 产物:lib/index.js(node 半边)+ lib/client.js(浏览器半边)+ lib/invariant.js
pnpm pack # 生成 tarball(含 lib/ 与 cordis.patch.yml)
lib/(含 lib/types 类型声明)已预构建并随仓库提交;prepare/bundle(tsdown)只重建 JS 产物,不重新生成 .d.ts——类型由仓库维护,改动源码后如需同步类型请对照 lib/types 更新。
结构
src/schema.ts— 仅 node 半边;ui-status-label设置 schema(放在浏览器 bundle 之外,运行时不依赖 schemastery)。src/status-settings.ts— 两个半边共享的常量与 section 类型。src/client/StatusLabelRow.tsx— General 设置文本行。src/client/status-label-policy.ts— 实时 snapshot store、持久化写穿、采纳 Host 侧变更,以及空值回退默认。src/client/status-label-injector.ts— DOM 兜底:把官方硬编码的Deep diving...文本替换为配置文案(上游合入扩展点后自动让位)。src/client/index.ts— 注册设置行、提供conversationStatus服务并启动 DOM 注入器;把本插件从 cordis.yml 组合掉后,ui-conversation 的内置文案保持原样。
模型体验
无——设置行与服务只影响浏览器呈现;本包不会触及任何模型请求。
