deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
DeepSeek Harness(DSH)Web 会话增强插件。在会话头部(「对话 / 轨迹」标签条右侧)提供四个入口:
此外:每条 AI 回复左侧显示头像(纯展示,可开关/调大小/上传自定义),头像下方带轮次标签(第 N 轮)。
历史快速定位面板:打开后持续悬停(仅随「历史」按钮再次点击关闭);顶部固定「回到顶部」按钮;每条记录带「第 N 轮」序号徽章,支持搜索与点击跳转(跳转定位到该输入第一行)。若会话存在未加载完全的更早历史(DSH 原生「加载更早」可补),顶部显示「历史未加载完全」提示。
导出文件名规则:标题取左侧工作区显示的会话名称(displayTitle);时间戳取导出当日(点分格式,如 2026.8.24);会话存在未加载完全的历史时加前缀——
未加载完全历史对话_2026.8.24_会话标题.md2026.8.24_会话标题.md轮次语义:每条用户输入独立一轮并递增编号(含运行期插入的中途引导/steering)——历史窗口序号、头像下方标签、导出文档轮次三处编号严格一致。
状态持久化:全局折叠/展开开关保存在 Host 设置文件中,刷新页面或重启服务后自动还原。
dsh-GreaterClarity-plugin/
├── package.json # dsh.bundle.patch + dsh.client.inject/platform + peerDeps 范围声明
├── cordis.patch.yml # 官方 dsh plugin add 的 insert 挂载声明
├── tsconfig.json # NodeNext,exclude src/client
├── tsconfig.test.json # 测试编译配置(src/pure + tests → build-test/)
├── tsdown.config.ts # host 自包含 ESM + client CJS(ModuleLoader banner)
├── scripts/build.sh # junction link + tsc 编译 host
├── LICENSE # MIT
├── src/
│ ├── index.ts # HOST:webServer 路由 + 设置持久化(纯逻辑引用 src/pure)
│ ├── pure/ # 双端共享纯函数(单一事实源,node:test 覆盖)
│ │ ├── markdown.ts # 转义/事件流导出构建/文件名净化/时间格式
│ │ ├── rounds.ts # 快照轮次采集/轮次映射/直出构建
│ │ └── settings-spec.ts # 设置模型/净化/合并/clamp
│ └── client/
│ ├── index.ts # CLIENT 入口:apply(样式/DOM 层装卸/slot 注册)
│ ├── state.ts # 共享状态 + 宿主通信 + 设置同步
│ ├── use-store.ts # React 订阅钩子
│ ├── styles.ts # 主题 token CSS
│ ├── dom-layer.ts # 头像/折叠 DOM 层 + 轮次映射缓存
│ ├── export-panel.ts # 导出按钮(直出+兜底)
│ ├── history-panel.ts # 历史快速定位面板
│ ├── settings-modal.ts # 设置弹窗
│ └── buttons.ts # 会话头部按钮区
├── tests/ # node:test 单测(pure 层)
├── assets/DSH_Avatar.png # 默认头像
└── README.md
dsh plugin --profile web add github:Baisbt/dsh-GreaterClarity-plugin
首次安装 pnpm 会拦截 prepare 构建脚本(allowBuilds 授权,源码安装的标准流程):把 pnpm 打印的 @dsh-external/dsh-greater-clarity@... 键原样加入该 profile 的 pnpm-workspace.yaml(allowBuilds: "<键>": true;键随解析方式存在 git/codeload 两种形态,可同时保留多把),然后重跑一次安装命令即可。装入 web profile(含 dsh-web-app,提供本插件依赖的 webServer 服务)。
dsh plugin --profile web add <本目录绝对路径>
# 或发布到 npm 后:
dsh plugin --profile web add @dsh-external/dsh-greater-clarity
# 在 DSH 会话内使用注入器工具:
# dev_build_plugin -> dev_inject_plugin
# 需 DSH_CHECKOUT 指向 dsh 源码 checkout(含 packages/)
$env:DSH_CHECKOUT = "D:\dsharness\deepseek-harness"
bash scripts/build.sh # link 依赖 + tsc 编译 host
npm run build:client # tsdown 打包 host + client
设置写入 $DSH_HOME/greater-clarity/settings.json;上传的头像落盘 $DSH_HOME/greater-clarity/avatar.<ext>;默认头像来自包内 assets/DSH_Avatar.png。三处均通过 Host 路由 /dsh-greater-clarity/* 读写。
三种粒度,按需选择:
| 需求 | 操作 | 效果 |
|---|---|---|
| 临时停用(保留设置) | 设置弹窗 → 「启用 GreaterClarity」开关关闭 | 全部功能与 DOM 层下线,会话头部仅留「启用」按钮;重启后保持停用 |
| 软卸载(清除数据) | 设置弹窗 → 底部「卸载插件…」(双确认) | 清空 $DSH_HOME/greater-clarity/(设置 + 头像),写入 uninstalled.flag 停用标记,跨重启生效;重新「启用」即恢复默认配置 |
| 彻底移除(profile 级) | 终端运行 dsh plugin --profile <名称> remove @dsh-external/dsh-greater-clarity |
从 profile 组合中移除 bundle 层,插件不再加载;建议先用软卸载清掉数据目录 |
说明:bundle 插件由 profile 配置层装配,「彻底移除」必须走官方
dsh plugin remove命令——这是 DSH 的架构约定;弹窗内的卸载按钮负责的是数据清理与停用标记。
name(已剥离本地路径),图片导出用文件名(+ 附件存储派生路径)指代,无法还原原始完整路径;普通文件以文本中的 @路径 引用原样保留。webServer、slots、sessionQuery)、slot 名(conversation.session.header.utilities)、DOM 属性(data-chat-flow-kind、data-variant="think"、data-chat-call-id、data-chat-anchor-key、data-conversation-scroll)以及 Buttons 注入 props(sessionId、useSession),DSH 升级后需回归验证。\-、\* 等反斜杠序列与 < 等实体,渲染显示不受影响;行首 4+ 空格缩进的输入在导出中仍会呈现为代码块。chat.order/chat.nodes 结构(防御式读取,异常自动回退服务端);标题在快照无 title 时取首条用户输入前 24 字。快照结构与 Host 端 sessionQuery 属同类非契约依赖,DSH 升级需回归。avatarPath 仅接受 $DSH_HOME/greater-clarity/ 目录内的图片文件(安全约束,目录外路径会静默回退到上传头像 / 默认头像);此前配置过外部路径的用户需把文件移入该目录或改用上传功能。peerDependencies.cordis 为 *(本插件对 cordis 仅类型导入、运行时零引用,避免 semver 预发布元组排除陷阱)。>=4.0.0-rc <5 存在 semver 预发布元组排除陷阱(未来 4.1.0-rc.* 将 ERESOLVE),改为 *(运行时零依赖,仅类型声明)。src/pure/ 共享纯函数层:转义/导出构建/文件名/轮次映射/设置模型抽取为双端共享单一事实源,消除 Host/Client 四处手工同步的副本;buildMarkdown 与 snapshotToMarkdown 统一装配段(roundsToMarkdown),并顺带修复头部「对话轮数」与实际轮数不一致的旧问题。settings-spec.ts 提供类型/默认值/逐字段净化/合并/clamp,Host 净化与 Client 合并共享同一实现,新增设置字段触点从 6 处降至 2 处。tests/ + node:test(npm test),pure 层 40+ 断言固化(转义向量/轮次语义/导出构建/设置净化/文件名规则)。displayTitle(与左侧工作区显示一致),回退快照标题链;服务端兜底维持 readTitle 权威来源。#N 改为「第 N 轮」;会话存在未加载完全的更早历史时(快照 hasMore),「回到顶部」旁显示「历史未加载完全」提示。2026.8.24);会话存在未加载完全的历史时文件名加前缀 未加载完全历史对话_。客户端直出按快照 hasMore 判定;服务端兜底由请求体 partial 字段传入。textOf 死函数;删除从未被功能使用的 export.mode / export.targetDir 设置字段(导出恒为浏览器默认下载,设置页同步移除「导出路径」提示行)。docs 外的 ui 分类提交收录 PR。kind==='user',agent 运行期插入的追问一律是 'steering'(harness 场景占多数),旧计数逻辑只对 user 递增导致几乎全部同号。轮次语义改为「每条用户输入独立递增」,历史序号 / 头像标签 / 导出轮次三处同步。--dsw-alias-button-info-fill 蓝);卸载按钮的错误令牌 --dsw-alias-danger 不存在,改为 --dsw-alias-state-error-primary;其余令牌(表面/边框/文字/悬停/三级标签)均经 design-platform.css 源码核实有效。#N 序号徽章,AI 头像下方显示「第 N 轮」标签,三处与导出文档轮次编号保持一致;导出同步纳入 steering 内容并采用相同轮次划分。ui.foldGlobal),刷新页面或重启服务后自动还原。chat 节点构建 Markdown 并触发下载——零网络往返、零磁盘读取,长会话从「秒级等待」降为毫秒级响应;轮次分组以 user/steering 节点为边界,转义规则与 Host 端保持一致(副本同步维护)。/export 路径;兜底路径的 readSession/readTitle 改为并行读取。uninstalled.flag 持久停用标记 → 弹出官方彻底移除命令指引;重新启用即清除标记恢复默认配置。POST /dsh-greater-clarity/uninstall 路由(受同源/回环信任校验保护);设置结构新增 plugin.enabled 字段(旧配置文件自动补默认值)。安全
avatarPath 白名单限定在 greater-clarity 目录内且扩展名必须是图片,杜绝经 settings 写入任意路径后借 /avatar 路由读取机器文件。Access-Control-Allow-Origin: *;所有插件路由要求 Host 为本机回环地址(防 DNS rebinding),浏览器跨站请求的 Origin 必须与 Host 同源(防 CSRF)。外部工具经 http://127.0.0.1:<port> 直连不受影响。正确性
3. 导出丢首轮修复:事件流不以 turn/start 开头时(部分快照/回放窗口),已积累内容按独立轮输出而非丢弃。
4. 跳转吸附容器覆盖:滚动停稳检测改为捕获阶段监听全文档 scroll(静默 150ms 停稳 / 1200ms 兜底),不再依赖固定的 [data-conversation-scroll] 容器签名。
5. 空 step 轮不再整体隐藏:折叠分组中某轮没有最终回答行时保持该轮原样可见。
6. 请求体超限:以暂停读取 + 413 状态码响应取代直接断连;错误响应对已销毁套接字的二次写异常就地吞掉,消除未处理 rejection。
7. 悬浮窗跟随窗口缩放:HistoryPanel 打开时窗口 resize 会重算吸附位置。
健壮性
8. settings.json 损坏备份:解析失败时先把旧文件改名 .bak 再回默认值,不无提示覆盖。
9. POST 设置逐字段类型净化:非法类型不落盘;数值字段统一 clamp。
elementFromPoint 必须命中头像自身),被 session log 栏等浮层遮挡的头像不再误判为可见。escapeUserText 全局严格转义用户输入与附件文件名,阻断伪造标题/分隔线/列表/注释及裸 HTML 注入;AI 回答不转义。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。