

























@@ -31,16 +31,21 @@ import {
3131capturePluginToolDescriptor,
3232createPluginToolDescriptorConfigCacheKeyMemo,
3333readCachedPluginToolDescriptors,
34+resetPluginToolDescriptorCache as resetCachedPluginToolDescriptors,
3435type CachedPluginToolDescriptor,
3536type PluginToolDescriptorConfigCacheKeyMemo,
3637writeCachedPluginToolDescriptors,
3738} from "./tool-descriptor-cache.js";
3839import type { OpenClawPluginToolContext } from "./types.js";
394040-export {
41-resetPluginToolDescriptorCache,
42-resetPluginToolDescriptorCache as resetPluginToolFactoryCache,
43-} from "./tool-descriptor-cache.js";
41+let cachedDescriptorRuntimeRegistries = new WeakMap<CachedPluginToolDescriptor, PluginRegistry>();
42+43+export function resetPluginToolDescriptorCache(): void {
44+resetCachedPluginToolDescriptors();
45+cachedDescriptorRuntimeRegistries = new WeakMap();
46+}
47+48+export { resetPluginToolDescriptorCache as resetPluginToolFactoryCache };
44494550/** MCP bridge metadata attached to plugin tools surfaced through agent tool lists. */
4651export type PluginToolMcpMeta = {
@@ -692,6 +697,10 @@ function createCachedDescriptorPluginTool(params: {
692697const registry = resolvePluginToolRegistry({
693698 loadOptions,
694699onlyPluginIds: [pluginId],
700+retainedRegistry: cachedDescriptorRuntimeRegistries.get(params.descriptor),
701+onRetainRegistry: (retainedRegistry) => {
702+cachedDescriptorRuntimeRegistries.set(params.descriptor, retainedRegistry);
703+},
695704});
696705const candidates = registry?.tools.filter((candidate) => candidate.pluginId === pluginId);
697706if (!candidates || candidates.length === 0) {
@@ -899,6 +908,8 @@ function resolveCachedPluginTools(params: {
899908function resolvePluginToolRegistry(params: {
900909loadOptions: PluginLoadOptions;
901910onlyPluginIds?: readonly string[];
911+retainedRegistry?: PluginRegistry;
912+onRetainRegistry?: (registry: PluginRegistry) => void;
902913}) {
903914const lookup = {
904915env: params.loadOptions.env,
@@ -924,7 +935,16 @@ function resolvePluginToolRegistry(params: {
924935return activeRegistry;
925936}
926937938+if (registryHasScopedPluginTools(params.retainedRegistry, params.onlyPluginIds)) {
939+return params.retainedRegistry;
940+}
941+927942const forceStandaloneLoad = Boolean(channelRegistry || activeRegistry);
943+const shouldRetainColdLoadedToolRegistry =
944+forceStandaloneLoad &&
945+params.loadOptions.activate === false &&
946+params.loadOptions.toolDiscovery === true &&
947+params.onRetainRegistry !== undefined;
928948const standaloneRegistry = ensureStandaloneRuntimePluginRegistryLoaded({
929949surface: "active",
930950forceLoad: forceStandaloneLoad,
@@ -933,6 +953,9 @@ function resolvePluginToolRegistry(params: {
933953loadOptions: params.loadOptions,
934954});
935955if (registryHasScopedPluginTools(standaloneRegistry, params.onlyPluginIds)) {
956+if (shouldRetainColdLoadedToolRegistry) {
957+params.onRetainRegistry?.(standaloneRegistry);
958+}
936959return standaloneRegistry;
937960}
938961return standaloneRegistry ?? channelRegistry ?? activeRegistry;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。