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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
JasperPengC/agent-blackbox
AI 编程 agent 的飞行记录仪:本地优先,回放、归因与对比 DSH / Claude Code / Codex…
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,173已汉化DeepSeek 客户端
74.4
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,308已汉化DSH
71.3
智能体运行框架路由HarnessRouter/harnessrouter
智能体运行框架的统一接口。
★ 3,897已汉化DSH
71.2
这是你的仓库?认领条目