dsh-expander
已验证@codebam/dsh-expander · v1.0.0 · MIT · Web 界面
DeepSeek Harness web plugin: expand every thinking (Think) block and tool-call block by default, with a header toggle. · DSH 网页插件:默认展开全部思维链与工具调用块。
安装
dsh plugin add @codebam/dsh-expander 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
发布到 npm 但没有公开仓库。安装前请检查包内容。
标签
作者
说明文档
@codebam/dsh-expander
一个 DeepSeek Harness(dsh)网页端插件:默认展开全部思维链(Think)区块与全部工具调用区块,
让每一轮对话直接呈现完整过程,而不是一排折叠起来的一行摘要。
插件同时在会话标题栏放了一个开关,想恢复“点击才展开”时可以关掉。
What it does
- 思维链 / reasoning 行 —— 每个
Think折叠块一出现就展开,模型流式输出时同样如此。 - 工具调用 —— 所有工具调用(bash、read、search、diff、terminal、web 等)自动展开,包括子调用。
- 完成轮次的 process 折叠 —— 紧凑视图下整轮过程会被折叠成一行 “思考了一会儿 · N 次工具调用”;插件也会把它展开,否则其中的工具调用根本不在 DOM 里。
- 尊重你的手动折叠 —— 每个区块只自动展开一次。你手动收起后它保持收起,插件不会和你抢。
Requirements
- DeepSeek Harness
>= 0.1.5-rc.1 - web profile(
dsh web)
Install
从 npm 安装(发布后):
dsh plugin --profile web add @codebam/dsh-expander
然后重启 profile —— bundle 层只在启动时读取:
dsh web
从本地目录安装:
dsh plugin --profile web add ./path/to/dsh-expander
卸载:
dsh plugin --profile web remove @codebam/dsh-expander
The toggle
会话标题栏的会话操作区会多出一个 Think 图标按钮:
- 高亮 —— 自动展开已开启。
- 变暗 —— 自动展开已关闭,折叠块恢复官方默认行为。
选择写入 localStorage,对所有会话生效。
Configuration
所有配置都在浏览器端(宿主侧没有任何可配置项)。开关会写入下面两个键, 也可以直接在浏览器控制台里改:
localStorage 键 |
默认值 | 含义 |
|---|---|---|
dsh-expander.enabled |
"1" |
自动展开思维链与工具调用区块。 |
dsh-expander.turn-process |
"1" |
同时展开完成轮次的 process 折叠块。 |
除 "0" / "false" 以外的值都表示开启。例如:
localStorage.setItem("dsh-expander.enabled", "0"); // 关闭
localStorage.removeItem("dsh-expander.turn-process"); // 恢复默认
How it works
dsh 把每个 reasoning 行和工具调用渲染成一个受控折叠块,
展开状态是组件内部的 React state —— 插件插槽无法设置它,且共享的 primitives
模块是被冻结的。但 DOM 本身暴露了官方的无障碍契约:处于折叠态、可展开的行,
其 data-expandable 与 aria-expanded="false" 都挂在真正处理点击的那个元素上。
因此插件:
用
MutationObserver监听对话区 (childList+subtree+aria-expanded/data-expandable属性)。选出属于思维链或工具调用的三类元素:
[data-variant="think"] [data-expandable][aria-expanded="false"] [data-chat-call-id] [data-expandable][aria-expanded="false"] button[data-turn-process][aria-expanded="false"]对每个元素只点击一次,并用
WeakSet记下来,绝不打扰你手动收起的行。
插件没有打补丁、没有替换组件:点击走的就是用户点击时同一条事件处理链, 因此流式更新、键盘焦点、无障碍树等原生行为全部保留。
Compatibility / limitations
- 功能建立在稳定、面向用户的
data-*/aria-*契约属性上,而不是私有组件 API 或 monkey-patch。若未来版本改名,插件会退化为无操作,而不会弄坏界面 —— 届时对照上面的选择器即可。 - 作用范围是 Chat 对话区;其它自带折叠块的界面(例如 trajectory 视图)不在范围内。
- 标题栏开关是“尽力而为”:宿主没有
conversation.session.header.actions插槽时按钮不出现, 但自动展开仍然正常工作。
Development
无需构建:client/client.js 就是发布的浏览器 bundle(一个普通的
window.__ModuleLoader__.load({ id, factory }) 注册),lib/index.js 是宿主半边。
npm test # node:test,零依赖
npm run pack:check
Publishing
npm 上带 scope 的包默认是 restricted,因此这里已设置
publishConfig.access: "public" —— 直接 npm publish 即可,无需再加
--access public。
npm login
npm test
npm pack --dry-run # 预览 tarball
npm publish
files 白名单只包含 lib/、client/、cordis.patch.yml、README.md、
README.zh.md、LICENSE。
License
MIT