dsh-plugin-rollout-scout 1.4.1 → 1.5.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 +8 -2
- package/README.md +8 -2
- package/lib/index.js +40 -27
- package/package.json +70 -67
package/README.en.md
CHANGED
|
@@ -5,7 +5,7 @@ English | [简体中文](README.md)
|
|
|
5
5
|
[](https://www.npmjs.com/package/dsh-plugin-rollout-scout)
|
|
6
6
|
[](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/actions/workflows/ci.yml)
|
|
7
7
|
[](LICENSE)
|
|
8
|
-
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
9
9
|
[](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/stargazers)
|
|
10
10
|
|
|
11
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.
|
|
@@ -135,7 +135,13 @@ Implementation notes live in [`docs/`](docs/) — [architecture](docs/architectu
|
|
|
135
135
|
|
|
136
136
|
## Compatibility
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
Version `1.5.0`: Consume transient agent/assistant-stream frames on DSH 0.1.5, retain the legacy feed without duplicate counting, and unwrap persistence snapshot headers for cleanup.
|
|
139
|
+
|
|
140
|
+
The declared host range is `>=0.1.5-rc.2 <0.1.6-0`; the official `0.1.5-rc.2` runtime was verified. DSH `0.1.6` alpha is not claimed compatible. Keep the previous plugin release on older DSH. [Validation record](.github/reviews/dsh-0.1.5.md).
|
|
141
|
+
|
|
142
|
+
Download the archive from the [GitHub Release](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/releases/tag/v1.5.0), then run `dsh plugin --profile desktop add ./dsh-plugin-rollout-scout-1.5.0.tgz`.
|
|
143
|
+
|
|
144
|
+
This release targets DSH `0.1.5-rc.2`. Run `npm ci`, `npm test`, and `npm run check:package` to verify the build and package. Restart DSH after updating.
|
|
139
145
|
|
|
140
146
|
|
|
141
147
|
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).
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://www.npmjs.com/package/dsh-plugin-rollout-scout)
|
|
6
6
|
[](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/actions/workflows/ci.yml)
|
|
7
7
|
[](LICENSE)
|
|
8
|
-
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
9
9
|
[](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/stargazers)
|
|
10
10
|
|
|
11
11
|
服务商有时会灰度发布新的对话模型,你分到哪一个全看运气。灰度侦察会用你自己的账号开启一批临时会话,**在思维链流式输出的同时**读取它,并按「推理是怎么写的」打分——读起来像你手上这个旧模型的立刻中止,不像的留下来。
|
|
@@ -133,7 +133,13 @@ dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
|
|
|
133
133
|
|
|
134
134
|
## 兼容性
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
版本 `1.5.0`:适配 DSH 0.1.5 的 agent/assistant-stream 瞬态流式事件,保留旧事件支持并防止重复计数,兼容持久化列表的新快照结构。
|
|
137
|
+
|
|
138
|
+
声明兼容范围为 `>=0.1.5-rc.2 <0.1.6-0`;已验证官方 `0.1.5-rc.2`,不声明兼容 `0.1.6` alpha。旧版 DSH 请保留上一插件版本。[验证记录](.github/reviews/dsh-0.1.5.md)。
|
|
139
|
+
|
|
140
|
+
可从 [GitHub Release](https://github.com/SpookySandwich/dsh-plugin-rollout-scout/releases/tag/v1.5.0) 下载发布包,然后执行 `dsh plugin --profile desktop add ./dsh-plugin-rollout-scout-1.5.0.tgz`。
|
|
141
|
+
|
|
142
|
+
本次兼容目标为 DSH `0.1.5-rc.2`。运行 `npm ci`、`npm test` 和 `npm run check:package` 可验证构建及发布包。更新后请重启 DSH。
|
|
137
143
|
|
|
138
144
|
|
|
139
145
|
入口占用 `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) 同族。
|
package/lib/index.js
CHANGED
|
@@ -1309,6 +1309,11 @@ async function launch(ctx, attempt) {
|
|
|
1309
1309
|
}
|
|
1310
1310
|
// Scoped: only this agent's events reach this listener.
|
|
1311
1311
|
agentCtx.on('session/event', (session, event) => onSessionEvent(ctx, attempt, event));
|
|
1312
|
+
// DSH 0.1.5 keeps chunks transient instead of persisting assistant/chunk.
|
|
1313
|
+
// Subscribe before publication so even a fast first chunk is observed.
|
|
1314
|
+
agentCtx.on('agent/assistant-stream', ({ frame }) => {
|
|
1315
|
+
if (frame?.type === 'chunk') onAssistantChunk(ctx, attempt, frame.chunk, 'agent');
|
|
1316
|
+
});
|
|
1312
1317
|
},
|
|
1313
1318
|
});
|
|
1314
1319
|
attempt.handle = handle;
|
|
@@ -1333,35 +1338,43 @@ async function launch(ctx, attempt) {
|
|
|
1333
1338
|
handle.agent.followup(probeMessage(config.prompt));
|
|
1334
1339
|
}
|
|
1335
1340
|
|
|
1336
|
-
function
|
|
1341
|
+
function onAssistantChunk(ctx, attempt, chunk, source) {
|
|
1337
1342
|
if (isEnded(attempt)) return;
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
attempt.chunkCount = (attempt.chunkCount || 0) + 1;
|
|
1350
|
-
const elapsedSec = (now - attempt.firstChunkAt) / 1000;
|
|
1351
|
-
if (attempt.chunkCount >= 8 && elapsedSec >= 0.4) {
|
|
1352
|
-
attempt.tps = Math.round((attempt.chunkCount / elapsedSec) * 10) / 10;
|
|
1353
|
-
}
|
|
1354
|
-
if (attempt.lastChunkAt !== null && text.length > 0
|
|
1355
|
-
&& now - attempt.lastChunkAt >= PAUSE_MS
|
|
1356
|
-
&& attempt.burstChars >= BURST_MIN_CHARS) {
|
|
1357
|
-
attempt.pauses += 1;
|
|
1358
|
-
attempt.burstChars = 0;
|
|
1343
|
+
// Some transitional hosts may expose both feeds. Consume exactly one so
|
|
1344
|
+
// scores, timing and paragraph counts cannot double-count the same text.
|
|
1345
|
+
if (attempt.chunkSource !== undefined && attempt.chunkSource !== source) return;
|
|
1346
|
+
attempt.chunkSource = source;
|
|
1347
|
+
if (chunk.type === 'reasoning-delta') {
|
|
1348
|
+
const now = Date.now();
|
|
1349
|
+
const text = chunk.text || '';
|
|
1350
|
+
if (attempt.firstChunkAt === null) {
|
|
1351
|
+
attempt.firstChunkAt = now;
|
|
1352
|
+
if (attempt.promptSentAt !== null) {
|
|
1353
|
+
attempt.ttft = Math.round((now - attempt.promptSentAt) / 100) / 10;
|
|
1359
1354
|
}
|
|
1360
|
-
attempt.lastChunkAt = now;
|
|
1361
|
-
attempt.burstChars += text.length;
|
|
1362
|
-
attempt.reasoning += text;
|
|
1363
|
-
evaluate(ctx, attempt);
|
|
1364
1355
|
}
|
|
1356
|
+
attempt.chunkCount = (attempt.chunkCount || 0) + 1;
|
|
1357
|
+
const elapsedSec = (now - attempt.firstChunkAt) / 1000;
|
|
1358
|
+
if (attempt.chunkCount >= 8 && elapsedSec >= 0.4) {
|
|
1359
|
+
attempt.tps = Math.round((attempt.chunkCount / elapsedSec) * 10) / 10;
|
|
1360
|
+
}
|
|
1361
|
+
if (attempt.lastChunkAt !== null && text.length > 0
|
|
1362
|
+
&& now - attempt.lastChunkAt >= PAUSE_MS
|
|
1363
|
+
&& attempt.burstChars >= BURST_MIN_CHARS) {
|
|
1364
|
+
attempt.pauses += 1;
|
|
1365
|
+
attempt.burstChars = 0;
|
|
1366
|
+
}
|
|
1367
|
+
attempt.lastChunkAt = now;
|
|
1368
|
+
attempt.burstChars += text.length;
|
|
1369
|
+
attempt.reasoning += text;
|
|
1370
|
+
evaluate(ctx, attempt);
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
function onSessionEvent(ctx, attempt, event) {
|
|
1375
|
+
if (isEnded(attempt)) return;
|
|
1376
|
+
if (event.type === 'assistant/chunk') {
|
|
1377
|
+
onAssistantChunk(ctx, attempt, event.data.chunk, 'session');
|
|
1365
1378
|
return;
|
|
1366
1379
|
}
|
|
1367
1380
|
if (event.type === 'turn/end') {
|
|
@@ -2182,7 +2195,7 @@ async function removeSessionLog(ctx, sessionId, headers, cwd) {
|
|
|
2182
2195
|
// computation over `{ id, cwd }`. Depending on it alone left behind the log
|
|
2183
2196
|
// of any session it had not caught up with — and a log whose workspace slot
|
|
2184
2197
|
// is gone is an ungrouped sidebar row with no Delete in its menu.
|
|
2185
|
-
const header = headers.find((h) => h.id === sessionId)
|
|
2198
|
+
const header = headers.map((snapshot) => snapshot.header ?? snapshot).find((h) => h.id === sessionId)
|
|
2186
2199
|
?? (cwd === undefined ? undefined : { id: sessionId, cwd });
|
|
2187
2200
|
if (header === undefined) throw new Error(`找不到会话记录 ${sessionId} / session record not found`);
|
|
2188
2201
|
let location;
|
package/package.json
CHANGED
|
@@ -1,67 +1,70 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-plugin-rollout-scout",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Detect which conversation model your DeepSeek Harness account is served: score probe conversations' live chain-of-thought, cancel old-model probes in seconds, keep confident catches.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "lib/index.js",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": {
|
|
9
|
-
"default": "./lib/index.js"
|
|
10
|
-
},
|
|
11
|
-
"./client": {
|
|
12
|
-
"default": "./lib/client.js"
|
|
13
|
-
},
|
|
14
|
-
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
15
|
-
"./package.json": "./package.json"
|
|
16
|
-
},
|
|
17
|
-
"files": [
|
|
18
|
-
"lib",
|
|
19
|
-
"cordis.patch.yml",
|
|
20
|
-
"plugin.client.js",
|
|
21
|
-
"_wrap-client.mjs"
|
|
22
|
-
],
|
|
23
|
-
"license": "MIT",
|
|
24
|
-
"repository": {
|
|
25
|
-
"type": "git",
|
|
26
|
-
"url": "git+https://github.com/SpookySandwich/dsh-plugin-rollout-scout.git"
|
|
27
|
-
},
|
|
28
|
-
"keywords": [
|
|
29
|
-
"dsh",
|
|
30
|
-
"dsh-plugin",
|
|
31
|
-
"deepseek-harness",
|
|
32
|
-
"cordis-plugin",
|
|
33
|
-
"rollout",
|
|
34
|
-
"ab-test",
|
|
35
|
-
"model-detection"
|
|
36
|
-
],
|
|
37
|
-
"dsh": {
|
|
38
|
-
"bundle": {
|
|
39
|
-
"patch": "./cordis.patch.yml"
|
|
40
|
-
},
|
|
41
|
-
"client": {
|
|
42
|
-
"platform": "web",
|
|
43
|
-
"inject": [
|
|
44
|
-
"@deepseek-ai/dsh-api-session-controller",
|
|
45
|
-
"@deepseek-ai/dsh-client-locale",
|
|
46
|
-
"@deepseek-ai/dsh-client-ui-
|
|
47
|
-
"@deepseek-ai/dsh-client-ui-layout",
|
|
48
|
-
"@deepseek-ai/dsh-client-modules"
|
|
49
|
-
]
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
"scripts": {
|
|
53
|
-
"build": "node _wrap-client.mjs",
|
|
54
|
-
"prepare": "node _wrap-client.mjs",
|
|
55
|
-
"prepack": "node _wrap-client.mjs",
|
|
56
|
-
"pretest": "node _wrap-client.mjs",
|
|
57
|
-
"test": "node test/classifier.test.mjs && node test/route.test.mjs && node test/pump.test.mjs && node test/delete.test.mjs && node test/lifecycle.test.mjs && node test/ownership.test.mjs && node test/manifest.test.mjs && node test/manifest-concurrency.test.mjs && node test/manifest-process.test.mjs && node test/history.test.mjs && node test/state-machine.test.mjs && node test/client-review.test.mjs && node test/client-anchor.test.mjs && node test/client-css.test.mjs && node --test test/client-loading.test.mjs && node --test test/probe-errors.test.mjs",
|
|
58
|
-
"check:client": "node _wrap-client.mjs && git diff --exit-code -- lib/client.js",
|
|
59
|
-
"check:package": "node scripts/check-package.mjs"
|
|
60
|
-
},
|
|
61
|
-
"devDependencies": {
|
|
62
|
-
"@deepseek-ai/cordis": "^4.0.2",
|
|
63
|
-
"jsdom": "^29.1.1",
|
|
64
|
-
"react": "^18.3.1",
|
|
65
|
-
"react-dom": "^18.3.1"
|
|
66
|
-
}
|
|
67
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-plugin-rollout-scout",
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"description": "Detect which conversation model your DeepSeek Harness account is served: score probe conversations' live chain-of-thought, cancel old-model probes in seconds, keep confident catches.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"default": "./lib/index.js"
|
|
10
|
+
},
|
|
11
|
+
"./client": {
|
|
12
|
+
"default": "./lib/client.js"
|
|
13
|
+
},
|
|
14
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"lib",
|
|
19
|
+
"cordis.patch.yml",
|
|
20
|
+
"plugin.client.js",
|
|
21
|
+
"_wrap-client.mjs"
|
|
22
|
+
],
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/SpookySandwich/dsh-plugin-rollout-scout.git"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"dsh",
|
|
30
|
+
"dsh-plugin",
|
|
31
|
+
"deepseek-harness",
|
|
32
|
+
"cordis-plugin",
|
|
33
|
+
"rollout",
|
|
34
|
+
"ab-test",
|
|
35
|
+
"model-detection"
|
|
36
|
+
],
|
|
37
|
+
"dsh": {
|
|
38
|
+
"bundle": {
|
|
39
|
+
"patch": "./cordis.patch.yml"
|
|
40
|
+
},
|
|
41
|
+
"client": {
|
|
42
|
+
"platform": "web",
|
|
43
|
+
"inject": [
|
|
44
|
+
"@deepseek-ai/dsh-api-session-controller",
|
|
45
|
+
"@deepseek-ai/dsh-client-locale",
|
|
46
|
+
"@deepseek-ai/dsh-client-ui-renderer",
|
|
47
|
+
"@deepseek-ai/dsh-client-ui-layout",
|
|
48
|
+
"@deepseek-ai/dsh-client-modules"
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "node _wrap-client.mjs",
|
|
54
|
+
"prepare": "node _wrap-client.mjs",
|
|
55
|
+
"prepack": "node _wrap-client.mjs",
|
|
56
|
+
"pretest": "node _wrap-client.mjs",
|
|
57
|
+
"test": "node test/classifier.test.mjs && node test/route.test.mjs && node test/pump.test.mjs && node test/delete.test.mjs && node test/lifecycle.test.mjs && node test/ownership.test.mjs && node test/manifest.test.mjs && node test/manifest-concurrency.test.mjs && node test/manifest-process.test.mjs && node test/history.test.mjs && node test/state-machine.test.mjs && node test/client-review.test.mjs && node test/client-anchor.test.mjs && node test/client-css.test.mjs && node --test test/client-loading.test.mjs && node --test test/probe-errors.test.mjs && node --test test/stream-events.test.mjs",
|
|
58
|
+
"check:client": "node _wrap-client.mjs && git diff --exit-code -- lib/client.js",
|
|
59
|
+
"check:package": "node scripts/check-package.mjs"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
63
|
+
"jsdom": "^29.1.1",
|
|
64
|
+
"react": "^18.3.1",
|
|
65
|
+
"react-dom": "^18.3.1"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"dsh": ">=0.1.5-rc.2 <0.1.6-0"
|
|
69
|
+
}
|
|
70
|
+
}
|