fix(plugins): preserve external capability provider fallback#76536
Conversation
|
Codex review: needs maintainer review before merge. Summary Reproducibility: yes. Source inspection on current main shows manifest-contract ids can be selected while the provider-entry loader only reads a loaded runtime registry, and the PR body provides a concrete Fish Audio before/after runtime reproduction. Next step before merge Security Review detailsBest possible solution: Merge the scoped fallback and regression test once exact-head CI is green, while tracking the related path-based plugin tools work separately under #76598/#76609. Do we have a high-confidence way to reproduce the issue? Yes. Source inspection on current main shows manifest-contract ids can be selected while the provider-entry loader only reads a loaded runtime registry, and the PR body provides a concrete Fish Audio before/after runtime reproduction. Is this the best way to solve the issue? Yes. The PR restores the previous scoped cold-load behavior only after a loaded-registry miss, preserves the startup-registry fast path, and adds focused regression coverage for the external manifest-contract case. Acceptance criteria:
What I checked:
Likely related people:
Remaining risk / open question:
Codex review notes: model gpt-5.5, reasoning high; reviewed against 2b82c05a7fb1. |
b0cf1f1 to
ce1d827
Compare
5557cfd to
4e0332f
Compare
4e0332f to
ea6e57f
Compare
…w#76536) * fix(plugins): preserve external capability provider fallback * docs: move changelog entry to avoid merge conflict --------- Co-authored-by: Clawdbot <clawdbot@apilab.us>
…w#76536) * fix(plugins): preserve external capability provider fallback * docs: move changelog entry to avoid merge conflict --------- Co-authored-by: Clawdbot <clawdbot@apilab.us>
…w#76536) * fix(plugins): preserve external capability provider fallback * docs: move changelog entry to avoid merge conflict --------- Co-authored-by: Clawdbot <clawdbot@apilab.us>
…w#76536) * fix(plugins): preserve external capability provider fallback * docs: move changelog entry to avoid merge conflict --------- Co-authored-by: Clawdbot <clawdbot@apilab.us>
…w#76536) * fix(plugins): preserve external capability provider fallback * docs: move changelog entry to avoid merge conflict --------- Co-authored-by: Clawdbot <clawdbot@apilab.us>
Summary
v2026.5.2, enabled external capability providers declared only through manifest contracts (for examplecontracts.speechProviders) can fail withno provider registeredunless they are also startup-loaded.v2026.5.2fast path that reuses an already-loaded runtime registry, but fall back to the scoped manifest-derived runtime load when that registry is missing the provider.Change Type (select all)
Scope (select all touched areas)
Linked Issue/PR
Root Cause (if applicable)
8283c5d6ccchanged capability provider fallback loading fromresolveRuntimePluginRegistry(params.loadOptions)togetLoadedRuntimePluginRegistry(...). That preserved startup-registry reuse, but dropped the cold-load path for enabled external providers that are declared in manifest contracts but absent from the startup registry.@conan-scott/openclaw-fish-audio@1.1.0declarescontracts.speechProviders: ["fish-audio"]; withoutactivation.onStartup,v2026.5.2could discover the contract but failed to register the runtime provider on request.Regression Test Plan (if applicable)
src/plugins/capability-provider-runtime.test.tscontracts.speechProvidersis absent from the startup registry, then resolves through the scoped cold-load path.User-visible / Behavior Changes
Enabled external capability providers declared through manifest contracts can again resolve on request without requiring
activation.onStartupfor correctness.Diagram (if applicable)
Security Impact (required)
Yes/No) NoYes/No) NoYes/No) NoYes/No) NoYes/No) NoYes, explain risk + mitigation: N/ARepro + Verification
Environment
linux 6.12.0-153.el10.x86_64, Node24.14.0)2026.5.2contracts.speechProviders: ["fish-audio"];activation.onStartupremoved for the repro.Steps
@conan-scott/openclaw-fish-audio@1.1.0withcontracts.speechProviders: ["fish-audio"]and noactivation.onStartup.2026.5.2.Expected
contracts.speechProvidersshould be request-loadable and usable.Actual
fish-audio: no provider registered; microsoft: not configured; minimax: not configured.Evidence
Local automated checks:
pnpm exec vitest run src/plugins/capability-provider-runtime.test.ts— 37 passedpnpm exec oxfmt --check src/plugins/capability-provider-runtime.ts src/plugins/capability-provider-runtime.test.ts— passedpnpm exec oxlint src/plugins/capability-provider-runtime.ts src/plugins/capability-provider-runtime.test.ts— 0 warnings / 0 errorsManual runtime evidence:
activation.onStartup, no runtime patch:fish-audio: no provider registered; microsoft: not configured; minimax: not configured.activation.onStartup, hard restarted pod:/tts audio exact reinstall hard restart test after monkey patchworked.Human Verification (required)
What you personally verified (not just CI), and how:
2026.5.2; success after applying only this runtime fallback as a loader monkey patch; hard pod restart on both sides.activation.onStartupduring the passing test, so success came from runtime fallback rather than plugin startup activation.Review Conversations
If a bot review conversation is addressed by this PR, resolve that conversation yourself. Do not leave bot review conversation cleanup for maintainers.
Compatibility / Migration
Yes/No) YesYes/No) NoYes/No) NoRisks and Mitigations
v2026.5.2.