




















@@ -10,14 +10,11 @@ import {
1010type ResolvePluginControlPlaneContextParams,
1111} from "./plugin-control-plane-context.js";
1212import type { PluginMetadataSnapshot } from "./plugin-metadata-snapshot.types.js";
13-import { resolvePluginCacheInputs } from "./roots.js";
14131514type CurrentPluginMetadataSnapshotState = ReturnType<typeof getCurrentPluginMetadataSnapshotState>;
1615type CurrentPluginMetadataConfigCacheEntry = {
1716configFingerprint: string;
18-discoveryKey: string;
1917policyHash: string;
20-policyKey: string;
2118};
22192320let currentPluginMetadataConfigIdentityCache = new WeakMap<
@@ -41,65 +38,6 @@ export function isReusableCurrentPluginMetadataSnapshot(
4138return true;
4239}
434044-function resolveConfiguredPluginLoadPaths(
45-config: OpenClawConfig | undefined,
46-): readonly string[] | undefined {
47-const paths = config?.plugins?.load?.paths;
48-return Array.isArray(paths) ? paths : undefined;
49-}
50-51-function resolveCurrentPluginMetadataDiscoveryKey(params: {
52-config?: OpenClawConfig;
53-env: NodeJS.ProcessEnv;
54-workspaceDir?: string;
55-}): string {
56-return JSON.stringify(
57-resolvePluginCacheInputs({
58-env: params.env,
59-workspaceDir: params.workspaceDir,
60-loadPaths: [...(resolveConfiguredPluginLoadPaths(params.config) ?? [])],
61-}),
62-);
63-}
64-65-function resolveCurrentPluginMetadataPolicyKey(config: OpenClawConfig | undefined): string {
66-const plugins = config?.plugins;
67-const rawEntries = plugins?.entries;
68-const entries: Record<string, unknown> = {};
69-if (rawEntries && typeof rawEntries === "object" && !Array.isArray(rawEntries)) {
70-for (const [pluginId, entry] of Object.entries(rawEntries)) {
71-if (entry && typeof entry === "object" && !Array.isArray(entry)) {
72-const enabled = (entry as Record<string, unknown>).enabled;
73-if (enabled !== undefined) {
74-entries[pluginId] = enabled;
75-}
76-}
77-}
78-}
79-const channelPolicy: Record<string, boolean> = {};
80-const channels = config?.channels;
81-if (channels && typeof channels === "object" && !Array.isArray(channels)) {
82-for (const [channelId, value] of Object.entries(channels)) {
83-if (value && typeof value === "object" && !Array.isArray(value)) {
84-const enabled = (value as Record<string, unknown>).enabled;
85-if (typeof enabled === "boolean") {
86-channelPolicy[channelId] = enabled;
87-}
88-}
89-}
90-}
91-return JSON.stringify({
92-plugins: {
93-enabled: plugins?.enabled,
94-allow: plugins?.allow,
95-deny: plugins?.deny,
96-slots: plugins?.slots,
97- entries,
98-},
99-channels: channelPolicy,
100-});
101-}
102-10341// Single-slot Gateway-owned handoff. Replace or clear it at lifecycle boundaries;
10442// never accumulate historical metadata snapshots here.
10543export function setCurrentPluginMetadataSnapshot(
@@ -145,16 +83,8 @@ export function setCurrentPluginMetadataSnapshot(
14583const workspaceDir = options.workspaceDir ?? snapshot.workspaceDir;
14684if (options.config) {
14785const policyHash = resolveInstalledPluginIndexPolicyHash(options.config);
148-const policyKey = resolveCurrentPluginMetadataPolicyKey(options.config);
149-const discoveryKey = resolveCurrentPluginMetadataDiscoveryKey({
150-config: options.config,
151- env,
152- workspaceDir,
153-});
15486currentPluginMetadataConfigIdentityCache.set(options.config, {
15587 policyHash,
156- policyKey,
157- discoveryKey,
15888configFingerprint: resolvePluginMetadataControlPlaneFingerprint(options.config, {
15989 env,
16090index: snapshot.index,
@@ -171,13 +101,7 @@ export function setCurrentPluginMetadataSnapshot(
171101}
172102currentPluginMetadataConfigIdentityCache.set(config, {
173103 policyHash,
174-policyKey: resolveCurrentPluginMetadataPolicyKey(config),
175104 configFingerprint,
176-discoveryKey: resolveCurrentPluginMetadataDiscoveryKey({
177- config,
178- env,
179- workspaceDir,
180-}),
181105});
182106}
183107}
@@ -226,23 +150,17 @@ export function getCurrentPluginMetadataSnapshot(
226150const requestedWorkspaceDir =
227151params.workspaceDir ??
228152(params.allowWorkspaceScopedSnapshot === true ? snapshot.workspaceDir : undefined);
153+if (snapshot.workspaceDir !== undefined && requestedWorkspaceDir === undefined) {
154+return undefined;
155+}
156+if (
157+requestedWorkspaceDir !== undefined &&
158+(snapshot.workspaceDir ?? "") !== (requestedWorkspaceDir ?? "")
159+) {
160+return undefined;
161+}
229162const cachedConfig = params.config && currentPluginMetadataConfigIdentityCache.get(params.config);
230-const requestedPolicyKey =
231-params.config && cachedConfig
232- ? resolveCurrentPluginMetadataPolicyKey(params.config)
233- : undefined;
234-const requestedDiscoveryKey =
235-params.config && cachedConfig
236- ? resolveCurrentPluginMetadataDiscoveryKey({
237-config: params.config,
238- env,
239-workspaceDir: requestedWorkspaceDir,
240-})
241- : undefined;
242-const canReuseCachedConfig =
243-cachedConfig !== undefined &&
244-cachedConfig.policyKey === requestedPolicyKey &&
245-cachedConfig.discoveryKey === requestedDiscoveryKey;
163+const canReuseCachedConfig = cachedConfig !== undefined;
246164const requestedPolicyHash = canReuseCachedConfig
247165 ? cachedConfig.policyHash
248166 : params.config
@@ -254,6 +172,9 @@ export function getCurrentPluginMetadataSnapshot(
254172return undefined;
255173}
256174}
175+if (canReuseCachedConfig && params.requireDefaultDiscoveryContext !== true) {
176+return snapshot;
177+}
257178if (params.config) {
258179const requestedConfigFingerprint = canReuseCachedConfig
259180 ? cachedConfig.configFingerprint
@@ -263,11 +184,10 @@ export function getCurrentPluginMetadataSnapshot(
263184policyHash: requestedPolicyHash,
264185workspaceDir: requestedWorkspaceDir,
265186});
266-const compatibleFingerprints = new Set(compatibleConfigFingerprints ?? []);
267187const fingerprintMatches =
268188configFingerprint === requestedConfigFingerprint ||
269189snapshot.configFingerprint === requestedConfigFingerprint ||
270-compatibleFingerprints.has(requestedConfigFingerprint);
190+Boolean(compatibleConfigFingerprints?.includes(requestedConfigFingerprint));
271191if (!fingerprintMatches) {
272192return undefined;
273193}
@@ -282,23 +202,13 @@ export function getCurrentPluginMetadataSnapshot(
282202workspaceDir: requestedWorkspaceDir,
283203},
284204);
285-const compatibleFingerprints = new Set(compatibleConfigFingerprints ?? []);
286205const fingerprintMatches =
287206configFingerprint === defaultDiscoveryConfigFingerprint ||
288207snapshot.configFingerprint === defaultDiscoveryConfigFingerprint ||
289-compatibleFingerprints.has(defaultDiscoveryConfigFingerprint);
208+Boolean(compatibleConfigFingerprints?.includes(defaultDiscoveryConfigFingerprint));
290209if (!fingerprintMatches) {
291210return undefined;
292211}
293212}
294-if (snapshot.workspaceDir !== undefined && requestedWorkspaceDir === undefined) {
295-return undefined;
296-}
297-if (
298-requestedWorkspaceDir !== undefined &&
299-(snapshot.workspaceDir ?? "") !== (requestedWorkspaceDir ?? "")
300-) {
301-return undefined;
302-}
303213return snapshot;
304214}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。