





















@@ -1,6 +1,5 @@
11import { normalizeToolName } from "../agents/tool-policy.js";
22import type { AnyAgentTool } from "../agents/tools/common.js";
3-import { resolveRuntimeConfigCacheKey } from "../config/runtime-snapshot.js";
43import { createSubsystemLogger } from "../logging/subsystem.js";
54import { applyTestPluginDefaults, normalizePluginsConfig } from "./config-state.js";
65import { resolveRuntimePluginRegistry, type PluginLoadOptions } from "./loader.js";
@@ -20,7 +19,15 @@ import {
2019resolvePluginRuntimeLoadContext,
2120} from "./runtime/load-context.js";
2221import { findUndeclaredPluginToolNames } from "./tool-contracts.js";
23-import type { OpenClawPluginToolContext, OpenClawPluginToolFactory } from "./types.js";
22+import {
23+buildPluginToolFactoryCacheKey,
24+readCachedPluginToolFactoryResult,
25+type PluginToolFactoryResult,
26+writeCachedPluginToolFactoryResult,
27+} from "./tool-factory-cache.js";
28+import type { OpenClawPluginToolContext } from "./types.js";
29+30+export { resetPluginToolFactoryCache } from "./tool-factory-cache.js";
24312532export type PluginToolMeta = {
2633pluginId: string;
@@ -43,106 +50,9 @@ const log = createSubsystemLogger("plugins/tools");
4350const PLUGIN_TOOL_FACTORY_WARN_TOTAL_MS = 5_000;
4451const PLUGIN_TOOL_FACTORY_WARN_FACTORY_MS = 1_000;
4552const PLUGIN_TOOL_FACTORY_SUMMARY_LIMIT = 20;
46-const PLUGIN_TOOL_FACTORY_CACHE_LIMIT_PER_FACTORY = 64;
47-48-type PluginToolFactoryResult = AnyAgentTool | AnyAgentTool[] | null | undefined;
49-50-let pluginToolFactoryCache = new WeakMap<
51-OpenClawPluginToolFactory,
52-Map<string, PluginToolFactoryResult>
53->();
54-let pluginToolFactoryCacheObjectIds = new WeakMap<object, number>();
55-let nextPluginToolFactoryCacheObjectId = 1;
56535754const pluginToolMeta = new WeakMap<AnyAgentTool, PluginToolMeta>();
585559-export function resetPluginToolFactoryCache(): void {
60-pluginToolFactoryCache = new WeakMap();
61-pluginToolFactoryCacheObjectIds = new WeakMap();
62-nextPluginToolFactoryCacheObjectId = 1;
63-}
64-65-function getPluginToolFactoryCacheObjectId(value: object | null | undefined): number | null {
66-if (!value) {
67-return null;
68-}
69-const existing = pluginToolFactoryCacheObjectIds.get(value);
70-if (existing !== undefined) {
71-return existing;
72-}
73-const next = nextPluginToolFactoryCacheObjectId++;
74-pluginToolFactoryCacheObjectIds.set(value, next);
75-return next;
76-}
77-78-function getPluginToolFactoryConfigCacheKey(
79-value: PluginLoadOptions["config"] | null | undefined,
80-): string | number | null {
81-if (!value) {
82-return null;
83-}
84-try {
85-return resolveRuntimeConfigCacheKey(value);
86-} catch {
87-return getPluginToolFactoryCacheObjectId(value);
88-}
89-}
90-91-function buildPluginToolFactoryCacheKey(params: {
92-ctx: OpenClawPluginToolContext;
93-currentRuntimeConfig?: PluginLoadOptions["config"] | null;
94-}): string {
95-const { ctx } = params;
96-return JSON.stringify({
97-config: getPluginToolFactoryConfigCacheKey(ctx.config),
98-runtimeConfig: getPluginToolFactoryConfigCacheKey(ctx.runtimeConfig),
99-currentRuntimeConfig: getPluginToolFactoryConfigCacheKey(params.currentRuntimeConfig),
100-fsPolicy: ctx.fsPolicy ?? null,
101-workspaceDir: ctx.workspaceDir ?? null,
102-agentDir: ctx.agentDir ?? null,
103-agentId: ctx.agentId ?? null,
104-sessionKey: ctx.sessionKey ?? null,
105-sessionId: ctx.sessionId ?? null,
106-browser: ctx.browser ?? null,
107-messageChannel: ctx.messageChannel ?? null,
108-agentAccountId: ctx.agentAccountId ?? null,
109-deliveryContext: ctx.deliveryContext ?? null,
110-requesterSenderId: ctx.requesterSenderId ?? null,
111-senderIsOwner: ctx.senderIsOwner ?? null,
112-sandboxed: ctx.sandboxed ?? null,
113-});
114-}
115-116-function readCachedPluginToolFactoryResult(params: {
117-factory: OpenClawPluginToolFactory;
118-cacheKey: string;
119-}): { hit: boolean; result: PluginToolFactoryResult } {
120-const cache = pluginToolFactoryCache.get(params.factory);
121-if (!cache || !cache.has(params.cacheKey)) {
122-return { hit: false, result: undefined };
123-}
124-return { hit: true, result: cache.get(params.cacheKey) };
125-}
126-127-function writeCachedPluginToolFactoryResult(params: {
128-factory: OpenClawPluginToolFactory;
129-cacheKey: string;
130-result: PluginToolFactoryResult;
131-}): void {
132-let cache = pluginToolFactoryCache.get(params.factory);
133-if (!cache) {
134-cache = new Map();
135-pluginToolFactoryCache.set(params.factory, cache);
136-}
137-if (!cache.has(params.cacheKey) && cache.size >= PLUGIN_TOOL_FACTORY_CACHE_LIMIT_PER_FACTORY) {
138-const oldestKey = cache.keys().next().value;
139-if (oldestKey !== undefined) {
140-cache.delete(oldestKey);
141-}
142-}
143-cache.set(params.cacheKey, params.result);
144-}
145-14656export function setPluginToolMeta(tool: AnyAgentTool, meta: PluginToolMeta): void {
14757pluginToolMeta.set(tool, meta);
14858}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。