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