前言¶
在 DeepSeek Harness(DSH)里跑智能体时,模型常会连续调用 shell、workflow、subagent 等重工具。整机物理内存或提交内存一旦被吃紧,Windows 容易进入换页风暴,连再拉一个 pwsh 都困难——这不是「慢一点」,而是宿主和对话一起卡死。社区里有不少只监控、不动作的插件,也有只在 Code Mode 容器里做 cgroup 硬限的方案,但 README 作者逐项核对后认为:没有现成的包能对 harness 本体做「采样 → 分级 → 降优先级 / 拦重活」这一整条链路。dsh-rampart(维护者 tataCrayon,分类 admin-security)就是补这一层:在机器被压垮之前先踩刹车,并让用户在 Composer 输入框下方看到 DSH 进程树占用了整机多少内存。
这是什么¶
dsh-rampart 是给 DSH 加的内存压力护栏。它周期性读取可用物理内存与可用提交内存,分成 normal / warn / critical 三档;CPU 占比只展示,不参与 gradeOf() 分级。压力升高时可把宿主降到 below-normal 优先级、可选钉核,并在 critical 时拒绝配置名单里的重工具调用;同时提供 resource_guard 工具供模型读实时读数。另有一条可选的启动壳(scripts/launch.mjs),用 Windows Job Object 给整棵 Electron 进程树套内存硬顶——与插件层的「软护栏」分工不同,README 明确:插件本身不能给已运行的宿主加无法解除的 Job 硬顶。
与 npm 上另一作者的 dsh-resource-guard 不是同一个东西;本插件为避让而改名 rampart。
核心功能¶
两层分工¶
| 层 | 作用 | 位置 |
|---|---|---|
| 插件(软) | 采样 → 分级 → 降优先级、钉核、拦重活、给模型结构化反馈 | lib/ |
| 启动壳(硬) | Job Object 内存硬顶,撞上由系统拒绝 | scripts/launch.mjs |
分级与拦截¶
gradeOf() 只看四个内存阈值(见配置表),整机 CPU 与 DSH 进程树 CPU 只进入 Composer 读数条与面板。默认 heavyTools 包含 pwsh、bash、shell、workflow、subagent、subagent_fork、send_message、web_fetch、web_search 等;heavyPatterns 默认含 job_*。被拦时返回 RESOURCE_GUARD_DENIED,带实测读数与改用轻量工具的建议,而不是一句笼统的禁止。
轻工具(如 read、grep、write、todo_write)在压力大时也不拦,便于收尾与保存状态。
Composer 读数与面板¶
在 DSH 自带统计(如 tok/s、上下文占用环)右侧显示类似:
154 tok/s · 缓存命中 49% · 38% · CPU 12% · DSH 1.2 GB
normal 为灰色,warn / critical 为警示色(critical 前还有实心点)。点开面板用一根分段条表示整机物理内存中 DSH、其他已用与空闲的占比;数据经浏览器 GET /rampart/api/stats 打宿主路由,不经过模型、不耗 token。面板提供「释放内存」,仅对本进程 V8 堆做强制 GC,README 说明任务管理器里的 RSS 不一定明显变化。
安装与启用¶
当前版本 0.2.0,尚未发布到 npm(registry.npmjs.org/dsh-rampart 为 404)。README 要求用 release tarball 安装,不要用 add dsh-rampart,也不要用 add github:tataCrayon/dsh-rampart(易走 SSH 导致未配密钥时报错)。
在目标 profile 下执行(示例为 web profile,请按本机 profile 名替换):
dsh plugin --profile web add https://github.com/tataCrayon/dsh-rampart/releases/download/v0.2.0/dsh-rampart.tgz
开发调试时也可在 $profile\cordis.patch.yml 里 insert 插件 id rampart、name dsh-rampart,或通过 file:/// 绝对路径指向 lib/index.js;桌面 profile 保存 patch 后约 2 秒 HMR 重组。需要 Job 硬顶时,在仓库目录运行 node scripts\launch.mjs(可先 --dry-run),或双击 dsh-guarded.cmd。
运行环境要求(来自 package.json):Node >=20,DSH >=0.2.1-rc.1,peer @deepseek-ai/cordis ^4.0.5。
配置要点¶
配置写在 patch 的 config 里,字段与默认值见 lib/config.js。最常改的是四个内存阈值:
| 字段 | 默认 | 含义 |
|---|---|---|
warnFreeMemoryMb |
2048 | 可用物理内存低于此进入 warn |
criticalFreeMemoryMb |
1024 | 低于此进入 critical 并拦重活 |
warnCommitMb |
3072 | 可用提交内存低于此进入 warn;0 关闭 |
criticalCommitMb |
1536 | 低于此进入 critical;0 关闭 |
priority |
on-pressure |
warn 时降优先级,解除恢复;可选 below-normal / unchanged |
limitCores |
0 | 钉核数,0 不动亲和性 |
showStatusPill |
true |
是否显示读数条与 /rampart/api/* |
statusPillIntervalMs |
2000 | 轮询间隔,低于 500 会被夹到 500 |
调参口诀(README):阈值应压在「常态低谷」之下,留约 1 GB 余量;若长期误报,往往是提交内存常态就低于默认 warnCommitMb,需按本机实测重定。
典型用法¶
- 安装 tarball 并启用插件后,正常对话;压力到
critical时模型调用pwsh等重工具会收到结构化拒绝,可改调resource_guard查看grade、availPhysMb、deniedCalls等字段再向用户说明。 - 需要可视化时看输入框下方读数,点开面板确认 DSH 与整机内存分段;必要时点「释放内存」仅回收本进程 JS 堆。
- 若要在启动阶段就限制整进程树内存,使用启动壳,例如:
node scripts\launch.mjs --dry-run
node scripts\launch.mjs --cap 12000 --low-priority
适用场景与注意¶
适合:在 Windows 上长期跑 DSH 桌面或 web profile、容易因 agent 重工具把内存顶满、希望「早拦重活 + 可观测 DSH 占用」的开发者。
务必知晓:
- 护栏防的是「DSH 把自己和机器卡死」,不是恶意进程隔离,也不是安全边界。
- 插件以当前 DSH 进程权限运行;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,自行评估是否纳入 profile。
- 社区插件目录 skillhub.cn 为独立生态站点,与 DeepSeek / 幻方无官方从属关系;星标数随仓库变化,写作时 GitHub 显示为 0。
结尾¶
dsh-rampart 用内存分级、重工具拒绝、可选优先级与 Job 启动壳,把 DSH 智能体开发里「内存见底整机假死」的问题前移到可恢复的操作:慢可以,别拖到 shell 都起不来。进一步了解与 issue 见 GitHub:tataCrayon/dsh-rampart,目录页见 skillhub.cn/plugins/tataCrayon/dsh-rampart。