deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
给 DeepSeek Harness Web 界面(dsh web)的对话窗口增加「展开 / 折叠」控制:
折叠 = 彻底隐藏全部 AI 思考过程(Think) 与工具执行过程(Bash / Read / Edit 等 tool-call),
AI 回复正文与用户输入始终全文显示、永不折叠;点「展开全部」可把过程行显示为 5 行预览。
纯浏览器端实现,零后端、零 API key。
当前版本:v0.1.8(变更记录见 CHANGELOG.md)
conversation.session.header.actions
槽位,与 Agent 预设、任务状态等按钮同一行)放一个按钮,和每条回复上的单按钮
交互一致:localStorage(dsh-chat-fold:mode),刷新 / 重开会话后保持。dsh-chat-fold/ # ← git 仓库根
├── package.json # dsh.client 声明(platform: web → 浏览器端 bundle)
├── lib/
│ ├── index.js # Node 半身:空插件(让 loader 能创建 fiber)
│ └── client.js # 浏览器端 bundle(全部功能所在,手写、零构建)
├── test/
│ └── smoke.test.mjs # 冒烟测试:模块表 + 假 DOM 适配器(44 项断言)
├── README.md
└── CHANGELOG.md
若本机尚未完成接线,按以下步骤操作;
webprofile 已接线时会直接加载本仓库。
把插件软链进 web profile 的 node_modules(使 dsh-chat-fold 可被 Node 与
client-modules 从 profile 目录解析):
mkdir -p ~/.dsh/profiles/web/node_modules
ln -sfn /Users/robinddu/Desktop/workspace/robinddu/dsh-chat-fold \
~/.dsh/profiles/web/node_modules/dsh-chat-fold
在 ~/.dsh/profiles/web/cordis.patch.yml 追加:
# dsh-chat-fold: 对话过程折叠插件(浏览器端;右上角 折叠/展开)
- insert:
- id: chat-fold
name: 'dsh-chat-fold'
config:
defaultMode: 'folded' # 初始模式:folded=折叠思考/工具/AI回复 | expanded=全部展开
userEmphasis: 'auto' # 用户输入高亮:auto | strong | none
replyFoldMinChars: 120 # 短于此字符数的 AI 回复不折叠,直接展示全文
debug: false
重启 dsh web(首次安装需重启以重新扫描 client 插件清单),浏览器硬刷新
(Cmd+Shift+R)。之后代码改动只需硬刷新页面即可生效。
为什么是
dsh-chat-fold(包名)而不是绝对路径:client-modules 会用条目名解析<name>/package.json并据此扫描dsh.client声明、服务/plugins/<id>/client.js; loader 的 Node 侧 import 也从 profile 目录解析包名。软链一次接线、两处生效。 浏览器端 bundle 只依赖react(平台种子模块),无需 node_modules 软链到 harness。
[data-conversation-scroll][data-chat-flow-kind](user / assistant-step / tool-call …)[data-variant="think"] 内的 Disclosure 行
([data-disclosure-row][role="button"][aria-expanded],与内置「Think」行同源)[data-expandable][role="button"][aria-expanded]dsh-fold-scope-opendsh-fold-expose-half 裁剪);完整详情由用户点击预览区展开(capture 拦截防误收起)createCore)职责:collectTargets 收集当前已渲染的全部可折叠目标(含展开态);scan:按作用域归位(隐藏/暴露行、scope-open、5 行半展开预览),
预览只自动打开到 5 行,不自动展开全文、不干预用户已展开的完整详情;applyAll(open):一键作用于当前所有目标(按钮语义),忽略用户临时开关;findReplyWrapper 仅用于定位
“某条最终回复”以便作用域归属与单按钮挂载;conversation.chat.assistant-actions 官方槽位
(与复制 / 🔊 朗读同一条操作条),从按钮 DOM 上溯到 turn-tail 再取其前一个
assistant-step 定位「本条回复」,toggleReplyForFlow 只改这条的 override 与 class,
与全局模式解耦;按钮经回复 revision store 订阅刷新「展开回复 / 收起回复」状态;html[data-dsh-fold-mode="folded"] [data-variant="think"](思考行)与
[data-chat-flow-kind="tool-call"](Bash/Read/Edit 工具卡)display:none;
纯思考步骤(只有 Think、无正文)由 isThinkOnlyStep 识别后打 class
dsh-chat-fold-step-hidden 整条隐藏,避免留空行;display: contents、非透明的
div)找到气泡并加上自有 class dsh-chat-fold-user-bubble,由插件自己的 CSS 描边,
不依赖任何 hashed class。subscribeMode/publishMode 模块级 store 管理,React 槽位组件用
useSyncExternalStore 订阅,按钮按下态与引擎状态始终一致。npm test # 冒烟测试(Node,44 项断言:识别/归位/彻底隐藏/过程行预览/单按钮/作用域展开/纯思考步骤/气泡标记)
若需手工验证 DOM 行为(点击 Disclosure 是否驱动 React 展开等),可参考仓库
docs/ 之外的开发会话记录;核心假设已内置在冒烟测试与注释中。
collectTargets / findUserBubble / findReplyWrapper 与少量常量里,
改动面很小。~/.dsh/profiles/web/cordis.patch.yml 删除对应 insert 段;~/.dsh/profiles/web/node_modules/dsh-chat-fold;dsh web;残留的 localStorage 键 dsh-chat-fold:mode 无副作用,可不管。MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。