Просмотр исходного кода

fix(config): resolve inheritance through agent aliases

HeZzz 3 недель назад
Родитель
Сommit
ffb8d1ac3b
2 измененных файлов с 32 добавлено и 2 удалено
  1. 18 0
      src/agents/index.test.ts
  2. 14 2
      src/config/runtime.ts

+ 18 - 0
src/agents/index.test.ts

@@ -243,6 +243,24 @@ describe('fixer agent fallback', () => {
     expect(fixer?.config.model).toBeUndefined();
   });
 
+  test('legacy alias inheritance clears a canonical lower-layer model', () => {
+    const config: PluginConfig = {
+      preset: 'split',
+      presets: {
+        split: {
+          explorer: { model: 'preset/explorer' },
+        },
+      },
+      agents: {
+        explore: { inheritModelFrom: 'session' },
+      },
+    };
+    const agents = createAgents(runtimeFor(config));
+    const explorer = agents.find((a) => a.name === 'explorer');
+
+    expect(explorer?.config.model).toBeUndefined();
+  });
+
   test('fixer uses its own model when explicitly configured', () => {
     const config: PluginConfig = {
       agents: {

+ 14 - 2
src/config/runtime.ts

@@ -123,9 +123,21 @@ function mergeAgentOverrides(
     ) {
       continue;
     }
-    const entry = merged[name];
+    const resolvedName = AGENT_ALIASES[name] ?? name;
+    // A canonical key in the same layer remains authoritative over its
+    // legacy alias. Otherwise, apply the alias directive to the canonical
+    // lower-layer entry so getOverrideFromAgents sees the effective policy.
+    if (resolvedName !== name && Object.hasOwn(override, resolvedName)) {
+      continue;
+    }
+    const entry = merged[resolvedName] ?? merged[name];
     if (entry) {
-      delete entry.model;
+      const updatedEntry = { ...entry };
+      delete updatedEntry.model;
+      if (resolvedName !== name) {
+        updatedEntry.inheritModelFrom = agentOverride.inheritModelFrom;
+      }
+      merged[resolvedName] = updatedEntry;
     }
   }
   return merged;