@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.
@@ -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.2"
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.2",
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.2"
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.2",
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 + 面板一行显示)。**
@@ -12,6 +12,6 @@
12
12
 
13
13
  [mcp_servers.w2m-fleet]
14
14
  command = "npx"
15
- args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@1.6.2", "w2m-mcp"]
15
+ args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@1.6.4", "w2m-mcp"]
16
16
  startup_timeout_sec = 20
17
17
  tool_timeout_sec = 60
@@ -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} fleets · {online}/{total} machines online',
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.2",
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.2",
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
  },
@@ -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.2';
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;
@@ -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,