mcp-pacemaker 2.1.0 → 2.1.1

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +98 -2
  2. package/CONTRIBUTING.md +10 -3
  3. package/README.md +98 -760
  4. package/autostart/windows/legacy-access.ps1 +359 -0
  5. package/bin/account-upgrade-controller.mjs +1 -1
  6. package/bin/account-upgrade-worker.mjs +7 -0
  7. package/bin/cli-main.mjs +61 -5
  8. package/bin/dependency-lock.json +642 -0
  9. package/bin/legacy-access.mjs +73 -0
  10. package/bin/legacy-installation.mjs +75 -19
  11. package/bin/legacy-task.mjs +24 -0
  12. package/bin/legacy-upgrade.mjs +66 -10
  13. package/bin/managed-upgrade.mjs +102 -12
  14. package/bin/mcp-bridge.mjs +38 -20
  15. package/bin/prewarm.mjs +28 -6
  16. package/bin/service-control.mjs +10 -5
  17. package/bin/upgrade-capability.json +2 -1
  18. package/bin/upgrade-dependencies.mjs +67 -6
  19. package/bin/upgrade-package.mjs +2 -0
  20. package/bin/windows-legacy/LegacyProcessBroker.build.json +3 -3
  21. package/bin/windows-legacy/LegacyProcessBroker.exe +0 -0
  22. package/bin/windows-legacy/src/LegacyNative.cs +60 -11
  23. package/bin/windows-legacy/src/LegacyProcessBroker.cs +317 -197
  24. package/bin/windows-legacy-process.mjs +12 -5
  25. package/docs/account-upgrades.md +17 -4
  26. package/docs/compatibility.md +39 -0
  27. package/docs/configuration.md +146 -0
  28. package/docs/dashboards.md +125 -0
  29. package/docs/execution-context.md +11 -5
  30. package/docs/http-api.md +47 -0
  31. package/docs/install.md +52 -0
  32. package/docs/operations.md +99 -0
  33. package/docs/upgrades.md +324 -0
  34. package/package.json +10 -3
  35. package/tools/windows-legacy/README.md +118 -92
  36. package/tools/windows-legacy/inventory.mjs +8 -6
  37. package/ui/dist/third-party-manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,9 +7,104 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.1.1] - 2026-10-15
11
+
12
+ ### Added
13
+
14
+ - `upgrade --fix-legacy-access` is a one-time step for a Windows 1.3 install that was set up from
15
+ an administrator terminal. Run it from an administrator terminal. It gives the task's own
16
+ run-as user full control of that 1.3 task and makes that user the owner of the 1.3
17
+ `bin\cli.mjs`, and it records the previous permissions in
18
+ `legacy-upgrade\access-<time>.json` first. Nothing else changes: the task XML, triggers,
19
+ run-as account and run level, the other permission entries and the file contents stay the
20
+ same and are checked afterwards. `--plan` shows the change without making it.
21
+ - The Windows release qualification can resume after a failed or killed run with
22
+ `--resume RUN_DIRECTORY`. Each run records its inputs, controller, Docker engine, Windows
23
+ build and passed steps in `run-state.json`. A resume refuses any change to those or to the
24
+ kept evidence, sets the failed attempt aside next to the run and reruns only the steps that
25
+ did not pass. The offline verifier checks the recorded history; the published regression
26
+ statement is unchanged.
27
+
28
+ ### Fixed
29
+
30
+ - Upgrading a Windows 1.3 install that was set up from an administrator terminal no longer fails
31
+ part-way. Windows makes Administrators the owner of that task and lets your account only read
32
+ it, and makes Administrators the owner of the files, so the upgrade, which must run as an
33
+ ordinary user, was refused while copying the CLI file and would then have failed while holding
34
+ the task. Planning now checks these permissions first and stops before any process capture,
35
+ download or change. It names each item and the fix. Installs set up from a normal terminal
36
+ are unaffected.
37
+ - `upgrade --to` from an elevated terminal is now refused before planning and before any
38
+ confirmation prompt, with the normal-terminal next step. It used to ask for the restart
39
+ confirmation first and refuse afterwards.
40
+ - Managed upgrades no longer fail behind npm mirrors that publish only SHA-1 checksums, such as
41
+ some Azure Artifacts upstreams. Each release now carries the SHA-512 dependency lock it was
42
+ released and tested with (`bin/dependency-lock.json`, declared by `dependencyLock` in
43
+ `bin/upgrade-capability.json`), and staging installs exactly that lock with `npm ci` through
44
+ your configured registry, including when `replace-registry-host` is `never`.
45
+ Staged dependencies no longer move to newer in-range versions at upgrade time. Targets without
46
+ the lock keep the old resolution, and an entry without SHA-512 integrity now names the package.
47
+ - The Windows legacy process broker now waits up to eight seconds instead of two for each WMI
48
+ command-line query, and reports the first real failure instead of a generic
49
+ `Argument query cancelled`. A WMI timeout is reported as `Argument query timed out`. On a busy
50
+ host with about 1,000 processes the two-second limit made legacy planning fail.
51
+ - `reload` no longer reports a slow bridge as `bridge DOWN`. The bridge may spend its whole
52
+ pooling budget settling a pending batch before it answers, but the CLI gave up after five
53
+ seconds. It now waits past that budget and reports a late answer as a timeout. Status
54
+ checks wait ten seconds instead of two before treating a bridge as down. A refused
55
+ connection still fails at once.
56
+ - Upgrading a busy Windows 1.3 install no longer fails. The legacy process broker put every
57
+ process under the 1.3 bridge into the plan and refused when that list changed, but a busy
58
+ bridge starts and ends a session process every few seconds. It also refused any install
59
+ with more than 512 such processes (one had 533), and the upgrade refused whenever 1.3
60
+ rewrote `sessions.json`, which it does on every session start and end. The plan now holds
61
+ only the supervisor and the bridge. The stop ends the supervisor, holds a handle to every
62
+ process under the bridge, ends the bridge, and then stops everything it holds plus anything
63
+ those processes started, up to 2048 processes. Holding them first matters: Node ends a
64
+ process's direct children with it, and 1.3 runs each bare server command under `cmd.exe`,
65
+ so ending the bridge first would have left those servers running with no traceable parent.
66
+ A process it cannot stop is reported and left running instead of blocking the upgrade.
67
+ Capture and revalidation also get 120 seconds from the request instead of 14 to 15 seconds
68
+ from the broker's start, which a loaded host could use up before the capture began.
69
+ - A 1.3 upgrade started from inside the 1.3 tree, for example through an MCP server's shell,
70
+ is now refused before anything changes. It would have stopped itself part-way.
71
+ - A managed upgrade no longer refuses because a client is connected. The bridge counted every
72
+ open session as active work and refused after eight seconds, and once any client had dropped
73
+ a stream it refused every later upgrade until it restarted. Each refusal also left the bridge
74
+ answering 503 until `upgrade --recover`. Now calls in progress and config work get up to
75
+ eight seconds to finish, and open sessions and calls still running end with the restart.
76
+ Config work still unfinished then refuses the upgrade, and the upgrader resumes the current
77
+ version, trying for up to ten seconds while that work settles. A session that starts or ends
78
+ during the download no longer fails the upgrade either; only `servers.json` must be
79
+ unchanged. The installed version runs an upgrade, so this applies to upgrades from 2.1.1 on.
80
+ To upgrade from 2.1.0, close your MCP clients and restart Pacemaker first.
81
+ - `prewarm` no longer crashes on Windows with
82
+ `Assertion failed: !(handle->flags & UV_HANDLE_CLOSING)` after the bridge refuses a change. It
83
+ prints the refusal and exits with status 1. Node 23, 24 before 24.20.0, 25, and 26 before
84
+ 26.7.0 can abort a process that exits soon after `fetch`
85
+ ([nodejs/node#56645](https://github.com/nodejs/node/issues/56645)), so `prewarm` now talks to
86
+ the bridge with `node:http` like the rest of the CLI. A bridge that does not answer within ten
87
+ seconds is now reported by port instead of as `The operation was aborted due to timeout`.
88
+
89
+ ### Changed
90
+
91
+ - Upgrades now follow one written rule: an upgrade may end open sessions and calls in progress,
92
+ and never retries a call; it never changes `servers.json` or your client setup. See
93
+ [upgrades and rollback](docs/upgrades.md#what-an-upgrade-keeps-and-what-it-ends).
94
+ - The Windows 1.3 upgrade accepts `--yes` to confirm the plan shown, like other upgrades, and
95
+ its confirmation now says what ends and what is kept. It used to require an interactive
96
+ terminal and ask you to pause callers first. Explicit-account (`--user`) upgrades still need
97
+ interactive confirmation, because they also create a task for that account.
98
+ - Split the Windows release qualification into a contained lane and a host session lane.
99
+ The qualification container has no interactive logon, so it now verifies the
100
+ `source-ordinary` contract and defers the four session-bound test files; those files run
101
+ on the publishing host under an ordinary, non-elevated interactive account and produce a
102
+ `session-lane.json` receipt that the offline verifier requires, bound to the same commit.
103
+ This closes a gap where those four files ran in no automated lane.
104
+
10
105
  ## [2.1.0] - 2026-10-12
11
106
 
12
- Target release: 2.1.0. This candidate has not yet been published.
107
+ Published to npm on 2026-10-14.
13
108
 
14
109
  ### Added
15
110
 
@@ -545,7 +640,8 @@ one is a trap for anyone building something similar.
545
640
  - Do not report a teardown the bridge initiated as a crash. `taskkill /F` exits non-zero, so
546
641
  every recycle, idle reap and session close was recorded as a failure, burying real ones.
547
642
 
548
- [Unreleased]: https://github.com/girishkvs/mcp-pacemaker/compare/v2.1.0...HEAD
643
+ [Unreleased]: https://github.com/girishkvs/mcp-pacemaker/compare/v2.1.1...HEAD
644
+ [2.1.1]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v2.1.1
549
645
  [2.1.0]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v2.1.0
550
646
  [2.0.2]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v2.0.2
551
647
  [2.0.1]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v2.0.1
package/CONTRIBUTING.md CHANGED
@@ -128,6 +128,13 @@ instead of installing bundled Chromium. CI uses bundled Chromium, not that overr
128
128
  Both standalone test commands **fail** when preparation is missing or candidate bytes have
129
129
  changed. Clean and prepare again after changing package files, built assets, or Node major.
130
130
 
131
+ On Windows, run these gates on Node 20, 22, 24.20.0 or a later 24.x, or 26.7.0 and later.
132
+ Released CLIs up to 2.1.0 use `fetch` for `prewarm`, and Node 23, 24 before 24.20.0, 25, and 26
133
+ before 26.7.0 can abort a process that exits soon after `fetch`
134
+ ([nodejs/node#56645](https://github.com/nodejs/node/issues/56645)). There, any test that runs a
135
+ released CLI into a refused change (1.3.0, and 2.0.0 in the historical baseline) fails with exit
136
+ code 3221226505 and a libuv `UV_HANDLE_CLOSING` assertion.
137
+
131
138
  Historical compatibility baselines remain explicitly **1.3.0 and 2.0.0**.
132
139
  Candidate versions must be canonical stable **1.x legacy / 2.x current** versions.
133
140
  The owner selects the actual release and any exact opposite-major patch pair;
@@ -136,12 +143,12 @@ The same harness runs in both maintained branches:
136
143
 
137
144
  | Preparation | Selected legacy / current pair |
138
145
  |---|---|
139
- | Default in the selected 2.1.0 checkout | Immutable 1.3.0 / packed 2.1.0 |
146
+ | Default in the selected 2.1.1 checkout | Immutable 1.3.0 / packed 2.1.1 |
140
147
  | Default in the 1.3.1 checkout | Packed 1.3.1 / immutable 2.0.0 |
141
148
  | `npm run compat:prepare:baseline` | Immutable 1.3.0 / immutable 2.0.0 |
142
- | `npm run compat:prepare -- --peer-root <opposite-patch-checkout>` | Packed explicit 1.x peer / packed 2.1.0 |
149
+ | `npm run compat:prepare -- --peer-root <opposite-patch-checkout>` | Packed explicit 1.x peer / packed 2.1.1 |
143
150
 
144
- These selections are not qualification evidence. The 2.1.0 candidate requires fresh
151
+ These selections are not qualification evidence. The 2.1.1 candidate requires fresh
145
152
  exact-byte gates; selecting it does not select an opposite-major patch pair.
146
153
  Earlier 1.3.1/2.0.2 and 1.3.1/2.0.1 results remain historical.
147
154