
















@@ -66,6 +66,35 @@ const BUNDLED_LIVE_CONFIG_HOOK_GUARDS = {
6666"api.runtime.config?.loadConfig?.() ?? api.config",
6767],
6868} as const satisfies Record<string, readonly string[]>;
69+const BUNDLED_LIVE_CONFIG_PROVIDER_GUARDS = {
70+"extensions/amazon-bedrock/register.sync.runtime.ts": [
71+"resolvePluginConfigObject(",
72+"const startupPluginConfig = (api.pluginConfig ?? {})",
73+"const currentPluginConfig = resolveCurrentPluginConfig(ctx.config);",
74+"const currentGuardrail = resolveCurrentPluginConfig(config)?.guardrail;",
75+],
76+"extensions/codex/provider.ts": [
77+"resolvePluginConfigObject(",
78+"const runtimePluginConfig = resolvePluginConfigObject(ctx.config, CODEX_PROVIDER_ID);",
79+"const pluginConfig = runtimePluginConfig ?? (ctx.config ? undefined : options.pluginConfig);",
80+],
81+"extensions/github-copilot/index.ts": [
82+"resolvePluginConfigObject(",
83+'const runtimePluginConfig = resolvePluginConfigObject(config, "github-copilot");',
84+"return config ? {} : startupPluginConfig;",
85+],
86+"extensions/ollama/index.ts": [
87+"resolvePluginConfigObject(",
88+'const runtimePluginConfig = resolvePluginConfigObject(config, "ollama");',
89+"return config ? {} : startupPluginConfig;",
90+],
91+"extensions/openai/index.ts": [
92+"resolvePluginConfigObject(",
93+'const runtimePluginConfig = resolvePluginConfigObject(ctx.config, "openai");',
94+"runtimePluginConfig ??",
95+"ctx.config ? undefined : (api.pluginConfig as Record<string, unknown>)",
96+],
97+} as const satisfies Record<string, readonly string[]>;
6998const BUNDLED_STARTUP_GATED_HOOK_FORBIDDEN_SNIPPETS = {
7099"extensions/memory-lancedb/index.ts": ["if (cfg.autoRecall)", "if (cfg.autoCapture)"],
71100"extensions/skill-workshop/index.ts": [
@@ -256,6 +285,18 @@ describe("plugin contract boundary invariants", () => {
256285expect(missingGuards).toEqual([]);
257286});
258287288+it("keeps live provider config surfaces on runtime config lookups", () => {
289+const missingGuards = Object.entries(BUNDLED_LIVE_CONFIG_PROVIDER_GUARDS).flatMap(
290+([file, requiredSnippets]) => {
291+const source = readRepoSource(file);
292+return requiredSnippets
293+.filter((snippet) => !source.includes(snippet))
294+.map((snippet) => `${file}: ${snippet}`);
295+},
296+);
297+expect(missingGuards).toEqual([]);
298+});
299+259300it("keeps long-lived bundled hook handlers off startup-only registration gates", () => {
260301const offenders = Object.entries(BUNDLED_STARTUP_GATED_HOOK_FORBIDDEN_SNIPPETS).flatMap(
261302([file, forbiddenSnippets]) => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。