🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

智能体飞行记录仪 JasperPengC/agent-blackbox

DeepSeek Harnessv0.2.0
JasperPengC7 天前有提交已提供中文文档扫描:含敏感能力

AI 编程 agent 的飞行记录仪:本地优先,回放、归因与对比 DSH / Claude Code / Codex…

36.4/100
综合分
5
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:npm 同名包「agent-blackbox」归属 iammujtaba44/agent-blackbox,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add JasperPengC/agent-blackbox
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · tool
装得上吗
静态安装检查有提示项,装前建议看一眼 README
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 7 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

npm 同名包「agent-blackbox」归属 iammujtaba44/agent-blackbox,装到的可能不是本插件

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包agent-blackbox @ 0.2.0
✓Node 引擎要求 >=22.19 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 00:13:06

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 81 处,展示前 71 条)
  • 读取本地文件
    bin/blackbox.js:27
    const entry = preferSrc || !existsSync(dist) ? src : dist
  • 读取本地文件
    bin/blackbox.js:29
    if (entry === src && !existsSync(src)) {
  • 读取本地文件
    src/cli.ts:59
    const pkg = JSON.parse(readFileSync(PKG_URL, 'utf8')) as { version?: string }
  • 读取本地文件
    src/cli.ts:83
    if (file === '-') return readFileSync(0, 'utf8')
  • 读取本地文件
    src/cli.ts:84
    if (!existsSync(file)) die(`找不到文件:${file}`, 2)
  • 读取本地文件
    src/cli.ts:85
    return readFileSync(file, 'utf8')
  • 执行外部命令来自配置/变量
    src/cli.ts:288
    const child = spawn(childArgv[0] ?? '', childArgv.slice(1), {
  • 读取本地文件
    src/cli.ts:434
    const stat = existsSync(input) ? statSync(input) : undefined
  • 读取本地文件
    src/cli.ts:434
    const stat = existsSync(input) ? statSync(input) : undefined
  • 读取本地文件
    src/dsh-titles.ts:37
    dirMtime = statSync(dir).mtimeMs
  • 读取本地文件
    src/dsh-titles.ts:47
    files = readdirSync(dir).filter((f) => f.endsWith('.json'))
  • 读取本地文件
    src/dsh-titles.ts:55
    const raw = JSON.parse(readFileSync(join(dir, file), 'utf8')) as {
  • 读取本地文件
    src/event-cache.ts:79
    if (!existsSync(file)) return undefined
  • 读取本地文件
    src/event-cache.ts:81
    const raw = readFileSync(file)
  • 读取本地文件
    src/event-cache.ts:90
    statSync(file)
  • 写入本地文件
    src/event-cache.ts:91
    writeFileSync(file, raw)
  • 删除本地文件
    src/event-cache.ts:104
    rmSync(file, { force: true })
  • 写入本地文件
    src/event-cache.ts:116
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/event-cache.ts:120
    writeFileSync(tmp, gzipSync(JSON.stringify(payload), { level: 3 }))
  • 写入本地文件
    src/event-cache.ts:121
    renameSync(tmp, file)
  • 读取本地文件
    src/event-cache.ts:133
    const entries = readdirSync(dir)
  • 读取本地文件
    src/event-cache.ts:138
    const st = statSync(path)
  • 读取本地文件
    src/event-cache.ts:165
    if (!existsSync(dir)) return stats
  • 读取本地文件
    src/live.ts:41
    if (!existsSync(root)) return out
  • 读取本地文件
    src/live.ts:44
    projects = readdirSync(root)
  • 读取本地文件
    src/live.ts:52
    sessions = readdirSync(projectDir)
  • 读取本地文件
    src/live.ts:60
    const st = statSync(file)
  • 读取本地文件
    src/live.ts:156
    size = statSync(this.#file).size
  • 读取本地文件
    src/live.ts:200
    if (existsSync(arg)) {
  • 读取本地文件
    src/ndjson.ts:103
    return parseNdjson(readFileSync(file, 'utf8'), lenient)
  • 读取本地文件
    src/ndjson.ts:113
    if (dir && !existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/ndjson.ts:113
    if (dir && !existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/ndjson.ts:164
    if (dir && !existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/ndjson.ts:164
    if (dir && !existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/ndjson.ts:259
    size = statSync(this.#file).size
  • 读取本地文件
    src/overview.ts:70
    const raw = JSON.parse(readFileSync(cachePath(), 'utf8')) as CacheFile
  • 写入本地文件
    src/overview.ts:81
    mkdirSync(join(path, '..'), { recursive: true })
  • 写入本地文件
    src/overview.ts:83
    writeFileSync(path, JSON.stringify(payload))
  • 读取本地文件
    src/overview.ts:225
    return existsSync(file)
  • 读取本地文件
    src/pricing.ts:93
    if (existsSync(file)) {
  • 读取本地文件
    src/pricing.ts:95
    const raw = JSON.parse(readFileSync(file, 'utf8')) as UserFile
  • 读取本地文件
    src/server.ts:410
    if (!existsSync(abs)) {
  • 读取本地文件
    src/server.ts:414
    const body = readFileSync(abs)
  • 执行外部命令来自配置/变量
    src/server.ts:722
    const child = spawn(cmd, args, { detached: true, stdio: 'ignore' })
  • 读取本地文件
    src/session-source.ts:146
    if (existsSync(file)) return file
  • 读取本地文件
    src/session-source.ts:177
    const stat = statSync(childFile)
  • 读取本地文件
    src/session-source.ts:331
    const st = statSync(session.file)
  • 读取本地文件
    src/session-source.ts:362
    if (!existsSync(file)) throw new Error(`找不到文件:${file}`)
  • 读取本地文件
    src/session-source.ts:377
    const stat = statSync(file)
  • 读取本地文件
    src/snapshot-cache.ts:64
    if (!existsSync(file)) return undefined
  • 读取本地文件
    src/snapshot-cache.ts:66
    const raw = readFileSync(file)
  • 写入本地文件
    src/snapshot-cache.ts:91
    mkdirSync(root(), { recursive: true })
  • 写入本地文件
    src/snapshot-cache.ts:96
    writeFileSync(tmp, gzipSync(JSON.stringify(payload), { level: 3 }))
  • 写入本地文件
    src/snapshot-cache.ts:97
    renameSync(tmp, file)
  • 删除本地文件
    src/snapshot-cache.ts:107
    rmSync(file, { force: true })
  • 读取本地文件
    src/snapshot-cache.ts:118
    const files = readdirSync(dir).filter((f) => f.endsWith('.json.gz'))
  • 读取本地文件
    src/snapshot-cache.ts:123
    return { path: join(dir, f), at: statSync(join(dir, f)).mtimeMs }
  • 读取本地文件
    src/snapshot-cache.ts:142
    if (!existsSync(dir)) return stats
  • 读取本地文件
    src/snapshot-cache.ts:144
    for (const f of readdirSync(dir)) {
  • 读取本地文件
    src/sources.ts:60
    return readdirSync(dir)
  • 读取本地文件
    src/sources.ts:68
    const st = statSync(file)
  • 读取本地文件
    src/sources.ts:135
    isDir = statSync(next).isDirectory()
  • 读取本地文件
    src/sources.ts:386
    : readFileSync(session.file, 'utf8').split('\n')
  • 发起网络请求
    web/app.js:153
    const res = await fetch(`api/meta?file=${encodeURIComponent(saved)}`, { cache: 'no-store' })
  • 发起网络请求
    web/app.js:175
    const res = await fetch(withFile(path), { cache: 'no-store' })
  • 发起网络请求
    web/app.js:344
    const res = await fetch(withFile('api/sessions'), { cache: 'no-store' })
  • 写入剪贴板
    web/app.js:2652
    await navigator.clipboard.writeText(JSON.stringify(drawerData, null, 2))
  • 发起网络请求
    web/compare.js:74
    const res = await fetch('api/overview')
  • 发起网络请求
    web/compare.js:94
    const res = await fetch(`api/compare?left=${encodeURIComponent(state.left)}&right=${encodeURIComponent(state.right)}`)
  • 发起网络请求
    web/overview.js:83
    const res = await fetch(`api/overview${refresh ? '?refresh=1' : ''}`)
  • 发起网络请求
    web/overview.js:287
    fetch(`api/meta?file=${encodeURIComponent(file)}`).catch(() => {})
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
agent-blackbox English · 中文 AI 编程智能体的飞行记录仪:读取各 runtime 已经写在本地的会话日志,重建为可回放、可检查、可对比的事件时间线。所有处理都在本机完成,无网络请求、无遥测。 面板回放:时间轴、工具瀑布与事件检查器 暗色主题 · 4× 回放 · 合成会话 · 亮色录屏 · 网速慢可以看静态截图 功能 回放 - 时间轴缩放、框选、0.25×–8× 播放;焦点跟随自动跳过空闲,并追踪当前工具 / 事件 / 智能体 - 工具瀑布(按耗时着色)与事件检查器(搜索、类型筛选、完整 payload) - 回放时事件与工具随播放头逐步揭示,不会一次性铺满整窗 分析 - 会话总览:事件、时长、工具成功率、token、成本排行 - 双会话对比:指标差值、工具构成、最慢调用 - 多智能体:DSH 子代理会话合并进父时间线,独立 lane 与 token 归因 其他 - 多 runtime、深色 / 浅色主题、键盘优先、WCAG 2.1 AA 对比度审计 - 零运行时依赖(只用 Node 内置模块) 会话总览与成本排行两个会话对比 支持的 runtime | Runtime | 数据来源 | 状态 | | DeepSeek Harness (DSH) | ~/.dsh/sessions/(.zstd) | 稳定 |
展开完整文档(README 剩余 1 节)
agent-blackbox

English · 中文

AI 编程智能体的飞行记录仪:读取各 runtime 已经写在本地的会话日志,重建为可回放、可检查、可对比的事件时间线。所有处理都在本机完成,无网络请求、无遥测。

面板回放:时间轴、工具瀑布与事件检查器

暗色主题 · 4× 回放 · 合成会话 · 亮色录屏 · 网速慢可以看静态截图

功能

回放
- 时间轴缩放、框选、0.25×–8× 播放;焦点跟随自动跳过空闲,并追踪当前工具 / 事件 / 智能体
- 工具瀑布(按耗时着色)与事件检查器(搜索、类型筛选、完整 payload)
- 回放时事件与工具随播放头逐步揭示,不会一次性铺满整窗

分析
- 会话总览:事件、时长、工具成功率、token、成本排行
- 双会话对比:指标差值、工具构成、最慢调用
- 多智能体:DSH 子代理会话合并进父时间线,独立 lane 与 token 归因

其他
- 多 runtime、深色 / 浅色主题、键盘优先、WCAG 2.1 AA 对比度审计
- 零运行时依赖(只用 Node 内置模块)

会话总览与成本排行两个会话对比

支持的 runtime

| Runtime | 数据来源 | 状态 |
| DeepSeek Harness (DSH) | ~/.dsh/sessions/(.zstd) | 稳定 |
| Claude Code | ~/.claude/projects/(.jsonl) | 稳定 |
| Codex | ~/.codex/sessions/(.jsonl) | 稳定 |
| ACP | agent-client-protocol 日志 | 实验性 |
| 录制 NDJSON | blackbox record 输出 | 稳定 |

快速开始

需要 Node.js ≥ 22.19,源码由 Node 类型擦除直接执行,无需构建。

git clone https://github.com/JasperPengC/agent-blackbox.git
cd agent-blackbox
npm install

npm run demo:ui # 合成数据,浏览器打开
npm run demo # 合成数据,终端回放
node src/cli.ts sessions # 列出本机会话
node src/cli.ts ui <文件> # 打开指定会话
node src/cli.ts live # 实时跟随最新会话
node src/cli.ts overview # 终端成本排行

DSH 插件

dsh plugin --profile desktop add dsh-agent-blackbox

重启 DSH 后侧栏出现 Blackbox,主区可打开整屏面板;也可以在 DSH 的「设置 → 插件市场」里搜索 agent-blackbox 安装(已收录:dsh-plugin.org)。dshmarket 目录同样有收录:awesome-dsh-plugin.com。插件源码与发版在 dsh-agent-blackbox。

实现

- 事件溯源:任意时刻状态 = 对前缀事件的 fold;检查点让 seek 与事件总数无关
- 适配器:DSH / Claude Code / Codex / ACP / NDJSON → 统一事件模型(16 种事件)
- 索引:解码一次、按间隔建检查点、落盘缓存;HTTP API + 原生 JS 渲染

性能

Intel Mac(Core i7-10700 @ 2.90 GHz,macOS 14.8.9)、Node 24.18、Chrome 155,合成 fixture 与 47 MB 真实会话实测。Apple silicon 上预计更快。

| 指标 | 数值 |
| 首次内容绘制 | 104–108 ms |
| 首屏数据(缓存命中) | 225–315 ms |
| 首屏数据(冷启动,47 MB 会话) | 2.0–2.4 s |
| 回放帧时间 | 中位 17 ms / p95 17 ms |
| 10 万事件建索引 | 129–132 ms |
| seek(有检查点) | 中位 80 µs / p95 145 µs / 最大 323 µs |
| 无检查点 seek | 20.6–21.8 ms |

npm run bench 复现索引与 seek 数字;npm run perf 测量首屏绘制。

数据与隐私

- 只读本地会话文件,不修改原文件
- 无网络请求、无遥测、无账号
- 缓存与价格表位于 ~/.dsh/blackbox/,blackbox cache --clear 可清理
- 成本依赖本地 pricing.json;未知模型不计入成本合计,并在界面标注

已知限制

- 暂不支持 OpenCode / Pi 会话格式
- 超过 24 MB 的会话只加载尾部 8 MB;该模式不合并文件中段的子代理目录
- Claude Code 的 sidechain 事件暂未聚合为独立 lane
- 插件目前针对 DSH 验证;其他编辑器可用独立服务模式

相关仓库

- dsh-agent-blackbox — DSH 插件(npm dsh-agent-blackbox)

参与贡献

欢迎 issue 和 PR,见 CONTRIBUTING.md;安全问题见 SECURITY.md。

社区

本项目在 LINUX DO 社区推广。

许可证

MIT,见 LICENSE。
预览分享卡片长什么样 ↓JasperPengC/agent-blackbox
分享 · DeepSeek Harness Hub
JasperPengC/agent-blackbox

AI 编程 agent 的飞行记录仪:本地优先,回放、归因与对比 DSH / Claude Code / Codex…

这是你的仓库?认领条目

回到顶部