* i18n: say the restart banner counts restart-pending changes
Part of #558: the banner number is restart-pending changes, not completed changes, so the copy should say so.
* fix(client): count restart-pending updates in the restart banner (#558)
The restart banner mixed two counting schemes: session updates (every completed change, including client-only plugins that go live without a restart) vs host activation state (only plugins parked behind a restart). The same batch showed 4 right after updating and 3 after the session was lost. Track restart-requiring updates separately (restartNames, gated on the update response's activation evidence, defaulting to restart-pending when the host reports nothing) and count those. updatedNames keeps its row-marker role. Persisted across tab switches like the other restart counters.
* build(client): rebuild the bundle with the restart-pending gate (#558)
Regenerated client/client.js from the patched src/client tree, per review: the repo commits build artifacts and CI checks them against the source.
* test(client): pin the restart-count gate and the conservative default (#558)
Adds the missing spec file for the restart-count fix: a mixed restart/inert batch shows 1 (not 2), the count survives a session loss, and an update with no activation evidence still counts (the conservative direction, pinned so it cannot be silently dropped).
* build(client): regenerate bundle against current main (banner normalization from upstream)
* fix(client): count restart-pending updates after the upstream >=1 mergefix(client): count restart-pending updates after the upstream >=1 merge
---------
Co-authored-by: JINITAIMEI121 <JINITAIMEI121@users.noreply.github.com>
* fix(install): retry the no-matching-version host-peer shape with peers off
A host peer that only ever published pre-releases makes pnpm fail with ERR_PNPM_NO_MATCHING_VERSION instead of FETCH_404, so the #289 one-shot AUTO_INSTALL_PEERS_OFF retry never fired. Extend the gate to the new no-matching-version code. See #569.
* test: pin the ERR_PNPM_NO_MATCHING_VERSION classifier branch (#569)
Fixture is verbatim pnpm 12.4.1 output for a stable-range add against a prerelease-only host peer, per the house rule of pinning real wording in classifier tests.
* fix(pnpm-compat): give ERR_PNPM_NO_MATCHING_VERSION its own code and wording
Per #569 and the review on #528: the package exists, the requested range matches no published version, so the fetch-404 copy (ghost dependency / private package) misleads. New no-matching-version branch names the failing range, calls out the host-provided provision for @deepseek-ai/dsh-* peers, and the install.ts retry gate shares the #289 one-shot peers-off recovery. Fixture pins verbatim pnpm 12.4.1 wording.
* fix(discovery): read dsh.engines.dsh as well as the top-level engines.dsh (#577)
The ecosystem declares the host requirement in both shapes; manifestFacts read only the top-level one, so packages like @linxin666/dsh-web-all always reported enginesDsh null and the #404/#522 preflight never saw their declaration. Read both, top-level wins when both are present.
* test(discovery): pin the dual-shape host-requirement read (#577)
Covers the nested dsh.engines.dsh shape, the both-shapes top-level-wins case, and the null when neither declares.