DSH 会话轨迹分析插件:上下文演化、团队协作图、工具错误证据链、智能告警、会话对比与导出,兼作 aeval 评测控制
43.9/100
综合分
27
GitHub 星标
207
npm 周下载
—/5
用户评分
数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-eval-controlnpm 源 · dsh-eval-control 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-eval-control @ 0.4.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖要求 >=0.1.7-alpha.1 <0.1.8-0 || >=0.1.8-alpha.1 <0.2.0-0 || >=0.2.0-0 <0.3.0-0 · 最新 0.2.1-rc.2 兼容
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/26 15:41:14
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 108 处,展示前 89 条)
- 写入本地文件dist/index.js:227
writeFileSync(`${config.bundlePath}.finalize-error.txt`, `${error instanceof Error ? `${error.name}: ${error.message}\n${error.stack ?? ''}` : String( - 写入剪贴板client/client.js:2769
await navigator.clipboard.writeText(text); - 读取本地文件dist/session_reader.js:12447
if ((await stat(path === parse(path).root ? path : toNamespacedPath(path))).isDirectory()) return true; - 删除本地文件dist/session_reader.js:12495
await rm(staging, { - 写入本地文件dist/session_reader.js:12523
await mkdir(dir, { - 读取本地文件dist/session_reader.js:12550
const current = await stat(path, { bigint: true }).catch((error) => { - 读取本地文件dist/session_reader.js:13226
readFile: (path, signal) => readFile(path, signal === void 0 ? void 0 : { signal }), - 读取本地文件dist/session_reader.js:13227
readdir: (path) => readdir(path), - 读取本地文件dist/session_reader.js:13228
stat: (path) => stat(path, { bigint: true }), - 读取本地文件dist/session_reader.js:13229
lstat: (path) => lstat(path), - 删除本地文件dist/session_reader.js:13231
rm: (path) => rm(path, { force: true }) - 写入本地文件dist/session_reader.js:14643
await mkdir(this.root, { - 写入本地文件dist/session_reader.js:14648
await mkdir(project, { - 写入本地文件dist/session_reader.js:14653
await mkdir(dir, { - 删除本地文件dist/session_reader.js:14665
if (!linked) await rm(tmp, { force: true }); - 删除本地文件dist/session_reader.js:14669
await rm(tmp, { force: true }); - 删除本地文件dist/session_reader.js:14684
await rm(tmp, { force: true }); - 写入本地文件dist/session_reader.js:14774
await truncate(path, offset); - 读取本地文件dist/session_stub.js:50
stat = lstatSync(value); - 读取本地文件dist/broker_main.js:4882
const server = tls ? createTlsServer({ ...serverOptions, key: readFileSync(tls.key), cert: readFileSync(tls.cert) }, handler) : createServer(serverOpt - 写入本地文件dist/broker_main.js:5012
writeFileSync(path, token, { mode: 384, flag: "wx" }); - 读取本地文件dist/broker_main.js:5019
stat = lstatSync(path); - 删除本地文件dist/broker_main.js:5028
unlinkSync(path); - 发起网络请求dist/broker_main.js:5417
response = await fetch(this.#url, { - 发起网络请求dist/broker_main.js:5638
response = await fetch(this.#url, { - 发起网络请求dist/broker_main.js:5942
response = await fetch(endpoint, { method: "POST", headers, body, redirect: "error", signal }); - 读取本地文件dist/broker_main.js:6124
text = readFileSync2(path, "utf8"); - 读取本地文件dist/selfcheck.js:67
const stat = statSync(path); - 读取本地文件dist/selfcheck.js:69
accessSync(path, mode); - 读取本地文件dist/selfcheck.js:96
if (!statSync(dir).isDirectory()) { - 发起网络请求dist/selfcheck.js:114
const response = await fetch(new URL('/info', config.gatewayUrl), { - 读取本地文件dist/control_config_source.js:51
raw = readFileSync(path, 'utf8'); - 读取本地文件dist/gateway_lease.js:225
const token = readFileSync(fd, 'utf8').trim(); - 发起网络请求dist/gateway_lease.js:257
const response = await fetch(`${this.#config.gatewayUrl.replace(/ $/, '')}${path}`, { - 发起网络请求dist/gateway_lease.js:272
const response = await this.request('/info', signal ? { signal } : {}); - 发起网络请求dist/gateway_lease.js:329
const response = await abortable(() => this.request('/stream', { method: 'POST', body: JSON.stringify(body), signal }), signal); - 读取本地文件dist/bundle_writer.js:31
return lstatSync(path); - 读取本地文件dist/bundle_writer.js:71
if (!stat.isDirectory() && !(stat.isSymbolicLink() && lstatSync(actual).isDirectory())) { - 写入本地文件dist/bundle_writer.js:89
mkdirSync(parent, { recursive: true }); - 写入本地文件dist/bundle_writer.js:114
writeFileSync(fd, payload, { encoding: 'utf-8' }); - 写入本地文件dist/bundle_writer.js:123
renameSync(temp, target); - 删除本地文件dist/bundle_writer.js:134
rmSync(temp, { force: true }); - 读取本地文件dist/bundle_writer.js:307
previous = JSON.parse(readFileSync(this.path, 'utf8')); - 读取本地文件dist/host_broker.js:314
? createTlsServer({ ...serverOptions, key: readFileSync(tls.key), cert: readFileSync(tls.cert) }, handler) - 写入本地文件dist/host_broker.js:454
writeFileSync(path, token, { mode: 0o600, flag: 'wx' }); - 读取本地文件dist/host_broker.js:467
stat = lstatSync(path); - 删除本地文件dist/host_broker.js:477
unlinkSync(path); - 发起网络请求dist/upstream.js:203
response = await fetch(this.#url, { - 发起网络请求dist/token_bound.js:96
response = await fetch(endpoint, { method: 'POST', headers, body, redirect: 'error', signal }); - 发起网络请求dist/upstream_responses.js:445
response = await fetch(this.#url, { - 写入本地文件dist/report_share.js:89
await mkdir(directory, { recursive: true, mode: 0o700 }); - 读取本地文件dist/report_share.js:90
const files = (await readdir(directory)).filter((file) => /^[a-f0-9]{48}\.json$/.test(file)); - 读取本地文件dist/report_share.js:93
const old = JSON.parse(await readFile(join(directory, file), 'utf8')); - 删除本地文件dist/report_share.js:95
await unlink(join(directory, file)); - 读取本地文件dist/report_share.js:99
if ((await readdir(directory)).length >= 100) - 写入本地文件dist/report_share.js:102
await writeFile(join(directory, `${id}.json`), JSON.stringify(report), { mode: 0o600, flag: 'wx' }); - 删除本地文件dist/report_share.js:108
await unlink(join(this.directory(), `${id}.json`)).catch((error) => { if (error.code !== 'ENOENT') - 读取本地文件dist/report_share.js:132
report = JSON.parse(await readFile(join(this.directory(), `${id}.json`), 'utf8')); - 读取本地文件dist/sandbox_entry.js:69
: readFileSync(entry.jobTokenPath, 'utf8').trim(); - 写入本地文件dist/sandbox_entry.js:101
appendFileSync(rejectionLog, `${JSON.stringify(record)}\n`, { mode: 0o600 }); - 写入本地文件dist/sandbox_entry.js:103
appendFileSync(dispatchLog, `${JSON.stringify(record)}\n`, { mode: 0o600 }); - 读取本地文件src/bundle_writer.ts:49
return lstatSync(path); - 读取本地文件src/bundle_writer.ts:87
if (!stat.isDirectory() && !(stat.isSymbolicLink() && lstatSync(actual).isDirectory())) { - 写入本地文件src/bundle_writer.ts:106
mkdirSync(parent, { recursive: true }); - 写入本地文件src/bundle_writer.ts:131
writeFileSync(fd, payload, { encoding: 'utf-8' }); - 写入本地文件src/bundle_writer.ts:139
renameSync(temp, target); - 删除本地文件src/bundle_writer.ts:146
if (ownedTemp) rmSync(temp, { force: true }); - 读取本地文件src/bundle_writer.ts:328
previous = JSON.parse(readFileSync(this.path, 'utf8')) as BundleDescriptor; - 读取本地文件src/control_config_source.ts:69
raw = readFileSync(path, 'utf8'); - 写入本地文件src/index.ts:265
writeFileSync(`${config.bundlePath}.finalize-error.txt`, - 写入本地文件src/report_share.ts:42
const directory=this.directory();await mkdir(directory,{recursive:true,mode:0o700}); - 读取本地文件src/report_share.ts:43
const files=(await readdir(directory)).filter((file)=>/^[a-f0-9]{48}\.json$/.test(file)); - 读取本地文件src/report_share.ts:45
try {const old=JSON.parse(await readFile(join(directory,file),'utf8')) as SharedReport;if (old.expiresAt!==null&&old.expiresAt<Date.now()-86400000) aw - 删除本地文件src/report_share.ts:45
try {const old=JSON.parse(await readFile(join(directory,file),'utf8')) as SharedReport;if (old.expiresAt!==null&&old.expiresAt<Date.now()-86400000) aw - 读取本地文件src/report_share.ts:47
if ((await readdir(directory)).length>=100) throw new Error('分享快照已达 100 份,请先删除不再使用的分享'); - 写入本地文件src/report_share.ts:49
await writeFile(join(directory,`${id}.json`),JSON.stringify(report),{mode:0o600,flag:'wx'}); - 删除本地文件src/report_share.ts:55
await unlink(join(this.directory(),`${id}.json`)).catch((error:NodeJS.ErrnoException)=>{if(error.code!=='ENOENT')throw error;}); - 读取本地文件src/report_share.ts:67
try {report=JSON.parse(await readFile(join(this.directory(),`${id}.json`),'utf8')) as SharedReport;} catch {res.statusCode=404;res.end(page('<main>分享链 - 读取本地文件src/sandbox_entry.ts:82
: readFileSync(entry.jobTokenPath, 'utf8').trim(); - 写入本地文件src/sandbox_entry.ts:115
appendFileSync(rejectionLog, `${JSON.stringify(record)}\n`, { mode: 0o600 }); - 写入本地文件src/sandbox_entry.ts:118
appendFileSync(dispatchLog, `${JSON.stringify(record)}\n`, { mode: 0o600 }); - 读取本地文件src/selfcheck.ts:83
const stat = statSync(path); - 读取本地文件src/selfcheck.ts:84
if (mode !== undefined) accessSync(path, mode); - 读取本地文件src/selfcheck.ts:112
if (!statSync(dir).isDirectory()) { - 发起网络请求src/selfcheck.ts:129
const response = await fetch(new URL('/info', config.gatewayUrl), { - 读取本地文件src/session_reader.ts:67
const stat = lstatSync(current); - 读取本地文件src/session_reader.ts:85
const stat = lstatSync(current); - 读取本地文件src/session_reader.ts:91
for (const name of readdirSync(current)) pending.push(join(current, name)); - 读取本地文件src/session_stub.ts:70
stat = lstatSync(value);
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh@deepseek-ai/dsh-acp@deepseek-ai/dsh-agent@deepseek-ai/dsh-compaction@deepseek-ai/dsh-experimental-agent-team@deepseek-ai/dsh-llm@deepseek-ai/dsh-llm-retry@deepseek-ai/dsh-ptc-runtime@deepseek-ai/dsh-scope@deepseek-ai/dsh-sdk-protocol@deepseek-ai/dsh-session给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
6 张 · 点击查看大图功能亮点
- 配置注入
- 预算封顶
- 证据归属
最近更新
在 GitHub 查看全部 →v0.4.02026-10-20
证据链与团队协作全量落地:统一证据抽屉从结论回溯宿主原始事件,Team 活动新增协作关系图与交互时序,消息与演化页改为全历史采集;仓库文档精简为仅保留用户向文档。
· Added
· 统一证据链抽屉:顶部指标卡、告警、指标明细、演化标记、请求选择、消息 ⚡/🔻、压缩/注入事件、工具明细、Team 成员与对比指标共用右侧抽屉;打开时固定数据快照,展示结论、规则、计算输入、样本与分母、证据等级(observed/derived/inferred)与质量提示;关闭后保留原 Tab 的筛选和缩放。
· 原始事件核查:关联事件按 sessionId + seq 通过 loadThrough(seq) 读取宿主持久原始事件,显示目标事件及前后最多 3 条(可折叠),支持 JSON 检查、单条下载、引用搜索与分页(每页 20 条);15 秒超时、切换即取消,不把 projection 节选当成原始证据。
· 窗口占用计算卡:展示"未缓存输入 + 缓存读取 = 请求占用""请求占用 ÷ 窗口上限"实际数值;每个输入独立绑定用量/配置事件,可核对原始字段与计算快照是否一致;缓存读缺失时保留未知值,不冒充已核实的 0。
· Team 活动协作视图:主子 Agent 协作关系图(消息实线 + 任务归属虚线,点击连线按方向筛选)、交互时序图(日期/成员/交互类型筛选)、成员泳道与轮次卡片、共享任务板(待处理/进行中/已完成)、消息往来按消息 ID 合并排队与送达回执;无记录时明确提示,不补画推测关系。
· 上下文内容估算:按请求拆分消息正文、历史思考、工具调用参数、工具结果正文、系统/开发者内容、图片引用结构与结构开销,逐项标注候选输入 / 依路由而定 / 非真实计价。
· 工具错误分析:失败结果标红、错误原文节选和规则化原因分析(权限、路径不存在、超时、网络、参数格式、非零退出);工具分布图联动失败证据。
· 总览全链路综合诊断:联合任务进展、上下文、消耗、延迟、工具与团队六个维度生成综合结论与跨阶段证据引用;缺失数据标为未知。
· AI 模型诊断服务与客户端已实现,默认停用:宿主未注册该服务,界面不显示 AI 诊断入口;规则告警、错误文本分析与证据链不受影响。
· 宿主投影补充证据锚点:contextWindowSeq、toolsSeq、压缩事件 evidenceRefs、compactionStarts 保留序号。
· 新增证据链、团队协作两张面板 GIF;全部 8 张 GIF 以最新面板重录;新增用户向文档 docs/evidence-chain.md。
· Changed
· 全历史采集:宿主投影移除 steps/injections/compactions 的 256/64/32 条截断上限,请求、消息及压缩/修剪样本按实际数量采集;消息页默认读取全部可读历史,可切换最近 N 条或起止事件序号,叠加角色与单条 Token 范围筛选,列表分页显示覆盖状态。
· 工具结果回填聚合:演化页普通工具结果按相邻模型请求区间聚合,默认显示估算 Token 最高的 10 组和全部失败结果,可切换全部区间;失败结果独立标红,通过 callId 关联来源调用。
· 激增检测抽出共用基线算法(前 5 条追加消息中位数,≥3 样本、≥1000 Token 且 ≥3 倍中位数),消息页与演化页口径一致。
· Removed
· 仓库文档精简:设计过程文档(PRD、PLAN、tech-design、契约、验证报告、proposals、演示分镜与原始终端录制等)从仓库移除并忽略,仅保留用户向文档;远程历史提交未改写。
· Fixed
· npm 说明页裂图(0.3.0 已知问题):README 的 5 枚徽章与 8 张面板 GIF 改为 raw.githubusercontent.com 绝对链接,npmjs 说明页图片恢复正常显示。
---
安装:dsh plugin --profile web add dsh-eval-control@0.4.0
完整变更:CHANGELOG · npm:
v0.3.02026-10-20
轨迹分析面板全量落地(宿主投影 contextTimeline + 客户端多视图),并补齐统一诊断中心、多会话对比与报告分享。
· Added(宿主投影)
· contextTimeline 投影(src/analytics/contextTimeline.ts):对会话事件流的纯折叠,输出均经 zod strict wire schema、全部有界:
- 7 段上下文表面组成(系统提示/对话消息/工具定义/工具结果/文件内容/压缩摘要/其他),估算算法与 dsh-token-meter 一致(CHARS_PER_TOKEN=4);每段附有界内容节选与 callId 定位符;
- 消息级 Token 台账(kind/sourceKind/tokens/turn,客户端过滤"注入"视图);
- 步骤采样(表面估算 + 服务商 usage,含 cacheReadTokens);
- 压缩事件(摘要/修剪分类、前后 Token、回收量与回收比、耗时);
- 工具 Top-20 与 callId→工具名映射。
· Added(客户端「轨迹分析」面板)
· 总览:环形占用仪表盘(>80% 脉冲)、组成堆叠条+饼图(点击过滤)、组成明细表(查看内容/复制/在 Trajectory 定位)、指标卡×6。
· 上下文演化:窗口占用(含缓存读)实线 + 表面估算/输出参考线 + 窗口上限虚线;压缩(绿三角)/注入(橙圆)/激增(红菱形)标记,悬停详情、重叠聚合气泡、筛选芯片;框选缩放、拖拽平移、双击重置;X 轴按轮次/步骤/时间。
· 消息 Token:角色/注入/Token 范围筛选与多键排序;Top3 消耗 👑、异常突增 ⚡、累计骤降 🔻 高亮;「原因总结」归因面板(主导机制、突增倍数、匹配压缩事件);双饼图消息构成。
· 压缩与注入:事件卡片(前后对比条、回收比、耗时)、替换关系与手段说明、注入 vs 直接输入分类;连续历史修剪与同秒注入聚合。
· 工具分布:横条图 + 错误叠加 + 调用明细。Team 活动:成员×指标聚合。
· 对比分析:2–4 会话选择、8 指标对比卡(最优★)、资源比例雷达图(原始值/本轴最大值,零值居中)、差异报告与建议。
· 智能告警 5 规则(满载/频繁压缩/高错误率/Token 浪费/长间隔),阈值本地持久化、忽略/已处理。
· 统一诊断中心:总览右侧合并告警入口,提供规则设置、原始诊断数据和压缩策略配置应用(经宿主配置编辑器持久化,含并发检查与回读确认)。
· 导出与分享:Markdown / JSON / PNG / 独立单文件 HTML 报告;PDF、多种报告模板;支持密码、有效期和撤销的只读分享链接;团队模板可下载差异报告。
· Changed
· client/client.js 由手写脚本变为生成产物;修改 UI 一律改 client-src/ 后 npm run build:client。
· "当前窗口占用"语义修正:取最后一步 inputTokens + cacheReadTokens(服务商 inputTokens 为未缓存部分)。
· 指标卡"输入 Token"重标为"输入 Token(未缓存)";趋势用含缓存值。
· 新增宿主依赖遵循运行时兼容范围与开发期精确版本分离的发布约定。
· 已知偏差
· 分享链接由宿主 HTTP 路由提供本地持久化只读快照;本机地址仅本机可达。
· 组成/消息 Token 为估算(服务商不提供消息级精确值),UI 标注"估算"。
· 已知问题(0.4.0 已修复)
· npm 说明页面板 GIF 裂图(README 用仓库相对路径);0.4.0 已改为 raw 绝对链接。
---
安装:dsh plugin --profile web add dsh-eval-control@0.3.0
完整变更:CHANGELOG · npm:
v0.2.02026-10-20
发布面版本:让本包作为 DSH 插件可被收录、可被独立安装,且装完不炸。 aeval 的运行链路未变:deploy_control_stack 依旧自己写 patch 与内联配置,插件行为、descriptor 格式与 configDigest 计算方式均未改动。
· Added
· 可发布的 Cordis bundle:package.json 声明 dsh.bundle.patch,仓库新增 cordis.patch.yml,files 白名单补齐补丁/locale/icon/client,exports 暴露 ./client、./package.json、./cordis.patch.yml、./locale/*.json。已用真实 DSH 的 profile loader 验证:bundle 解析成功、peer 预检通过、补丁被加载且无跳过。
· standalone 激活路径(src/sandbox_entry.ts):controlConfigPath 改为可选。没有任何配置时不再抛错,而是发布 evalControlStatus 服务、打一条通知并什么都不挂载——模型调用不被重定向。配置一旦提供,fail-closed 语义原样保留。
· 配置引用形态(src/control_config_source.ts):行配置可以是内联完整配置、{ controlConfigPath } 引用,或在空配置时回退到 AEVAL_CONTROL_CONFIG。内联路径逐字节透传,configDigest 不变。
· 自检命令 aeval-dsh-control-selfcheck(第 4 个 bin):只读检查 Node 版本、配置解析与摘要、run 绑定、job token、session root、descriptor 目录可写性与 broker /info 可达性;支持 --json,未配置时报 standalone 并以 0 退出。
· Web 只读状态胶囊:在 conversation.composer.dock 显示控制行是否挂载及其 fiber 阶段;宿主 Remote 缺席时如实显示"宿主通道不可用"。
· 展示元数据:locale/en.json、locale/zh.json 与顶层 icon.svg。
· Changed
· 发布面 peer 范围与构建期 pin 分离:@deepseek-ai/* 从 dependencies 移入 peerDependencies,精确 pin 保留在 devDependencies 作为构建记录。profile 不再被塞入第二份 Harness。
· 内部资料归档:docs/TESTS/ → docs/internal/(开发过程记录,不随 npm 包分发)。
· Fixed
· README 里的坏链:改为自足的 npm test 说明,并链接 aeval 侧的三份使用者指南。
· 已知限制
· aeval 部署路径仍按 @deepseek-ai/dsh-*@0.1.7-alpha.1 的片构建与锁定;peer 范围只描述本包可被加载的宿主版本窗口。
· Node 要求 ^22.19.0 || >=24.0.0。
---
完整变更:CHANGELOG · npm:
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-eval-control
源码版本 0.5.0 License Apache-2.0 验证环境 DSH 0.2.0-rc.2 / 0.2.1-rc.2 / 0.2.1-rc.3 Node.js 22.19.x–22.x 或 24+ TypeScript 6.0.3
DSH 轨迹分析与 aeval 评测控制插件。
上下文窗口不知不觉就满了,不知道哪条消息吃了大量 Token,子 Agent 之间到底交接了什么,工具报错后找不到原始日志——这些问题现在都能看见。dsh-eval-control 把会话黑盒变成可视化面板:从上下文演化、团队协作关系图到工具错误证据链,一个插件全覆盖。同时提供 aeval 所需的变量注入、预算控制和 fork 血统校验。
dsh plugin --profile web add dsh-eval-control
快速开始 · 面板演示 · 功能对比 · 面板功能 · 导出与分享 · 常见问题
本文对应仓库当前实现,package.json 版本为 0.5.0。发行包的功能取决于实际安装版本。
展开完整文档(README 剩余 1 节)
dsh-eval-control 源码版本 0.5.0 License Apache-2.0 验证环境 DSH 0.2.0-rc.2 / 0.2.1-rc.2 / 0.2.1-rc.3 Node.js 22.19.x–22.x 或 24+ TypeScript 6.0.3 DSH 轨迹分析与 aeval 评测控制插件。 上下文窗口不知不觉就满了,不知道哪条消息吃了大量 Token,子 Agent 之间到底交接了什么,工具报错后找不到原始日志——这些问题现在都能看见。dsh-eval-control 把会话黑盒变成可视化面板:从上下文演化、团队协作关系图到工具错误证据链,一个插件全覆盖。同时提供 aeval 所需的变量注入、预算控制和 fork 血统校验。 dsh plugin --profile web add dsh-eval-control 快速开始 · 面板演示 · 功能对比 · 面板功能 · 导出与分享 · 常见问题 本文对应仓库当前实现,package.json 版本为 0.5.0。发行包的功能取决于实际安装版本。 功能对比 与同类上下文可视化插件相比,本插件额外提供: | 能力 | 本插件 | 同类插件 | | 上下文窗口组成与演化 | ✅ | ✅ | | 消息 Token 估算与筛选 | ✅ | ✅ | | 压缩事件可视化 | ✅ | ✅ | | 区分摘要压缩与历史修剪 | ✅ | ❌ | | 工具调用分析与错误证据 | ✅ | ❌ | | Team 多 Agent 协作关系图 | ✅ | ❌ | | 交互时序与任务板 | ✅ | ❌ | | 智能告警 + 配置应用 | ✅ | ❌ | | 证据链(从结论到原始事件) | ✅ | ❌ | | 会话对比 + 差异报告 | ✅ | ❌ | | 导出 PDF/Markdown/HTML + 只读分享 | ✅ | ❌ | | aeval 评测控制集成 | ✅ | ❌ | 快速开始 向目标 profile 安装插件: dsh plugin --profile web add dsh-eval-control 将 web 替换为实际使用的 profile。需要固定发行版本时,在包名后追加 @<version>。 重启或重新加载该 profile,打开一个会话,在会话顶部选择 轨迹分析。对话区的 aeval 控制 状态胶囊和侧栏插件详情提供评测控制状态。 从源码构建 在仓库根目录执行: npm install npm run build npm run typecheck 将构建后的本地目录安装到目标 profile: dsh plugin --profile web add /absolute/path/to/dsh-eval-control client/client.js 是生成产物,前端修改应编辑 client-src/,再运行 npm run build:client。 环境要求 | 项目 | 要求 | | Node.js | ^22.19.0 或 >=24.0.0 | | 完整功能验证环境 | DSH 0.2.0-rc.2、0.2.1-rc.2 与 0.2.1-rc.3 的 Web 界面 | | 宿主依赖 | 满足 package.json 中全部 peerDependencies;契约类 peer 覆盖 0.2.0-rc.2 到 0.2.1-rc.3 三个已验证版本 | | 轨迹分析 | 宿主会话及 projection 服务 | | 诊断配置应用 | 宿主持久化配置编辑器 configEditor | | 分享链接 | 宿主 HTTP 服务及本地 profile 存储 | 版本不满足时,宿主会在安装阶段直接拒绝(dsh: installation rejected ... nothing was installed),并且因为市场对 engines 与全部宿主 peer 取合取,插件也不会出现在市场搜索结果中——给自己加 engines.dsh 只能绕过宿主的加载闸门,绕不过市场过滤。若确需在未验证的宿主版本上试用,可用宿主自带的精确版本豁免: dsh plugin --profile <profile> allow-version dsh-eval-control@<version> --dsh-version <host-version> --accept-risk 豁免只对「该插件版本 + 该宿主精确版本」这一对生效,不会放宽 peerDependencies。 面板演示 以下动图由演示数据的关键操作截图合成循环 GIF,不包含真实会话内容。 上下文演化:切换步骤 / 轮次、选中压缩事件、适配纵轴范围。 上下文演化:轮次切换、事件定位与纵轴适配 团队协作:主子与子子 Agent 关系、交接方向筛选、消息原文、轨迹证据和共享任务板。 团队协作关系图、交互时序、消息证据与任务板(合成数据) 总览诊断与消息 Token 查看窗口占用和右侧告警,展开诊断建议,切换消息台账与注入筛选。 总览告警与消息 Token 筛选 压缩替换详情与聚合事件 展开摘要压缩,查看替换手段、历史内容与检查点的对应关系,以及聚合后的历史修剪和注入来源。 压缩替换关系、替换手段和事件聚合 工具分布与失败证据 查看工具调用及错误分布、放大图表,再打开失败标红、错误原文和规则原因分析。 工具调用分布、缩放和失败原因证据 会话对比与差异报告 比较两次运行,查看资源消耗雷达图、原始值与差异报告。 会话对比、雷达图和差异报告 报告导出与分享选项 切换报告格式,查看只读分享的有效期与访问权限选项。此演示未创建分享链接。 报告导出格式与只读分享配置 动图的演示数据和更新方法见 录制说明。 面板功能 | Tab | 可以查看或执行的操作 | | 总览 | 上下文窗口占用、组成拆解、会话摘要;右侧集中展示智能告警、规则设置和可折叠诊断数据 | | 上下文演化 | 按步骤、轮次或时间查看输入占用、上下文内容估算 Token 和输出 Token;区分摘要压缩、历史修剪、注入与激增 | | 消息 Token | 默认全部历史,可选最近 N 条或事件范围;角色、Token 范围、排序与高消耗消息定位 | | 压缩与注入 | 事件聚合、压缩前后对比、替换关系、替换手段、注入来源和内容节选 | | 工具分布 | 调用次数、显式错误、分布图与调用明细;失败标红、规则原因分析及原生工具卡片定位 | | Team 活动 | 主子 Agent 协作关系图、交互时序、成员分工与活动泳道、任务板和消息交接;支持筛选与证据跳转 | | 对比分析 | 选择 2–4 个会话,生成资源消耗对比、上下文折线、雷达图、差异报告与建议 | 顶部关键指标卡可打开计算口径与事件证据;其他 Tab 可通过 总览诊断 返回诊断中心。各面板的详细交互说明见 面板详细说明。 证据链:从结论回到原始事件 点击顶部指标卡、告警中的 查看证据链,或消息表中的 ⚡ / 🔻,会在右侧打开统一证据抽屉。演化图选中标记、压缩、注入、工具明细、Team 成员与对比指标均有对应入口。 抽屉显示结论、规则、实际计算输入、样本与分母、证据等级和数据质量提示。点击关联事件,按 sessionId + seq 读取宿主原始持久事件,并可折叠查看前后事件、检查 JSON 或下载记录。当前会话且宿主支持时可打开原生工具卡片,跨会话时使用原始事件查看器。 窗口占用证据额外展示"未缓存输入 + 缓存读取 = 请求占用"的实际数值公式;每个输入分别关联事件与原始字段。突增同时展示基线中位数、相邻消息体积差、主导成分和时间间隔,各数值分别标明来源。 引用和投影均有保留上限;缺失、读取失败或未记录的耗时起止会明确提示,不会用相邻事件代替。关闭抽屉保留原 Tab 的筛选和缩放。 窗口占用公式、原始用量来源和相邻事件核查(演示数据) 实现和数据约定见 证据链设计。 智能告警 告警与诊断集中在 总览右侧的诊断中心,提供未处理、已处理、已忽略及严重级别筛选。 | 告警 | 默认触发条件 | | 上下文满载 | 窗口占用超过 80% | | 频繁压缩 | 摘要压缩超过 5 次 / 千输入 Token | | 高错误率 | 工具显式错误率超过 10% | | Token 浪费 | 同一参数调用最长连续重复超过 3 次 | | 长间隔 | 存在至少一个 ≥30 秒的长间隔段 | 在 规则设置 中修改阈值或启停规则。上下文满载、频繁压缩告警支持 查看并调整配置 或 直接应用推荐配置,写入通过宿主配置编辑器完成,包含并发变更检查、配置校验和回读确认。 预设中的配置修改对新建会话生效,现有会话保留原预设版本。 AI 模型诊断暂时停用;现有规则告警、错误文本分析、证据链和配置建议继续可用。 会话对比与差异报告 打开 对比分析,勾选 2–4 个会话,点击 开始对比。查看 Token 条形对比、上下文演化折线和多维雷达图。 系统默认高亮相对差异最大的一项。差异报告给出 Token 消耗、摘要压缩频率、工具错误率和模型耗时的最低值,缺失数据标为不可用,不按零参与排名。勾选 归一化显示 后,上下文曲线按窗口占用率与请求进度对齐。 雷达图使用资源消耗比例(当前会话原始值 / 所选会话该项最大值),至少三个指标在所有所选会话中均可用时才绘图。雷达面积不代表任务能力或完成质量。 导出与分享 报告导出 点击面板顶部 导出,选择模板、标题和格式。 | 格式 | 说明 | | PDF | 本地生成 A4 报告,支持中文、表格、图表、分页和页码 | | Markdown | 可编辑文本报告,包含指标、分析和图表数据样本 | | JSON | 原始投影、告警及已选对比快照 | | PNG | 当前 Tab 的首个可用 SVG 图表 | | HTML | 离线只读报告,无外部资源依赖 | | 模板 | 内容 | | 简洁版 | 关键指标与图表 | | 详细版 | 指标明细、事件、图表和告警分析 | | 团队版 | 关键指标、图表、多会话对比与建议 | | 自定义 | 自选章节,可保存配置到当前浏览器 | 只读分享 点击顶部 分享,选择报告模板,设置有效期(7 天 / 30 天 / 永久)和访问权限(公开或密码保护)。 分享快照保存在当前宿主 profile 的 trajectory-shares/ 目录。宿主停止期间链接不可用,重启同一 profile 后可继续访问。127.0.0.1 / localhost 链接仅本机可用;团队访问需从可达地址的宿主页面生成链接。 分享报告不包含原始消息正文、工具参数或替换内容节选。当前最多保留 100 份分享,每份 HTML 不超过 2 MB。密码以随机 salt + scrypt 存储。 数据口径与隐私 | 数据 | 口径 | | 顶部及对比中的 Token 消耗 | 未缓存输入 + 输出,不等于计费金额 | | 上下文窗口占用 | 请求输入占用,包含缓存读 | | 上下文内容估算 Token | 启发式估算,CHARS_PER_TOKEN = 4,与 dsh-token-meter 镜像算法一致 | | 压缩频率 | 摘要压缩次数 / 千输入 Token;历史修剪单独统计 | | 工具错误率 | 已观察到的显式工具错误 / 已知工具结果数;缺失结果不算成功 | | 雷达及最低值排名 | 所选会话内的资源表现;比较时应同时考虑任务规模、模型与完成质量 | 本插件的分析与分享数据保存在本地,不上传到外部服务。内容节选、复制和导出可能包含原会话中已保留的路径或正文,分享前应核对所选导出内容。诊断中的配置应用由用户显式触发,会持久化修改对应宿主配置。 aeval 评测控制 本插件同时提供 aeval 评测控制能力(变量注入、步骤与 Token 预算、fork 血统校验和 bundle descriptor),编排、评分与评测报告由 aeval 完成。默认以 standalone 状态运行,不影响普通轨迹分析;接入完整控制栈后启用评测控制。 详细配置、行配置示例和自检方法见 aeval 评测控制文档。 开发与验证 npm install npm run build # 组合中立运行时、编译宿主、打包独立入口及前端 npm run typecheck # 宿主与前端类型检查 npm test # 构建与完整测试流程 仅修改面板时: npm run typecheck:client npm run build:client node --test test/client_*.test.mjs 项目结构 | 目录或文件 | 职责 | | client-src/ | 面板、图表、诊断配置操作、对比、报告与分享 UI | | client/client.js | esbuild 生成的浏览器入口 | | client-src/teamActivity.ts、client-src/teamCollaboration.tsx | 协作事件重建、关系图与交互时序 | | src/analytics/ | 轨迹指标与上下文时间线投影 | | src/analytics_entry.ts | 分析服务入口 | | src/diagnostic_config.ts | 可验证的压缩配置读取与应用 | | src/report_share.ts | 分享快照存储、有效期、密码与只读路由 | | src/index.ts、src/sandbox_entry.ts | aeval 控制与 transport 入口 | | cordis.patch.yml | 默认组合包挂载声明 | | test/ | 宿主、前端、配置、报告及分享测试 | 常见问题 安装后没有「轨迹分析」? 检查 profile 是否正确、插件是否启用、peer 版本是否满足。重建前端后重新加载页面;重建宿主代码后确认服务已重新加载。 装了之后会影响 DSH 性能吗? 本插件的分析基于宿主提交的事件投影,不拦截模型调用,不改变宿主运行策略。图表和指标在需要时按需计算,关闭面板后不持续消耗资源。 为什么控制状态是 standalone? 当前没有评测控制配置。这是正常的普通分析模式;需要跑受控评测时再接入完整控制栈。 数据会上传到外部吗? 不会。所有分析数据、报告快照和分享文件均保存在本地宿主 profile 中。分享链接仅在宿主运行期间可用,且不包含原始消息正文和工具参数。 为什么「压缩次数」和「压缩频率」看起来不同? 先核对是否包含历史修剪,以及分母是否为输入 Token。时间线区分摘要压缩与历史修剪;告警和对比的频率采用摘要压缩口径。 为什么两条 Token 曲线不同? 窗口占用包含缓存读,上下文内容估算包括历史思考、工具参数等保留内容,且与实际请求序列化和模型分词不同;顶部消耗采用未缓存输入加输出。可在演化页按请求查看估算成分与参与情况。 为什么配置应用成功后,当前会话还没变化? 检查界面中的生效范围。Agent 预设修改用于新建会话,已经运行的会话保留原预设版本。 差异报告在哪里下载? 在对比 Tab 完成「开始对比」,再到顶部「导出」选择团队版和 PDF、Markdown 或 HTML。 为什么同事打不开分享链接? 检查链接是否为本机地址、宿主是否运行、有效期及密码。团队访问需要可达的宿主地址。 更多文档 - 面板详细说明 — 各面板的详细交互、缩放操作和数据边界 - aeval 评测控制 — 完整控制栈配置、行配置示例和自检方法 - 市场安装到评测报告 - 证据链设计与数据约定 - 面板动图录制说明 - 变更记录 文档链接相对仓库根目录;从 npm 页面阅读时,可进入 GitHub 仓库 查看完整文档。 License Apache-2.0
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
xyrrrrr-r/dsh-eval-control
DSH 会话轨迹分析插件:上下文演化、团队协作图、工具错误证据链、智能告警、会话对比与导出,兼作 aeval 评测控制
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 3,801已汉化DeepSeek 客户端
74.5
网文长卷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,082已汉化DSH
71.7
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,292已汉化DSH
71.3
智能体运行框架路由HarnessRouter/harnessrouter
智能体运行框架的统一接口。
★ 3,800已汉化DSH
71.2