Skip to content

Commit d251932

Browse files
committed
refactor: keep manifest contracts on plugin index
1 parent 948c32d commit d251932

6 files changed

Lines changed: 8 additions & 124 deletions

File tree

src/commands/doctor/shared/legacy-web-search-migrate.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { mergeMissing } from "../../../config/legacy.shared.js";
22
import type { OpenClawConfig } from "../../../config/types.openclaw.js";
3-
import {
4-
loadPluginManifestRegistry,
5-
resolveManifestContractOwnerPluginId,
6-
} from "../../../plugins/manifest-registry.js";
3+
import { loadPluginManifestRegistry } from "../../../plugins/manifest-registry.js";
4+
import { resolveManifestContractOwnerPluginId } from "../../../plugins/plugin-registry.js";
75
import {
86
cloneRecord,
97
ensureRecord,

src/plugins/contracts/loader.contract.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
22
import { uniqueSortedStrings } from "../../../test/helpers/plugins/contracts-testkit.js";
33
import { withBundledPluginAllowlistCompat } from "../bundled-compat.js";
4-
import { resolveManifestContractPluginIds } from "../manifest-registry.js";
4+
import { resolveManifestContractPluginIds } from "../plugin-registry.js";
55
import { __testing as providerTesting } from "../providers.js";
66
import { resolveBundledContractSnapshotPluginIds } from "./inventory/bundled-capability-metadata.js";
77
import { providerContractCompatPluginIds } from "./registry.js";

src/plugins/contracts/registry.contract.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { describe, expect, it } from "vitest";
22
import { uniqueSortedStrings } from "../../../test/helpers/plugins/contracts-testkit.js";
3-
import {
4-
loadPluginManifestRegistry,
5-
resolveManifestContractPluginIds,
6-
} from "../manifest-registry.js";
3+
import { loadPluginManifestRegistry } from "../manifest-registry.js";
4+
import { resolveManifestContractPluginIds } from "../plugin-registry.js";
75
import {
86
pluginRegistrationContractRegistry,
97
providerContractLoadError,

src/plugins/contracts/registry.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { normalizeProviderId } from "../../agents/provider-id.js";
22
import { normalizeLowercaseStringOrEmpty } from "../../shared/string-coerce.js";
33
import { loadBundledCapabilityRuntimeRegistry } from "../bundled-capability-runtime.js";
4-
import {
5-
loadPluginManifestRegistry,
6-
resolveManifestContractPluginIds,
7-
} from "../manifest-registry.js";
4+
import { loadPluginManifestRegistry } from "../manifest-registry.js";
5+
import { resolveManifestContractPluginIds } from "../plugin-registry.js";
86
import { resolveBundledExplicitProviderContractsFromPublicArtifacts } from "../provider-contract-public-artifacts.js";
97
import type {
108
ImageGenerationProviderPlugin,

src/plugins/manifest-registry.ts

Lines changed: 1 addition & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ import path from "node:path";
33
import type { OpenClawConfig } from "../config/types.js";
44
import type { PluginInstallRecord } from "../config/types.plugins.js";
55
import { isBlockedObjectKey } from "../infra/prototype-keys.js";
6-
import {
7-
normalizeOptionalLowercaseString,
8-
normalizeOptionalString,
9-
} from "../shared/string-coerce.js";
6+
import { normalizeOptionalString } from "../shared/string-coerce.js";
107
import { normalizeOptionalTrimmedStringList } from "../shared/string-normalization.js";
118
import { sanitizeForLog } from "../terminal/ansi.js";
129
import { resolveUserPath } from "../utils.js";
@@ -169,90 +166,6 @@ const DEFAULT_MANIFEST_CACHE_MS = 1000;
169166

170167
export { clearPluginManifestRegistryCache } from "./manifest-registry-state.js";
171168

172-
function listContractValues(
173-
plugin: PluginManifestRecord,
174-
contract: PluginManifestContractListKey,
175-
): readonly string[] {
176-
return plugin.contracts?.[contract] ?? [];
177-
}
178-
179-
export function resolveManifestContractPluginIds(params: {
180-
contract: PluginManifestContractListKey;
181-
origin?: PluginOrigin;
182-
config?: OpenClawConfig;
183-
workspaceDir?: string;
184-
env?: NodeJS.ProcessEnv;
185-
onlyPluginIds?: readonly string[];
186-
}): string[] {
187-
const onlyPluginIdSet =
188-
params.onlyPluginIds && params.onlyPluginIds.length > 0 ? new Set(params.onlyPluginIds) : null;
189-
return loadPluginManifestRegistry({
190-
config: params.config,
191-
workspaceDir: params.workspaceDir,
192-
env: params.env,
193-
})
194-
.plugins.filter(
195-
(plugin) =>
196-
(!params.origin || plugin.origin === params.origin) &&
197-
(!onlyPluginIdSet || onlyPluginIdSet.has(plugin.id)) &&
198-
listContractValues(plugin, params.contract).length > 0,
199-
)
200-
.map((plugin) => plugin.id)
201-
.toSorted((left, right) => left.localeCompare(right));
202-
}
203-
204-
export function resolveManifestContractPluginIdsByCompatibilityRuntimePath(params: {
205-
contract: PluginManifestContractListKey;
206-
path: string | undefined;
207-
origin?: PluginOrigin;
208-
config?: OpenClawConfig;
209-
workspaceDir?: string;
210-
env?: NodeJS.ProcessEnv;
211-
}): string[] {
212-
const normalizedPath = params.path?.trim();
213-
if (!normalizedPath) {
214-
return [];
215-
}
216-
return loadPluginManifestRegistry({
217-
config: params.config,
218-
workspaceDir: params.workspaceDir,
219-
env: params.env,
220-
})
221-
.plugins.filter(
222-
(plugin) =>
223-
(!params.origin || plugin.origin === params.origin) &&
224-
listContractValues(plugin, params.contract).length > 0 &&
225-
(plugin.configContracts?.compatibilityRuntimePaths ?? []).includes(normalizedPath),
226-
)
227-
.map((plugin) => plugin.id)
228-
.toSorted((left, right) => left.localeCompare(right));
229-
}
230-
231-
export function resolveManifestContractOwnerPluginId(params: {
232-
contract: PluginManifestContractListKey;
233-
value: string | undefined;
234-
origin?: PluginOrigin;
235-
config?: OpenClawConfig;
236-
workspaceDir?: string;
237-
env?: NodeJS.ProcessEnv;
238-
}): string | undefined {
239-
const normalizedValue = normalizeOptionalLowercaseString(params.value);
240-
if (!normalizedValue) {
241-
return undefined;
242-
}
243-
return loadPluginManifestRegistry({
244-
config: params.config,
245-
workspaceDir: params.workspaceDir,
246-
env: params.env,
247-
}).plugins.find(
248-
(plugin) =>
249-
(!params.origin || plugin.origin === params.origin) &&
250-
listContractValues(plugin, params.contract).some(
251-
(candidate) => normalizeOptionalLowercaseString(candidate) === normalizedValue,
252-
),
253-
)?.id;
254-
}
255-
256169
function resolveManifestCacheMs(env: NodeJS.ProcessEnv): number {
257170
const raw = env.OPENCLAW_PLUGIN_MANIFEST_CACHE_MS?.trim();
258171
if (raw === "" || raw === "0") {

src/plugins/providers.test.ts

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,13 @@ type LoadOpenClawPlugins = typeof import("./loader.js").loadOpenClawPlugins;
1010
type IsPluginRegistryLoadInFlight = typeof import("./loader.js").isPluginRegistryLoadInFlight;
1111
type LoadPluginManifestRegistry =
1212
typeof import("./manifest-registry.js").loadPluginManifestRegistry;
13-
type ResolveManifestContractPluginIds =
14-
typeof import("./manifest-registry.js").resolveManifestContractPluginIds;
1513
type ApplyPluginAutoEnable = typeof import("../config/plugin-auto-enable.js").applyPluginAutoEnable;
1614
type SetActivePluginRegistry = typeof import("./runtime.js").setActivePluginRegistry;
1715

1816
const resolveRuntimePluginRegistryMock = vi.fn<ResolveRuntimePluginRegistry>();
1917
const loadOpenClawPluginsMock = vi.fn<LoadOpenClawPlugins>();
2018
const isPluginRegistryLoadInFlightMock = vi.fn<IsPluginRegistryLoadInFlight>((_) => false);
2119
const loadPluginManifestRegistryMock = vi.fn<LoadPluginManifestRegistry>();
22-
const resolveManifestContractPluginIdsMock = vi.fn<ResolveManifestContractPluginIds>((params) => {
23-
const onlyPluginIds =
24-
params.onlyPluginIds && params.onlyPluginIds.length > 0 ? new Set(params.onlyPluginIds) : null;
25-
return loadPluginManifestRegistryMock({
26-
config: params.config,
27-
workspaceDir: params.workspaceDir,
28-
env: params.env,
29-
})
30-
.plugins.filter(
31-
(plugin) =>
32-
(!params.origin || plugin.origin === params.origin) &&
33-
(!onlyPluginIds || onlyPluginIds.has(plugin.id)) &&
34-
(plugin.contracts?.[params.contract] ?? []).length > 0,
35-
)
36-
.map((plugin) => plugin.id)
37-
.toSorted((left, right) => left.localeCompare(right));
38-
});
3920
const applyPluginAutoEnableMock = vi.fn<ApplyPluginAutoEnable>();
4021

4122
let resolveOwningPluginIdsForProvider: typeof import("./providers.js").resolveOwningPluginIdsForProvider;
@@ -308,8 +289,6 @@ describe("resolvePluginProviders", () => {
308289
vi.doMock("./manifest-registry.js", () => ({
309290
loadPluginManifestRegistry: (...args: Parameters<LoadPluginManifestRegistry>) =>
310291
loadPluginManifestRegistryMock(...args),
311-
resolveManifestContractPluginIds: (...args: Parameters<ResolveManifestContractPluginIds>) =>
312-
resolveManifestContractPluginIdsMock(...args),
313292
}));
314293
vi.doMock("./installed-plugin-index-store.js", async (importOriginal) => {
315294
const actual = await importOriginal<typeof import("./installed-plugin-index-store.js")>();
@@ -355,7 +334,6 @@ describe("resolvePluginProviders", () => {
355334
resolveRuntimePluginRegistryMock.mockReturnValue(registry);
356335
loadOpenClawPluginsMock.mockReturnValue(registry);
357336
loadPluginManifestRegistryMock.mockReset();
358-
resolveManifestContractPluginIdsMock.mockClear();
359337
applyPluginAutoEnableMock.mockReset();
360338
applyPluginAutoEnableMock.mockImplementation(
361339
(params): PluginAutoEnableResult => ({
@@ -474,7 +452,6 @@ describe("resolvePluginProviders", () => {
474452
declaredPluginIds,
475453
}),
476454
).toEqual(["legacy-auth-owner"]);
477-
expect(resolveManifestContractPluginIdsMock).not.toHaveBeenCalled();
478455
});
479456

480457
it("treats explicit empty provider scopes as scoped-empty in provider helpers", () => {

0 commit comments

Comments
 (0)