

















@@ -8,16 +8,15 @@ import {
88resolveMemoryDreamingPluginId,
99} from "../memory-host-sdk/dreaming.js";
1010import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js";
11-import { resolveManifestActivationPluginIds } from "./activation-planner.js";
1211import { hasExplicitChannelConfig } from "./channel-presence-policy.js";
1312import {
1413createPluginActivationSource,
1514normalizePluginId,
1615normalizePluginsConfig,
1716resolveEffectivePluginActivationState,
1817} from "./config-state.js";
19-import { loadPluginManifestRegistry, type PluginManifestRecord } from "./manifest-registry.js";
20-import { hasKind } from "./slots.js";
18+import type { InstalledPluginIndexRecord } from "./installed-plugin-index.js";
19+import { loadPluginRegistrySnapshot } from "./plugin-registry.js";
21202221function listDisabledChannelIds(config: OpenClawConfig): Set<string> {
2322const channels = config.channels;
@@ -46,30 +45,12 @@ function listPotentialEnabledChannelIds(config: OpenClawConfig, env: NodeJS.Proc
4645.filter((id) => id && !disabled.has(id));
4746}
484749-function hasRuntimeContractSurface(plugin: PluginManifestRecord): boolean {
50-return Boolean(
51-plugin.providers.length > 0 ||
52-plugin.cliBackends.length > 0 ||
53-plugin.contracts?.speechProviders?.length ||
54-plugin.contracts?.mediaUnderstandingProviders?.length ||
55-plugin.contracts?.documentExtractors?.length ||
56-plugin.contracts?.imageGenerationProviders?.length ||
57-plugin.contracts?.videoGenerationProviders?.length ||
58-plugin.contracts?.musicGenerationProviders?.length ||
59-plugin.contracts?.webContentExtractors?.length ||
60-plugin.contracts?.webFetchProviders?.length ||
61-plugin.contracts?.webSearchProviders?.length ||
62-plugin.contracts?.memoryEmbeddingProviders?.length ||
63-hasKind(plugin.kind, "memory"),
64-);
65-}
66-67-function isGatewayStartupMemoryPlugin(plugin: PluginManifestRecord): boolean {
68-return hasKind(plugin.kind, "memory");
48+function isGatewayStartupMemoryPlugin(plugin: InstalledPluginIndexRecord): boolean {
49+return plugin.startup.memory;
6950}
705171-function isGatewayStartupSidecar(plugin: PluginManifestRecord): boolean {
72-return plugin.channels.length === 0 && !hasRuntimeContractSurface(plugin);
52+function isGatewayStartupSidecar(plugin: InstalledPluginIndexRecord): boolean {
53+return plugin.startup.sidecar;
7354}
74557556function resolveGatewayStartupDreamingPluginIds(config: OpenClawConfig): Set<string> {
@@ -92,7 +73,7 @@ function resolveExplicitMemorySlotStartupPluginId(config: OpenClawConfig): strin
9273}
93749475function shouldConsiderForGatewayStartup(params: {
95-plugin: PluginManifestRecord;
76+plugin: InstalledPluginIndexRecord;
9677startupDreamingPluginIds: ReadonlySet<string>;
9778explicitMemorySlotStartupPluginId?: string;
9879}): boolean {
@@ -102,45 +83,47 @@ function shouldConsiderForGatewayStartup(params: {
10283if (!isGatewayStartupMemoryPlugin(params.plugin)) {
10384return false;
10485}
105-if (params.startupDreamingPluginIds.has(params.plugin.id)) {
86+if (params.startupDreamingPluginIds.has(params.plugin.pluginId)) {
10687return true;
10788}
108-return params.explicitMemorySlotStartupPluginId === params.plugin.id;
89+return params.explicitMemorySlotStartupPluginId === params.plugin.pluginId;
10990}
1109111192function hasConfiguredStartupChannel(params: {
112-plugin: PluginManifestRecord;
93+plugin: InstalledPluginIndexRecord;
11394configuredChannelIds: ReadonlySet<string>;
11495}): boolean {
115-return params.plugin.channels.some((channelId) => params.configuredChannelIds.has(channelId));
96+return params.plugin.contributions.channels.some((channelId) =>
97+params.configuredChannelIds.has(channelId),
98+);
11699}
117100118101function canStartConfiguredChannelPlugin(params: {
119-plugin: PluginManifestRecord;
102+plugin: InstalledPluginIndexRecord;
120103config: OpenClawConfig;
121104pluginsConfig: ReturnType<typeof normalizePluginsConfig>;
122105activationSource: ReturnType<typeof createPluginActivationSource>;
123106}): boolean {
124107if (!params.pluginsConfig.enabled) {
125108return false;
126109}
127-if (params.pluginsConfig.deny.includes(params.plugin.id)) {
110+if (params.pluginsConfig.deny.includes(params.plugin.pluginId)) {
128111return false;
129112}
130-if (params.pluginsConfig.entries[params.plugin.id]?.enabled === false) {
113+if (params.pluginsConfig.entries[params.plugin.pluginId]?.enabled === false) {
131114return false;
132115}
133116const explicitBundledChannelConfig =
134117params.plugin.origin === "bundled" &&
135-params.plugin.channels.some((channelId) =>
118+params.plugin.contributions.channels.some((channelId) =>
136119hasExplicitChannelConfig({
137120config: params.activationSource.rootConfig ?? params.config,
138121 channelId,
139122}),
140123);
141124if (
142125params.pluginsConfig.allow.length > 0 &&
143-!params.pluginsConfig.allow.includes(params.plugin.id) &&
126+!params.pluginsConfig.allow.includes(params.plugin.pluginId) &&
144127!explicitBundledChannelConfig
145128) {
146129return false;
@@ -149,7 +132,7 @@ function canStartConfiguredChannelPlugin(params: {
149132return true;
150133}
151134const activationState = resolveEffectivePluginActivationState({
152-id: params.plugin.id,
135+id: params.plugin.pluginId,
153136origin: params.plugin.origin,
154137config: params.pluginsConfig,
155138rootConfig: params.config,
@@ -164,13 +147,14 @@ export function resolveChannelPluginIds(params: {
164147workspaceDir?: string;
165148env: NodeJS.ProcessEnv;
166149}): string[] {
167-return loadPluginManifestRegistry({
150+const index = loadPluginRegistrySnapshot({
168151config: params.config,
169152workspaceDir: params.workspaceDir,
170153env: params.env,
171-})
172-.plugins.filter((plugin) => plugin.channels.length > 0)
173-.map((plugin) => plugin.id);
154+});
155+return index.plugins
156+.filter((plugin) => plugin.contributions.channels.length > 0)
157+.map((plugin) => plugin.pluginId);
174158}
175159176160export function resolveConfiguredDeferredChannelPluginIds(params: {
@@ -186,23 +170,24 @@ export function resolveConfiguredDeferredChannelPluginIds(params: {
186170const activationSource = createPluginActivationSource({
187171config: params.config,
188172});
189-return loadPluginManifestRegistry({
173+const index = loadPluginRegistrySnapshot({
190174config: params.config,
191175workspaceDir: params.workspaceDir,
192176env: params.env,
193-})
194-.plugins.filter(
177+});
178+return index.plugins
179+.filter(
195180(plugin) =>
196181hasConfiguredStartupChannel({ plugin, configuredChannelIds }) &&
197-plugin.startupDeferConfiguredChannelFullLoadUntilAfterListen === true &&
182+plugin.startup.deferConfiguredChannelFullLoadUntilAfterListen &&
198183canStartConfiguredChannelPlugin({
199184 plugin,
200185config: params.config,
201186 pluginsConfig,
202187 activationSource,
203188}),
204189)
205-.map((plugin) => plugin.id);
190+.map((plugin) => plugin.pluginId);
206191}
207192208193export function resolveGatewayStartupPluginIds(params: {
@@ -219,33 +204,23 @@ export function resolveGatewayStartupPluginIds(params: {
219204const activationSource = createPluginActivationSource({
220205config: params.activationSourceConfig ?? params.config,
221206});
222-const requiredAgentHarnessPluginIds = new Set(
207+const requiredAgentHarnessRuntimes = new Set(
223208collectConfiguredAgentHarnessRuntimes(
224209params.activationSourceConfig ?? params.config,
225210params.env,
226-).flatMap((runtime) =>
227-resolveManifestActivationPluginIds({
228-trigger: {
229-kind: "agentHarness",
230- runtime,
231-},
232-config: params.config,
233-workspaceDir: params.workspaceDir,
234-env: params.env,
235-cache: true,
236-}),
237211),
238212);
239213const startupDreamingPluginIds = resolveGatewayStartupDreamingPluginIds(params.config);
240214const explicitMemorySlotStartupPluginId = resolveExplicitMemorySlotStartupPluginId(
241215params.activationSourceConfig ?? params.config,
242216);
243-return loadPluginManifestRegistry({
217+const index = loadPluginRegistrySnapshot({
244218config: params.config,
245219workspaceDir: params.workspaceDir,
246220env: params.env,
247-})
248-.plugins.filter((plugin) => {
221+});
222+return index.plugins
223+.filter((plugin) => {
249224if (hasConfiguredStartupChannel({ plugin, configuredChannelIds })) {
250225return canStartConfiguredChannelPlugin({
251226 plugin,
@@ -254,9 +229,11 @@ export function resolveGatewayStartupPluginIds(params: {
254229 activationSource,
255230});
256231}
257-if (requiredAgentHarnessPluginIds.has(plugin.id)) {
232+if (
233+plugin.startup.agentHarnesses.some((runtime) => requiredAgentHarnessRuntimes.has(runtime))
234+) {
258235const activationState = resolveEffectivePluginActivationState({
259-id: plugin.id,
236+id: plugin.pluginId,
260237origin: plugin.origin,
261238config: pluginsConfig,
262239rootConfig: params.config,
@@ -275,7 +252,7 @@ export function resolveGatewayStartupPluginIds(params: {
275252return false;
276253}
277254const activationState = resolveEffectivePluginActivationState({
278-id: plugin.id,
255+id: plugin.pluginId,
279256origin: plugin.origin,
280257config: pluginsConfig,
281258rootConfig: params.config,
@@ -290,5 +267,5 @@ export function resolveGatewayStartupPluginIds(params: {
290267}
291268return activationState.source === "explicit" || activationState.source === "default";
292269})
293-.map((plugin) => plugin.id);
270+.map((plugin) => plugin.pluginId);
294271}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。