dsh-memory-guard:DSH 本地内存与会话日志防护

前言

在 DeepSeek Harness(DSH)里跑长会话时,Host 既要解析会话日志,又要执行工具调用。单次工具参数过大,或日志里反复写入同一段 PTC 载荷,会让日志体积和堆占用一起抬升,严重时 Host 在打开会话时就 OOM。社区插件 dsh-memory-guard(维护者 zeroed-07,分类 admin-security)面向这类问题:在本地监控堆与会话目录,拦截过大的工具参数,并对已「冷」下来的会话做离线瘦身。下文介绍其定位、能力与安装用法;事实以 GitHub README 为准。

这是什么

dsh-memory-guard 是 DSH 的 Host + Client 插件(npm 包名 dsh-memory-guard,当前版本 0.1.2,MIT)。它只做本地防护:采样 Host 堆、统计 $DSH_HOME/sessions 下的日志体积,在运行时拒绝估算超过阈值的工具参数,并对已持久化的大事件发出分级告警;必要时对冷会话日志做 vacuum,保留原文件备份。README 记载的真实案例:一个 7,913 行会话解压后约 954 MB、磁盘约 177 MB,其中 98.5% 为重复的 PTC dispatch 载荷,打开时会话耗尽 Host 堆——插件即针对此类膨胀设计。

核心功能

监控与界面

  • 堆监控:每 3 秒采样 process.memoryUsage() 与 v8.getHeapStatistics()(used / limit / ratio / RSS)。
  • 会话日志统计:每 15 秒扫描 $DSH_HOME/sessions,汇报总字节数、文件数及最大的若干会话。
  • Header chip:在会话头注册 MEM 42% · 24.6 MB 一类指示;Host 报告 warn / critical 时变黄 / 红。Client 每 5 秒请求同源 /memory-guard/stats;悬停可看堆、RSS、会话合计、最大会话、近期告警与大载荷。DSH 升级后若 chip 未出现,Host 侧仍可通过 /memguard 与 memguard 工具使用。

运行时防护

  • 同步拒绝:工具调用参数估算超过 maxToolArgBytes(默认 2 MiB)时直接拒绝,并提示模型分块写入或用脚本生成文件。
  • 已写入载荷告警:对已追加的 tool/call、tool/ptc-dispatch* 等行,8 MiB 警告、32 MiB 升级;单会话日志 50 MiB 警告、200 MiB 严重。
  • 配置项 guardEnabled:设为 false 可关闭拒绝,保留监控。

离线 vacuum

  • 命令 /memguard vacuum 为 dry-run,列出可瘦身冷会话及可节省字节;/memguard vacuum <session-id> confirm 重写该冷日志:超大参数字符串在 PTC start/final 对中用相同占位符替换,校验通过后原文件保留为 .orig-<timestamp>。
  • memguard 工具提供 status、vacuum-scan、vacuum-apply(后者需 confirm: true,且拒绝 live 会话)。
  • 独立 CLI(不装 DSH 也可对磁盘上的备份跑):
npx dsh-memory-guard-vacuum ./session.v4.jsonl.zstd scan
npx dsh-memory-guard-vacuum ./session.v4.jsonl.zstd write --out=./session.slim.jsonl.zstd

vacuum 保守处理 DSH 的「首帧仅含 header 行」与 PTC 成对 arguments 必须 deep-equal 的格式约束;详见 README「Why the vacuum is conservative」。

本地 HTTP

同源前缀 /memory-guard:GET /stats、POST /limit(临时改 maxToolArgBytes,重启失效)、POST /vacuum(冷会话 dry-run)。除 Origin 检查外无额外鉴权;README 明确要求勿将 DSH web 端口暴露给不可信网络。

环境与安装

项 要求
DSH 在 0.2.1-rc.2 上测试(desktop 与 web profile)
Node.js >= 22.15(使用内置 zstd API;DSH 自带合适运行时)
平台 在 Windows 开发与验证;代码路径无关,Linux/macOS 未测试

安装 Host 半部分后需重启应用;Client chip 需刷新页面。

# desktop profile(DeepSeek Harness 桌面应用)
dsh plugin --profile desktop add dsh-memory-guard

# web / headless profile
dsh plugin --profile web add dsh-memory-guard

也可在 DSH UI:Settings → Plugins → Install,输入 dsh-memory-guard。

升级示例:

dsh plugin --profile desktop remove dsh-memory-guard
dsh plugin --profile desktop add dsh-memory-guard

卸载:

dsh plugin --profile desktop remove dsh-memory-guard

典型用法

1、安装并重启后,观察会话头 chip 或执行 /memguard,查看堆、会话 Top 5、告警、阈值。

2、日志已膨胀且会话已冷,先做 dry-run:

/memguard vacuum

确认后再:

/memguard vacuum <session-id> confirm

3、调参时编辑已安装插件的 cordis.patch.yml 中 config 块(或 profile composition 里对应 bundle 行),重启 DSH。常用键示例:

Key 默认 含义
maxToolArgBytes 2097152 (2 MiB) 超过则拒绝工具调用
guardExemptTools [] 豁免工具名,如 ["write"]
heapWarnRatio / heapCriticalRatio 0.75 / 0.90 堆黄 / 红
sessionLogWarnBytes / sessionLogCriticalBytes 50 MiB / 200 MiB 单会话日志黄 / 红
vacuumMinBytes 10485760 (10 MiB) 小于此体积不参与 vacuum 候选

运行时临时改上限(重启恢复默认):

# POST /memory-guard/limit,body: {"maxToolArgBytes": <int>}

适用场景与注意

适合:长期在 DSH 里跑 Agent、频繁 run_code / 大工具参数、会话列表里出现百 MB 级日志,或 Host 堆占用持续偏高的开发者。

权限与信任:插件以当前 DSH Host 进程权限运行,会读本地会话路径与体积,vacuum 会改写所选冷日志(原文件备份为 .orig-*)。安装前应阅读 源码与 LICENSE;社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。

已知限制(README 原文要点):

  • run_code 的 tool/ptc-dispatch-start 在 guard 之前写入,首次超大参数仍可能进日志;guard 阻止执行与第二条结果行,告警与 vacuum 覆盖其余。
  • 仅冷会话可 vacuum;live 日志不重写。
  • 仅可见 Host 堆,不能替 launcher 提高 Node/Electron 堆上限。
  • 无网络请求、无遥测;Privacy 节说明仅本地读盘与同源 UI 调用。

结尾

dsh-memory-guard 把「堆 + 会话日志 + 超大工具参数」收在一套本地 guard 里:先监控与拦截,再对冷日志 dry-run vacuum,避免 Host 被单会话拖垮。目录页:https://www.skillhub.cn/plugins/zeroed-07/dsh-memory-guard;仓库:https://github.com/zeroed-07/dsh-memory-guard。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye