dsh-llm-verifier 0.6.2 → 0.6.3

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 CHANGED
@@ -540,7 +540,7 @@ 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 任务闸**不进**这块指示器:前者本来就有宿主的挂起工具行,后者窗口极短,加进去只是噪音。
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"`,所以「通过」对读屏同样可达;它不是一条横贯窗口的状态行。**这张卡片只有一个元素**:宽度轴与表面(描边、圆角、底色)声明在同一个盒子上——composer stack 是宿主区域,宿主或皮肤样式表可以给 dock 行刷底,多一层「宽而无底」的 wrapper 会让那层底在卡片两侧露出一条遮罩(见 `.agents/notes/implemented/bug-fix/2026-09-15-single-element-activity-card.md`),`client.test.ts` 的 `client activity card structure` 锁死了这一点。计划预审与 Team 任务闸**不进**这块指示器:前者本来就有宿主的挂起工具行,后者窗口极短,加进去只是噪音。
544
544
 
545
545
  ### 定位诊断(Findings)与 smart 调度(P04)
546
546
 
package/lib/client.js CHANGED
@@ -4468,18 +4468,19 @@ window.__ModuleLoader__.load({
4468
4468
  * four dock insets — and the fallbacks below only matter on a host that does not publish the three
4469
4469
  * custom properties. Without this clamp the status line stretches to the window edge and its text
4470
4470
  * sits far left of the composer it belongs to, which is exactly the misplacement it is here to fix.
4471
+ *
4472
+ * ONE element owns BOTH the dock-column width and the card surface. The composer stack is a host
4473
+ * region a host or skin stylesheet may paint (the dock row, for instance with the tip surface), and
4474
+ * a wider wrapper that paints no background of its own would show that paint as a mask reaching
4475
+ * well past the card on both sides. The surface here is declared inline, so it is itself the card:
4476
+ * a background can never be painted outside the border box it is declared on.
4471
4477
  */
4472
- const activityDock = {
4473
- boxSizing: "border-box",
4474
- width: "calc(100% - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-dock-inset, 8px) - var(--dsh-composer-dock-inset, 8px) - var(--dsh-composer-dock-inset, 8px) - var(--dsh-composer-dock-inset, 8px))",
4475
- margin: "0 auto"
4476
- };
4477
- const activityBar = {
4478
+ const activityCard = {
4478
4479
  boxSizing: "border-box",
4479
4480
  display: "flex",
4480
4481
  alignItems: "center",
4481
4482
  gap: 10,
4482
- width: "100%",
4483
+ width: "calc(100% - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-dock-inset, 8px) - var(--dsh-composer-dock-inset, 8px) - var(--dsh-composer-dock-inset, 8px) - var(--dsh-composer-dock-inset, 8px))",
4483
4484
  maxWidth: "calc(var(--dsh-composer-card-max-width, 952px) - 4 * var(--dsh-composer-dock-inset, 8px))",
4484
4485
  height: 36,
4485
4486
  margin: "0 auto",
@@ -4546,20 +4547,17 @@ window.__ModuleLoader__.load({
4546
4547
  ]);
4547
4548
  if (rendered === null) return null;
4548
4549
  const dotState = rendered.tone === "busy" ? "ongoing" : rendered.tone === "ok" ? "done" : "error";
4549
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4550
- style: activityDock,
4551
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4552
- style: activityBar,
4553
- role: "status",
4554
- "aria-live": "polite",
4555
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4556
- state: dotState,
4557
- size: 8
4558
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4559
- style: activityTextStyle,
4560
- children: rendered.text
4561
- })]
4562
- })
4550
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4551
+ style: activityCard,
4552
+ role: "status",
4553
+ "aria-live": "polite",
4554
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4555
+ state: dotState,
4556
+ size: 8
4557
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4558
+ style: activityTextStyle,
4559
+ children: rendered.text
4560
+ })]
4563
4561
  });
4564
4562
  }
4565
4563
  /**