dsh-prism
简体中文 | English
DSH 界面三档模式插件:原生 / 整洁 / 白话一键切换。整洁档保留产品原版的工具行语言,白话档把术语换成大白话,两者都把工具调用收成折叠组。新手看白话,老手要完整,同一套界面三种读法,降低 DeepSeek Harness 的上手门槛。
项目仍在持续迭代:跟进 DSH 接口演进、扩充工具覆盖、打磨白话档体验,欢迎试用与反馈。
为什么做这个
DeepSeek Harness 发布后,社区对它的批评集中在一点:门槛。
- 界面新闻:「一切皆插件」的设计十分依赖配置(YAML + 插件 + 效果组件 + 服务),「对高级用户而言功能强大,但对于只想快速用上可用智能代理的人来说,上手门槛较高」
- 极客公园:DSH「对非编程用户不是很友好」,像框架、不像成品,是给开发者的尝鲜版
- 社区开发者:「这玩意鬼才用,我为什么没事要插拔」
DSH 的毛坯房是刻意为之,但「想省事的人」和「要全功能的人」不该被迫接受同一套界面。dsh-prism 用三档模式回应这个矛盾:
| 档位 | 适用的人 | 界面表现 |
|---|
| 白话 | 想先用起来、不想研究术语的人 | 工具调用归组折叠:正式回复前的一串调用收成一行统计,点开展开后每行走白话文案(「正在读取一个文件的内容」),全篇 emoji 图标 |
| 整洁 | 想整洁、但不想改变原有信息读法的人 | 同样归组折叠,展开后每一行按产品原版样式呈现:单色线性图标 + 类别标题(Bash / 读取 / 编辑 / 工具调用)+「·」+ 参数摘要,例如 Bash · Run syntax check、工具调用 · get_goal · {};用宿主内置的官方 ui-primitives 组件渲染 |
| 原生 | 老手、需要完整信息的人 | 插件零接管,产品原貌原样渲染,一个像素都不改 |
默认原生档,切换一次即生效,刷新页面回原生档。不想用的时候,卸掉插件,界面回到出厂状态,没有任何残留。
功能
- 侧栏入口:侧栏底部「设置」上方一枚圆形按钮(官方
sidebar.footer.action 槽,与 WSL / 记忆等入口同排),显示当前档位首字(原 / 整 / 白),点开菜单切换「原生 / 整洁 / 白话」;菜单内含「隐藏复杂工具」开关(仅白话档生效)
- 整洁档 = 归组折叠 × 原版行:
- 与白话档共用归组与折叠统计行,差别只在展开后的每一行:用宿主内置的官方
@deepseek-ai/dsh-client-ui-primitives 原语(DisclosureRow / StateDot / 官方图标)渲染,标题与摘要按产品 toolRowModel 的同一套规则推导,视觉与产品原生工具行一致
- 行结构:状态标识(运行中 / 出错 / 中断,取
StateDot)+ 单色线性图标 + 类别标题 +「·」+ 参数摘要;通用工具按产品的写法带上工具名(如 工具调用 · get_goal · {})
- 不折叠复杂工具(信息完整度贴近原生);脱敏与详情渲染沿用同一套底线
- 白话档 = 工具调用折叠组 × 大白话交付文档:
- 总结档:一次 user turn 内、模型正式回复之前的整串工具调用收成一个折叠组,收起时只显示一行统计「N 个工具 · M 次思考」(M 为组内模型思考次数,按 assistant 输出的 reasoning 块计数;无思考时只显示工具数),行尾带组状态(✓ 完成 / ● 运行中 / ✕ 有出错)
- 展开面板:点开统计行展开文档化面板——标题区(「本次调用 N 个工具 · M 次思考」)+ 清单区(每个工具一行)+ 说明区;白话档的行是类别图标 + 白话动作/参数摘要 + 状态图标,整洁档的行是官方图标 + 类别标题 + 参数摘要;点单行展开该工具的「交付文档」详情(脱敏结果 Markdown 渲染)
- 隐藏复杂工具:21 个高级工具(目标 / 计划、子代理编排、后台任务、插件系统)在面板内默认折叠成白话摘要行,点「展开」即展开并打开详情;菜单开关可随时关闭折叠
- 归组规则:一个 user turn 内的全部工具调用为一组(一行统计,不按回复切段);运行中随新调用累计,刷新重放后按同一规则归组,每个工具恰好显示一次
- 双语界面:插件全部文案跟随 DSH 界面语言(简体中文 / English),设置里切换语言即时生效,无需刷新;工具白话文案、参数摘要、菜单与状态均有中英双语\n- 数据脱敏(两个折叠档共用同一底线):
token / secret / password / api_key / authorization 等敏感参数名永不取值,整洁档的摘要同样过滤;参数里只有敏感键时摘要留空,不回退原始 JSON
- 结果文本与摘要中的常见密钥形态(
sk-xxx、Bearer xxx、?token=xxx、key=xxx)替换为占位符
- 白话档额外把路径缩成文件名(
file_path 等参数用 basename 呈现);整洁档按产品原版规则显示路径,以贴近原版
- 详情面板只展示脱敏结果,不暴露原始参数
- 原生档 = 产品原貌:原生档下插件不注册任何工具行渲染器,交还产品原样渲染(含通用卡片);整洁档与白话档才注册折叠组节点(以更低的 priority shadow 产品 tool-call 树),切档时动态注册 / 注销、即时生效
- 文案规则:33 个工具规则表给出白话文案(如
pwsh → 「正在电脑上执行一条命令」),未进表的工具按参数名自动生成摘要。白话档下折叠组内每一行都按这套规则渲染;整洁档改用产品原版的类别标题与摘要规则(Bash · …、工具调用 · 工具名 · …),只在脱敏底线上保留插件自己的过滤
设计原则
- 纯展示层:只改界面呈现,模型输入输出零改动,不影响 agent 的任何工作
- 原生零接管:原生档不注册任何卡片,产品原貌完整回归;白话档把工具调用收成折叠组,组内工具行统一按白话规则渲染,官方工具卡片本身不被改动,原生档下保持原版
- 内存态切换:刷新回原生档,简单、干净、无配置污染
- 跟随主题:全部使用官方
--dsw-alias-* 设计变量,明暗主题自适应
安装
需要先装好 DeepSeek Harness(Node.js 22.19+ 或 24+)。
当前通过 GitHub 发布,克隆本仓库后以本地路径安装:
npx -y @deepseek-ai/dsh plugin --profile web add <本仓库目录>
也可以直接从 Releases 下载打包产物。启动 Web UI 后,侧栏底部「设置」上方会出现档位入口。
使用
- 启动后点击侧栏底部「设置」上方的档位入口(显示当前模式)
- 选择「白话」:一次任务里的工具调用归成折叠组,收起是一行统计,点开展开面板看每个工具的白话行与交付文档详情
- 菜单里可开关「隐藏复杂工具」(仅白话档生效)
- 选择「原生」:恢复完整原生界面
- 刷新页面回到原生档
常见问题
为什么刷新后回到原生档?
档位存在内存里,这是刻意设计:白话档是临时辅助,不想用的时候刷新即消失,不留任何状态。
为什么有些工具卡片看起来没变?
read、write、web_search 等工具官方已有产品级原生卡片,插件不为它们注册替代卡片(原生档完全原版);白话档把它们与其他工具一起收进折叠组,以统一的白话行展示,不改变官方卡片本身。
白话档会影响 agent 干活吗?
不会。插件只改界面显示,模型收到的输入输出与原生完全一致。
点开详情后表格 / 代码块是什么效果?
结果文本先脱敏,再按 Markdown 子集渲染:| a | b | 表格、``` 代码块、# 标题、- 列表、**粗体**、行内代码与 commit 哈希高亮;任何解析失败都退化为纯文本。
Roadmap
- 跟进 DSH 官方接口演进,保持新版本兼容
- 扩充工具规则表,让更多工具自动获得白话文案与文档化呈现
- 打磨白话档体验:时间线行、交付文档渲染、脱敏粒度
- 按社区反馈补充适配说明与常见问题
有想法或遇到不适配的工具,欢迎开 issue 讨论。
更新日志
v1.4.0(2026-09-18)
- 入口迁移:档位切换按钮从浮动层搬进左栏底部——官方
sidebar.footer.action 槽,与 WSL / 记忆等入口同排、位于「设置」上方;按钮显示当前档位首字(原 / 整 / 白;英文 N / T / P),宽栏 28px、窄栏 36px,与同排其它插件一致
- 随之删掉整套浮动定位逻辑(含手机端专门的角落定位):入口住在侧栏里,宽屏窄屏都自然就位,不再与输入框上方的控件争地方
- 回归脚本的入口选择器同步更新(26 个)
v1.3.4(2026-09-18)
- 手机(窄屏)适配:宽度不足 560px 时,悬浮入口贴屏幕左下角,不再与输入框上方那一行的控件争位;入口触控高度 31→39px,菜单与面板不溢出视口。宽屏行为不变
v1.3.3(2026-09-17)
- 修复:工具收起不彻底。一个 user turn 里的调用原先按「正式回复」切段,而模型边写边调时,回复之间夹着的调用会各自单独成行——看起来就是「收了一半、漏了一半」。现在一个 turn 的全部工具调用收成一行统计,不再切段
- 顺带校准:思考计数从「正式回复之前的 reasoning」改为「本 turn 的全部 reasoning」,与工具数口径一致
- 回归:组逻辑 26/26(新增「回复后调用仍并入同一组」用例)、等价性全过、红队单元 29/29、红队浏览器 20/20
v1.3.2(2026-09-17)
收尾复审(只动确会影响后续的地方):
- 修复:折叠组的展开态此前只按 turn 编号记账,两个会话里同号 turn 会互相串档(在会话 A 展开的组,切到会话 B 也显示展开)。改为按「会话 + turn」记账——跨会话隔离,同会话内记忆照旧
- 清理:
dsh.client.inject 里长期挂着一个宿主并不存在的包名(@deepseek-ai/dsh-client-runtime),已清空;对官方 ui-primitives 的依赖补进 peerDependencies
- 文档:装配说明与脱敏章节跟上了三档现状(白话档把路径缩成文件名,整洁档照原版显示路径;两档共用同一套敏感键过滤)
v1.3.1(2026-09-17)
- 档位定名:原生 / 整洁 / 白话(原名「原生 / 中级 / 简化」)。三个词各指一处可感知的差别——原生讲保真度、整洁讲排布、白话讲语言;「中级」是程度词,与另外两项不在同一根轴上。英文同步为 Native / Tidy / Plain
- 修复:选「整洁」档后左下角悬浮按钮仍显示「原生」(档位名分派漏了第三档;全项目仅此一处,已逐点审计确认)
- 安全(红队发现并修复):整洁档照产品规则取参数摘要时,补上脱敏底线——敏感键名(
token / secret / password / api_key / authorization 等)永不取值;参数里只有敏感键时不再回退原始 JSON 文本(否则键名与结构会出现在摘要里);URL 查询串里的 ?token= / &api_key= / &sig= 等凭据形态纳入脱敏
- 移除摘要上的
title 属性(产品没有),避免超长参数在悬停时弹出整段 JSON
- 三档语义不变,功能与数据零改动
v1.3.0(2026-09-17)
- 新增「中级」档:三档结构为原生 / 中级 / 简化。中级档与简化档共用归组折叠,差别在展开后的行——改用宿主内置的官方
ui-primitives 原语(DisclosureRow、StateDot、官方图标组件)渲染,标题与摘要照产品 toolRowModel 的规则推导,行语言与产品原生工具行一致(Bash · Run syntax check、工具调用 · get_goal · {})
- 官方包通过宿主模块表的平台单例取得(
seed.ts 里已登记 @deepseek-ai/dsh-client-ui-primitives),插件 require 即得,零打包、零安装、零依赖;取不到时自动降级为普通布局,功能不丢
- 中间面板行的度量值照抄产品的
ToolRow.module.css(标题字重、2px 圆点分隔、摘要字号与省略),主题令牌沿用 --dsw-alias-*,明暗主题自适应
v1.2.1(2026-09-17)
- 适配 DSH 0.1.5:Chat 视图快照改从运行时注入的
useChat 取用(新版把它从 SessionSnapshot.chat 挪到了 SessionStandardProps.useChat),旧版路径保留为回退,同一份代码在两代产品上都能正常归组
- 新增诊断开关:控制台执行
window.__PRISM_DEBUG__ = true 后刷新,会输出首个组节点的分组上下文(turn / 节点数 / 工具数 / 边界判定),产品升级后定位问题不必再猜
- 配套回归脚本同步:新增「新版 ChatSnapshot 直取」用例,25 项全通过
v1.2.0(2026-08-18)
- 界面双语适配:全部文案跟随 DSH 界面语言(zh/en),切换即时生效;33 工具规则、参数摘要、菜单、组状态均有英文
v1.1.1(2026-08-18)
- 修复:简化档归组在真实浏览器完全失效(
ToolGroupNode 裸用 framework hook useSession,每次渲染抛错导致槽位条目退出、回退产品原版渲染,两档看起来一样);改为从组件 props 取运行时注入的 hook
- 组状态升级为三态 + 混合计数:全对显示 ✓、全错显示 ✕、对错混合显示警示符号 + 「✓ n · ✕ m」计数(对在前);组内还有调用在跑时只显示 ● 运行中,跑完才给对错总结
- 状态计数按根工具调用计算,与组内行数口径一致
v1.1.0(2026-08-18)
- 简化档工具调用归组折叠:一次 user turn 内、正式回复之前的整串工具调用收成一个折叠组
- 总结档:收起时一行统计「N 个工具 · M 次思考」(M 按 assistant 输出的 reasoning 块计数,无思考时只显工具数),行尾带组状态
- 中间档:点开统计行展开文档化面板(标题区 + 每工具一行 + 说明区),每行复用白话卡片样式,点行看脱敏交付文档详情
- 归组在运行中随新调用累计、刷新重放按同一规则归组;每工具恰好显示一次
- 行推导提取为共享函数
toolRowMeta,时间线卡片与折叠组面板共用,文案与状态完全一致
- 折叠组统计行的开合状态按组独立存内存 store(每个 turn 一组),刷新回默认收起
- 修复:简化档的 tool-call 节点渲染器与产品 ToolCallTree 同 key 注册冲突(keyed 槽同 key 同 priority 会抛错),改为以
priority: -1 shadow 产品渲染;白话卡片不再注册到 tool.call.toolview(该槽在简化档无消费方),折叠组面板内直接渲染
v1.0.0(2026-08-18)
- 架构:规则表 + 参数名规则驱动(33 工具白话文案、接管名单自动推导),新增工具只需加一行
- 原生档零注册:产品原貌完整回归,切换即时生效
- 简化档:时间线行(类别图标 + 白话动作 + 状态图标)+ 交付文档详情(Markdown 子集渲染:表格 / 代码块 / 标题 / commit 高亮)
- 新增「隐藏复杂工具」开关(默认开启):21 个高级工具折叠成一行
- 数据脱敏加严:敏感参数名永不展示、密钥形态替换、详情先脱敏后渲染
早期版本
- 初版:简化 / 原生两档切换,33 工具白话文案,接管 19 个无原生卡片的工具
贡献
- 发现工具适配问题:开 issue,附上工具名与界面截图即可
- 想补充白话文案或新工具规则:按「新增一个工具」一节改
TOOL_RULES,提 PR
- 代码风格:与
lib/client.js 保持一致(零依赖、React.createElement、中文注释)
架构(全部实现位于 lib/client.js)
TOOL_RULES 规则表:33 个工具 → 白话文案与参数摘要声明
ARG_NAME_RULES 参数名规则:无显式声明的工具按参数名自动生成摘要
SENSITIVE_KEY 敏感参数名(任何情况下不展示其值)
注册是动态的:conversation.chat.node 的 tool-call 渲染器仅在简化档注册(以 priority: -1 shadow 产品 ToolCallTree;keyed 槽同 key 同 priority 的注册会抛错,更低 priority 者胜出),原生档零注册,产品界面原样呈现。折叠组面板内的工具行直接渲染白话卡片,不经 tool.call.toolview 槽分发(该槽的消费方是产品 ToolCallTree,简化档下已被 shadow)。
规则表字段
| 字段 | 含义 |
|---|
tools | 工具名(数组);多个工具共用一条规则 |
doing / done | 进行中 / 完成的白话文案;缺省时自动生成通用文案 |
complex | 标记复杂工具:简化档默认折叠成一行,点击可展开 |
noArgs | 不显示参数摘要(保持原有行为) |
arg.pick | 候选参数键,按序取第一个非空字符串 |
arg.mode | 呈现方式:file=路径只留文件名 / raw=原文 / short=截断(配 max)/ count=数组计数(配 unit)/ wrap=(值)包裹 / fixed=固定文案 |
arg.prefix | 摘要前缀 |
arg.fallback | 参数缺省时的文案;不填则不显示摘要 |
新增一个工具
- 在
TOOL_RULES 加一行,只写工具名即可:doing/done 自动生成通用白话文案,参数摘要由 ARG_NAME_RULES 按参数名自动生成(如 file_path → 「文件:xxx」、url → 「链接:xxx」),简化档折叠组面板自动按规则渲染该工具行。
- 想更精准时再补
doing / done / arg;想让它默认折叠则加 complex: true。
- 简化档折叠组面板会把组内所有工具(含产品有原生卡片的
read / write 等)按规则渲染成白话行;原生档下它们仍是产品原版卡片,无需特殊处理。
装配
cordis.patch.yml:bundle patch 注入(insert prism)。
package.json:dsh.client.external: ["@deepseek-ai/dsh-client-ui-primitives"](宿主模块表的平台单例,运行时 require 即得,无需安装或打包),浏览器半体经 exports["./client"] 加载。
- 经 web profile 的
node_modules/dsh-prism junction 直接指向工作树装配;修改 lib/client.js 后刷新页面即生效(无需同步副本)。
License
MIT