@twinsearth/w2m-dsh-plugin 1.6.2 → 1.6.4
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/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +18 -0
- package/codex/mcp-servers.toml +1 -1
- package/docs/acceptance/1.6.3/ONLINE-FLEETS.json +21 -0
- package/docs/acceptance/1.6.4/HEALTHZ-FLEETS-ONLINE.json +20 -0
- package/lib/client.js +3 -2
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/src/plugin/fleet-target.mjs +1 -0
- package/src/plugin/tools.mjs +1 -1
- package/src/relay/state.mjs +5 -0
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
7
|
"description": "The w2m fleet plugins: one account, many machines, any of Windows, macOS or Linux.",
|
|
8
|
-
"version": "1.6.
|
|
8
|
+
"version": "1.6.4"
|
|
9
9
|
},
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "w2m-fleet",
|
|
13
13
|
"source": "./",
|
|
14
14
|
"description": "Read fleet state and dispatch commands across the machines registered to one account. Read-only MCP surface: the five exposed tools cannot change anything.",
|
|
15
|
-
"version": "1.6.
|
|
15
|
+
"version": "1.6.4",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "TwinsEarth"
|
|
18
18
|
},
|
|
@@ -26,5 +26,5 @@
|
|
|
26
26
|
]
|
|
27
27
|
}
|
|
28
28
|
],
|
|
29
|
-
"version": "1.6.
|
|
29
|
+
"version": "1.6.4"
|
|
30
30
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "w2m-fleet",
|
|
3
3
|
"description": "Drive the same project on online Windows, macOS and Linux machines from one account: read fleet state, dispatch commands and read results. The MCP surface is deliberately read-only.",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.4",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "TwinsEarth"
|
|
7
7
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,24 @@
|
|
|
7
7
|
|
|
8
8
|
All notable changes to this project are documented here.
|
|
9
9
|
|
|
10
|
+
## [1.6.4] — 2026-10-24
|
|
11
|
+
|
|
12
|
+
**修复:`/healthz` 漏发 `fleets_online`(1.6.3 的 `fleetSummary` 已计算,但 `stats()` 没带到公开字段)。**
|
|
13
|
+
|
|
14
|
+
- `stats()` 现在同时输出 `fleets_total` 与 `fleets_online`;
|
|
15
|
+
- 面板可正确显示 `全服:X/Y 个编队 · M/T 台在线`(X = 至少一台机器在线的编队数);
|
|
16
|
+
- relay 主机升级到 1.6.4(含 1.6.3/1.6.2/1.6.1 全部内容)。
|
|
17
|
+
- 测试:relay 200/200、fleet-target 49/49;证据 `docs/acceptance/1.6.4/HEALTHZ-FLEETS-ONLINE.json`
|
|
18
|
+
(fleet task `01M5ANYMVLX3MI7`)。
|
|
19
|
+
## [1.6.3] — 2026-10-24
|
|
20
|
+
|
|
21
|
+
**编队与机器同构显示:在线编队数/编队总数 + 在线机器/机器总数。**
|
|
22
|
+
|
|
23
|
+
- relay `fleetSummary()` 新增 `fleets_online`(至少一台机器在线的编队数),`/healthz` 公开计数同步增加;
|
|
24
|
+
- 面板 relay 区显示:`全服:X/Y 个编队 · M/T 台在线`(fleet-target probe 读取 `fleets_online`);
|
|
25
|
+
- relay 主机升级到 1.6.3(含 1.6.2 全服概览与 1.6.1 安全修复)。
|
|
26
|
+
- 测试:relay 200/200、fleet-target 49/49、client-bundle 26/26;证据
|
|
27
|
+
`docs/acceptance/1.6.3/ONLINE-FLEETS.json`(fleet task `01M5ANYMVLWMTSG`)。
|
|
10
28
|
## [1.6.2] — 2026-10-24
|
|
11
29
|
|
|
12
30
|
**relay 全服概览:多少个编队、多少台机器在线(healthz + operator /v1/fleets + 面板一行显示)。**
|
package/codex/mcp-servers.toml
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.6.3",
|
|
3
|
+
"case": "ONLINE-FLEETS",
|
|
4
|
+
"kind": "positive",
|
|
5
|
+
"machines": [
|
|
6
|
+
"b53a37f4-1464-4512-9259-33a7df091e3e"
|
|
7
|
+
],
|
|
8
|
+
"executed_at": "2026-10-24T04:34:31.766Z",
|
|
9
|
+
"executor": "lead",
|
|
10
|
+
"requirement": "fleets are reported the same way as machines: online fleets / total fleets, beside online/total machines",
|
|
11
|
+
"task_id": "01M5ANYMVLWMTSG",
|
|
12
|
+
"result": {
|
|
13
|
+
"outcome": "ok",
|
|
14
|
+
"assertions": {
|
|
15
|
+
"relay_suite": "200/200",
|
|
16
|
+
"fleet_target": "49/49",
|
|
17
|
+
"panel_line": "fleetsOnline/fleets · machines online/total"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"note": "suites ran as a real fleet task"
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.6.4",
|
|
3
|
+
"case": "HEALTHZ-FLEETS-ONLINE",
|
|
4
|
+
"kind": "positive",
|
|
5
|
+
"machines": [
|
|
6
|
+
"b53a37f4-1464-4512-9259-33a7df091e3e"
|
|
7
|
+
],
|
|
8
|
+
"executed_at": "2026-10-24T04:47:35.562Z",
|
|
9
|
+
"executor": "lead",
|
|
10
|
+
"requirement": "/healthz carries fleets_online beside fleets_total so the panel can show online fleets / total fleets",
|
|
11
|
+
"task_id": "01M5ANYMVLX3MI7",
|
|
12
|
+
"result": {
|
|
13
|
+
"outcome": "ok",
|
|
14
|
+
"assertions": {
|
|
15
|
+
"relay_suite": "200/200",
|
|
16
|
+
"stats": "fleets_online present"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"note": "1.6.3 shipped fleetSummary.fleets_online but headlz stats omitted it; this release adds it"
|
|
20
|
+
}
|
package/lib/client.js
CHANGED
|
@@ -112,7 +112,7 @@ window.__ModuleLoader__.load({
|
|
|
112
112
|
relayFold: '另有 {count} 个已折叠,点击展开',
|
|
113
113
|
relayUnfold: '收起折叠的 relay',
|
|
114
114
|
relayTemporary: '临时 Relay 节点(回退配置)',
|
|
115
|
-
globalSummary: '全服:{fleets} 个编队 · {online}/{total} 台在线',
|
|
115
|
+
globalSummary: '全服:{fleetsOnline}/{fleets} 个编队 · {online}/{total} 台在线',
|
|
116
116
|
capLabel: 'Node 执行:{state}',
|
|
117
117
|
capDenied: '拒绝',
|
|
118
118
|
capTemporary: '临时 24 小时',
|
|
@@ -144,7 +144,7 @@ window.__ModuleLoader__.load({
|
|
|
144
144
|
relayFold: '{count} more folded — expand',
|
|
145
145
|
relayUnfold: 'collapse the folded relays',
|
|
146
146
|
relayTemporary: 'temporary relay nodes (fallback config)',
|
|
147
|
-
globalSummary: '{fleets}
|
|
147
|
+
globalSummary: 'fleets {fleetsOnline}/{fleets} · machines {online}/{total} online',
|
|
148
148
|
capLabel: 'Node exec: {state}',
|
|
149
149
|
capDenied: 'denied',
|
|
150
150
|
capTemporary: 'temporary 24 h',
|
|
@@ -634,6 +634,7 @@ window.__ModuleLoader__.load({
|
|
|
634
634
|
h('span', { key: 'rtt', className: cls('relayRtt') }, item.rtt_ms === null || item.rtt_ms === undefined ? '—' : `${item.rtt_ms} ms`),
|
|
635
635
|
])),
|
|
636
636
|
relayFold.server === null || relayFold.server === undefined ? null : h('div', { key: 'global', className: cls('relayHint') }, t('globalSummary', {
|
|
637
|
+
fleetsOnline: relayFold.server.fleets_online ?? '—',
|
|
637
638
|
fleets: relayFold.server.fleets_total ?? '—',
|
|
638
639
|
online: relayFold.server.devices_online ?? '—',
|
|
639
640
|
total: relayFold.server.devices_total ?? '—',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twinsearth/w2m-dsh-plugin",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.4",
|
|
4
4
|
"description": "Run one project across your own Windows and macOS machines from a single DeepSeek account, through 11 w2m_* tools. Four coordination modes (replicate, split, broadcast, pipeline) and six aggregate verdicts (consistent, divergent, divergent-platform, failed, partial, unverifiable). P2P hole punching by default, with a bundled relay, STUN responder and ledger fallback, so the fleet needs no third-party service. Joining needs a pairing code plus autoStartAgent: true; installing alone does not join.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "twinsearth-w2m-dsh",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.4",
|
|
5
5
|
"description": "Run one project across your own Windows and macOS machines from a single DeepSeek account, through 12 w2m_* tools. Four coordination modes (replicate, split, broadcast, pipeline) and six aggregate verdicts (consistent, divergent, divergent-platform, failed, partial, unverifiable). P2P hole punching by default, with a bundled relay, STUN responder and ledger fallback, so the fleet needs no third-party service. Joining needs a pairing code plus autoStartAgent: true; installing alone does not join.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
@@ -509,6 +509,7 @@ export async function probeRelays(urls, options = {}) {
|
|
|
509
509
|
// Counts only: per-fleet membership stays behind the fleet-scoped endpoints.
|
|
510
510
|
stats: {
|
|
511
511
|
fleets_total: Number.isInteger(body.fleets_total) ? body.fleets_total : null,
|
|
512
|
+
fleets_online: Number.isInteger(body.fleets_online) ? body.fleets_online : null,
|
|
512
513
|
devices_online: Number.isInteger(body.devices_online) ? body.devices_online : null,
|
|
513
514
|
devices_total: Number.isInteger(body.devices_total) ? body.devices_total : null,
|
|
514
515
|
},
|
package/src/plugin/tools.mjs
CHANGED
|
@@ -277,7 +277,7 @@ const MAX_STAGES = 16;
|
|
|
277
277
|
* `package.json` during `scripts/pack.mjs` rather than hand-maintained, and `W2M_PLUGIN_VERSION`
|
|
278
278
|
* overrides it at runtime for tests and packagers.
|
|
279
279
|
*/
|
|
280
|
-
const PLUGIN_VERSION = '1.6.
|
|
280
|
+
const PLUGIN_VERSION = '1.6.4';
|
|
281
281
|
|
|
282
282
|
/** How long any single HTTP call may take before it is aborted, in milliseconds. */
|
|
283
283
|
const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
|
package/src/relay/state.mjs
CHANGED
|
@@ -3263,6 +3263,9 @@ export class RabbitState {
|
|
|
3263
3263
|
const fleets = [...byFleet.values()].sort((a, b) => b.devices - a.devices);
|
|
3264
3264
|
return {
|
|
3265
3265
|
fleets_total: fleets.filter((f) => f.fleet_id !== null).length,
|
|
3266
|
+
// v1.6.3: an online fleet is a fleet with at least one online machine. Reported beside
|
|
3267
|
+
// fleets_total so the panel can say "X/Y fleets" the same way it says "M/T machines".
|
|
3268
|
+
fleets_online: fleets.filter((f) => f.fleet_id !== null && f.online > 0).length,
|
|
3266
3269
|
unfleeted_devices: byFleet.get(null)?.devices ?? 0,
|
|
3267
3270
|
devices_total: this.devices.size,
|
|
3268
3271
|
devices_online: online,
|
|
@@ -3277,6 +3280,8 @@ export class RabbitState {
|
|
|
3277
3280
|
devices: this.devices.size,
|
|
3278
3281
|
// v1.6.2: whole-relay totals on the public health probe.
|
|
3279
3282
|
fleets_total: this.fleetSummary().fleets_total,
|
|
3283
|
+
// v1.6.4: 1.6.3 forgot to surface this on /healthz (the panel reads it there).
|
|
3284
|
+
fleets_online: this.fleetSummary().fleets_online,
|
|
3280
3285
|
devices_online: this.fleetSummary().devices_online,
|
|
3281
3286
|
devices_total: this.devices.size,
|
|
3282
3287
|
tasks: this.tasks.size,
|