feat(coding-agent): unified resolution logic for deferred model patterns

- Enabled comma-separated string splitting within array-based model patterns.
- Expanded deferred model patterns before registration to align with immediate resolution behavior.
- Unified resolution logic to ensure deferred patterns support the same role aliases and chaining as the standard path.
This commit is contained in:
can1357
2026-07-05 15:57:24 +02:00
parent 2f7e95d533
commit da705d76e6
2 changed files with 10 additions and 5 deletions
@@ -864,7 +864,7 @@ function getModelRoleAlias(value: string): ModelRole | undefined {
function normalizeModelPatternList(value: string | string[] | undefined): string[] {
if (!value) return [];
const patterns = Array.isArray(value) ? value : value.split(",");
const patterns = Array.isArray(value) ? value.flatMap(pattern => pattern.split(",")) : value.split(",");
return patterns.map(pattern => pattern.trim()).filter(Boolean);
}
+9 -4
View File
@@ -41,6 +41,7 @@ import {
parseModelString,
pickDefaultAvailableModel,
resolveAllowedModels,
resolveConfiguredModelPatterns,
resolveModelRoleValue,
} from "./config/model-resolver";
import { loadPromptTemplates as loadPromptTemplatesInternal, type PromptTemplate } from "./config/prompt-templates";
@@ -1969,12 +1970,16 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
}
}
}
// Resolve deferred --model/subagent patterns now that extension models are registered.
// Resolve deferred --model/subagent patterns now that extension models are
// registered. Expand role aliases (`pi/smol`) and comma chains to concrete
// selectors first so deferred resolution accepts everything the immediate
// path (resolveModelOverride → resolveModelRoleValue) accepts.
if (!model && deferredModelPatterns.length > 0) {
const expandedModelPatterns = resolveConfiguredModelPatterns(deferredModelPatterns, settings);
const availableModels = modelRegistry.getAll();
const matchPreferences = getModelMatchPreferences(settings);
for (let patternIndex = 0; patternIndex < deferredModelPatterns.length; patternIndex += 1) {
const pattern = deferredModelPatterns[patternIndex];
for (let patternIndex = 0; patternIndex < expandedModelPatterns.length; patternIndex += 1) {
const pattern = expandedModelPatterns[patternIndex];
const primary = parseModelPattern(pattern, availableModels, matchPreferences);
if (!primary.model) continue;
let selectedModel = primary.model;
@@ -2007,7 +2012,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
);
const seenSelectors = new Set<string>([primarySelector]);
const fallbackSelectors: string[] = [];
for (const fallbackPattern of deferredModelPatterns.slice(patternIndex + 1)) {
for (const fallbackPattern of expandedModelPatterns.slice(patternIndex + 1)) {
const fallback = parseModelPattern(fallbackPattern, availableModels, matchPreferences);
if (!fallback.model) continue;
const fallbackSelector = formatModelSelectorValue(