`pushMetaToMonitor` and `resolveAgentId` were both calling `api.runtime?.config?.loadConfig?.()` to read the agent list. That deprecated path (openclaw warns at gateway start: "plugin runtime config.loadConfig() is deprecated; use config.current()") synchronously rebuilds the full plugin-metadata snapshot — realpathSync walks every plugin's package.json + manifest + source up the directory tree, hashWatchedFiles fingerprints every watched plugin file, and discoverInDirectory re-scans every `dist/extensions/<plugin>` (~100 of them on prod t2). Each rebuild costs ~6-7s of gateway CPU. `pushMetaToMonitor` fires every `reportIntervalSec` (default 30s) from `hooks/gateway-start.js`. With 100 plugins that put the gateway into a chronic ~22-30% CPU baseline even with zero agent activity. V8 profile 2026-05-27 08:14:00 60s window (0 turns, 2 metadata pushes during): lstat 44.2%, statSync(buildInstalledManifestRegistryIndexKey) 6.9%, hashWatchedFiles via memo key 1.7%, all routed through `readPersistedInstalledPluginIndexInstallRecordsSync` -> per-plugin `discoverInDirectory`. Switching to `(api as any).config ?? api.runtime?.config?.loadConfig?.()` reads from the snapshot cache the gateway already maintains — the same pattern already used elsewhere in this file (e.g. the calendar wakeAgent dispatcher at line 284). Same change applied to `resolveAgentId` (only runs once at start, but same anti-pattern). This is a plugin-side perf workaround. The underlying openclaw bug is that `loadConfig()` rebuilds the snapshot rather than returning the cached one — a chronic 'all sync cache validity checks pay the full discovery cost' design issue worth pushing upstream separately (the walks per-call cost we measured here is unrelated to and amplifies any agent-turn-triggered walk path). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
34 KiB
34 KiB