


















@@ -8,6 +8,7 @@ import {
88loadManifestContractSnapshot,
99} from "./manifest-contract-eligibility.js";
1010import { hasManifestToolAvailability } from "./manifest-tool-availability.js";
11+import type { PluginToolRegistration } from "./registry-types.js";
1112import {
1213getActivePluginChannelRegistry,
1314getActivePluginRegistry,
@@ -148,6 +149,99 @@ function describePluginToolFactoryResult(
148149return { result: "single", resultCount: 1 };
149150}
150151152+function createPluginToolFactoryTiming(params: {
153+pluginId: string;
154+names: string[];
155+durationMs: number;
156+elapsedMs: number;
157+resolved: PluginToolFactoryResult;
158+failed: boolean;
159+optional: boolean;
160+}): PluginToolFactoryTiming {
161+const result = describePluginToolFactoryResult(params.resolved, params.failed);
162+return {
163+pluginId: params.pluginId,
164+names: params.names,
165+durationMs: params.durationMs,
166+elapsedMs: params.elapsedMs,
167+result: result.result,
168+resultCount: result.resultCount,
169+optional: params.optional,
170+};
171+}
172+173+function resolvePluginToolFactoryEntry(params: {
174+entry: PluginToolRegistration;
175+ctx: OpenClawPluginToolContext;
176+declaredNames: string[];
177+currentRuntimeConfig: PluginLoadOptions["config"] | null | undefined;
178+factoryTimingStartedAt: number;
179+logError: (message: string) => void;
180+}): {
181+resolved: PluginToolFactoryResult;
182+failed: boolean;
183+timing: PluginToolFactoryTiming;
184+} {
185+let resolved: PluginToolFactoryResult = null;
186+let failed = false;
187+const factoryStartedAt = Date.now();
188+const factoryCacheKey = buildPluginToolFactoryCacheKey({
189+ctx: params.ctx,
190+currentRuntimeConfig: params.currentRuntimeConfig,
191+});
192+const cached = readCachedPluginToolFactoryResult({
193+factory: params.entry.factory,
194+cacheKey: factoryCacheKey,
195+});
196+197+if (cached.hit) {
198+resolved = cached.result;
199+return {
200+ resolved,
201+failed: false,
202+timing: createPluginToolFactoryTiming({
203+pluginId: params.entry.pluginId,
204+names: params.declaredNames,
205+durationMs: 0,
206+elapsedMs: toElapsedMs(Date.now() - params.factoryTimingStartedAt),
207+ resolved,
208+failed: false,
209+optional: params.entry.optional,
210+}),
211+};
212+}
213+214+try {
215+resolved = params.entry.factory(params.ctx);
216+} catch (err) {
217+failed = true;
218+params.logError(`plugin tool failed (${params.entry.pluginId}): ${String(err)}`);
219+} finally {
220+if (!failed) {
221+writeCachedPluginToolFactoryResult({
222+factory: params.entry.factory,
223+cacheKey: factoryCacheKey,
224+result: resolved,
225+});
226+}
227+}
228+229+const factoryEndedAt = Date.now();
230+return {
231+ resolved,
232+ failed,
233+timing: createPluginToolFactoryTiming({
234+pluginId: params.entry.pluginId,
235+names: params.declaredNames,
236+durationMs: toElapsedMs(factoryEndedAt - factoryStartedAt),
237+elapsedMs: toElapsedMs(factoryEndedAt - params.factoryTimingStartedAt),
238+ resolved,
239+ failed,
240+optional: params.entry.optional,
241+}),
242+};
243+}
244+151245function formatPluginToolFactoryTiming(timing: PluginToolFactoryTiming): string {
152246const names = timing.names.length > 0 ? timing.names.join("|") : "-";
153247return [
@@ -445,59 +539,19 @@ export function resolvePluginTools(params: {
445539) {
446540continue;
447541}
448-let resolved: PluginToolFactoryResult = null;
449-let factoryFailed = false;
450-const factoryStartedAt = Date.now();
451-const factoryCacheKey = buildPluginToolFactoryCacheKey({
542+const factoryResult = resolvePluginToolFactoryEntry({
543+ entry,
452544ctx: params.context,
545+ declaredNames,
453546currentRuntimeConfig: currentRuntimeConfigForFactoryCache,
547+ factoryTimingStartedAt,
548+logError: (message) => context.logger.error(message),
454549});
455-const cached = readCachedPluginToolFactoryResult({
456-factory: entry.factory,
457-cacheKey: factoryCacheKey,
458-});
459-if (cached.hit) {
460-resolved = cached.result;
461-const result = describePluginToolFactoryResult(resolved, false);
462-factoryTimings.push({
463-pluginId: entry.pluginId,
464-names: declaredNames,
465-durationMs: 0,
466-elapsedMs: toElapsedMs(Date.now() - factoryTimingStartedAt),
467-result: result.result,
468-resultCount: result.resultCount,
469-optional: entry.optional,
470-});
471-} else {
472-try {
473-resolved = entry.factory(params.context);
474-} catch (err) {
475-factoryFailed = true;
476-context.logger.error(`plugin tool failed (${entry.pluginId}): ${String(err)}`);
477-} finally {
478-const factoryEndedAt = Date.now();
479-const result = describePluginToolFactoryResult(resolved, factoryFailed);
480-factoryTimings.push({
481-pluginId: entry.pluginId,
482-names: declaredNames,
483-durationMs: toElapsedMs(factoryEndedAt - factoryStartedAt),
484-elapsedMs: toElapsedMs(factoryEndedAt - factoryTimingStartedAt),
485-result: result.result,
486-resultCount: result.resultCount,
487-optional: entry.optional,
488-});
489-if (!factoryFailed) {
490-writeCachedPluginToolFactoryResult({
491-factory: entry.factory,
492-cacheKey: factoryCacheKey,
493-result: resolved,
494-});
495-}
496-}
497-}
498-if (factoryFailed) {
550+factoryTimings.push(factoryResult.timing);
551+if (factoryResult.failed) {
499552continue;
500553}
554+const { resolved } = factoryResult;
501555if (!resolved) {
502556if (declaredNames.length > 0) {
503557context.logger.debug?.(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。