Skip to content

CLI openclaw status text mode extremely slow (~20-30s) due to cache: false hardcoded in manifest registry loader #73291

Description

@slideshow-dingo

Bug Report

Environment

  • OpenClaw version: 2026.4.25
  • Node.js: v24.14.1
  • OS: Ubuntu 24.04 LTS
  • Installed plugins: 112 (19 enabled, 93 disabled)

Problem

openclaw status in text mode takes 20-30 seconds to produce output, appearing to hang. JSON mode (--json) completes in ~8 seconds. The process writes 0 bytes to stdout for the entire duration.

Evidence

  1. strace shows 48K statx filesystem calls in 3 seconds — the CLI scans all 112 plugin directories
  2. V8 profiler shows 15%+ CPU in json5.parse():
    • json5/lib/parse.js:13 — 977 ticks (4.4%)
    • json5/lib/parse.js:133 — 906 ticks (4.1%)
    • json5/lib/parse.js:570 — 664 ticks (3.0%)
  3. 112 plugin manifests found at dist/extensions/*/openclaw.plugin.json
  4. Text mode eventually completes after ~20-30s (not an infinite hang)

Root Cause

The root cause is not JSON5 parsing speed per se — it's that the manifest registry cache is hardcoded disabled.

The Smoking Gun

File: dist/manifest-registry-installed-BaIMBgdv.js:64

return loadPluginManifestRegistry({
    config: params.config,
    workspaceDir: params.workspaceDir,
    env: params.env,
    cache: false,  // ← THIS IS THE BUG
    candidates,
    diagnostics: [...diagnostics],
    installRecords: extractPluginInstallRecordsFromInstalledPluginIndex(params.index)
});

The cache is hardcoded to false. The existing cache infrastructure (1-second TTL, mtime-based invalidation) at dist/manifest-registry-BeaRFaM3.js:113 is completely bypassed.

Full Call Chain (Text Mode)

openclaw status (text)
  → dist/status-faD5DC8z.js:runDaemonStatus()
    → dist/status-faD5DC8z.js:printDaemonStatus() [opts.json = false]
      → (text formatter path loads)
      → dist/status-BW3nLVAj.js:buildPluginRegistrySnapshotReport():174
        → dist/manifest-registry-installed-BaIMBgdv.js:loadPluginManifestRegistryForInstalledIndex()
          → dist/manifest-registry-BeaRFaM3.js:loadPluginManifestRegistry({ cache: false }):317
            → discoverOpenClawPlugins() in dist/discovery-IHhcAvkF.js:695
              → For each of 112 plugins:
                → loadPluginManifest() in dist/manifest-C0Wa8IEc.js:1013
                  → JSON5.parse() in dist/manifest-C0Wa8IEc.js:1036

Why JSON Mode Is Fast

// dist/status-faD5DC8z.js:printDaemonStatus()
if (opts.json) {
    const sanitized = sanitizeDaemonStatusForJson(status);
    defaultRuntime.writeJson(sanitized);
    return;  // ← Early return, text formatter NEVER loaded
}

JSON mode never loads status-BW3nLVAj.js, so it never calls buildPluginRegistrySnapshotReport(), so it never triggers manifest parsing.

Cache Infrastructure Already Exists

// dist/manifest-registry-BeaRFaM3.js:113
const DEFAULT_MANIFEST_CACHE_MS = 1e3;  // 1 second TTL

// dist/manifest-registry-BeaRFaM3.js:317-324
const cacheEnabled = params.cache !== false && !params.installRecords && shouldUseManifestCache(env);
if (cacheEnabled) {
    const cached = registryCache.get(cacheKey);
    if (cached && cached.expiresAt > Date.now()) return cached.registry;
}

The cache works. It's just never enabled because cache: false is passed.

Reproduction

# Text mode — ~20-30s, 0 bytes output for most of it
$ time openclaw status
# JSON mode — ~8s
$ time openclaw status --json --timeout 3000
# channels status — ~2s (skips plugin diagnostics)
$ time openclaw channels status
# usage — ~2s (skips plugin diagnostics)
$ time openclaw status --usage

Suggested Fix

Option A (one-line): Change cache: false to cache: true in manifest-registry-installed-BaIMBgdv.js:64.

Option B (slightly better): Add cache parameter to loadPluginManifestRegistryForInstalledIndex() so callers can opt-in, and have status pass cache: true.

Option A is probably sufficient — the cache TTL is only 1 second, so stale data is minimal.

Workaround

Use openclaw status --json --timeout 3000 or openclaw channels status for quick checks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions