With HMR, installing, enabling, disabling and removing bundles take effect live. Each profile recomposition compares the loaded modules below the profile directory and its linked targets with disk, stops the plugins whose files changed, and recomposes the profile through app-boot's recomposeProfile(): the rows the next generation drops are removed first, the latest runtime resolution is published once, and the generation is applied and judged. Afterwards HMR evicts the modules below the mappings the recomposition dropped. - app-boot: recomposeProfile(); PluginPackages.resolution; ResolutionRestartRequired; the resolver accepts in-place version changes and relinks, and relocates Node's cached link real paths. - plugin-manager: with HMR, installBundle refuses an installed package (already-installed), so an upgrade is a removal and an installation; every restart-required result carries a restartReason; removal uses the registry the package was installed from. - ui-plugin-manager: the Official Update removes and then installs; restart prompts name their reason.
2.0 KiB
kind, description
| kind | description |
|---|---|
| upgrade-guide | With HMR, installing a package that is already installed fails with already-installed; an upgrade removes the package first. |
Installing over an installed plugin package is refused with HMR
English | 中文
Change
In a profile that runs HMR, which the shipped profiles do, pluginManager.installBundle(spec) used to run pnpm over a package the profile already depends on and report restart-required while the previous version kept running. It now fails before pnpm runs, with application: 'failed' and error.code: 'already-installed', and changes no profile file, when the spec names an installed package: a registry name with or without a version, a local directory, or the git or tarball spec the dependency was saved with. Repeating an installation of the same spec fails the same way instead of reporting changed: false.
This affects callers of installBundle() through the Host API and the remote client in @deepseek-ai/dsh-api-remotes/client, and the agent's plugin_manager tool (install_bundle). An installed package that cannot be removed, such as a bundle carrying plugin management, can no longer be installed over while HMR runs. The Web page's Update for an Official plugin removes the package and installs the new version itself. Without HMR, installing over an installed package still runs pnpm and reports restart-required.
Migration
- To install another version or location of an installed package, call
removeBundle(name)first, theninstallBundle(spec). For the agent tool, callremove_bundle, theninstall_bundle. The removal stops the bundle's plugins and drops its packages' mappings, so the new version is mapped afresh and starts without a restart. - If code switches exhaustively over
ManagementError['code'], handle thealready-installedcode. - Confirm the migration: installing the package again returns
already-installed, and afterremoveBundlethe sameinstallBundlecall returnsappliedwith the newversion.