dsh-plugin-log-bridge:把 Harness 运行时告警与错误写到 stderr

前言

DeepSeek Harness(DSH)在进程内用环形缓冲区保存日志记录,默认并不把这些记录导出到外部。进程若在「已经 ready」之后才失败——例如会话无法激活、预设挂载失败、某个插件行抛错——退出时环形缓冲随之消失, supervising 进程往往只能知道「启动失败了」,很难从 Harness 侧拿到原因。更严重的是,默认导出级别会把 warn 从环形缓冲里滤掉,启动窗口里的警告在插件加载前就可能已经丢失。

Node 子进程的 stderr 会由父进程保留,是不额外引入日志依赖时最稳妥的通道。下面介绍社区插件 dsh-plugin-log-bridge(维护者 desanv01,分类 admin-security):在 Harness 上挂一个 exporter,把 error 与 warn 以及部分会话错误写到 stderr,便于终端或进程管理器事后排查。

这是什么

dsh-plugin-log-bridge 是一句定位很直白的 DSH 插件:把 Harness 自身的运行时 warning 和 error 记录到 stderr,让「启动之后才挂掉」的启动失败能说出原因。仓库:github.com/desanv01/dsh-plugin-log-bridge;社区目录页:skillhub.cn/plugins/desanv01/dsh-plugin-log-bridge。许可证 MIT,当前包版本 1.0.0;README 标明已在编写时所针对的 DeepSeek Harness 0.1.x 组合下验证(含曾捆绑它的桌面应用),在官方 DeepSeek Harness 桌面应用 0.2.0-rc.2 内的验证仍待完成。插件无 UI、无配置 schema、模块作用域不 import 其他包,宿主侧约 144 行代码。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。

核心功能

README 中已核实的行为如下。

  1. 桥接 error 与 warn:每条记录一行带前缀的输出写到 stderr;若含堆栈,首行之后的内容会缩进续行。
  2. 回放加载前的缓冲错误:若 ctx.logger.buffer 是数组,会对其中已缓冲的 error 记录做回放。加载前窗口里的 warn 因默认级别已被滤出环形缓冲,README 明确说明无法恢复,不做虚假承诺。
  3. 会话激活失败:订阅 api-session/error,把不会进入 logger 的会话激活失败同样写到 stderr。
  4. 限速:60 秒窗口内最多 100 条;超出后输出一行说明丢弃条数,避免错误循环刷屏。
  5. 就绪标记:每次启动在 stdout 写一行 ready,便于判断桥接是否已加载;桥接正文在 stderr,前缀为 [harness-log],方便 loader 区分「桥接输出」与「哪个插件搞坏了启动」。
  6. 不拖垮启动:apply(ctx) 里回放、挂 exporter、订阅事件各包在独立 try 中,附着失败也不应阻断 boot。

实现要点:apply 对 ctx.logger 挂 exporter,levels: { default: 2 }(Cordis:error 0、info 1、warn 2)。formatMessage、bridgeLines、createLimitedWriter 等以可注入时钟的纯函数导出,便于无 Harness 环境下单测。

环境与依赖

  • Node.js 22 及以上(Harness 自带运行时,一般无需单独装 Node)。
  • 能加载插件 bundle 的 DSH profile,0.1.x 或 0.2.x。
  • 父进程能捕获子进程 stderr;在终端直接跑 dsh 即满足。

安装与启用

从 npm 安装(README 给出的命令)

在目标 profile 下执行:

dsh plugin --profile web add dsh-plugin-log-bridge

README 路线图注明「Publish to npm」尚未勾选完成;若安装失败,可改用本地路径方式(见下)。安装会在 bundle 中增加对应行,输出出现在 Harness stderr 旁。

桌面应用

可将插件目录通过 --add-plugin <path> 指向应用,或使用应用内插件管理器安装该 npm 包名(以你当前客户端文档为准)。

本地目录加入 profile

包内无构建步骤;README 示例为克隆仓库后在目录内执行:

dsh plugin --profile web add .

(任务要求禁止在介绍流程中引导读者 git clone;若你已有源码树,用 . 指向该目录即可。)

安装后检查 profile 的 cordis.patch.yml 是否包含 desktop-log-bridge 行;无 ready 行通常表示插件未加载。

典型用法与自检

插件没有 Config,也不接受选项——按设计,启动已出问题时不应再依赖可配置诊断。

桥接行在 stderr,前缀 [harness-log]。若完全看不到这类行,可能是尚未产生 error/warn,或 profile 未挂上 bundle;可故意用坏插件触发,或核对 patch 行。

README 提供不启动 Harness 即可验证格式化与分行逻辑的 smoke test:

node --input-type=module -e "import('./index.js').then(m => {
  console.log(m.formatMessage({ args: ['hello', new Error('boom')] }));
  console.log(m.bridgeLines('error', 'harness', 'line one\nline two').join('|'));
})"

预期得到格式化消息,以及两条带前缀的行(第二行缩进)。

内置常量(非配置项)

调参常量写在 index.js 顶部,未暴露为配置:

常量 值 含义
EXPORT_LEVEL 2 至多导出到 warn
WINDOW_MS 60_000 限速窗口(毫秒)
WINDOW_LIMIT 100 窗口内行数上限

适用场景与注意

适合谁:用 systemd、Docker、桌面壳或 CI 拉起 DSH,需要在进程退出后仍能从 stderr 日志里看到 Harness 自身 warn/error 和会话激活失败的人;尤其关心「ready 之后才失败」的场景。

权限与安全:插件与当前 dsh 进程同权限运行;安装前应阅读源码与 MIT 许可证。README Security 节说明:写到 stderr 的内容可能包含 prompt 片段、路径、工具参数等——任何被记成 error/warn 的敏感信息都会随 stderr 离开进程,收集日志时要按环境做脱敏与访问控制。

排障摘录:supervisor 缓冲 stderr 时可能截断,应读 supervisor 完整日志;出现 dropped N message(s) 表示触发了限速;加载前的 warn 不可恢复。

Slots:无。纯宿主插件,不注册 UI slot。

结尾

dsh-plugin-log-bridge 用最小表面把 Harness 内存日志环的缺口补到 stderr 上:error/warn、缓冲 error 回放、会话错误、限速与 boot 安全包裹,且无配置项。若你维护 DSH 部署或桌面捆绑,值得在 profile 里加一行 bundle,让「为什么挂掉」留在父进程已经抓着的 stderr 里。

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

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

小夜