openclaw - 💡(How to fix) Fix [Bug]: openclaw 2026.4.24 — runtime-deps npm install loops, escapes into $HOME/node_modules [2 comments, 3 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#71942Fetched 2026-04-27 05:37:05
View on GitHub
Comments
2
Participants
3
Timeline
8
Reactions
0
Author
Timeline (top)
commented ×2mentioned ×2subscribed ×2closed ×1

Symptom 1 — npm install re-spawns indefinitely

While the gateway is up, this exact command is being respawned by openclaw-gateway roughly every 4–5 seconds, and stays running for ~1 second before exiting:

npm install --ignore-scripts \
@anthropic-ai/[email protected] @anthropic-ai/vertex-sdk@^0.16.0 \
@aws-sdk/[email protected] ... zod@^4.3.6

(34 top-level specs, the contents of .openclaw-runtime-deps.json.)

cwd of every spawn: ~/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-b375d4277baa/.

It comes in clusters of ~10 invocations spaced seconds apart, then quiet for a few minutes, then another cluster. Periods observed: 21:55, 22:12, 22:23, 22:32 (local). I
observed 7+ distinct npm install PIDs inside a single 32-second window during the active phase. npm's own log rotation (logs-max:10) means ~/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-b375d4277baa/.openclaw-npm-cache/_logs/ only retains the last 10 — so the count is at minimum 10/cluster.

Each spawn ends cleanly:
2624 verbose exit 0 2625 info ok
…but silly reify moves {} and the absence of any extract / unpack / finalize / reifyNode lines in the npm log show npm isn't actually doing work — it resolves, audits, exits.
The .openclaw-runtime-deps.lock/ directory is empty (no owner.json), so it's not stale-lock contention; the loop is being driven from outside npm.

The looping correlates with session bootstraps. Specifically, after I sent a Discord DM to the bot, the gateway logs showed:

  • [lcm] bootstrap: session queue acquired queueKey=agent:main:discord:direct:<uid> session=<sid> immediately followed by another npm install cluster.
  • An LLM-side timeout: lane task error: lane=session:agent:main:discord:direct:<uid> durationMs=508818 error="FailoverError: LLM request timed out.".
  • Followed by another bootstrap ([lcm] bootstrap: append-only conversation=270 ...) — and the install cluster repeats.

So the runtime-deps install path appears to be re-entered on every session bootstrap (or every retry of one), instead of being a one-shot bootstrap. Earlier we also saw it
driven by a manual:<jobId>:...:2 cron retry (the :2 attempt counter), confirming retries trigger reinstall.

Suggested look: whatever provisions the isolated runtime on session bootstrap — gate it on a "deps already satisfied" check, or a simple in-process flag, so retries/respawns
don't re-fire npm install.

Symptom 2 — runtime deps land in $HOME/node_modules, not in the runtime-deps dir

The npm install is invoked with cwd = ~/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-b375d4277baa/, but that directory has no package.json. With no project root, npm walks upward, finds ~/package.json (a small unrelated file dating from before openclaw), and installs every transitive dep into ~/node_modules/.

Error Message

! npm list
⎿  openclaw@ /home/openclaw
├── @agentclientprotocol/[email protected] extraneous
├── @anthropic-ai/[email protected] extraneous
├── @anthropic-ai/[email protected] extraneous
├── @aws-crypto/[email protected] extraneous
├── @aws-crypto/[email protected] extraneous ├── @aws-crypto/[email protected] extraneous ├── @aws-crypto/[email protected] extraneous ├── @aws-crypto/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws-sdk/[email protected] extraneous ├── @aws/[email protected] extraneous ├── @aws/[email protected] extraneous ├── @babel/[email protected] extraneous ├── @borewit/[email protected] extraneous ├── @buape/[email protected] extraneous ├── @clack/[email protected] extraneous ├── @clack/[email protected] extraneous ├── @cloudflare/[email protected] extraneous ├── @discordjs/[email protected] extraneous ├── @esbuild/[email protected] extraneous ├── @eshaz/[email protected] extraneous ├── @google/[email protected] extraneous ├── @homebridge/[email protected] extraneous ├── @hono/[email protected] extraneous ├── @mariozechner/[email protected] extraneous ├── @mariozechner/[email protected] extraneous ├── @mariozechner/[email protected] extraneous ├── @mariozechner/[email protected] extraneous ├── @mariozechner/[email protected] extraneous ├── @mariozechner/[email protected] extraneous ├── @mariozechner/[email protected] extraneous ├── @mistralai/[email protected] extraneous ├── @modelcontextprotocol/[email protected] extraneous ├── @mozilla/[email protected] extraneous ├── @napi-rs/[email protected] extraneous ├── @napi-rs/[email protected] extraneous ├── @nodable/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @protobufjs/[email protected] extraneous ├── @silvia-odwyer/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @smithy/[email protected] extraneous ├── @snazzah/[email protected] extraneous ├── @snazzah/[email protected] extraneous ├── @tencent-connect/[email protected] extraneous ├── @tokenizer/[email protected] extraneous ├── @tokenizer/[email protected] extraneous ├── @tootallnate/[email protected] extraneous ├── @types/[email protected] extraneous ├── @types/[email protected] extraneous ├── @types/[email protected] extraneous ├── @types/[email protected] extraneous ├── @types/[email protected] extraneous ├── @types/[email protected] extraneous ├── @wasm-audio-decoders/[email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous ├── [email protected] extraneous └── [email protected] extraneous

Root Cause

Reproduction

  1. Upgrade from 2026.4.23 to openclaw 2026.4.24 in a user-prefix npm-global on Linux (openclaw update).
  2. Start openclaw-gateway.
  3. Send a Discord DM the bot will try to handle (or trigger a manual cron run). If the agent's LLM target is unreachable, the loop becomes obvious because each timed-out retry re-fires the install.

Code Example

! npm list                                                                                                                                                                        
  ⎿  openclaw@ /home/openclaw                                                                                                                                               
     ├── @agentclientprotocol/sdk@0.17.1 extraneous                                                                                                                               
     ├── @anthropic-ai/sdk@0.90.0 extraneous                                                                                                                                      
     ├── @anthropic-ai/vertex-sdk@0.16.0 extraneous                                                                                                                               
     ├── @aws-crypto/crc32@5.2.0 extraneous                                                                                                                                       
     ├── @aws-crypto/sha256-browser@5.2.0 extraneous
     ├── @aws-crypto/sha256-js@5.2.0 extraneous
     ├── @aws-crypto/supports-web-crypto@5.2.0 extraneous
     ├── @aws-crypto/util@5.2.0 extraneous
     ├── @aws-sdk/client-bedrock-runtime@3.1034.0 extraneous
     ├── @aws-sdk/client-bedrock@3.1034.0 extraneous
     ├── @aws-sdk/client-cognito-identity@3.1037.0 extraneous
     ├── @aws-sdk/core@3.974.5 extraneous
     ├── @aws-sdk/credential-provider-cognito-identity@3.972.28 extraneous
     ├── @aws-sdk/credential-provider-env@3.972.31 extraneous
     ├── @aws-sdk/credential-provider-http@3.972.33 extraneous
     ├── @aws-sdk/credential-provider-ini@3.972.35 extraneous
     ├── @aws-sdk/credential-provider-login@3.972.35 extraneous
     ├── @aws-sdk/credential-provider-node@3.972.34 extraneous
     ├── @aws-sdk/credential-provider-process@3.972.31 extraneous
     ├── @aws-sdk/credential-provider-sso@3.972.35 extraneous
     ├── @aws-sdk/credential-provider-web-identity@3.972.35 extraneous
     ├── @aws-sdk/credential-providers@3.1037.0 extraneous
     ├── @aws-sdk/eventstream-handler-node@3.972.14 extraneous
     ├── @aws-sdk/middleware-eventstream@3.972.10 extraneous
     ├── @aws-sdk/middleware-host-header@3.972.10 extraneous
     ├── @aws-sdk/middleware-logger@3.972.10 extraneous
     ├── @aws-sdk/middleware-recursion-detection@3.972.11 extraneous
     ├── @aws-sdk/middleware-sdk-s3@3.972.34 extraneous
     ├── @aws-sdk/middleware-user-agent@3.972.35 extraneous
     ├── @aws-sdk/middleware-websocket@3.972.16 extraneous
     ├── @aws-sdk/nested-clients@3.997.3 extraneous
     ├── @aws-sdk/region-config-resolver@3.972.13 extraneous
     ├── @aws-sdk/signature-v4-multi-region@3.996.22 extraneous
     ├── @aws-sdk/token-providers@3.1034.0 extraneous
     ├── @aws-sdk/types@3.973.8 extraneous
     ├── @aws-sdk/util-arn-parser@3.972.3 extraneous
     ├── @aws-sdk/util-endpoints@3.996.8 extraneous
     ├── @aws-sdk/util-format-url@3.972.10 extraneous
     ├── @aws-sdk/util-locate-window@3.965.5 extraneous
     ├── @aws-sdk/util-user-agent-browser@3.972.10 extraneous
     ├── @aws-sdk/util-user-agent-node@3.973.21 extraneous
     ├── @aws-sdk/xml-builder@3.972.19 extraneous
     ├── @aws/bedrock-token-generator@1.1.0 extraneous
     ├── @aws/lambda-invoke-store@0.2.4 extraneous
     ├── @babel/runtime@7.29.2 extraneous
     ├── @borewit/text-codec@0.2.2 extraneous
     ├── @buape/carbon@0.16.0 extraneous
     ├── @clack/core@1.2.0 extraneous
     ├── @clack/prompts@1.2.0 extraneous
     ├── @cloudflare/workers-types@4.20260405.1 extraneous
     ├── @discordjs/voice@0.19.2 extraneous
     ├── @esbuild/linux-x64@0.27.7 extraneous
     ├── @eshaz/web-worker@1.2.2 extraneous
     ├── @google/genai@1.50.1 extraneous
     ├── @homebridge/ciao@1.3.6 extraneous
     ├── @hono/node-server@1.19.14 extraneous
     ├── @mariozechner/clipboard-linux-x64-gnu@0.3.3 extraneous
     ├── @mariozechner/clipboard@0.3.3 extraneous
     ├── @mariozechner/jiti@2.6.5 extraneous
     ├── @mariozechner/pi-agent-core@0.70.2 extraneous
     ├── @mariozechner/pi-ai@0.70.2 extraneous
     ├── @mariozechner/pi-coding-agent@0.70.2 extraneous
     ├── @mariozechner/pi-tui@0.70.2 extraneous
     ├── @mistralai/mistralai@2.2.1 extraneous
     ├── @modelcontextprotocol/sdk@1.29.0 extraneous
     ├── @mozilla/readability@0.6.0 extraneous
     ├── @napi-rs/canvas-linux-x64-gnu@0.1.99 extraneous
     ├── @napi-rs/canvas@0.1.99 extraneous
     ├── @nodable/entities@2.1.0 extraneous
     ├── @protobufjs/aspromise@1.1.2 extraneous
     ├── @protobufjs/base64@1.1.2 extraneous
     ├── @protobufjs/codegen@2.0.4 extraneous
     ├── @protobufjs/eventemitter@1.1.0 extraneous
     ├── @protobufjs/fetch@1.1.0 extraneous
     ├── @protobufjs/float@1.0.2 extraneous
     ├── @protobufjs/inquire@1.1.0 extraneous
     ├── @protobufjs/path@1.1.2 extraneous
     ├── @protobufjs/pool@1.1.0 extraneous
     ├── @protobufjs/utf8@1.1.0 extraneous
     ├── @silvia-odwyer/photon-node@0.3.4 extraneous
     ├── @smithy/config-resolver@4.4.17 extraneous
     ├── @smithy/core@3.23.17 extraneous
     ├── @smithy/credential-provider-imds@4.2.14 extraneous
     ├── @smithy/eventstream-codec@4.2.14 extraneous
     ├── @smithy/eventstream-serde-browser@4.2.14 extraneous
     ├── @smithy/eventstream-serde-config-resolver@4.3.14 extraneous
     ├── @smithy/eventstream-serde-node@4.2.14 extraneous
     ├── @smithy/eventstream-serde-universal@4.2.14 extraneous
     ├── @smithy/fetch-http-handler@5.3.17 extraneous
     ├── @smithy/hash-node@4.2.14 extraneous
     ├── @smithy/invalid-dependency@4.2.14 extraneous
     ├── @smithy/is-array-buffer@4.2.2 extraneous
     ├── @smithy/middleware-content-length@4.2.14 extraneous
     ├── @smithy/middleware-endpoint@4.4.32 extraneous
     ├── @smithy/middleware-retry@4.5.5 extraneous
     ├── @smithy/middleware-serde@4.2.20 extraneous
     ├── @smithy/middleware-stack@4.2.14 extraneous
     ├── @smithy/node-config-provider@4.3.14 extraneous
     ├── @smithy/node-http-handler@4.6.1 extraneous
     ├── @smithy/property-provider@4.2.14 extraneous
     ├── @smithy/protocol-http@5.3.14 extraneous
     ├── @smithy/querystring-builder@4.2.14 extraneous
     ├── @smithy/querystring-parser@4.2.14 extraneous
     ├── @smithy/service-error-classification@4.3.0 extraneous
     ├── @smithy/shared-ini-file-loader@4.4.9 extraneous
     ├── @smithy/signature-v4@5.3.14 extraneous
     ├── @smithy/smithy-client@4.12.13 extraneous
     ├── @smithy/types@4.14.1 extraneous
     ├── @smithy/url-parser@4.2.14 extraneous
     ├── @smithy/util-base64@4.3.2 extraneous
     ├── @smithy/util-body-length-browser@4.2.2 extraneous
     ├── @smithy/util-body-length-node@4.2.3 extraneous
     ├── @smithy/util-buffer-from@4.2.2 extraneous
     ├── @smithy/util-config-provider@4.2.2 extraneous
     ├── @smithy/util-defaults-mode-browser@4.3.49 extraneous
     ├── @smithy/util-defaults-mode-node@4.2.54 extraneous
     ├── @smithy/util-endpoints@3.4.2 extraneous
     ├── @smithy/util-hex-encoding@4.2.2 extraneous
     ├── @smithy/util-middleware@4.2.14 extraneous
     ├── @smithy/util-retry@4.3.4 extraneous
     ├── @smithy/util-stream@4.5.25 extraneous
     ├── @smithy/util-uri-escape@4.2.2 extraneous
     ├── @smithy/util-utf8@4.2.2 extraneous
     ├── @smithy/uuid@1.1.2 extraneous
     ├── @snazzah/davey-linux-x64-gnu@0.1.11 extraneous
     ├── @snazzah/davey@0.1.11 extraneous
     ├── @tencent-connect/qqbot-connector@1.1.0 extraneous
     ├── @tokenizer/inflate@0.4.1 extraneous
     ├── @tokenizer/token@0.3.0 extraneous
     ├── @tootallnate/quickjs-emscripten@0.23.0 extraneous
     ├── @types/bun@1.3.11 extraneous
     ├── @types/mime-types@2.1.4 extraneous
     ├── @types/node@25.6.0 extraneous
     ├── @types/retry@0.12.0 extraneous
     ├── @types/ws@8.18.1 extraneous
     ├── @types/yauzl@2.10.3 extraneous
     ├── @wasm-audio-decoders/common@9.0.7 extraneous
     ├── accepts@2.0.0 extraneous
     ├── acpx@0.5.3 extraneous
     ├── agent-base@9.0.0 extraneous
     ├── ajv-formats@3.0.1 extraneous
     ├── ajv@8.20.0 extraneous
     ├── ansi-regex@6.2.2 extraneous
     ├── ansi-styles@4.3.0 extraneous
     ├── any-promise@1.3.0 extraneous
     ├── ast-types@0.13.4 extraneous
     ├── b4a@1.8.0 extraneous
     ├── balanced-match@4.0.4 extraneous
     ├── bare-events@2.8.2 extraneous
     ├── bare-fs@4.7.1 extraneous
     ├── bare-os@3.9.0 extraneous
     ├── bare-path@3.0.0 extraneous
     ├── bare-stream@2.13.0 extraneous
     ├── bare-url@2.4.2 extraneous
     ├── base64-js@1.5.1 extraneous
     ├── basic-ftp@5.3.0 extraneous
     ├── bignumber.js@9.3.1 extraneous
     ├── body-parser@2.2.2 extraneous
     ├── boolbase@1.0.0 extraneous
     ├── bowser@2.14.1 extraneous
     ├── brace-expansion@5.0.5 extraneous
     ├── buffer-crc32@0.2.13 extraneous
     ├── buffer-equal-constant-time@1.0.1 extraneous
     ├── buffer-from@1.1.2 extraneous
     ├── bun-types@1.3.11 extraneous
     ├── bytes@3.1.2 extraneous
     ├── call-bind-apply-helpers@1.0.2 extraneous
     ├── call-bound@1.0.4 extraneous
     ├── chalk@5.6.2 extraneous
     ├── cli-highlight@2.1.11 extraneous
     ├── cliui@7.0.4 extraneous
     ├── color-convert@2.0.1 extraneous
     ├── color-name@1.1.4 extraneous
     ├── commander@14.0.3 extraneous
     ├── content-disposition@1.1.0 extraneous
     ├── content-type@1.0.5 extraneous
     ├── cookie-signature@1.2.2 extraneous
     ├── cookie@0.7.2 extraneous
     ├── cors@2.8.6 extraneous
     ├── cross-spawn@7.0.6 extraneous
     ├── css-select@5.2.2 extraneous
     ├── css-what@6.2.2 extraneous
     ├── cssom@0.5.0 extraneous
     ├── data-uri-to-buffer@6.0.2 extraneous
     ├── debug@4.4.3 extraneous
     ├── degenerator@5.0.1 extraneous
     ├── depd@2.0.0 extraneous
     ├── diff@8.0.4 extraneous
     ├── discord-api-types@0.38.47 extraneous
     ├── dom-serializer@2.0.0 extraneous
     ├── domelementtype@2.3.0 extraneous
     ├── domhandler@5.0.3 extraneous
     ├── domutils@3.2.2 extraneous
     ├── dunder-proto@1.0.1 extraneous
     ├── ecdsa-sig-formatter@1.0.11 extraneous
     ├── ee-first@1.1.1 extraneous
     ├── emoji-regex@8.0.0 extraneous
     ├── encodeurl@2.0.0 extraneous
     ├── end-of-stream@1.4.5 extraneous
     ├── entities@4.5.0 extraneous
     ├── es-define-property@1.0.1 extraneous
     ├── es-errors@1.3.0 extraneous
     ├── es-object-atoms@1.1.1 extraneous
     ├── esbuild@0.27.7 extraneous
     ├── escalade@3.2.0 extraneous
     ├── escape-html@1.0.3 extraneous
     ├── escodegen@2.1.0 extraneous
     ├── esprima@4.0.1 extraneous
     ├── estraverse@5.3.0 extraneous
     ├── esutils@2.0.3 extraneous
     ├── etag@1.8.1 extraneous
     ├── events-universal@1.0.1 extraneous
     ├── eventsource-parser@3.0.8 extraneous
     ├── eventsource@3.0.7 extraneous
     ├── express-rate-limit@8.4.1 extraneous
     ├── express@5.2.1 extraneous
     ├── extend@3.0.2 extraneous
     ├── extract-zip@2.0.1 extraneous
     ├── fast-deep-equal@3.1.3 extraneous
     ├── fast-fifo@1.3.2 extraneous
     ├── fast-string-truncated-width@1.2.1 extraneous
     ├── fast-string-width@1.1.0 extraneous
     ├── fast-uri@3.1.0 extraneous
     ├── fast-wrap-ansi@0.1.6 extraneous
     ├── fast-xml-builder@1.1.5 extraneous
     ├── fast-xml-parser@5.7.1 extraneous
     ├── fd-slicer@1.1.0 extraneous
     ├── fetch-blob@3.2.0 extraneous
     ├── file-type@21.3.4 extraneous
     ├── finalhandler@2.1.1 extraneous
     ├── formdata-polyfill@4.0.10 extraneous
     ├── forwarded@0.2.0 extraneous
     ├── fresh@2.0.0 extraneous
     ├── function-bind@1.1.2 extraneous
     ├── gaxios@6.7.1 extraneous
     ├── gcp-metadata@6.1.1 extraneous
     ├── get-caller-file@2.0.5 extraneous
     ├── get-east-asian-width@1.5.0 extraneous
     ├── get-intrinsic@1.3.0 extraneous
     ├── get-proto@1.0.1 extraneous
     ├── get-stream@5.2.0 extraneous
     ├── get-tsconfig@4.14.0 extraneous
     ├── get-uri@6.0.5 extraneous
     ├── glob@13.0.6 extraneous
     ├── google-auth-library@9.15.1 extraneous
     ├── google-logging-utils@0.0.2 extraneous
     ├── gopd@1.2.0 extraneous
     ├── graceful-fs@4.2.11 extraneous
     ├── gtoken@7.1.0 extraneous
     ├── has-flag@4.0.0 extraneous
     ├── has-symbols@1.1.0 extraneous
     ├── hasown@2.0.3 extraneous
     ├── highlight.js@10.7.3 extraneous
     ├── hono@4.12.15 extraneous
     ├── hosted-git-info@9.0.2 extraneous
     ├── html-escaper@3.0.3 extraneous
     ├── htmlparser2@10.1.0 extraneous
     ├── http-errors@2.0.1 extraneous
     ├── http-proxy-agent@7.0.2 extraneous
     ├── https-proxy-agent@9.0.0 extraneous
     ├── iconv-lite@0.7.2 extraneous
     ├── ieee754@1.2.1 extraneous
     ├── ignore@7.0.5 extraneous
     ├── inherits@2.0.4 extraneous
     ├── ip-address@10.1.0 extraneous
     ├── ipaddr.js@1.9.1 extraneous
     ├── is-fullwidth-code-point@3.0.0 extraneous
     ├── is-promise@4.0.0 extraneous
     ├── is-stream@2.0.1 extraneous
     ├── isexe@2.0.0 extraneous
     ├── jose@6.2.2 extraneous
     ├── json-bigint@1.0.0 extraneous
     ├── json-schema-to-ts@3.1.1 extraneous
     ├── json-schema-traverse@1.0.0 extraneous
     ├── json-schema-typed@8.0.2 extraneous
     ├── jwa@2.0.1 extraneous
     ├── jws@4.0.1 extraneous
     ├── koffi@2.16.1 extraneous
     ├── linkedom@0.18.12 extraneous
     ├── long@5.3.2 extraneous
     ├── lru-cache@11.3.5 extraneous
     ├── marked@15.0.12 extraneous
     ├── math-intrinsics@1.1.0 extraneous
     ├── media-typer@1.1.0 extraneous
     ├── merge-descriptors@2.0.0 extraneous
     ├── mime-db@1.54.0 extraneous
     ├── mime-types@3.0.2 extraneous
     ├── minimatch@10.2.5 extraneous
     ├── minipass@7.1.3 extraneous
     ├── mpg123-decoder@1.0.3 extraneous
     ├── ms@2.1.3 extraneous
     ├── mz@2.7.0 extraneous
     ├── negotiator@1.0.0 extraneous
     ├── netmask@2.1.1 extraneous
     ├── node-domexception@1.0.0 extraneous
     ├── node-edge-tts@1.2.10 extraneous
     ├── node-fetch@2.7.0 extraneous
     ├── node-readable-to-web-readable-stream@0.4.2 extraneous
     ├── nth-check@2.1.1 extraneous
     ├── object-assign@4.1.1 extraneous
     ├── object-inspect@1.13.4 extraneous
     ├── on-finished@2.4.1 extraneous
     ├── once@1.4.0 extraneous
     ├── openai@6.26.0 extraneous
     ├── opusscript@0.1.1 extraneous
     ├── p-retry@4.6.2 extraneous
     ├── pac-proxy-agent@7.2.0 extraneous
     ├── pac-resolver@7.0.1 extraneous
     ├── parse5-htmlparser2-tree-adapter@6.0.1 extraneous
     ├── parse5@5.1.1 extraneous
     ├── parseurl@1.3.3 extraneous
     ├── partial-json@0.1.7 extraneous
     ├── path-expression-matcher@1.5.0 extraneous
     ├── path-key@3.1.1 extraneous
     ├── path-scurry@2.0.2 extraneous
     ├── path-to-regexp@8.4.2 extraneous
     ├── pdfjs-dist@5.6.205 extraneous
     ├── pend@1.2.0 extraneous
     ├── pkce-challenge@5.0.1 extraneous
     ├── playwright@1.59.1
     ├── prism-media@1.3.5 extraneous
     ├── proper-lockfile@4.1.2 extraneous
     ├── protobufjs@7.5.5 extraneous
     ├── proxy-addr@2.0.7 extraneous
     ├── proxy-agent@6.5.0 extraneous
     ├── proxy-from-env@1.1.0 extraneous
     ├── pump@3.0.4 extraneous
     ├── qrcode-terminal@0.12.0 extraneous
     ├── qs@6.15.1 extraneous
     ├── range-parser@1.2.1 extraneous
     ├── raw-body@3.0.2 extraneous
     ├── require-directory@2.1.1 extraneous
     ├── require-from-string@2.0.2 extraneous
     ├── resolve-pkg-maps@1.0.0 extraneous
     ├── retry@0.13.1 extraneous
     ├── router@2.2.0 extraneous
     ├── safe-buffer@5.2.1 extraneous
     ├── safer-buffer@2.1.2 extraneous
     ├── send@1.2.1 extraneous
     ├── serve-static@2.2.1 extraneous
     ├── setprototypeof@1.2.0 extraneous
     ├── shebang-command@2.0.0 extraneous
     ├── shebang-regex@3.0.0 extraneous
     ├── side-channel-list@1.0.1 extraneous
     ├── side-channel-map@1.0.1 extraneous
     ├── side-channel-weakmap@1.0.2 extraneous
     ├── side-channel@1.1.0 extraneous
     ├── signal-exit@3.0.7 extraneous
     ├── silk-wasm@3.7.1 extraneous
     ├── simple-yenc@1.0.4 extraneous
     ├── sisteransi@1.0.5 extraneous
     ├── skillflag@0.1.4 extraneous
     ├── smart-buffer@4.2.0 extraneous
     ├── socks-proxy-agent@8.0.5 extraneous
     ├── socks@2.8.7 extraneous
     ├── source-map-support@0.5.21 extraneous
     ├── source-map@0.6.1 extraneous
     ├── statuses@2.0.2 extraneous
     ├── std-env@3.10.0 extraneous
     ├── streamx@2.25.0 extraneous
     ├── string-width@4.2.3 extraneous
     ├── strip-ansi@7.2.0 extraneous
     ├── strnum@2.2.3 extraneous
     ├── strtok3@10.3.5 extraneous
     ├── supports-color@7.2.0 extraneous
     ├── tar-stream@3.1.8 extraneous
     ├── teex@1.0.1 extraneous
     ├── text-decoder@1.2.7 extraneous
     ├── thenify-all@1.6.0 extraneous
     ├── thenify@3.3.1 extraneous
     ├── toidentifier@1.0.1 extraneous
     ├── token-types@6.1.2 extraneous
     ├── tr46@0.0.3 extraneous
     ├── ts-algebra@2.0.0 extraneous
     ├── tslib@2.8.1 extraneous
     ├── tsx@4.21.0 extraneous
     ├── type-is@2.0.1 extraneous
     ├── typebox@1.1.31 extraneous
     ├── uhyphen@0.2.0 extraneous
     ├── uint8array-extras@1.5.0 extraneous
     ├── undici-types@7.19.2 extraneous
     ├── undici@8.1.0 extraneous
     ├── unpipe@1.0.0 extraneous
     ├── uuid@14.0.0 extraneous
     ├── vary@1.1.2 extraneous
     ├── web-streams-polyfill@3.3.3 extraneous
     ├── webidl-conversions@3.0.1 extraneous
     ├── whatwg-url@5.0.0 extraneous
     ├── which@2.0.2 extraneous
     ├── wrap-ansi@7.0.0 extraneous
     ├── wrappy@1.0.2 extraneous
     ├── ws@8.20.0 extraneous
     ├── y18n@5.0.8 extraneous
     ├── yaml@2.8.3 extraneous
     ├── yargs-parser@20.2.9 extraneous
     ├── yargs@16.2.0 extraneous
     ├── yauzl@2.10.0 extraneous
     ├── yoctocolors@2.1.2 extraneous
     ├── zod-to-json-schema@3.25.2 extraneous
     └── zod@4.3.6 extraneous
RAW_BUFFERClick to expand / collapse

Bug type

Behavior bug (incorrect output/state without crash)

Beta release blocker

No

Summary

Symptom 1 — npm install re-spawns indefinitely

While the gateway is up, this exact command is being respawned by openclaw-gateway roughly every 4–5 seconds, and stays running for ~1 second before exiting:

npm install --ignore-scripts \
@anthropic-ai/[email protected] @anthropic-ai/vertex-sdk@^0.16.0 \
@aws-sdk/[email protected] ... zod@^4.3.6

(34 top-level specs, the contents of .openclaw-runtime-deps.json.)

cwd of every spawn: ~/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-b375d4277baa/.

It comes in clusters of ~10 invocations spaced seconds apart, then quiet for a few minutes, then another cluster. Periods observed: 21:55, 22:12, 22:23, 22:32 (local). I
observed 7+ distinct npm install PIDs inside a single 32-second window during the active phase. npm's own log rotation (logs-max:10) means ~/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-b375d4277baa/.openclaw-npm-cache/_logs/ only retains the last 10 — so the count is at minimum 10/cluster.

Each spawn ends cleanly:
2624 verbose exit 0 2625 info ok
…but silly reify moves {} and the absence of any extract / unpack / finalize / reifyNode lines in the npm log show npm isn't actually doing work — it resolves, audits, exits.
The .openclaw-runtime-deps.lock/ directory is empty (no owner.json), so it's not stale-lock contention; the loop is being driven from outside npm.

The looping correlates with session bootstraps. Specifically, after I sent a Discord DM to the bot, the gateway logs showed:

  • [lcm] bootstrap: session queue acquired queueKey=agent:main:discord:direct:<uid> session=<sid> immediately followed by another npm install cluster.
  • An LLM-side timeout: lane task error: lane=session:agent:main:discord:direct:<uid> durationMs=508818 error="FailoverError: LLM request timed out.".
  • Followed by another bootstrap ([lcm] bootstrap: append-only conversation=270 ...) — and the install cluster repeats.

So the runtime-deps install path appears to be re-entered on every session bootstrap (or every retry of one), instead of being a one-shot bootstrap. Earlier we also saw it
driven by a manual:<jobId>:...:2 cron retry (the :2 attempt counter), confirming retries trigger reinstall.

Suggested look: whatever provisions the isolated runtime on session bootstrap — gate it on a "deps already satisfied" check, or a simple in-process flag, so retries/respawns
don't re-fire npm install.

Symptom 2 — runtime deps land in $HOME/node_modules, not in the runtime-deps dir

The npm install is invoked with cwd = ~/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-b375d4277baa/, but that directory has no package.json. With no project root, npm walks upward, finds ~/package.json (a small unrelated file dating from before openclaw), and installs every transitive dep into ~/node_modules/.

Steps to reproduce

Reproduction

  1. Upgrade from 2026.4.23 to openclaw 2026.4.24 in a user-prefix npm-global on Linux (openclaw update).
  2. Start openclaw-gateway.
  3. Send a Discord DM the bot will try to handle (or trigger a manual cron run). If the agent's LLM target is unreachable, the loop becomes obvious because each timed-out retry re-fires the install.

Quick observability hooks

  • Cluster logs land in ~/.openclaw/plugin-runtime-deps/openclaw-<ver>-<hash>/.openclaw-npm-cache/_logs/.
  • Lock dir: .openclaw-runtime-deps.lock/owner.json (empty in our reproduction).
  • Spec list: .openclaw-runtime-deps.json.
  • Gateway-side trigger: grep gateway log for bootstrap: session queue acquired immediately preceding a new npm log timestamp.

Expected behavior

Install under ~/.openclaw instead

Actual behavior

Observed:

  • ~/node_modules is 366 MB, 295 top-level entries.
  • npm list from ~ reports every runtime-deps package as extraneous (because they aren't declared in ~/package.json) — only [email protected] (the one entry that IS in
    ~/package.json) lacks the marker.
  • The runtime-deps cwd has only dist/, .openclaw-npm-cache/, and .openclaw-runtime-deps.json — no node_modules, no package.json, no package-lock.json.

This works at runtime because Node's module-resolution upward walk also finds ~/node_modules, but it's fragile:

  • npm prune from $HOME would happily delete the entire 366 MB tree as "extraneous" and brick the gateway.
  • Anything else under $HOME running Node will resolve openclaw's deps, masking missing-dep bugs in unrelated tools and pinning them to versions chosen by openclaw.
  • Two different openclaw versions' runtime-deps would collide in the same $HOME/node_modules.

Suggested fix: write a minimal package.json (and ideally package-lock.json) into the runtime-deps directory before invoking npm install, and pass --prefix=<that dir> (or
--install-strategy=hoisted / --install-links as appropriate) so npm treats that directory as the project root and writes a local node_modules. Don't rely on cwd alone.

OpenClaw version

2026.4.24

Operating system

Ubuntu 24.04

Install method

npm local user

Model

ollama/gemma4:cloud

Provider / routing chain

openclaw -> ollama cloud -> gemma4

Additional provider/model setup details

No response

Logs, screenshots, and evidence

! npm list                                                                                                                                                                        
  ⎿  openclaw@ /home/openclaw                                                                                                                                               
     ├── @agentclientprotocol/[email protected] extraneous                                                                                                                               
     ├── @anthropic-ai/[email protected] extraneous                                                                                                                                      
     ├── @anthropic-ai/[email protected] extraneous                                                                                                                               
     ├── @aws-crypto/[email protected] extraneous                                                                                                                                       
     ├── @aws-crypto/[email protected] extraneous
     ├── @aws-crypto/[email protected] extraneous
     ├── @aws-crypto/[email protected] extraneous
     ├── @aws-crypto/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws-sdk/[email protected] extraneous
     ├── @aws/[email protected] extraneous
     ├── @aws/[email protected] extraneous
     ├── @babel/[email protected] extraneous
     ├── @borewit/[email protected] extraneous
     ├── @buape/[email protected] extraneous
     ├── @clack/[email protected] extraneous
     ├── @clack/[email protected] extraneous
     ├── @cloudflare/[email protected] extraneous
     ├── @discordjs/[email protected] extraneous
     ├── @esbuild/[email protected] extraneous
     ├── @eshaz/[email protected] extraneous
     ├── @google/[email protected] extraneous
     ├── @homebridge/[email protected] extraneous
     ├── @hono/[email protected] extraneous
     ├── @mariozechner/[email protected] extraneous
     ├── @mariozechner/[email protected] extraneous
     ├── @mariozechner/[email protected] extraneous
     ├── @mariozechner/[email protected] extraneous
     ├── @mariozechner/[email protected] extraneous
     ├── @mariozechner/[email protected] extraneous
     ├── @mariozechner/[email protected] extraneous
     ├── @mistralai/[email protected] extraneous
     ├── @modelcontextprotocol/[email protected] extraneous
     ├── @mozilla/[email protected] extraneous
     ├── @napi-rs/[email protected] extraneous
     ├── @napi-rs/[email protected] extraneous
     ├── @nodable/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @protobufjs/[email protected] extraneous
     ├── @silvia-odwyer/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @smithy/[email protected] extraneous
     ├── @snazzah/[email protected] extraneous
     ├── @snazzah/[email protected] extraneous
     ├── @tencent-connect/[email protected] extraneous
     ├── @tokenizer/[email protected] extraneous
     ├── @tokenizer/[email protected] extraneous
     ├── @tootallnate/[email protected] extraneous
     ├── @types/[email protected] extraneous
     ├── @types/[email protected] extraneous
     ├── @types/[email protected] extraneous
     ├── @types/[email protected] extraneous
     ├── @types/[email protected] extraneous
     ├── @types/[email protected] extraneous
     ├── @wasm-audio-decoders/[email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected]
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     ├── [email protected] extraneous
     └── [email protected] extraneous

Impact and severity

No response

Additional information

extent analysis

TL;DR

The issue can be fixed by creating a minimal package.json file in the runtime-deps directory and passing the --prefix option to npm install to ensure that dependencies are installed locally.

Guidance

  • Create a minimal package.json file in the runtime-deps directory with the required dependencies.
  • Pass the --prefix option to npm install to specify the directory where dependencies should be installed.
  • Consider adding a "deps already satisfied" check or an in-process flag to prevent retries from re-firing npm install.
  • Verify that the node_modules directory is created in the correct location and that dependencies are installed correctly.

Example

// package.json
{
  "name": "openclaw-runtime-deps",
  "version": "1.0.0",
  "dependencies": {
    "@anthropic-ai/sdk": "0.90.0",
    "@anthropic-ai/vertex-sdk": "^0.16.0",
    // ... other dependencies ...
  }
}
npm install --prefix ~/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-b375d4277baa/

Notes

The provided solution assumes that the issue is caused by the lack of a package.json file in the runtime-deps directory. If the issue persists, further investigation may be required to determine the root cause.

Recommendation

Apply the suggested fix by creating a minimal package.json file and passing the --prefix option to npm install. This should resolve the issue and prevent retries from re-firing npm install.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

Install under ~/.openclaw instead

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING