@twinsearth/w2m-dsh-plugin 2.2.3 → 2.2.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": "2.2.3"
8
+ "version": "2.2.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": "2.2.3",
15
+ "version": "2.2.4",
16
16
  "author": {
17
17
  "name": "TwinsEarth"
18
18
  },
@@ -26,5 +26,5 @@
26
26
  ]
27
27
  }
28
28
  ],
29
- "version": "2.2.3"
29
+ "version": "2.2.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": "2.2.3",
4
+ "version": "2.2.4",
5
5
  "author": {
6
6
  "name": "TwinsEarth"
7
7
  },
package/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ All notable changes to this project are documented here.
7
7
  - `w2m_intent`: structured intents mapped onto allow-listed commands; unknown actions, parameters and types
8
8
  are refused by name (the fleet does not invent commands).
9
9
 
10
+ ## [2.2.4] - 2026-11-05
11
+
12
+ - Fixes the remote desktop `HTTP 404`: a default desktop profile leaves `stateDir` empty, and
13
+ the remote-view route registration returned not-mounted in that case. The host now resolves
14
+ the same `~/.dsh/xclient` directory the agent uses, so `/api/w2m/remote/config|start|frame|stop`
15
+ are mounted and the settings toggle works without configuring `stateDir` by hand.
16
+ - Remote-view route coverage now includes the default-stateDir mount path.
10
17
  ## [2.2.3] - 2026-11-05
11
18
 
12
19
  - Remote desktop (view-only) now reaches 1 frame per second in a fleet. A machine opts in by
package/README.md CHANGED
@@ -93,7 +93,7 @@ w2m-mcp --help
93
93
  # 复制进你自己的 codex/mcp-servers.toml
94
94
  [mcp_servers.w2m]
95
95
  command = "npx"
96
- args = ["-y", "@twinsearth/w2m-dsh-plugin@2.2.3", "w2m-mcp"]
96
+ args = ["-y", "@twinsearth/w2m-dsh-plugin@2.2.4", "w2m-mcp"]
97
97
  ```
98
98
 
99
99
  ### 5. 验证过的 release tarball(离线)
@@ -12,6 +12,6 @@
12
12
 
13
13
  [mcp_servers.w2m-fleet]
14
14
  command = "npx"
15
- args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@2.2.3", "w2m-mcp"]
15
+ args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@2.2.4", "w2m-mcp"]
16
16
  startup_timeout_sec = 20
17
17
  tool_timeout_sec = 60
@@ -0,0 +1,32 @@
1
+ {
2
+ "version": "2.2.4",
3
+ "case": "RELEASE-2240",
4
+ "kind": "positive",
5
+ "machines": [
6
+ "b53a37f4-1464-4512-9259-33a7df091e3e"
7
+ ],
8
+ "executed_at": "2026-11-05T15:10:00.000Z",
9
+ "executor": "lead",
10
+ "task_id": "pre-release-2240",
11
+ "requirement": "v2.2.4: remote-view host routes mount on a default desktop profile whose stateDir is unset, so the settings toggle and /api/w2m/remote/{config,start,frame,stop} no longer return HTTP 404",
12
+ "commands": [
13
+ ["node", "--test", "--test-force-exit", "test/remote-view-route.test.mjs", "test/view-consent.test.mjs", "test/view-frame-channel.test.mjs", "test/relay-target.test.mjs", "test/client-bundle.test.mjs"],
14
+ ["node", "scripts/check-entrypoints.mjs"],
15
+ ["node", "--test", "--test-force-exit", "test/loader-entry.test.mjs"]
16
+ ],
17
+ "result": {
18
+ "outcome": "ok",
19
+ "assertions": {
20
+ "remote_view": "test/remote-view-route.test.mjs 4/4: default-stateDir mount, P2P session, P2P refusal, and relay refresh",
21
+ "consent": "test/view-consent.test.mjs 4/4",
22
+ "p2p": "test/view-frame-channel.test.mjs 4/4",
23
+ "relay": "test/relay-target.test.mjs 3/3",
24
+ "client": "test/client-bundle.test.mjs 36/36",
25
+ "entrypoints": "node scripts/check-entrypoints.mjs: all entry points PASS",
26
+ "loader": "test/loader-entry.test.mjs 10/10 against the packed 2.2.4 artifact in the real DSH 0.2.2-rc.1 Loader and Edge page",
27
+ "root_cause": "registerRemoteViewRoutes returned { mounted: false, reason: 'stateDir is not configured' } when cfg.stateDir was empty; no /api/w2m/remote/* route existed",
28
+ "fix": "resolveStateDir(null, '') resolves ~/.dsh/xclient, matching the agent's default state directory",
29
+ "scope": "code and tests only; no profile was edited by the tests; npm publish is separate"
30
+ }
31
+ }
32
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinsearth/w2m-dsh-plugin",
3
- "version": "2.2.3",
3
+ "version": "2.2.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": "2.2.3",
4
+ "version": "2.2.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": [
@@ -12,6 +12,7 @@ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
12
12
  import { dirname, join } from 'node:path';
13
13
  import { captureHostScreen } from './capture-route.mjs';
14
14
  import { createViewSide, openViewFrame } from '../agent/view/session-key.mjs';
15
+ import { resolveStateDir } from '../util/cli.mjs';
15
16
 
16
17
  export const REMOTE_CONFIG_PATH = '/api/w2m/remote/config';
17
18
  export const REMOTE_FRAME_PATH = '/api/w2m/remote/frame';
@@ -43,8 +44,13 @@ function payloadJson(payload) {
43
44
  export function registerRemoteViewRoutes(ctx, deps = {}) {
44
45
  const status = { mounted: false, reason: 'the host has no Connection service', configPath: null };
45
46
  if (typeof ctx?.inject !== 'function') return status;
46
- if (typeof deps.stateDir !== 'string' || deps.stateDir === '') { status.reason = 'stateDir is not configured'; return status; }
47
- const file = join(deps.stateDir, 'remote-view.json');
47
+ // stateDir is unset on a default desktop profile. That must not silently remove the
48
+ // remote-view routes: the settings toggle and every /api/w2m/remote/* call would 404.
49
+ // Resolve the same default the agent uses so consent lives beside device.json.
50
+ const stateDir = typeof deps.stateDir === 'string' && deps.stateDir !== ''
51
+ ? deps.stateDir
52
+ : resolveStateDir(null, '');
53
+ const file = join(stateDir, 'remote-view.json');
48
54
  const capture = deps.capture ?? captureHostScreen;
49
55
  const platform = deps.platform ?? process.platform;
50
56
  const p2p = deps.p2p ?? null;
@@ -296,7 +296,7 @@ const MAX_STAGES = 16;
296
296
  * `package.json` during `scripts/pack.mjs` rather than hand-maintained, and `W2M_PLUGIN_VERSION`
297
297
  * overrides it at runtime for tests and packagers.
298
298
  */
299
- const PLUGIN_VERSION = '2.2.3';
299
+ const PLUGIN_VERSION = '2.2.4';
300
300
 
301
301
  /** How long any single HTTP call may take before it is aborted, in milliseconds. */
302
302
  const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;