deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:silencieuxzero/Better_Deepseek_Harness
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
项目名致敬 Minecraft 模组名(?),更好的下界/末地/进度/砧板/FPS/地牢/村庄/经验修补/F3/树叶/动物动作/PVP/HUD/生存/战斗/延迟显示/附魔/图腾/掉落物/钠视频设置按钮……
为 DeepSeek Harness Web UI 编写的插件:在「设置 → 更好的 DeepSeek Harness」中直接安装、卸载、启用/停用 技能(Skills) 与 插件(Plugins),并把插件的自身偏好接入原生设置体系(settings.yaml 的 ext-center 节)。
想了解内部实现、参与开发与贡献?见 CONTRIBUTING.md(架构、目录结构、开发与测试流程)。
技能管理
--- frontmatter,必须有 name 与 description)SKILL.md)~/.dsh/skills(技能文件系统提供方实时发现,无需重启)插件管理
.tgz 包 URL(内置 tar 解包,无需外部工具)、本机目录、Git 仓库lib/ 不存在),安装时自动 npm install + npm run build 补构建(需要本机有 npm;失败会给出明确报错,改用 npm / tarball 源即可)cordis.patch.yml,由启动时的 HMR 配置监听器热生效,无需重启;带客户端界面的插件在刷新页面后出现原生设置项(settings.yaml 的 ext-center 节)
| 设置项 | 说明 |
|---|---|
allowLan |
是否允许局域网通过 /ext/api 访问(读写都包含:变更类接口以及文件树/终端输出/Git 读取/MCP 列表等回环端点;默认仅本机回环) |
skillRoot |
技能安装根目录(留空 = ~/.dsh/skills) |
customSkillDirs |
额外技能目录,每行一个;其中的技能通过本插件注册的 provider 提供给所有会话 |
treeRoot |
侧栏文件树根目录(留空 = 最近注册的工作区,其次进程工作目录) |
MCP 服务器:设置页「MCP」页签
cordis.patch.yml 中的一行 @deepseek-ai/dsh-mcp-client 条目(id ext-center.mcp.<名称>),由配置监听器热生效mcp__<名称>__<工具名> 提供给模型;手写的外部 MCP 行只读展示图片转述:设置页「图片转述」配置
llm/stream 瀑布包装转述成文字——仅替换本次请求中的图片块,会话记录原图不受影响;转述失败自动降级为占位文本(已安装且激活 dsh-web-ui 的 dsh-tool-describe-image 时本功能自动让位,见「dsh-web-ui 兼容」)/ext/api/state 的 llmProviders),也可选择「自定义路由」并填写 OpenAI 兼容的 chat/completions API URLAuthorization: Bearer <key> 头,/ext/api/state 只返回 apiKeyConfigured 布尔、不回传密钥本身vision.maxTokens,推理模型可适当调大)inputModalities 拒绝不支持图片的模型(报 MODEL_DOES_NOT_SUPPORT_IMAGES);开关开启时插件把当前模型宣告为支持图片输入(包装 llm.resolveModelInfo,仅追加 image 模态);关闭时不做任何改动,保持宿主原生校验行为Tavily 搜索:设置页「Tavily」页签(ext-center.tavily)
tvly- 开头且至少 20 个字符)tavily_search 工具并在系统提示中加入引导——模型需要实时信息(新闻、价格、最新事件)或无法自信回答时自动调用,结果(摘要 + 来源列表 + 原始内容)注入上下文供参考并按要求引用来源watch 联动注册 / 注销工具与提示引导,无需重启)GitHub 仓库访问:设置页「GitHub」页签(ext-center.github)
ghp_ / gho_ / ghu_ / ghs_ / ghr_ / github_pat_ 开头且至少 20 个字符)github_repo:仓库元数据(描述 / star / fork / 默认分支 / 语言 / 许可证 / 主题)github_tree:列目录(文件与子目录及大小;路径指向文件时提示改用 github_file)github_file:读文件(base64 解码,截断到 64 KiB;二进制文件标记;路径指向目录时提示改用 github_tree)github_search:仓库搜索(GitHub 搜索语法,如 topic:rust stars:>1000,1-10 条)github_releases:近期发布(标签 / 名称 / 时间 / 发布说明,说明截断到 4000 字符)x-github-api-version: 2022-11-28);401(Token 失效)/ 403(限流)/ 404 等错误映射为可读提示,由 agent loop 转为工具错误结果,不阻塞正常回答;总开关关闭或调用失败时模型凭已有知识作答;开关变更实时生效(settings watch 联动注册 / 注销,无需重启)Windows 通知:设置页「通知」页签(ext-center.notify,仅 Windows)
ask_user_question 等你输入时弹出,附问题摘要(截断)ext-center.notify 节):Notification;否则经 powershell.exe -EncodedCommand 调 WinRT ToastText02(单引号字面量转义 + CreateTextNode 注入,无注入面;spawn 15 秒超时兜底)。通知失败只记日志,绝不阻塞 agent loop 或工具分发;非 Windows 平台自动 no-op侧栏文件树:侧栏底部「文件树」按钮
GET /ext/api/tree),逐级展开目录:目录显示子项数、文件显示大小,每行可一键复制路径;支持全部收起treeRoot(留空 = 最近注册的工作区,其次进程工作目录)归档对话管理:侧栏底部「归档」按钮
/ext/api/archive/delete 完成:移除对应 JSONL 会话日志并清理工作区记账多终端:对话页「终端」页签(conversation.view slot)
Git 面板:对话页「Git」页签(conversation.view slot,ext-center.git),VSCode「源代码管理」风格
.git;所有操作由主机侧 git 子进程执行(GIT_TERMINAL_PROMPT=0,防挂起)优化输入:会话输入框右下角(发送按钮与上下文按钮之间)「优化输入」按钮(星星图标)
dsh-web-ui 兼容:与 dsh-web-ui 全家桶同装时,冲突界面自动让位(详见 兼容性(dsh-web-ui))。
工具参数自动修复
tools/execute 包装层修复模型偶发的参数抖动:description 缺失 / 为空 / 类型错误时自动补上中性占位符arguments 是损坏 JSON(截断、夹杂文字、尾逗号)时尝试恢复为对象INVALID_ARGS 报错,让对话更流畅急救模式(rescue mode)
cordis.patch.yml 热生效,无需手动改文件),以最小化配置继续运行无头 / TUI 宿主(如 dsh-TUI)
webServer 也能加载):/rescue 斜杠命令(dsh-TUI 的斜杠菜单自动并入注册表命令):/rescue 查看状态、/rescue apply all|none|<插件名,...> 恢复选择、/rescue trigger 手动进入急救rescue.protectBundles 显式追加保护名单/ext/api HTTP 路由与 Web 界面不挂载dsh-web-ui 是 DeepSeek Harness Web UI 的插件与皮肤全家桶(@linxin666/* 系列,可经聚合包 dsh-web-ui-all 一键安装)。它的部分功能与本插件界面重叠;当元素冲突时,本插件不加载自身相应功能,只启用 dsh-web-ui 的功能——自动让位,无需任何配置。
| 本插件表面 | dsh-web-ui 的对应功能 | 让位条件(以下插件 ACTIVE 时本插件不加载) |
|---|---|---|
侧栏文件树(ext-center.tree) |
右侧面板「文件」文件树 | @linxin666/dsh-client-ui-aionui-panel(ui-dsh-aionui-panel) |
对话页「Git」页签(ext-center.git) |
右侧面板「变更(SCM)」+ 分支选择器 / Git 图谱 | dsh-client-ui-aionui-panel 或 @linxin666/dsh-client-ui-git-graph(ui-git-graph) |
对话页「终端」页签(ext-center.terminal) |
「SSH」远程运维面板的 Web 终端 | @linxin666/dsh-ssh(ssh) |
| 图片转述 + 视觉能力桥 | 图像理解(describe_image 工具 + 输入框图片按钮) |
@linxin666/dsh-tool-describe-image(describe-image) |
说明:dsh-web-ui 的
describe-image会在客户端把带图发送改写为文本引用,图片块根本到不了llm/stream转述瀑布——因此它生效时本插件的图片转述与视觉能力桥直接保持惰性,避免重复的视觉模型调用。
apply() 时快照一次加载器树,树收敛后(最多 8 秒)再复查一次——兄弟 bundle 在本插件启动时可能仍在 pending,晚到的激活也会让位;转述监听器与能力桥内部先查门,被抑制时原样放行(恢复 api-gateway 原生图片准入校验)。/ext/api,与全家桶的 /git/*、/api/dsh-ssh/* 互不冲突)。克隆本仓库,然后运行仓库内的一键安装脚本:
git clone https://github.com/silencieuxzero/Better_Deepseek_Harness.git
cd Better_Deepseek_Harness
.\install.ps1 # 默认装入 web profile;其它 profile:.\install.ps1 -Profile agents
脚本会把本包复制到共享模块根 ~/.dsh/profiles/node_modules/better-deepseek-harness,自动执行 npm ci 并生成 lib/(lib/ 不再提交进 git),然后在 profile 的 cordis.patch.yml 追加 ext-center 行(按 id 去重)。配置监听器会在几秒内热生效:主机侧 API 立即可用,浏览器刷新页面后「设置 → 更好的 DeepSeek Harness」出现。
把 better-deepseek-harness 整个目录复制到共享模块根(git clone 下来的目录名是 Better_Deepseek_Harness,按实际目录名复制即可):
Copy-Item -Recurse Better_Deepseek_Harness "$HOME\.dsh\profiles\node_modules\better-deepseek-harness"
cd "$HOME\.dsh\profiles\node_modules\better-deepseek-harness"
npm ci
npm run build
然后在 profile 的 cordis.patch.yml(例如 ~/.dsh/profiles/web/cordis.patch.yml)追加:
- insert:
- id: ext-center
name: better-deepseek-harness
配置监听器会在几秒内热生效:主机侧 API 立即可用,浏览器刷新页面后「设置 → 更好的 DeepSeek Harness」出现。
dsh plugin 流程(需要 pnpm)本地目录(或方式一 clone 下来的目录):
dsh plugin --profile web add file:/path/to/better-deepseek-harness
也可以直接从 Git 仓库安装(需要 git):
dsh plugin --profile web add git+https://github.com/silencieuxzero/Better_Deepseek_Harness.git
本包在 package.json 的 dsh.bundle.patch 中声明的补丁文件(cordis.patch.yml)会插入同名(ext-center)行,与方式一、方式二按 id 去重、不冲突。由于 lib/ 不再提交,安装过程中会通过 prepare 钩子自动构建。
部署可调的行为全部收敛在 cordis.patch.yml 中 ext-center 行的 config: 块,用 schemastery 校验:每个字段自带默认值与合法范围,非法值会让插件加载失败并给出明确报错(宁可响亮失败,不静默漂移)。安全不变量(请求体 2 MiB、技能 URL 下载 1 MiB、插件 tgz 下载 64 MiB、文件编辑器 1 MiB、终端单次写入 4096 字符、git 单批路径 500 条、归档删除单批 500 条、输入优化单次文本 100 KiB)保持固定、不可配置。
- insert:
- id: ext-center
name: better-deepseek-harness
config:
pluginRoot: "" # 插件安装根;留空 = profile 共享模块根 node_modules
tree:
maxEntries: 2000 # 单目录最多返回条目数
ignores: [".git", ".svn", ".hg", "node_modules", ".dsh", "dist",
".next", ".cache", ".turbo", "coverage", "__pycache__",
".DS_Store"]
terminal:
maxSessions: 8 # 终端并发上限(1-64)
bufferLimit: 262144 # 每个终端的输出环形缓冲(字节)
git:
timeoutMs: 60000 # 单条 git 命令超时(毫秒)
diffLimit: 524288 # 单文件 diff 载荷上限(字节,超出截断)
logMax: 30 # 提交历史条数
mcp:
maxServers: 16 # 面板管理的 MCP 服务器上限
vision:
maxImagesCap: 8 # 单次请求转述图片的部署上限(设置页的 1-N 以此为界)
maxTokens: 1024 # 单次转述输出的默认 token 上限(设置页可覆盖,64-8192)
toolRepair:
enabled: true # tools/execute 参数修复总开关
descriptionFill: "Execute tool" # description 缺失时的中性占位文案
client:
terminalPollMs: 300 # 浏览器终端输出轮询间隔
terminalListPollMs: 2000 # 浏览器终端列表轮询间隔
gitPollMs: 5000 # 浏览器 git 状态轮询间隔
mcpPollMs: 3000 # 浏览器 MCP 列表轮询间隔
rescue:
enabled: true # 急救模式总开关(默认开)
settleMs: 12000 # 启动窗口:启动后多久无异常才算启动成功(3000-120000)
以上全部字段均可省略(省略即取默认值);config: 块本身也可省略。改完后配置监听器热生效(config 属于 ext-center 行的元数据,同样由监听器重放)。Web UI 通过 /ext/api/state 的 limits 块读取这些上限,界面文案(「前 2000 项」「上限 8 个」等)与轮询节奏随之自动跟随。
ext-center 节)安全:所有变更类接口以及会暴露本机路径/输出的读取端点(
/ext/api/state、文件树、终端输出、Git 读取、MCP 列表)默认只允许本机(回环地址)调用;如需局域网管理,在「设置」页打开allowLan。另外注意:Git 源安装本身等于运行仓库里的代码——安装/加载插件以及自动构建(npm install会执行该仓库声明的 npm 生命周期脚本)都会执行其内容,请只安装你信任的仓库。
cordis.patch.yml 的变更由 harness 的配置监听器(HMR)应用。若短时间内连续多次修改(例如安装后立刻停用)触发监听器竞态,配置监听可能卡住——重启一次 dsh web 即可恢复(补丁文件本身是正确的,重启后照常加载)。本插件的写入已做间隔串行化以尽量避免该情况。/ext/api/state 与 /ext/api/config,不再依赖 api-proxy 是否暴露 ext-center。旧版本若仍在加载中,升级后重启 dsh web 并刷新页面;若只有旧版可用,检查宿主日志确认 ext-center 设置命名空间已注册。npm 可用且能访问 registry;若仓库没有 build 脚本或构建后仍缺入口文件,请改用该包的 npm 包名 / tarball URL 安装。EPERM: Permission denied(Windows,路径指向 .dsh-ext-center-staging):Windows 上删除目录时若被其他进程短暂占用(杀毒实时扫描刚 clone 的仓库、文件监听等),会返回 EPERM。本插件已在 staging 清理与目标目录替换处内置重试(maxRetries: 5),瞬时锁会自动跳过;若反复复现说明锁是持续性的——将 ~/.dsh 加入 Windows 安全中心的排除目录,或重启一次后再装(残留的 staging 目录可手动删除,不影响数据)。[better-deepseek-harness] invalid config on the ext-center row ...:cordis.patch.yml 里 ext-center 行的 config: 有非法值(超出范围或类型错误)。按「部署配置」一节修正或直接删掉该 config: 块(全部回落默认值)后重启。cordis.patch.yml 删除对应行的 disabled: true(急救记录在 profile 目录的 .dsh-rescue.json)。invalid arguments: missing required property ...:模型生成的工具参数偶发缺字段或 JSON 损坏。本插件的 tools/execute 包装层会自动修复 description 缺失与可恢复的 JSON;确实缺少 code / command 等内容的调用仍会按 DSH 原机制报错并让模型重试,属正常反馈。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。