dsh-plugin-rollout-scout 1.3.1 → 1.4.1

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,8 +2,10 @@
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)
6
+ [![CI](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/actions/workflows/ci.yml/badge.svg)](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/actions/workflows/ci.yml)
5
7
  [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
- [![dsh](https://img.shields.io/badge/dsh-0.1.1--rc.2-4b8dff)](https://github.com/deepseek-ai/deepseek-harness)
8
+ [![dsh](https://img.shields.io/badge/dsh-0.1.2--rc.1-4b8dff)](https://github.com/deepseek-ai/deepseek-harness)
7
9
  [![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)
8
10
 
9
11
  Providers sometimes roll a new conversation model out gradually, so which one you get is luck of the draw. Rollout Scout opens throwaway conversations on your own account, reads each one's chain-of-thought **as it streams**, and scores how the reasoning is written — cancelling the ones that read like the model you already have, and keeping the ones that don't.
@@ -76,23 +78,27 @@ The actions live in a footer under the column, so they stay put while the settin
76
78
 
77
79
  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
80
 
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.
81
+ **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.
82
+
83
+ 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
84
 
81
85
  **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
86
 
83
87
  **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
88
 
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.
89
+ 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
90
 
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.
91
+ **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
92
 
89
93
  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
94
 
91
95
  **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
96
 
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.
97
+ 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.
98
+
99
+ 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
100
 
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.
101
+ 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
102
 
97
103
  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
104
 
@@ -101,14 +107,20 @@ The run lives on the host, so it keeps going when you close the console — the
101
107
  ## Install
102
108
 
103
109
  ```bash
104
- dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
110
+ dsh plugin --profile web add dsh-plugin-rollout-scout
105
111
  ```
106
112
 
107
113
  Restart DSH afterwards: the host half loads with the server. The interface follows DSH's display language (English / 中文).
108
114
 
115
+ Installing from the repository also works and tracks `master` rather than the last release:
116
+
117
+ ```bash
118
+ dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
119
+ ```
120
+
109
121
  `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
122
 
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.
123
+ `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
124
 
113
125
  ## How it works
114
126
 
@@ -123,6 +135,9 @@ Implementation notes live in [`docs/`](docs/) — [architecture](docs/architectu
123
135
 
124
136
  ## Compatibility
125
137
 
138
+ This release targets DSH `0.1.2-rc.1`. Run `npm ci`, `npm test`, and `npm run check:package` to verify the build and package. Restart DSH after updating.
139
+
140
+
126
141
  The launcher takes a `sidebar.footer.action` seat (a list slot, so it sits beside any other footer action rather than displacing one) and the console renders on the frame-wide `shell.overlay` layer. Neither is per-session, so it conflicts with no session plugin. Requires a DSH whose sidebar declares that seat; without it the console has no way in. Part of the same family as [dsh-plugin-smooth-stream](https://github.com/SpookySandwich/dsh-plugin-smooth-stream), [dsh-plugin-no-workspace](https://github.com/SpookySandwich/dsh-plugin-no-workspace) and [dsh-plugin-message-edit](https://github.com/SpookySandwich/dsh-plugin-message-edit).
127
142
 
128
143
  ## A note on cost
package/README.md CHANGED
@@ -2,8 +2,10 @@
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)
6
+ [![CI](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/actions/workflows/ci.yml/badge.svg)](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/actions/workflows/ci.yml)
5
7
  [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
- [![dsh](https://img.shields.io/badge/dsh-0.1.1--rc.2-4b8dff)](https://github.com/deepseek-ai/deepseek-harness)
8
+ [![dsh](https://img.shields.io/badge/dsh-0.1.2--rc.1-4b8dff)](https://github.com/deepseek-ai/deepseek-harness)
7
9
  [![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)
8
10
 
9
11
  服务商有时会灰度发布新的对话模型,你分到哪一个全看运气。灰度侦察会用你自己的账号开启一批临时会话,**在思维链流式输出的同时**读取它,并按「推理是怎么写的」打分——读起来像你手上这个旧模型的立刻中止,不像的留下来。
@@ -74,23 +76,27 @@ npm test
74
76
 
75
77
  评分阈值下方有一条**自检**:`自检 13/13 · 已知灰度样本保留 5/5`。它用当前表单里的设置,把十三条人工标注的思维链跑一遍——走的是真实探测同一套分类器,不消耗 Token、不发起探测。把「高于此分即保留」调到标注样本都够不着,它会变成橙色并列出被排除的样本。这是分辨「没找到」和「根本找不到」的办法,否则这两种情况在控制台里长得一模一样。
76
78
 
77
- **右栏** —— 已发起 / 进行中 / 已保留 / 已丢弃 / 最高分,下方队列按发起顺序排列、不随分数跳动。每行带分数条、命中短语与思维链预览。点击整张卡片打开会话,会话继续跑。鼠标放在卡片上视为需要它:淡出过程中移上去会救回来,点进去也不会停。
79
+ **右栏** —— 已发起 / 进行中 / 已保留 / 已丢弃 / 最高分,下方是随探测新增与离开正常流动的最新优先队列。每行带分数条、命中短语与思维链预览。鼠标放到某一行时,只把这一行钉在当前屏幕位置,显示 **固定中** 并露出 **保留**;其他行仍可正常移动。若它正在淡出,淡出也会立刻停止,鼠标还在时不能消失。点击整张卡片打开会话;从悬停直接点进会话时,这次临时救援会带进会话界面,直到鼠标再次移动。未固定、未保留的行默认不显示保留按钮;要真正留住一个探测,请在悬停时点 **保留**。
80
+
81
+ 固定必须收到宿主对当前这一次鼠标手势的明确确认;若请求被拒、超时或确认不匹配,界面会撤销固定,而不会显示一个实际没有保活能力的假状态。
78
82
 
79
83
  **开始** 前会先提醒你确认通知设置——一次运行会开启大量会话,而 DSH Desktop 可能逐个弹通知。探测提示词以插件消息发送,本身不会触发通知;弹窗会显示桌面通知当前是否开启,并可一键关闭。勾选 **不再提示** 即可跳过。
80
84
 
81
85
  **开始** 会变为 **暂停**:停止发起新探测,中止已判定为旧模型的探测,尚未判定的各自跑完。再变为 **继续**。**强制停止** 会中止所有进行中的会话。
82
86
 
83
- 判旧的探测先淡出约 3 秒(卡片底边一条细线收掉),期间会话还在跑;淡完才取消。鼠标放上去或点进去会留下。
87
+ 判旧的探测先淡出约 3 秒(卡片底边一条细线收掉),期间会话还在跑;淡完才取消。这个截止时间只在首次判旧时建立,后续流式文本不会把它重置。悬停会暂停并记住剩余时间,移开后只继续这一段,不会重新赠送完整 3 秒——只有 **保留** 才会真正留下。
84
88
 
85
- 卡片上的 **保留** 会让该会话不受本控制台其它任何操作影响:不淡出、不中止、不清理、不删除,且该标记在插件重载后依然有效。判定为灰度并跑完的探测会自动保留。再次点击 **已保留** 可交回常规规则处理。
89
+ 悬停时出现的 **保留** 是对会话文件的承诺:不淡出、不清理、不删除,且该标记在插件重载后依然有效。它不会让正在消耗 Token 的回合变成不可停止——**强制停止** 仍会结束该回合,但会话和保留标记都留下。判定为灰度并跑完的探测会自动保留。已保留的行会持续显示 **已保留**,再次点击可交回常规清理规则。
86
90
 
87
91
  探测会话在侧边栏里会自动命名:运行时叫 `灰度探测 12`,命中后改为 `★ 灰度命中 12 · 87%`,在一堆探测里一眼就能认出。已保留的卡片上有 **重命名**,可以自己起名字;起了名字就等于保留。
88
92
 
89
93
  **清空已结束** 会从列表移除已完成的探测,并删除这些会话文件。**删除全部会话** 会清空该目录下所有探测(包括已经从列表清掉的),并把编号从 1 重新计。
90
94
 
91
- 如果目录下出现了本控制台并未跟踪的探测会话——插件重载、升级或应用重启都会留下这类残留——顶部会出现提示条,可一键 **清理**。这些正是平时在侧边栏里删不掉的会话:外壳自带的菜单只有归档,没有删除。
95
+ 如果 Rollout Scout 的持久所有权记录里存在当前控制台没有对应卡片的探测会话——插件重载、升级或应用重启都会留下这类残留——顶部会出现提示条,可一键 **清理**。只有插件自己生成并记录的会话 ID 才算;DSH 的空白工作区占位会话,以及用户在同一目录里手动创建的普通会话,都不会被推断成探测。
96
+
97
+ v3 所有权记录把 `owned`、`protected`、`deleting` 分成三个独立状态。只有会话先持久进入 `deleting`,才允许物理删除;因此重载后可以继续未完成的清理,而不会把每一个未保留 ID 都误当成删到一半。保留操作在当前进程内按安全侧失败:写盘失败时卡片仍受保护,并显示 **重试保留**(或 **重试取消保留**),不会反向执行用户不想要的删除。请在重启前完成重试,因为文件系统从未接受的意图,任何应用都无法在重启后凭空还原。
92
98
 
93
- 两者都不会动仍在流式输出的探测;已保留的除外——它本就该一直跑着,因此不会挡住删除。暂停只是停止发起,进行中的探测仍在跑,所以此时 **删除全部会话** 会要求你先 **强制停止**,以免删掉正在写入的会话文件。存放目录不能是主目录、磁盘根目录,也不能位于 `~/.dsh` 之内——删除以该目录为范围,这些位置会把无关会话卷进去。
99
+ 两者都不会动仍在流式输出或正在释放资源的探测,已保留的也不例外。暂停只是停止发起,进行中的探测仍在跑,所以此时 **删除全部会话** 会要求你先 **强制停止**,并等宿主完成释放后才允许删除,以免删掉仍在写入的会话文件。存放目录不能是主目录、磁盘根目录,也不能位于 `~/.dsh` 之内——删除以该目录为范围,这些位置会把无关会话卷进去。
94
100
 
95
101
  若连续三个探测连启动都失败(服务不可达、目录不可写等),运行会自行停止并报出错误,而不是一直重复同一个失败。点 **继续** 可以重试。
96
102
 
@@ -99,14 +105,20 @@ npm test
99
105
  ## 安装
100
106
 
101
107
  ```bash
102
- dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
108
+ dsh plugin --profile web add dsh-plugin-rollout-scout
103
109
  ```
104
110
 
105
111
  安装后请重启 DSH:宿主端随服务器加载。界面跟随 DSH 显示语言(中文 / English)。
106
112
 
113
+ 也可以直接从仓库安装,跟的是 `master` 而不是最近一次发布:
114
+
115
+ ```bash
116
+ dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
117
+ ```
118
+
107
119
  `web` 是 profile 名称,请换成你实际使用的那个。独立版启动的是 `web`,DSH Desktop 用的是 `desktop`。`~/.dsh/profiles/` 下就是你现有的 profile,安装结果落在对应 profile 的 `package.json` 里。
108
120
 
109
- 尚未发布到 npm,因此从仓库安装。`lib/client.js` 是构建产物,但已**提交进仓库**,所以安装时无需任何构建步骤——`dsh plugin add` 底层是 pnpm,默认不会执行依赖的生命周期脚本。若你修改了 `plugin.client.js`,请运行 `npm run build` 重新生成(`npm test` 也会顺带生成),并把结果一并提交。
121
+ `lib/client.js` 是构建产物,但已**提交进仓库**,所以从仓库安装时也无需任何构建步骤。若你修改了 `plugin.client.js`,请运行 `npm run build` 重新生成(`npm test` 也会顺带生成),并把结果一并提交。
110
122
 
111
123
  ## 工作原理
112
124
 
@@ -121,6 +133,9 @@ dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
121
133
 
122
134
  ## 兼容性
123
135
 
136
+ 本次兼容目标为 DSH `0.1.2-rc.1`。运行 `npm ci`、`npm test` 和 `npm run check:package` 可验证构建及发布包。更新后请重启 DSH。
137
+
138
+
124
139
  入口占用 `sidebar.footer.action` 座位(list 类型,会与其它底部操作并排,而不是把谁挤掉),控制台本体渲染在全局 `shell.overlay` 层。两者都不属于会话作用域,因此不与任何会话内插件冲突。需要侧边栏声明了该座位的 DSH 版本;否则控制台将没有入口。与 [dsh-plugin-smooth-stream](https://github.com/SpookySandwich/dsh-plugin-smooth-stream)、[dsh-plugin-no-workspace](https://github.com/SpookySandwich/dsh-plugin-no-workspace)、[dsh-plugin-message-edit](https://github.com/SpookySandwich/dsh-plugin-message-edit) 同族。
125
140
 
126
141
  ## 关于额度
package/_wrap-client.mjs CHANGED
@@ -29,4 +29,4 @@ const out = [
29
29
  "",
30
30
  ].join('\n');
31
31
  fs.writeFileSync(new URL('./lib/client.js', import.meta.url), out);
32
- console.log('wrote lib/client.js', out.length);
32
+ console.error('wrote lib/client.js', out.length);