11import { withActivatedPluginIds } from "./activation-context.js" ;
22import { resolveBundledPluginCompatibleActivationInputs } from "./activation-context.js" ;
3+ import { resolveManifestActivationPluginIds } from "./activation-planner.js" ;
34import {
45 isPluginRegistryLoadInFlight ,
56 loadOpenClawPlugins ,
@@ -21,6 +22,54 @@ import {
2122} from "./runtime/load-context.js" ;
2223import type { ProviderPlugin } from "./types.js" ;
2324
25+ function dedupeSortedPluginIds ( values : Iterable < string > ) : string [ ] {
26+ return [ ...new Set ( values ) ] . toSorted ( ( left , right ) => left . localeCompare ( right ) ) ;
27+ }
28+
29+ function resolveExplicitProviderOwnerPluginIds ( params : {
30+ providerRefs : readonly string [ ] ;
31+ config ?: PluginLoadOptions [ "config" ] ;
32+ workspaceDir ?: string ;
33+ env ?: PluginLoadOptions [ "env" ] ;
34+ } ) : string [ ] {
35+ return dedupeSortedPluginIds (
36+ params . providerRefs . flatMap ( ( provider ) => {
37+ const plannedPluginIds = resolveManifestActivationPluginIds ( {
38+ trigger : {
39+ kind : "provider" ,
40+ provider,
41+ } ,
42+ config : params . config ,
43+ workspaceDir : params . workspaceDir ,
44+ env : params . env ,
45+ } ) ;
46+ if ( plannedPluginIds . length > 0 ) {
47+ return plannedPluginIds ;
48+ }
49+ // Keep legacy provider/CLI-backend ownership working until every owner is
50+ // expressible through activation descriptors.
51+ return (
52+ resolveOwningPluginIdsForProvider ( {
53+ provider,
54+ config : params . config ,
55+ workspaceDir : params . workspaceDir ,
56+ env : params . env ,
57+ } ) ?? [ ]
58+ ) ;
59+ } ) ,
60+ ) ;
61+ }
62+
63+ function mergeExplicitOwnerPluginIds (
64+ providerPluginIds : readonly string [ ] ,
65+ explicitOwnerPluginIds : readonly string [ ] ,
66+ ) : string [ ] {
67+ if ( explicitOwnerPluginIds . length === 0 ) {
68+ return [ ...providerPluginIds ] ;
69+ }
70+ return dedupeSortedPluginIds ( [ ...providerPluginIds , ...explicitOwnerPluginIds ] ) ;
71+ }
72+
2473function resolvePluginProviderLoadBase ( params : {
2574 config ?: PluginLoadOptions [ "config" ] ;
2675 workspaceDir ?: string ;
@@ -32,19 +81,12 @@ function resolvePluginProviderLoadBase(params: {
3281 const env = params . env ?? process . env ;
3382 const workspaceDir = params . workspaceDir ?? getActivePluginRegistryWorkspaceDir ( ) ;
3483 const providerOwnedPluginIds = params . providerRefs ?. length
35- ? [
36- ...new Set (
37- params . providerRefs . flatMap (
38- ( provider ) =>
39- resolveOwningPluginIdsForProvider ( {
40- provider,
41- config : params . config ,
42- workspaceDir,
43- env,
44- } ) ?? [ ] ,
45- ) ,
46- ) ,
47- ]
84+ ? resolveExplicitProviderOwnerPluginIds ( {
85+ providerRefs : params . providerRefs ,
86+ config : params . config ,
87+ workspaceDir,
88+ env,
89+ } )
4890 : [ ] ;
4991 const modelOwnedPluginIds = params . modelRefs ?. length
5092 ? resolveOwningPluginIdsForModelRefs ( {
@@ -68,14 +110,19 @@ function resolvePluginProviderLoadBase(params: {
68110 ] ) ,
69111 ] . toSorted ( ( left , right ) => left . localeCompare ( right ) )
70112 : undefined ;
113+ const explicitOwnerPluginIds = dedupeSortedPluginIds ( [
114+ ...providerOwnedPluginIds ,
115+ ...modelOwnedPluginIds ,
116+ ] ) ;
71117 const runtimeConfig = withActivatedPluginIds ( {
72118 config : params . config ,
73- pluginIds : [ ... providerOwnedPluginIds , ... modelOwnedPluginIds ] ,
119+ pluginIds : explicitOwnerPluginIds ,
74120 } ) ;
75121 return {
76122 env,
77123 workspaceDir,
78124 requestedPluginIds,
125+ explicitOwnerPluginIds,
79126 runtimeConfig,
80127 } ;
81128}
@@ -92,13 +139,15 @@ function resolveSetupProviderPluginLoadState(
92139 includeUntrustedWorkspacePlugins : params . includeUntrustedWorkspacePlugins ,
93140 } ) ;
94141 if ( providerPluginIds . length === 0 ) {
95- return undefined ;
142+ if ( base . explicitOwnerPluginIds . length === 0 ) {
143+ return undefined ;
144+ }
96145 }
97146 const loadOptions = buildPluginRuntimeLoadOptionsFromValues (
98147 {
99148 config : withActivatedPluginIds ( {
100149 config : base . runtimeConfig ,
101- pluginIds : providerPluginIds ,
150+ pluginIds : mergeExplicitOwnerPluginIds ( providerPluginIds , base . explicitOwnerPluginIds ) ,
102151 } ) ,
103152 activationSourceConfig : base . runtimeConfig ,
104153 autoEnabledReasons : { } ,
@@ -107,7 +156,7 @@ function resolveSetupProviderPluginLoadState(
107156 logger : createPluginRuntimeLoaderLogger ( ) ,
108157 } ,
109158 {
110- onlyPluginIds : providerPluginIds ,
159+ onlyPluginIds : mergeExplicitOwnerPluginIds ( providerPluginIds , base . explicitOwnerPluginIds ) ,
111160 pluginSdkResolution : params . pluginSdkResolution ,
112161 cache : params . cache ?? false ,
113162 activate : params . activate ?? false ,
@@ -140,12 +189,15 @@ function resolveRuntimeProviderPluginLoadState(
140189 env : base . env ,
141190 } )
142191 : activation . config ;
143- const providerPluginIds = resolveEnabledProviderPluginIds ( {
144- config,
145- workspaceDir : base . workspaceDir ,
146- env : base . env ,
147- onlyPluginIds : base . requestedPluginIds ,
148- } ) ;
192+ const providerPluginIds = mergeExplicitOwnerPluginIds (
193+ resolveEnabledProviderPluginIds ( {
194+ config,
195+ workspaceDir : base . workspaceDir ,
196+ env : base . env ,
197+ onlyPluginIds : base . requestedPluginIds ,
198+ } ) ,
199+ base . explicitOwnerPluginIds ,
200+ ) ;
149201 const loadOptions = buildPluginRuntimeLoadOptionsFromValues (
150202 {
151203 config,
0 commit comments