























@@ -71,9 +71,13 @@ describe("provider public artifacts", () => {
7171return { resolveThinkingProfile };
7272});
737374-vi.doMock("./bundled-dir.js", () => ({
75-resolveBundledPluginsDir: () => bundledPluginsDir,
76-}));
74+vi.doMock("./bundled-dir.js", async (importOriginal) => {
75+const actual = await importOriginal<typeof import("./bundled-dir.js")>();
76+return {
77+ ...actual,
78+resolveBundledPluginsDir: () => bundledPluginsDir,
79+};
80+});
7781process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = bundledPluginsDir;
7882process.env.OPENCLAW_TEST_TRUST_BUNDLED_PLUGINS_DIR = "1";
7983vi.doMock("./public-surface-loader.js", () => ({
@@ -114,6 +118,71 @@ describe("provider public artifacts", () => {
114118}
115119});
116120121+it("does not cache manifest-owned provider policy aliases across bundled metadata changes", async () => {
122+const bundledPluginsDir = fs.mkdtempSync(
123+path.join(os.tmpdir(), "openclaw-provider-policy-refresh-"),
124+);
125+const writePlugin = (pluginId: string, providers: string[], version: number) => {
126+const pluginDir = path.join(bundledPluginsDir, pluginId);
127+fs.mkdirSync(pluginDir, { recursive: true });
128+fs.writeFileSync(
129+path.join(pluginDir, "openclaw.plugin.json"),
130+JSON.stringify({
131+id: pluginId,
132+name: `${pluginId} ${version}`,
133+configSchema: { type: "object" },
134+ providers,
135+}),
136+);
137+fs.writeFileSync(
138+path.join(pluginDir, "index.js"),
139+"export default { register() {} };\n",
140+"utf8",
141+);
142+};
143+144+const loadBundledPluginPublicArtifactModuleSync = vi.fn(({ dirName }: { dirName: string }) => {
145+if (dirName !== "first" && dirName !== "second") {
146+throw new Error(`Unable to resolve bundled plugin public surface ${dirName}`);
147+}
148+return {
149+resolveThinkingProfile: () => ({ levels: [{ id: dirName }] }),
150+};
151+});
152+153+vi.doMock("./public-surface-loader.js", () => ({
154+ loadBundledPluginPublicArtifactModuleSync,
155+}));
156+process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = bundledPluginsDir;
157+process.env.OPENCLAW_TEST_TRUST_BUNDLED_PLUGINS_DIR = "1";
158+vi.resetModules();
159+160+try {
161+writePlugin("first", ["fixture-provider"], 1);
162+writePlugin("second", [], 1);
163+const { resolveBundledProviderPolicySurface: resolvePolicySurface } = await importFreshModule<
164+typeof import("./provider-public-artifacts.js")
165+>(import.meta.url, "./provider-public-artifacts.js?scope=provider-alias-refresh");
166+167+expect(
168+resolvePolicySurface("fixture-provider")
169+?.resolveThinkingProfile?.({ provider: "fixture-provider", modelId: "demo" })
170+?.levels.map((level) => level.id),
171+).toEqual(["first"]);
172+173+writePlugin("first", [], 2);
174+writePlugin("second", ["fixture-provider"], 2);
175+176+expect(
177+resolvePolicySurface("fixture-provider")
178+?.resolveThinkingProfile?.({ provider: "fixture-provider", modelId: "demo" })
179+?.levels.map((level) => level.id),
180+).toEqual(["second"]);
181+} finally {
182+fs.rmSync(bundledPluginsDir, { force: true, recursive: true });
183+}
184+});
185+117186it("loads provider policy surfaces without package-manager repair", async () => {
118187const loadBundledPluginPublicArtifactModuleSync = vi.fn(() => ({
119188normalizeConfig: (ctx: { providerConfig: ModelProviderConfig }) => ctx.providerConfig,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。