fix(plugins): load externally-installed channel plugins at gateway startup#93470
Merged
vincentkoc merged 3 commits intoJun 16, 2026
Merged
Conversation
vincentkoc
force-pushed
the
fix/issue-93219-external-plugin-load-v2
branch
from
June 16, 2026 07:44
8e00832 to
b26cc30
Compare
Member
|
land-ready verification:
|
vincentkoc
force-pushed
the
fix/issue-93219-external-plugin-load-v2
branch
2 times, most recently
from
June 16, 2026 08:09
db67ec8 to
d733065
Compare
Member
|
reverified after relevant mainline drift:
|
…artup
Non-bundled plugins that declare channels and are explicitly enabled
in plugins.entries were not being included in the gateway startup
plugin plan because hasConfiguredStartupChannel only detected channels
configured via config.channels entries.
Published install flows configure channel plugins via
plugins.entries.<id>.enabled=true, which produces only {enabled: true}
in the channel config — insufficient for hasMeaningfulChannelConfig
to classify it as a configured channel.
Add a pre-check for non-bundled plugins with declared channels and
explicit config enablement so they enter the canStartConfiguredChannelPlugin
gate and are loaded at startup.
Fixes openclaw#93219
vincentkoc
force-pushed
the
fix/issue-93219-external-plugin-load-v2
branch
from
June 16, 2026 08:12
d733065 to
934dfd3
Compare
Member
|
final sync verification:
|
Member
|
Merged via squash.
Thanks @sunlit-deng! |
github-actions Bot
pushed a commit
to Desicool/openclaw
that referenced
this pull request
Jun 17, 2026
…artup (openclaw#93470) Merged via squash. Prepared head SHA: 934dfd3 Co-authored-by: sunlit-deng <[email protected]> Co-authored-by: vincentkoc <[email protected]> Reviewed-by: @vincentkoc
crh-code
pushed a commit
to crh-code/openclaw
that referenced
this pull request
Jun 18, 2026
…artup (openclaw#93470) Merged via squash. Prepared head SHA: 934dfd3 Co-authored-by: sunlit-deng <[email protected]> Co-authored-by: vincentkoc <[email protected]> Reviewed-by: @vincentkoc
This was referenced Jun 18, 2026
This was referenced Jun 18, 2026
This was referenced Jun 23, 2026
Closed
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
plugins.entries.<id>.enabled=truewere not loaded at gateway startuphasConfiguredStartupChannelonly detected channels configured viaconfig.channelsentries with meaningful content (botToken, webhook, etc.){enabled: true}, which is insufficient forhasMeaningfulChannelConfigto classify them as configured channelscanStartConfiguredChannelPluginand are loaded at startupFixes #93219
Linked context
installed_plugin_indexentries were never loadedlistPotentialConfiguredChannelIdswhich only considersconfig.channelsentries, notplugins.entriesReal behavior proof
Behavior addressed: Gateway now includes externally-installed channel plugins in the startup plan when enabled via
plugins.entriesReal setup tested:
Exact steps or command run after fix:
After-fix evidence:
Observed result after the fix: The predicate correctly identifies externally-installed channel plugins that should enter the startup channel gate. Bundled plugins, channel-less plugins, and explicitly disabled plugins are all correctly excluded.
What was not tested: Full gateway startup with a real externally-installed npm channel plugin
Proof limitations or environment constraints: Cannot run full gateway E2E on this environment without installing a real channel plugin and configuring it
Tests and validation
The change is a single predicate (+13/-1 lines) in
src/plugins/gateway-startup-plugin-ids.ts. The predicate gates entry to the existingcanStartConfiguredChannelPluginvalidation function, which already applies full activation state checks including allowlist, denylist, and explicit activation resolution.Risk checklist
Did user-visible behavior change? (
Yes)plugins.entriesDid config, environment, or migration behavior change? (
No)Did security, auth, secrets, network, or tool execution behavior change? (
No)What is the highest-risk area?
How is that risk mitigated?
plugins.entries.<id>.enabled === trueAND non-empty manifest channels ANDplugin.origin !== "bundled"canStartConfiguredChannelPluginapplies additional validation (deny list, allow list, explicit activation state)Current review state
What is the next action?
What is still waiting on author, maintainer, CI, or external proof?
Which bot or reviewer comments were addressed?