@twinsearth/w2m-dsh-plugin 1.1.1 → 1.1.2

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.1.1"
8
+ "version": "1.1.2"
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.1.1",
15
+ "version": "1.1.2",
16
16
  "author": {
17
17
  "name": "TwinsEarth"
18
18
  },
@@ -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.1.1",
4
+ "version": "1.1.2",
5
5
  "author": {
6
6
  "name": "TwinsEarth"
7
7
  },
package/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  All notable changes to this project are documented here.
4
4
 
5
+ ## [1.1.2] — 2026-10-17
6
+
7
+ **A dispatch that names no machines now goes to the machines that are online. The rule that decides "online" had been
8
+ written three times and the three copies are now one.**
9
+
10
+ ### The defect
11
+
12
+ The relay built a lease for **every paired device**, including a machine whose agent had stopped heartbeating days
13
+ earlier. That lease expired, `partial` became the only verdict the task could reach, and a fleet whose live machines
14
+ agreed reported *"incomplete"* forever. Observed on 2026-10-17:
15
+
16
+ aggregate: partial counts: { ok: 3, expired: 4 }
17
+
18
+ So "all machines agree" was **unreachable** while a stale entry existed, and no amount of re-running could fix it.
19
+
20
+ ### The fix: one definition, three call sites
21
+
22
+ `device.online === true` alone is **not** the answer -- the flag stays true until the sweep runs. The real rule was
23
+ already computed, in two places, as `device.online === true && !silent`, and the target list was about to become a
24
+ third copy. It is now a method:
25
+
26
+ isOnlineDevice(device, nowMs = this.nowMs())
27
+
28
+ used by `deviceStatus`, `publicDevice` and the default target list. `simtMs === null` (no contact ever observed) is
29
+ **not** silent, so an unknown age cannot be read as "gone".
30
+
31
+ ### `include_offline` is the escape hatch, and it is reachable
32
+
33
+ `w2m_run` gains `include_offline` (boolean, **default false**) and puts it on the wire only when asked, so a default
34
+ dispatch sends the same bytes as before. The relay records it on the task, and a probe against a live `RabbitState`
35
+ confirmed the field is accepted and stored (`recorded: true`) rather than rejected as unknown.
36
+
37
+ ### Deliberately NOT in this release
38
+
39
+ **The 72-hour archive rule is deferred to 1.1.3.** The read-path filter is written and correct, but eight
40
+ `fleet-target` fixtures carry fixed old timestamps and would need their intent reviewed one by one; shipping it with
41
+ those fixtures patched blindly is how a green suite stops meaning anything. A machine that has been offline for days is
42
+ therefore **hidden from dispatch** by this release (it is not online) but still **listed** by `w2m_devices`.
43
+
44
+ ### Verified
45
+
46
+ `test/relay.test.mjs` 160 pass, `test/tools.test.mjs` 115 pass, `test/fleet-target.test.mjs` 41 pass -- 316 tests, 0
47
+ fail, after the change. The 72h filter was measured, found to break 8 fixtures, and rolled back rather than shipped.
48
+
5
49
  ## [1.1.1] — 2026-10-17
6
50
 
7
51
  **The fleet is now installable from Claude Code, Codex and OpenAI's plugin surface -- and the parts that still need a
@@ -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.1.1", "w2m-mcp"]
15
+ args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@1.1.2", "w2m-mcp"]
16
16
  startup_timeout_sec = 20
17
17
  tool_timeout_sec = 60
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinsearth/w2m-dsh-plugin",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
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
  "main": "lib/index.js",
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.1.1",
4
+ "version": "1.1.2",
5
5
  "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.",
6
6
  "license": "MIT",
7
7
  "keywords": [