dsh-plugin-rollout-scout 1.3.1 → 1.4.0

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.en.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  English | [简体中文](README.md)
4
4
 
5
+ [![npm](https://img.shields.io/npm/v/dsh-plugin-rollout-scout?color=cb3837&logo=npm)](https://www.npmjs.com/package/dsh-plugin-rollout-scout)
5
6
  [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
7
  [![dsh](https://img.shields.io/badge/dsh-0.1.1--rc.2-4b8dff)](https://github.com/deepseek-ai/deepseek-harness)
7
8
  [![stars](https://img.shields.io/github/stars/SpookySandwich/dsh-plugin-rollout-scout?style=flat&label=stars)](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/stargazers)
@@ -76,23 +77,27 @@ The actions live in a footer under the column, so they stay put while the settin
76
77
 
77
78
  Under the scoring thresholds sits a **self-check**: `Self-check 13/13 · known rollout samples kept 5/5`. It runs thirteen hand-labelled chains-of-thought through the same classifier a live probe goes through, under whatever settings are currently in the form — no tokens, no probes. Tighten `Keep above` past what a labelled catch can reach and it turns amber and names the samples you just excluded. It is how you tell *nothing found* apart from *nothing findable*, which otherwise look identical from the console.
78
79
 
79
- **Right** — launched / live / kept / discarded / best score, above a queue in launch order that never jumps. Each row has a score meter, matched phrases, and a preview. Click a card to open the conversation it keeps running. Hover means you need it: putting the mouse on a fading card rescues it.
80
+ **Right** — launched / live / kept / discarded / best score, above a newest-first queue that keeps flowing as probes launch and leave. Each row has a score meter, matched phrases, and a preview. Hovering pins only that card at its current screen position, labels it **pinned**, and reveals **Keep**, while every other row keeps moving normally; a fading card also stops fading and cannot disappear under the pointer. Click a card to open the conversation. Clicking straight into it carries that temporary rescue across the transition until the pointer moves again. Ordinary unpinned, unkept rows show no retention control; to keep a probe for good, press **Keep** while hovering it.
81
+
82
+ Pinning requires an explicit host acknowledgement for that exact pointer gesture. A rejection, timeout, or mismatched acknowledgement removes the local pin instead of displaying a state that has no real keep-alive authority.
80
83
 
81
84
  **Start** asks you to check your notifications first — a run opens a lot of conversations, and DSH Desktop can announce every one of them. Probe prompts are sent as plugin messages so they raise no toast of their own, and the dialog shows whether desktop notifications are on and offers to switch them off. Tick **Do not show this again** to skip it in future.
82
85
 
83
86
  **Start** becomes **Pause**, which stops launching, cancels the probes already judged as the old model, and lets the undecided ones reach their own verdict. Then **Resume**. **Force stop** aborts everything still in flight.
84
87
 
85
- A probe judged old fades for about 3 seconds (a thin line at the bottom of the card) while the turn is still running, then cancels. Hover or click during the fade keeps it.
88
+ A probe judged old fades for about 3 seconds (a thin line at the bottom of the card) while the turn is still running, then cancels. That deadline is established only on the first old verdict; later streaming chunks cannot reset it. Hovering pauses and saves the remaining time, and mouseleave resumes only that remainder rather than granting a fresh 3 seconds. Only **Keep** keeps it.
86
89
 
87
- **Keep** on any card takes that conversation out of reach of everything else in the console: it is never faded, cancelled, swept or deleted, and the promise survives a plugin reload. Probes that finish as a confident catch are kept automatically. Click **Kept** again to hand one back to the ordinary rules.
90
+ **Keep**, revealed while hovering a card, is a promise about the conversation on disk: it is never faded, swept or deleted, and the promise survives a plugin reload. It does not make a token-spending turn unstoppable — **Force stop** still ends the active turn while preserving both the conversation and its Keep mark. Probes that finish as a confident catch are kept automatically. A retained row keeps showing **Kept**; click it again to hand the conversation back to cleanup rules.
88
91
 
89
92
  Probes are named in the sidebar as you go — `Rollout probe 12` while running, and `★ Rollout catch 12 · 87%` once one is caught, so a hit is obvious in a list full of probes. **Rename** on a kept card lets you name it yourself; naming one keeps it.
90
93
 
91
94
  **Clear finished** removes completed probes from the list *and* deletes those conversations from disk. **Delete all sessions** wipes every probe in the folder — including ones already cleared from the list — and resets numbering so the next run starts at probe 1.
92
95
 
93
- If probe conversations turn up in the folder that the console is not tracking — left by a plugin reload, an upgrade, or an app restart — a banner offers to **sweep** them. Those are the ones that otherwise sit in the sidebar with no way to remove them, since the shell's own menu offers Archive but not Delete.
96
+ If Rollout Scout's durable ownership record contains probe conversations that the current console has no cards for — left by a plugin reload, an upgrade, or an app restart — a banner offers to **sweep** them. Only session IDs generated and recorded by the plugin qualify; DSH's blank workspace placeholder and ordinary conversations opened in the same folder are never inferred to be probes.
97
+
98
+ The v3 ownership record keeps `owned`, `protected`, and `deleting` as separate states. Physical removal is permitted only after the session has durably entered `deleting`, so a reload can resume an interrupted cleanup without treating every unprotected ID as a half-finished delete. Keep is fail-closed inside the running app: if its disk write fails, the card remains protected and shows **Retry Keep** (or **Retry Unkeep**) instead of reversing the user's request. Retry before restarting, because no application can reconstruct an intent that the filesystem never accepted.
94
99
 
95
- Both refuse to touch a probe that is still streaming, except a kept one — that stays live on purpose, so it does not hold up a delete. Pause stops launching but leaves probes in flight, so **Delete all sessions** asks you to **Force stop** first rather than unlinking a log that is still being written to. The probe folder may not be your home directory, a drive root, or anywhere inside `~/.dsh` — deleting is scoped to that folder, and those would put unrelated conversations in its path.
100
+ Both refuse to touch a probe that is still streaming or draining resources, including a kept one. Pause stops launching but leaves probes in flight, so **Delete all sessions** asks you to **Force stop** first and waits for host teardown before unlinking any log that may still be written to. The probe folder may not be your home directory, a drive root, or anywhere inside `~/.dsh` — deleting is scoped to that folder, and those would put unrelated conversations in its path.
96
101
 
97
102
  If three probes in a row fail to even start — provider unreachable, folder unwritable — the run stops itself and reports the error instead of relaunching into the same failure forever. **Resume** tries again.
98
103
 
@@ -101,14 +106,20 @@ The run lives on the host, so it keeps going when you close the console — the
101
106
  ## Install
102
107
 
103
108
  ```bash
104
- dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
109
+ dsh plugin --profile web add dsh-plugin-rollout-scout
105
110
  ```
106
111
 
107
112
  Restart DSH afterwards: the host half loads with the server. The interface follows DSH's display language (English / 中文).
108
113
 
114
+ Installing from the repository also works and tracks `master` rather than the last release:
115
+
116
+ ```bash
117
+ dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
118
+ ```
119
+
109
120
  `web` is the profile name — use whichever profile you actually run. The standalone harness boots `web`; DSH Desktop uses `desktop`. `~/.dsh/profiles/` lists the ones you have, and the installed bundle ends up in that profile's `package.json`.
110
121
 
111
- Not on npm yet, so install from the repository. `lib/client.js` is a generated bundle but it is **committed**, so the install works without running any build step — `dsh plugin add` is pnpm underneath and does not run dependency lifecycle scripts by default. If you edit `plugin.client.js`, run `npm run build` to regenerate it (`npm test` does this too), and commit the result.
122
+ `lib/client.js` is a generated bundle but it is **committed**, so a repository install needs no build step. If you edit `plugin.client.js`, run `npm run build` to regenerate it (`npm test` does this too), and commit the result.
112
123
 
113
124
  ## How it works
114
125
 
package/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [English](README.en.md) | 简体中文
4
4
 
5
+ [![npm](https://img.shields.io/npm/v/dsh-plugin-rollout-scout?color=cb3837&logo=npm)](https://www.npmjs.com/package/dsh-plugin-rollout-scout)
5
6
  [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
7
  [![dsh](https://img.shields.io/badge/dsh-0.1.1--rc.2-4b8dff)](https://github.com/deepseek-ai/deepseek-harness)
7
8
  [![stars](https://img.shields.io/github/stars/SpookySandwich/dsh-plugin-rollout-scout?style=flat&label=stars)](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/stargazers)
@@ -74,23 +75,27 @@ npm test
74
75
 
75
76
  评分阈值下方有一条**自检**:`自检 13/13 · 已知灰度样本保留 5/5`。它用当前表单里的设置,把十三条人工标注的思维链跑一遍——走的是真实探测同一套分类器,不消耗 Token、不发起探测。把「高于此分即保留」调到标注样本都够不着,它会变成橙色并列出被排除的样本。这是分辨「没找到」和「根本找不到」的办法,否则这两种情况在控制台里长得一模一样。
76
77
 
77
- **右栏** —— 已发起 / 进行中 / 已保留 / 已丢弃 / 最高分,下方队列按发起顺序排列、不随分数跳动。每行带分数条、命中短语与思维链预览。点击整张卡片打开会话,会话继续跑。鼠标放在卡片上视为需要它:淡出过程中移上去会救回来,点进去也不会停。
78
+ **右栏** —— 已发起 / 进行中 / 已保留 / 已丢弃 / 最高分,下方是随探测新增与离开正常流动的最新优先队列。每行带分数条、命中短语与思维链预览。鼠标放到某一行时,只把这一行钉在当前屏幕位置,显示 **固定中** 并露出 **保留**;其他行仍可正常移动。若它正在淡出,淡出也会立刻停止,鼠标还在时不能消失。点击整张卡片打开会话;从悬停直接点进会话时,这次临时救援会带进会话界面,直到鼠标再次移动。未固定、未保留的行默认不显示保留按钮;要真正留住一个探测,请在悬停时点 **保留**。
79
+
80
+ 固定必须收到宿主对当前这一次鼠标手势的明确确认;若请求被拒、超时或确认不匹配,界面会撤销固定,而不会显示一个实际没有保活能力的假状态。
78
81
 
79
82
  **开始** 前会先提醒你确认通知设置——一次运行会开启大量会话,而 DSH Desktop 可能逐个弹通知。探测提示词以插件消息发送,本身不会触发通知;弹窗会显示桌面通知当前是否开启,并可一键关闭。勾选 **不再提示** 即可跳过。
80
83
 
81
84
  **开始** 会变为 **暂停**:停止发起新探测,中止已判定为旧模型的探测,尚未判定的各自跑完。再变为 **继续**。**强制停止** 会中止所有进行中的会话。
82
85
 
83
- 判旧的探测先淡出约 3 秒(卡片底边一条细线收掉),期间会话还在跑;淡完才取消。鼠标放上去或点进去会留下。
86
+ 判旧的探测先淡出约 3 秒(卡片底边一条细线收掉),期间会话还在跑;淡完才取消。这个截止时间只在首次判旧时建立,后续流式文本不会把它重置。悬停会暂停并记住剩余时间,移开后只继续这一段,不会重新赠送完整 3 秒——只有 **保留** 才会真正留下。
84
87
 
85
- 卡片上的 **保留** 会让该会话不受本控制台其它任何操作影响:不淡出、不中止、不清理、不删除,且该标记在插件重载后依然有效。判定为灰度并跑完的探测会自动保留。再次点击 **已保留** 可交回常规规则处理。
88
+ 悬停时出现的 **保留** 是对会话文件的承诺:不淡出、不清理、不删除,且该标记在插件重载后依然有效。它不会让正在消耗 Token 的回合变成不可停止——**强制停止** 仍会结束该回合,但会话和保留标记都留下。判定为灰度并跑完的探测会自动保留。已保留的行会持续显示 **已保留**,再次点击可交回常规清理规则。
86
89
 
87
90
  探测会话在侧边栏里会自动命名:运行时叫 `灰度探测 12`,命中后改为 `★ 灰度命中 12 · 87%`,在一堆探测里一眼就能认出。已保留的卡片上有 **重命名**,可以自己起名字;起了名字就等于保留。
88
91
 
89
92
  **清空已结束** 会从列表移除已完成的探测,并删除这些会话文件。**删除全部会话** 会清空该目录下所有探测(包括已经从列表清掉的),并把编号从 1 重新计。
90
93
 
91
- 如果目录下出现了本控制台并未跟踪的探测会话——插件重载、升级或应用重启都会留下这类残留——顶部会出现提示条,可一键 **清理**。这些正是平时在侧边栏里删不掉的会话:外壳自带的菜单只有归档,没有删除。
94
+ 如果 Rollout Scout 的持久所有权记录里存在当前控制台没有对应卡片的探测会话——插件重载、升级或应用重启都会留下这类残留——顶部会出现提示条,可一键 **清理**。只有插件自己生成并记录的会话 ID 才算;DSH 的空白工作区占位会话,以及用户在同一目录里手动创建的普通会话,都不会被推断成探测。
95
+
96
+ v3 所有权记录把 `owned`、`protected`、`deleting` 分成三个独立状态。只有会话先持久进入 `deleting`,才允许物理删除;因此重载后可以继续未完成的清理,而不会把每一个未保留 ID 都误当成删到一半。保留操作在当前进程内按安全侧失败:写盘失败时卡片仍受保护,并显示 **重试保留**(或 **重试取消保留**),不会反向执行用户不想要的删除。请在重启前完成重试,因为文件系统从未接受的意图,任何应用都无法在重启后凭空还原。
92
97
 
93
- 两者都不会动仍在流式输出的探测;已保留的除外——它本就该一直跑着,因此不会挡住删除。暂停只是停止发起,进行中的探测仍在跑,所以此时 **删除全部会话** 会要求你先 **强制停止**,以免删掉正在写入的会话文件。存放目录不能是主目录、磁盘根目录,也不能位于 `~/.dsh` 之内——删除以该目录为范围,这些位置会把无关会话卷进去。
98
+ 两者都不会动仍在流式输出或正在释放资源的探测,已保留的也不例外。暂停只是停止发起,进行中的探测仍在跑,所以此时 **删除全部会话** 会要求你先 **强制停止**,并等宿主完成释放后才允许删除,以免删掉仍在写入的会话文件。存放目录不能是主目录、磁盘根目录,也不能位于 `~/.dsh` 之内——删除以该目录为范围,这些位置会把无关会话卷进去。
94
99
 
95
100
  若连续三个探测连启动都失败(服务不可达、目录不可写等),运行会自行停止并报出错误,而不是一直重复同一个失败。点 **继续** 可以重试。
96
101
 
@@ -99,14 +104,20 @@ npm test
99
104
  ## 安装
100
105
 
101
106
  ```bash
102
- dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
107
+ dsh plugin --profile web add dsh-plugin-rollout-scout
103
108
  ```
104
109
 
105
110
  安装后请重启 DSH:宿主端随服务器加载。界面跟随 DSH 显示语言(中文 / English)。
106
111
 
112
+ 也可以直接从仓库安装,跟的是 `master` 而不是最近一次发布:
113
+
114
+ ```bash
115
+ dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
116
+ ```
117
+
107
118
  `web` 是 profile 名称,请换成你实际使用的那个。独立版启动的是 `web`,DSH Desktop 用的是 `desktop`。`~/.dsh/profiles/` 下就是你现有的 profile,安装结果落在对应 profile 的 `package.json` 里。
108
119
 
109
- 尚未发布到 npm,因此从仓库安装。`lib/client.js` 是构建产物,但已**提交进仓库**,所以安装时无需任何构建步骤——`dsh plugin add` 底层是 pnpm,默认不会执行依赖的生命周期脚本。若你修改了 `plugin.client.js`,请运行 `npm run build` 重新生成(`npm test` 也会顺带生成),并把结果一并提交。
120
+ `lib/client.js` 是构建产物,但已**提交进仓库**,所以从仓库安装时也无需任何构建步骤。若你修改了 `plugin.client.js`,请运行 `npm run build` 重新生成(`npm test` 也会顺带生成),并把结果一并提交。
110
121
 
111
122
  ## 工作原理
112
123