跳到主要内容

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" 都挂在真正处理点击的那个元素上。

因此插件:

  1. 用 MutationObserver 监听对话区 (childList + subtree + aria-expanded / data-expandable 属性)。

  2. 选出属于思维链或工具调用的三类元素:

    [data-variant="think"] [data-expandable][aria-expanded="false"]
    [data-chat-call-id]    [data-expandable][aria-expanded="false"]
    button[data-turn-process][aria-expanded="false"]
    
  3. 对每个元素只点击一次,并用 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