Three install/bridge bugs that made every OpenClaw model call to the
bridge fail when driven by a non-bundled channel plugin (e.g. Fabric):
1. OpenClaw redacts secret-like keys before exposing pluginConfig to a
plugin, so config.bridgeApiKey was the literal __OPENCLAW_REDACTED__
sentinel. The bridge then validated Authorization against the
sentinel while the model provider sent the real key -> permanent
HTTP 401. Resolve the real shared secret from the raw on-disk config
(same pattern resolveAgent already uses); if still missing/redacted,
treat as no-auth on the loopback-only bridge instead of 401-locking.
2. install.mjs set the provider apiKey authoritatively but only
setIfMissing the plugin bridgeApiKey, so a stale prior value desynced
the pair. Make bridgeApiKey authoritative too (they must match).
3. The provider had no timeoutSeconds; a full bridged agent turn far
exceeds OpenClaw's default model-fetch timeout, so OpenClaw aborted
mid-turn and no reply was ever delivered. Default timeoutSeconds=600
(preserves a user override).
Verified live: bridge now returns 200 for the real key and a valid
OpenAI SSE completion; the fetch-timeout abort is gone.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>