mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 23:00:43 +00:00
Reporter measured `agents list --json` at ~7-9s on a fast host (~11s in container) on 2026.4.23, while peer `--json` commands like `channels list`, `cron list --all`, and `sessions ... --all-agents` stay sub-second. Their cold-call dashboard endpoint dropped from 27s to ~2s after a local dist patch — they could even retire the 5-min cache TTL workaround they had shipped to dodge it. Root cause: `agents list` inherits `loadPlugins: 'always'` from the parent `agents` policy in command-catalog, then `agentsListCommand` calls `buildProviderStatusIndex(cfg)` unconditionally — both paths trigger the bundled-extension import waterfall (~60+ extension index.js modules). `channels list` already uses `loadPlugins: 'never'` and proves the shape is right; this PR matches that shape with the safer `text-only` variant so human invocations are unchanged. Two-line fix per reporter: 1. `src/cli/command-catalog.ts` — opt agents list into `text-only`, the same plugin-preload policy bucket that already exists. Plugin preload runs for human text output, skips for `--json`. 2. `src/commands/agents.commands.list.ts` — skip `buildProviderStatusIndex` (and the per-summary provider enrichment loop) when `opts.json`. Provider info is only rendered in human text output via `formatSummary`, so dropping it from JSON has no observable effect on existing callers that consume `id`, `name`, `model`, `bindings`, `isDefault`, `identity*`, `workspace`, or `agentDir`. `routes` is config-derived and continues to be set in both modes. Tests: - new assertion in command-startup-policy.test.ts: `agents list` with jsonOutputMode:true now resolves to `loadPlugins: false` (was effectively `true` via the parent `agents` 'always' policy). - existing assertion that human (jsonOutputMode:false) still triggers plugin load is preserved verbatim. 6/6 tests pass. Lint clean. Out of scope: - `--bindings` flag opt-in for restoring providers in JSON output: worth adding later if any consumer needs it; reporter said dashboard consumers don't. - Broader plugin-discovery cache work (#67040, #71690) which addresses the same family of cold-start cost.