dsh-llm-verifier 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/lib/{auto-DAMeKRkK.js → auto-caXDU2pw.js} +19 -1
- package/lib/{auto-DAMeKRkK.js.map → auto-caXDU2pw.js.map} +1 -1
- package/lib/client.js +493 -331
- package/lib/client.js.map +1 -1
- package/lib/index.js +201 -52
- package/lib/index.js.map +1 -1
- package/lib/replay.js +1 -1
- package/lib/types/client-i18n.d.ts +36 -11
- package/lib/types/client-i18n.d.ts.map +1 -1
- package/lib/types/client-i18n.js +50 -9
- package/lib/types/client-i18n.js.map +1 -1
- package/lib/types/client.d.ts +17 -7
- package/lib/types/client.d.ts.map +1 -1
- package/lib/types/client.js +165 -44
- package/lib/types/client.js.map +1 -1
- package/lib/types/decisions.d.ts +8 -0
- package/lib/types/decisions.d.ts.map +1 -1
- package/lib/types/decisions.js +13 -1
- package/lib/types/decisions.js.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +47 -31
- package/lib/types/index.js.map +1 -1
- package/lib/types/process-selection.d.ts +27 -5
- package/lib/types/process-selection.d.ts.map +1 -1
- package/lib/types/process-selection.js +17 -8
- package/lib/types/process-selection.js.map +1 -1
- package/lib/types/router.d.ts +22 -0
- package/lib/types/router.d.ts.map +1 -1
- package/lib/types/router.js +20 -0
- package/lib/types/router.js.map +1 -1
- package/lib/types/statistics.d.ts +8 -0
- package/lib/types/statistics.d.ts.map +1 -1
- package/lib/types/statistics.js +1 -1
- package/lib/types/statistics.js.map +1 -1
- package/lib/types/verifier-activity.d.ts +189 -0
- package/lib/types/verifier-activity.d.ts.map +1 -0
- package/lib/types/verifier-activity.js +223 -0
- package/lib/types/verifier-activity.js.map +1 -0
- package/package.json +1 -1
- package/src/client-i18n.ts +55 -16
- package/src/client.test.ts +101 -16
- package/src/client.tsx +238 -103
- package/src/decisions.test.ts +16 -0
- package/src/decisions.ts +22 -1
- package/src/index.test.ts +32 -0
- package/src/index.ts +48 -33
- package/src/process-selection.test.ts +13 -0
- package/src/process-selection.ts +39 -14
- package/src/router.test.ts +46 -0
- package/src/router.ts +31 -0
- package/src/statistics.test.ts +16 -0
- package/src/statistics.ts +9 -1
- package/src/verifier-activity.test.ts +164 -0
- package/src/verifier-activity.ts +321 -0
- package/lib/types/process-activity.d.ts +0 -109
- package/lib/types/process-activity.d.ts.map +0 -1
- package/lib/types/process-activity.js +0 -135
- package/lib/types/process-activity.js.map +0 -1
- package/src/process-activity.test.ts +0 -91
- package/src/process-activity.ts +0 -177
package/README.md
CHANGED
|
@@ -540,6 +540,8 @@ Workflow 候选在被记录后的**下一步主模型请求之前**就会评审
|
|
|
540
540
|
|
|
541
541
|
**聊天提示(这段时间里界面为什么静止)**:周期在跑的时候主回复被整条缓冲,聊天界面**不会有任何流式文字**,看板上也还没落行。宿主那种行内提示(「正在压缩上下文…」)走的是**会话事件 + 客户端节点**,这条路对外部插件是关闭的:持久化读路径(`@deepseek-ai/dsh-session-persistence` 的 `validateStoredEvents`)会拒绝解释含 `KNOWN_SESSION_EVENT_TYPES`(仓库内生成)之外事件类型的日志,除非该记录带 `ignorable: true`,而 `Session.append()` 无法写入这个标记——只有 seed/restore 的持久化信封能带。**所以本插件一条会话事件都不写**,改用内存态回答:选择器按会话登记「本次周期在哪个阶段(生成 / 比较)、几份候选」,插件既有的 RPC 增加一个只读的 `{ kind: 'process', sessionId }`(纯内存查询:不读侧车、不调模型、不改任何判定),聊天输入框上方的 dock 只在**回合运行中、或刚结束的 20 秒内**轮询它,依次显示「正在过程选优:生成 N 份候选…」→「裁判比较 N 份候选…」→「已改用更优的回复 / 保留原回复 / 备选与原回复相同 / 未完成」。它**不进模型历史、不写会话日志、不参与任何判定**;重载后什么都不显示(那个周期确实已经不存在)。长期记录仍然只有统计看板。
|
|
542
542
|
|
|
543
|
+
同一块指示器也覆盖**自动路由与最终验收**:它们跑在 `agent/turn-stopping` 里,回复已经在屏幕上,但回合会一直开着等裁判(`compare` / `select` / `track` 各 6 次调用起,`select` 随候选数与对数上升;最终验收是判据数 × 轮次 × 裁判数)。发布点是**路由器的预约状态机**——那是唯一知道「一个周期被批准了、什么时候结算」的地方(`RouterCycleObserver`,可选且异常安全:一个坏掉的观察者绝不能改变预约、预算或判决),P06 自己的周期则由选择器发布更细的相位。于是这些窗口会显示「正在识别需要独立复核的对象…」→「正在比较候选方案 / 为多个候选排名 / 复核任务进度(约 N 次调用)…」,最终验收结束时给一次「最终验收通过 / 未通过」——**通过时宿主本来一句话都不说,这一行是唯一能看见它的地方**。这一行是**输入框上方的 dock 卡片**,几何与颜色都跟宿主同层的 Todo / Goal / Queue 卡片同族(同一条内容宽度轴:聊天内容列减去左右留白与四个 dock 内缩,高 36px、圆角 12px、底色 `--dsw-specific-tip`),状态点用宿主的 `StateDot`(进行中 / 完成 / 失败),容器带 `role="status"`,所以「通过」对读屏同样可达;它不是一条横贯窗口的状态行。计划预审与 Team 任务闸**不进**这块指示器:前者本来就有宿主的挂起工具行,后者窗口极短,加进去只是噪音。
|
|
544
|
+
|
|
543
545
|
### 定位诊断(Findings)与 smart 调度(P04)
|
|
544
546
|
|
|
545
547
|
判官在**同一次调用**里可以额外给出**至多 3 条**定位诊断(不额外购买「解释模型」):
|
|
@@ -565,6 +567,7 @@ Workflow 候选在被记录后的**下一步主模型请求之前**就会评审
|
|
|
565
567
|
- `explicitTagScores`:降级采用模型显式输出标签的评分次数。
|
|
566
568
|
- **前缀缓存预热(省钱项)**:提示词把任务与两条轨迹放在前面、判据放在**尾部**,以最大化同一次比较内各判据之间共享的提示词前缀;并且**每个不同前缀先单独跑一次**再扇出其余调用(换位轮次的前缀与未换位不同,因此各预热一次;`track` 的重复轮次发送的是同一条提示词,先跑第一轮再扇出)。预热用的是本来就要发生的调用,只改变顺序,**不增加调用次数**,只多一次串行等待;在没有前缀缓存的后端上收益为零、损失也只是这点等待。提示词布局或预热顺序是刻意设计,改动前请先读 `core.ts` 的 `buildPairwisePrompt` 注释与 `engine.ts` 的 warm-up 段。
|
|
567
569
|
- **两种"缓存命中率"要分清**:看板的「评分缓存命中率」是**本地评分缓存**命中(命中即不发模型请求),「前缀缓存命中率」是**模型服务端**按 token 计费口径统计的前缀命中(`cachedInputTokens / (inputTokens + cachedInputTokens)`,DSH 报告的两者是**不相交**的计数)。前者衡量省了多少次调用,后者衡量省了多少输入 token;只优化后者不会改变任何判决,而把两者混为一谈会让人误以为省钱优化无效。
|
|
570
|
+
- **看板与设置页只用宿主真实存在的主题 token**:所有颜色都写成 `--dsw-alias-*` / `--dsw-specific-*` / `--dsw-static-*` 里的名字,浅色与深色由宿主 token 表解析,不读主题标记、不手写两套色。原因见 `.agents/notes/implemented/bug-fix/2026-09-14-client-theme-tokens-and-activity-chip-geometry.md`:CSS 对取不到值的 `var()` **静默丢弃声明**,所以写错 token 名既不会被构建、类型检查也不会被单测发现,历史上就因此让看板在浅色主题下画出一片深色卡片。`src/client.test.ts` 里的 `client design tokens` 用例现在会双向校验这份名单(用了未登记的名字、或登记了没用的名字,都会失败)。
|
|
568
571
|
- **能力记忆**:当某个 Provider/Model 明确拒绝 `logprobs` 参数后,插件会记住该能力探测结果,避免后续每次调用重复报错。探测结果按话题持久化到 verifier 目录的 `capabilities-v1.json`(24 小时 TTL 后自动重新探测),随话题一并删除;跨进程与会话恢复不再重复探测,首次降级并发窗口内的相同请求也会合并在途调用、不重复计费。
|
|
569
572
|
|
|
570
573
|
## 隐私与数据安全边界
|
|
@@ -1475,12 +1475,26 @@ function boundDecision(decision, policy) {
|
|
|
1475
1475
|
return decision;
|
|
1476
1476
|
}
|
|
1477
1477
|
var AutoVerifierRouter = class {
|
|
1478
|
+
observer;
|
|
1478
1479
|
states = /* @__PURE__ */ new Map();
|
|
1479
1480
|
/** Agent ids that already received this task's budget-exhaustion notice. */
|
|
1480
1481
|
exhaustedNotices = /* @__PURE__ */ new Set();
|
|
1481
1482
|
serial = 0;
|
|
1482
1483
|
/** Namespace for this router's cycle ids; unique per router and per process incarnation. */
|
|
1483
1484
|
instance = ROUTER_EPOCH + "-" + ++routerInstanceSerial;
|
|
1485
|
+
/**
|
|
1486
|
+
* @param observer - optional reporting channel for the chat indicator.
|
|
1487
|
+
*/
|
|
1488
|
+
constructor(observer) {
|
|
1489
|
+
this.observer = observer;
|
|
1490
|
+
}
|
|
1491
|
+
/** Report one lifecycle edge, swallowing anything the observer throws. */
|
|
1492
|
+
observe(report) {
|
|
1493
|
+
if (this.observer === void 0) return;
|
|
1494
|
+
try {
|
|
1495
|
+
report(this.observer);
|
|
1496
|
+
} catch {}
|
|
1497
|
+
}
|
|
1484
1498
|
state(agent) {
|
|
1485
1499
|
const taskStartSeq = latestDirectUserSeq(sessionEvents(agent.session));
|
|
1486
1500
|
if (taskStartSeq === void 0) return void 0;
|
|
@@ -1551,6 +1565,7 @@ var AutoVerifierRouter = class {
|
|
|
1551
1565
|
}
|
|
1552
1566
|
state.taskModelCalls += expectedCalls;
|
|
1553
1567
|
state.sessionModelCalls += expectedCalls;
|
|
1568
|
+
this.observe((observer) => observer.begin?.(agent, reservation));
|
|
1554
1569
|
return reservation;
|
|
1555
1570
|
}
|
|
1556
1571
|
/**
|
|
@@ -1592,6 +1607,7 @@ var AutoVerifierRouter = class {
|
|
|
1592
1607
|
reservation.expectedCalls += expectedCalls;
|
|
1593
1608
|
state.taskModelCalls += expectedCalls;
|
|
1594
1609
|
state.sessionModelCalls += expectedCalls;
|
|
1610
|
+
this.observe((observer) => observer.promoted?.(agent, reservation));
|
|
1595
1611
|
return true;
|
|
1596
1612
|
}
|
|
1597
1613
|
commit(agent, reservation, evidenceSeq) {
|
|
@@ -1605,6 +1621,7 @@ var AutoVerifierRouter = class {
|
|
|
1605
1621
|
state.finalRequiredFromSeq = void 0;
|
|
1606
1622
|
state.finalPreferred = false;
|
|
1607
1623
|
}
|
|
1624
|
+
this.observe((observer) => observer.settled?.(agent, reservation, "committed"));
|
|
1608
1625
|
return true;
|
|
1609
1626
|
}
|
|
1610
1627
|
fail(agent, reservation, strict) {
|
|
@@ -1614,6 +1631,7 @@ var AutoVerifierRouter = class {
|
|
|
1614
1631
|
state.failed.add(reservation.fingerprint);
|
|
1615
1632
|
if (strict) state.strictBlocked = true;
|
|
1616
1633
|
if (reservation.phase === "final") state.finalPreferred = false;
|
|
1634
|
+
this.observe((observer) => observer.settled?.(agent, reservation, "failed"));
|
|
1617
1635
|
}
|
|
1618
1636
|
/**
|
|
1619
1637
|
* Claim this task's single budget-exhaustion notice.
|
|
@@ -2119,4 +2137,4 @@ function selectRouteFeedbackDetail(candidates, result, maxChars = MAX_ROUTE_FEED
|
|
|
2119
2137
|
//#endregion
|
|
2120
2138
|
export { verificationFailed as A, latestDirectUserSeq as C, semanticDecision as D, routedRepeats as E, ScoreCache as F, SingleFlight as I, resolveCacheFile as L, extractSession as M, sanitizeVerifierText as N, semanticReferencesVisible as O, sessionEvents as P, stableHash as R, itemBudget as S, parseSemanticRoute as T, buildSemanticRoutePrompt as _, compareRouteFeedbackDetail as a, inspectDeliveryPhase as b, selectRouteFeedbackDetail as c, AutoVerifierRouter as d, MAX_ROUTED_CHECKPOINTS as f, buildEvidenceIndex as g, boundDecision as h, automaticFeedback as i, verificationVerdict as j, semanticRouteHint as k, sessionAccepted as l, analyzeStructuredRoute as m, PROPOSAL_FEEDBACK_NOTE as n, failedAcceptanceCriteria as o, RECOVERY_FAILURE_CONTEXT_CHARS as p, analyzeAutoTask as r, isSubagentSession as s, MAX_ROUTE_FEEDBACK_CHARS as t, topScoreIndices as u, buildSemanticRouteView as v, nextDiagnosticCycleId as w, inspectRecoverySignal as x, estimateRoutedCalls as y };
|
|
2121
2139
|
|
|
2122
|
-
//# sourceMappingURL=auto-
|
|
2140
|
+
//# sourceMappingURL=auto-caXDU2pw.js.map
|