dsh-plugins
DeepSeek Harness(DSH)插件集:长期记忆、会话归档、会话 Git 化、会话分支树、Goal 自动续跑、模型推理能力/推理强度编辑。
本仓库自身就是一个可安装单元:根 package.json 声明了 dsh.bundle,根 cordis.patch.yml 是聚合装配清单,所以插件中心 / hub 的「按仓库一键安装」直接把整个仓库当成一个插件装进 profile——无需克隆、无需构建。
插件一览
| 包名 | 功能 | 组成 |
|---|---|---|
dsh-memarc |
长期记忆库(per-workspace JSON)+ 会话归档管理(归档/全文搜索/批量恢复/彻底删除)+ 设置页 | host + client |
dsh-session-git |
把 DSH 会话导出为 <项目>/.dsh-sessions/*.json 随 Git 提交,团队任何人可一键导入为可继续会话 |
host + client |
dsh-session-branches |
会话分支关系树(fork / 子代理),侧边栏浮动面板 + 设置页,点击即打开 | host + client |
dsh-goal-auto-resume |
Goal 因错误/中断/max-tokens/崩溃异常停止后自动重新武装续跑(带退避与安全阀) | host |
dsh-model-reasoning |
三段式设置页(全局策略 / 路由概览 / 模型明细)编辑推理能力与推理强度:思考等级映射(wire 值)、上下文/输出上限、协议兼容开关,缺能力的模型行内一键声明;另有输入框里模型下拉左侧的会话级强度滑杆。直写 llm-pi-ai 命名空间即时生效 |
host + client |
推理强度:两层控制
| 位置 | 作用范围 | 落到哪里 |
|---|---|---|
| 设置页「推理能力」· ① 全局滑杆 | 勾选的每个路由 | providers.<路由>.reasoning(可顺带写 agent-default-model.reasoningEffort) |
| 输入框 · 模型下拉左侧的滑杆 | 当前会话 | 会话的模型选择本身,与模型下拉、/model 共用同一份状态;优先于路由默认 |
滑杆写入前按该路由模型实际支持的等级适配——请求路径对不支持的等级直接抛 UNSUPPORTED_REASONING_EFFORT,不会降级,所以预览必须说清「这一档在这条路由上实际会写成什么」。条目上缺 reasoningEfforts 的模型可以被顺带声明:「没有推理元数据」是配置缺口,不是模型不会思考。细节见 dsh-model-reasoning README。
环境要求
- DeepSeek Harness(
@deepseek-ai/dsh)≥ 0.1.1-rc.2(实测版本)。插件消费 DSH 的内部服务与事件(fs、sessionQuery、sessions、connection、goals、agent/*、turn/end等),这些契约没有稳定性承诺——DSH 升级后如遇不兼容,请在本仓库 issue 里反馈。 - peer 依赖(
@deepseek-ai/cordis、@deepseek-ai/dsh-tools、react)由 DSH 进程加载插件时提供,无需安装。本仓库零运行时依赖,离线也能装。
安装
方式一:整仓库一键安装(推荐,也是 hub 走的路)
dsh plugin --profile web add github:loongWoong/dsh-plugins
一条命令装五个插件。dsh plugin 是 pnpm 转发器:装完后它会按已安装状态做 reconcile——凡依赖里声明了 dsh.bundle.patch 的包自动进入 profile 的 dsh.profile.bundles 层栈,所以 dsh.profile.bundles 里只会出现一个 dsh-plugins,不需要手工登记。重启 DSH 后,根装配清单把五行插进 composition。
卸载:dsh plugin --profile web remove dsh-plugins(同样自动从层栈摘掉)。
方式二:只装其中某个插件
dsh plugin --profile web add "github:loongWoong/dsh-plugins#path:packages/dsh-memarc"
此时那个成员包自己就是 layer,用它包内的 cordis.patch.yml(行名是包名)。#path: 子路径是 pnpm 特性,npm 不支持;DSH profile 本身就用 pnpm,无需额外配置。
方式三:本地开发(改源码即时生效)
# 在仓库根目录执行;dsh plugin 会把相对路径 spec 重写成绝对路径,不会自连 profile
dsh plugin --profile web add .
pnpm 对 file: 依赖默认做拷贝,源码改动后需再跑一次 dsh plugin --profile web install;想让编辑实时生效可用 directory junction,见 dsh-session-git README 的「本地开发」。
整仓库 vs 单插件的区别
| 整仓库(方式一) | 单插件(方式二) | |
|---|---|---|
| profile 依赖 | 1 个 dsh-plugins |
N 个成员包 |
dsh.profile.bundles |
dsh-plugins 一层 |
每个成员各一层 |
| 生效的装配清单 | 仓库根 cordis.patch.yml |
成员包内 cordis.patch.yml |
装配行 name |
相对路径 ./packages/<pkg>/lib/index.js |
包名 dsh-<pkg> |
| 升级 | 一次更新五个插件 | 逐个更新 |
为什么根清单用相对路径而不是包名:pnpm 安装 git 依赖时,包内的 file:./packages/x 会被解析到消费者目录(ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND),workspace:* 也拿不到被拉取的 workspace(ERR_PNPM_WORKSPACE_PKG_NOT_FOUND),而 pnpm 的严格布局不会把传递依赖提升到 profile 顶层 node_modules——按包名解析必然落空。DSH 的 anchorInsertedPluginNames 会把 insert 行里以 ./ 开头的 name 重写成该清单文件旁边的 file URL,Host 半区于是直接从安装目录里的成员入口加载;Client 半区由 @deepseek-ai/dsh-client-modules 的 locatePkgJson 沿同一个入口向上找到成员自己的 package.json,成员各自的 dsh.client.platform / exports["./client"] 照常生效。因此聚合根没有 dependencies,也不能声明 dsh.client(自己既无浏览器半区也无 ./client 导出,声明了会让 client-modules 直接报错)。
改某个成员插件的入口路径或装配方式时,仓库根
cordis.patch.yml和该成员包内的cordis.patch.yml两份要一起改。
已实测路径:临时 git 仓库 → dsh plugin --profile probe add git+file:///... → 只装 1 个包、dsh.profile.bundles 自动出现 dsh-plugins → dsh --profile probe --dump-config 中五行分别解析到 node_modules/dsh-plugins/packages/*/lib/index.js,四个客户端半区的归属清单各自正确。
说明与注意事项
- bundle id 冲突:每个插件向 composition 插入自己的行(短 id 如
session-git、memarc)。若同时安装的其他插件占用了相同 id 会加载冲突,改对应cordis.patch.yml的 id 即可。 - 不要同时用两种方式:整仓库安装与单插件安装若同时启用,同一个插件会被挂两次(两个 layer、重复的服务/工具注册)。选一种即可。
- 生效方式:Host 半区改动需重启 DSH 进程;Client 半区(设置页/浮层/输入框控件)重启后刷新页面生效。
- 卸载:见上面的
remove命令。dsh-memarc的记忆文件保留在各工作区.dsh-memory/,dsh-session-git导出的会话文件保留在各项目.dsh-sessions/,均不受卸载影响。
测试
npm test
# 或逐个运行:
node packages/dsh-memarc/test/behavior.mjs
node packages/dsh-session-git/test/unit.mjs
node packages/dsh-model-reasoning/test/unit.mjs
测试自包含(在临时目录 stub 掉 peer 依赖),用系统 Node 直接运行即可——无需安装依赖、无需 DSH 进程。
维护者清单
- 在 GitHub 创建仓库并 push 本目录(
pi-web-main/、scratch/已进.gitignore,是本地参考资料,不属于可安装内容); - 打 tag:
git tag v0.1.0 && git push --tags,使用者可用#v0.1.0锁定版本; - 提交 hub / 插件中心条目时
install字段填dsh plugin --profile web add github:loongWoong/dsh-plugins; - npm 名称:
dsh-plugins在 npm 上已被他人占用(一个无关的dspCLI)。git 安装不受影响;若要发 npm 需换名或加 scope。五个成员名(dsh-memarc等)目前未被占用,成员各自发布后,用户可直接dsh plugin --profile web add dsh-memarc按包名安装。
No comments yet. Be the first to write one.