前言¶
在 DeepSeek Harness(DSH)里改插件或试新配置,常见顾虑是:装错包、改坏 profile,日常用的 desktop 或 headless 起不来。官方 --from-default-profile 只能从少数内置模板初始化,不能从现有 profile 克隆,也不方便「只建目录、不启动」。探针要手拼 DSH_HOME、环境变量和 dsh --profile;验 HTTP 或 host 路由还要另起 web 进程;读 session.v4.jsonl.zstd 又要自己解多帧 zstd。下面介绍社区插件 dsh-profile-lab(维护者 wqzhellohhwy,SkillHub 分类:工作流):用一组 tmpprofile_* 模型工具,把「建隔离环境 → 装插件 → 跑会话 → 读摘要 → 回收」收成有护栏的标准动作。
这是什么¶
dsh-profile-lab 是挂在 DSH 宿主侧的 Cordis 插件:注册十个以 tmpprofile_ 开头的模型工具,不声明 dsh.client,没有浏览器半侧。inject 只写 ['tools'](不写 webServer),因此在 headless、tui 等没有 HTTP 服务的 profile 里不会整体 pending。运行时只依赖 Node 内置模块(node:fs、node:path、node:child_process、node:zlib、node:crypto),无第三方运行时依赖。
它存在的直接理由:改插件时怕把本体改暴毙——先在隔离 profile 里验工具面、会话行为和 HTTP 面,确认后再装进日常 profile。
和老做法的对比¶
| 痛点 | 本插件做法 |
|---|---|
| 不能从现有 profile 克隆,目标目录还不能已存在 | tmpprofile_create:模板建或 clone: "desktop" 克隆(配置复制,node_modules 逐项链接) |
| 只想建 profile、不想立刻启动 | 内部用 --dump-config 短路 boot |
手拼探针命令、自己翻 sessions/ |
tmpprofile_run:装配 → 跑 headless → 返回 sessionId 与事件摘要 |
| headless 验不了 HTTP / 渲染路由 | tmpprofile_web_start / web_probe / web_stop:驻留 web 实例、探路由、按 pid 回收 |
| 会话 zstd 多帧解码重复写脚本 | tmpprofile_session:内置逐帧解码,输出 preset、工具面、上下文、token 等 |
| 清理靠自觉 | tmpprofile_clean:白名单 + junction 感知删除 + 默认 dry-run |
核心功能:十个工具¶
工具名统一 tmpprofile_ 前缀,便于在 dsh-tool-manager 里整组开关。
| 工具 | 作用 | 关键参数 |
|---|---|---|
tmpprofile_create |
建隔离 profile(模板或克隆),可选装包 | name、template(默认 headless)、clone、packages、purpose、overwrite |
tmpprofile_install |
对已登记临时 profile 追加安装或移除 | name、packages、remove |
tmpprofile_run |
同步跑 headless 探针(带超时) | name、task、sessionId、env、timeoutMs、json |
tmpprofile_web_start |
起驻留 web 实例 | name、port、probePath、waitMs、cwd、env |
tmpprofile_web_probe |
对驻留实例发 HTTP 探针 | name、path、method、timeoutMs |
tmpprofile_web_stop |
停驻留实例 | name、waitMs |
tmpprofile_session |
读会话日志结构化摘要 | sessionId 或 name、sections、limit |
tmpprofile_list |
列出本插件管理的与未登记的 profile | — |
tmpprofile_clean |
清理(默认演练,需 confirm: true) |
names、confirm、sessions、archiveTo |
tmpprofile_fingerprint |
采集 profiles/ 指纹,自查是否误碰其他 profile |
exclude |
headless 探针 侧重 host 侧事实(装配、哪个 entry 未激活、卡在等哪个服务)。web 实例 侧重 HTTP/渲染面(端口在听、host 路由注册、页面 HTML 可取)。两者不是同一件事;验 web 时 profile 的 bundles 需含 @deepseek-ai/dsh-web-app(可用 template: "web" 或从带 web-app 的 profile 克隆)。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前请自行查看 GitHub 源码与 MIT 许可证。package.json 要求 Node >=20、DSH >=0.2.0-rc.1、Cordis >=4.0.0-rc <5。
从 README 给出的安装方式:
# 从本地目录装(开发态)
dsh plugin --profile desktop add link:C:/repository/dsh-profile-lab
# 或从 GitHub 装
dsh plugin --profile desktop add github:<你的账号>/dsh-profile-lab
装完后重启 DSH(插件在启动时装配)。桌面版 profile 由 Electron 独占管理,命令行直连可能被拒——可用桌面版插件页安装,或走应用内通道。
可选 Cordis 配置(cordis.patch.yml 行内 config,均可省略):
- insert:
- id: dsh-profile-lab
name: 'dsh-profile-lab'
config:
home: 'C:/Users/you/.dsh' # 缺省 $DSH_HOME 或 ~/.dsh
dshBin: '' # 显式指定 dsh 的 lib/bin.js
nodePath: '' # 显式指定子进程 node
tools:
disabled: ['tmpprofile_fingerprint'] # 按名字关闭工具
典型用法¶
模型侧常见闭环如下(参数为 JSON 工具调用示意):
# A. host 面:装配 + 工具面 + 会话行为
tmpprofile_create { name: "probeA", template: "headless", purpose: "验证 dsh-xxx 的工具面", packages: ["link:C:/plugins/dsh-xxx"] }
tmpprofile_run { name: "probeA", task: "只回复两个字:OK" }
tmpprofile_session { name: "probeA", sections: ["preset","tools","contexts"] }
# B. 渲染 / HTTP 面:起真实例,探插件 host 路由
tmpprofile_create { name: "webA", template: "web", packages: ["link:C:/plugins/dsh-xxx"] }
tmpprofile_web_start { name: "webA", probePath: "/api/dsh-xxx/status" }
tmpprofile_web_stop { name: "webA" }
tmpprofile_clean { names: ["probeA", "webA"], confirm: true }
tmpprofile_run 返回的 session.tools 来自磁盘完整会话日志;headless 的 --json 只是投影,不能替代日志里的 tool/call 面。更多配方见仓库 docs/RECIPES.md。
装好后可在仓库根目录跑自检(会真建临时 profile、装本插件、跑一次 headless 并清理):
node scripts/selfcheck.mjs
退出码 0 表示在真实 DSH 里能加载且工具可调用。
安全护栏与文件位置¶
以下为刻意设计的安全护栏:只读写登记在 $DSH_HOME/profile-lab.json 的临时 profile,内置名如 desktop、headless、rescue 等硬拒;删目录前先 lstat 解 junction/symlink,不跟随链接删源;tmpprofile_clean 默认 dry-run;overwrite: true 才把旧目录挪到 profile-lab-trash/;跨进程锁 $DSH_HOME/profile-lab.lock;操作追加 $DSH_HOME/profile-lab-log.jsonl。
| 内容 | 路径 |
|---|---|
| 清单 | $DSH_HOME/profile-lab.json |
| 审计日志 | $DSH_HOME/profile-lab-log.jsonl |
| 临时 profile | $DSH_HOME/profiles/<name>/ |
适用场景与限制¶
适合:开发 DSH 插件或改 Cordis 注入时,需要在隔离 profile 里装 link/GitHub 包、跑短任务、读会话摘要,必要时起 web 验路由,再一次性清理。
不适合或需注意:
- 主力 profile 已无法启动时,本插件也依赖宿主加载,不能替代
rescue/reserve。 - 探针会话仍写在同一
DSH_HOME的sessions//storages/下;要进程级数据隔离需独立DSH_HOME(插件尚未实现)。 - web 探针验到服务端与静态 HTML;页面内 JS 是否真正执行需自行用浏览器打开对应端口查看。
profiles/里历史手工目录会出现在unmanaged,不会自动删除,需显式纳管后再操作。
DSH 社区采用「一切皆插件」思路;SkillHub(skillhub.cn)是社区目录站点,与 DeepSeek / 幻方无官方从属关系。