Skip to content

Commit 85a3d53

Browse files
jalehmansteipete
andauthored
fix: bypass npm freshness for managed installs (#83761)
* fix: bypass npm freshness for managed installs * test: tolerate npm config json differences * test: align npm freshness bypass expectation * fix: resolve npm config path expansions * test: tolerate npm zero config encoding --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
1 parent d761b98 commit 85a3d53

14 files changed

Lines changed: 441 additions & 74 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ Docs: https://docs.openclaw.ai
4848
### Fixes
4949

5050
- Memory/search: scan the JS-side fallback vector path (used when the sqlite-vec index is unavailable or has a mismatched dimension) in bounded rowid batches and yield to the event loop between batches so large chunk tables can no longer pin the Node.js main thread for multi-second windows. Also keeps the SQL prepared statement rooted in a local so node:sqlite cannot finalize it mid-scan under heap pressure. Fixes #81172. Thanks @dev23xyz-oss.
51+
- CLI/update: bypass npm freshness filters consistently during managed package and plugin installs so freshly published release plugins remain installable. Thanks @jalehman.
5152
- Agents/subagents: keep collect-mode announce queues batching unresolved-origin items with compatible same-route messages and resume collection after a true cross-channel drain when a later compatible batch remains. Fixes #83577.
5253
- Providers/Anthropic: preserve native image input for current Claude model rows when stale local catalog data marks them text-only. (#83756) Thanks @TurboTheTurtle.
5354
- Control UI: render live tool progress from session-scoped `session.tool` Gateway events so externally started runs show their tool cards in the active session. (#83734) Thanks @TurboTheTurtle.

src/infra/install-package-dir.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ export async function installPackageDir(params: {
259259
{
260260
timeoutMs: Math.max(params.timeoutMs, 300_000),
261261
cwd: stageDir,
262-
env: createSafeNpmInstallEnv(process.env),
262+
env: createSafeNpmInstallEnv(process.env, { npmConfigCwd: stageDir }),
263263
},
264264
);
265265
} finally {

src/infra/install-source-utils.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,13 @@ describe("packNpmSpecToArchive", () => {
210210
timeoutMs: 300_000,
211211
env: {
212212
COREPACK_ENABLE_DOWNLOAD_PROMPT: "0",
213-
NPM_CONFIG_BEFORE: "",
214213
NPM_CONFIG_IGNORE_SCRIPTS: "true",
214+
NPM_CONFIG_BEFORE: "",
215215
NPM_CONFIG_MIN_RELEASE_AGE: "",
216216
"NPM_CONFIG_MIN-RELEASE-AGE": "",
217217
npm_config_before: "",
218-
"npm_config_min-release-age": "0",
219-
npm_config_min_release_age: "",
218+
"npm_config_min-release-age": "",
219+
npm_config_min_release_age: "0",
220220
},
221221
},
222222
);

src/infra/install-source-utils.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { runCommandWithTimeout } from "../process/exec.js";
55
import { resolveUserPath } from "../utils.js";
66
import { resolveArchiveKind } from "./archive.js";
77
import { pathExists } from "./fs-safe.js";
8-
import { applyNpmFreshnessBypassEnv } from "./npm-install-env.js";
8+
import { applyNpmFreshnessBypassEnv, type NpmProjectInstallEnvOptions } from "./npm-install-env.js";
99
import { withTempWorkspace } from "./private-temp-workspace.js";
1010

1111
export type NpmSpecResolution = {
@@ -37,12 +37,14 @@ export function buildNpmResolutionFields(resolution?: NpmSpecResolution): NpmRes
3737
};
3838
}
3939

40-
export function createNpmMetadataEnv(): NodeJS.ProcessEnv {
40+
export function createNpmMetadataEnv(
41+
scope: Pick<NpmProjectInstallEnvOptions, "npmConfigCwd"> = {},
42+
): NodeJS.ProcessEnv {
4143
const env: NodeJS.ProcessEnv = {
4244
COREPACK_ENABLE_DOWNLOAD_PROMPT: "0",
4345
NPM_CONFIG_IGNORE_SCRIPTS: "true",
4446
};
45-
applyNpmFreshnessBypassEnv(env);
47+
applyNpmFreshnessBypassEnv(env, new Date(), scope);
4648
return env;
4749
}
4850

@@ -286,7 +288,7 @@ export async function packNpmSpecToArchive(params: {
286288
{
287289
timeoutMs: Math.max(params.timeoutMs, 300_000),
288290
cwd: params.cwd,
289-
env: createNpmMetadataEnv(),
291+
env: createNpmMetadataEnv({ npmConfigCwd: params.cwd }),
290292
},
291293
);
292294
if (res.code !== 0) {

0 commit comments

Comments
 (0)