deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
Part of the DSH plugin suite — six Apache-2.0 plugins for DeepSeek Harness. · DSH 插件套件之一:六个 Apache-2.0 插件。
Crash-surviving background jobs for DeepSeek Harness, where the filesystem is the source of truth. Cross-restart adoption, autopsy reports, sandboxed execution, event sourcing — battle-tested on Windows 11 NTFS, with sandbox backends for Linux and macOS.
给 DeepSeek Harness 的崩溃存活后台任务:文件系统即真相源。跨重启收养、尸检报告、沙箱执行、事件溯源——Windows 11 NTFS 实测;沙箱后端覆盖 Linux 与 macOS。
Harness 内核自带的后台 jobs 是 fire-and-forget 工具执行(能读输出、能杀,不能对话、不能跨崩溃收养)。真实世界里的长程会话踩过这些公开的坑:
| 公开的痛点 | dsh-witness 的答案 |
|---|---|
| Force-kill 丢弃未刷盘的 write-behind 尾部(#483) | 零缓冲。 每次状态转移立即落盘——目录结构本身就是状态机。 |
| 一条损坏的日志事件让会话永久死亡、无修复路径(#1593) | 双真相源。 目录=真相;SQLite=可重建的只读索引缓存(游标+mtime 失效)。缓存坏了永远不挡恢复——从目录重建即可。 |
| 两个任务挤在一个文件夹互相覆盖;40 分钟长跑交付坏产物(第三方实测报告) | 每任务一个隔离目录 + O_EXCL 锁 + 每任务沙箱化 cwd。 |
| "恢复意味着知道最后完成的步骤和证明输出的证据"(专家建议) | 尸检报告。 每任务 autopsy.json:死因、主证据、判决、死因代码。 |
| 调度任务静默失败、无审查路径 | 事件溯源。 events/*.jsonl 记录每个任务的 started/output/done/adopted/tampered。 |
每个任务一个目录,状态就是目录结构的函数:
jobs/
└── pwsh-1/ # 一个任务 = 一个目录
├── state/
│ ├── running # 五态标记(任一时刻恰一个为主)
│ ├── stopping
│ ├── orphaned # 崩溃残留(收养判定现场)
│ ├── adopted # 新会话已收养
│ └── done # 终态(内容 = 退出码)
├── lock # O_EXCL 协调锁,内容 = pid:startSec
├── spec.json # 任务规格(kind/label/startedAt)
├── out.log # 输出(游标续读)
├── exit.txt # 退出协议(EXIT:<code>)
├── autopsy.json # 尸检报告(终态时生成)
└── events/ # 事件溯源
├── 0001-started.jsonl
├── 0002-output.jsonl
└── 0003-done.jsonl
三证据收养判定:lock 内容(pid:startSec)+ 进程存活 + 进程启动时间比对(防 PID 复用)。任何时刻 kill -9,重启后新实例扫目录即可收养或结案。
autopsy.json(死因、主证据、判决、死因代码 D-01…D-09)+ output 摘要事件。tampered(EXIT:-999)。read(id) 只返回新字节;游标跨重启持久,长输出不重不漏。wait/close 生命周期——轮询到终态;干净停掉监控定时器。dsh plugin --profile <name> add "github:Wang-Lin-Chang/dsh-witness#v0.2.0"
仓库提交了编译产物(lib/),git 安装无需构建步骤。
import { WitnessJobRegistry } from 'dsh-witness'
const reg = new WitnessJobRegistry(ctx, {
jobsRoot: './data/witness-jobs', // 真相源:每任务一个目录
indexDbPath: './data/witness-index.db', // 可重建索引缓存
adoptMonitorMs: 30000, // 收养扫描间隔
})
const id = reg.start({ kind: 'pwsh', label: 'long-task', command: 'Start-Sleep 60; Write-Output done' })
const snap = await reg.wait(id, 120000) // → completed | failed | tampered
const output = reg.read(id) // 游标式增量读
reg.close() // 停监控定时器
test/witness-final-test.ts —— 12 场景 / 34 断言,连跑稳定全绿。实测环境:Windows 11 Pro · Node 25.8 · PowerShell 5.1。
| 类别 | 场景 | 断言 |
|---|---|---|
| 持久化 A | 重启存活 / 僵尸恢复(kill -9)/ 输出游标续读 / ID 不冲突 | 4 项 |
| 收养协调 B | 50 进程 O_EXCL 竞争恰一终态 / 跨会话收养 / 静默任务保护 / PID 复用防护 | 4 项 |
| 事件溯源 C | 事件日志完整有序 / 尸检报告生成 | 2 项 |
| 沙箱边界 D | 防覆盖 / 防删 | 2 项 |
自己跑:node --experimental-strip-types test/witness-final-test.ts
| 官方 jobs | dsh-witness | |
|---|---|---|
| 崩溃后 | 靠会话持久化(write-behind 有丢尾窗口) | 目录结构即真相,kill -9 后收养续命 |
| 终态证据 | 无 | autopsy.json 尸检 + 事件溯源 |
| 任务隔离 | 无目录级隔离 | 每任务独立目录+锁+沙箱 |
| 输出读 | 整体读 | 游标增量续读(跨重启) |
| 对话/引导 | 不能 | 不能(v0)——对话式后台 agent 是 dsh-anchor 的领地 |
Witness 核心(目录真相源、三证据收养、尸检、事件溯源)是平台无关的;沙箱层按平台选配方,三平台同级:
| 平台 | 沙箱配方 | 后端包 | 验收 |
|---|---|---|---|
| Windows | NTFS ACL 六维闭合 + 守卫句柄 | 本仓库(detach-runner.cjs) |
12 项 / 34 断言(Windows 11 真机) |
| Linux | chattr +i + bubblewrap 只读视图 | dsh-cross-platform | 12 项 / 34 断言 ×3 |
| macOS | chflags uchg + sandbox-exec deny 视图 | dsh-macos | 12 项 / 34 断言 ×3 |
tampered 判决而不是默默信任;任意代码层的完全限制是受限 token 的活(见官方 Harness 沙箱配方)。npm run build # tsc 编译 src → lib
npm test # 运行 12 项验收(node --experimental-strip-types)
要求:Node ≥ 22.5(node:sqlite,实测 25.8)、Windows PowerShell 5.1。
Apache-2.0
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。