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.
- package/CHANGELOG.md +98 -2
- package/CONTRIBUTING.md +10 -3
- package/README.md +98 -760
- package/autostart/windows/legacy-access.ps1 +359 -0
- package/bin/account-upgrade-controller.mjs +1 -1
- package/bin/account-upgrade-worker.mjs +7 -0
- package/bin/cli-main.mjs +61 -5
- package/bin/dependency-lock.json +642 -0
- package/bin/legacy-access.mjs +73 -0
- package/bin/legacy-installation.mjs +75 -19
- package/bin/legacy-task.mjs +24 -0
- package/bin/legacy-upgrade.mjs +66 -10
- package/bin/managed-upgrade.mjs +102 -12
- package/bin/mcp-bridge.mjs +38 -20
- package/bin/prewarm.mjs +28 -6
- package/bin/service-control.mjs +10 -5
- package/bin/upgrade-capability.json +2 -1
- package/bin/upgrade-dependencies.mjs +67 -6
- package/bin/upgrade-package.mjs +2 -0
- package/bin/windows-legacy/LegacyProcessBroker.build.json +3 -3
- package/bin/windows-legacy/LegacyProcessBroker.exe +0 -0
- package/bin/windows-legacy/src/LegacyNative.cs +60 -11
- package/bin/windows-legacy/src/LegacyProcessBroker.cs +317 -197
- package/bin/windows-legacy-process.mjs +12 -5
- package/docs/account-upgrades.md +17 -4
- package/docs/compatibility.md +39 -0
- package/docs/configuration.md +146 -0
- package/docs/dashboards.md +125 -0
- package/docs/execution-context.md +11 -5
- package/docs/http-api.md +47 -0
- package/docs/install.md +52 -0
- package/docs/operations.md +99 -0
- package/docs/upgrades.md +324 -0
- package/package.json +10 -3
- package/tools/windows-legacy/README.md +118 -92
- package/tools/windows-legacy/inventory.mjs +8 -6
- 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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|