feat(coding-agent): expose model resolution helpers

closes #6201
This commit is contained in:
Vegard Stikbakke
2026-07-01 10:22:35 +02:00
parent 1d061b3f45
commit 040f0a5197
5 changed files with 119 additions and 5 deletions
@@ -255,9 +255,24 @@ export function parseModelPattern(
* The algorithm tries to match the full pattern first, then progressively
* strips colon-suffixes to find a match.
*/
export async function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]> {
export interface ModelScopeDiagnostic {
type: "warning";
message: string;
pattern: string;
}
export interface ResolveModelScopeResult {
scopedModels: ScopedModel[];
diagnostics: ModelScopeDiagnostic[];
}
export async function resolveModelScopeWithDiagnostics(
patterns: string[],
modelRegistry: ModelRegistry,
): Promise<ResolveModelScopeResult> {
const availableModels = await modelRegistry.getAvailable();
const scopedModels: ScopedModel[] = [];
const diagnostics: ModelScopeDiagnostic[] = [];
for (const pattern of patterns) {
// Check if pattern contains glob characters
@@ -283,7 +298,7 @@ export async function resolveModelScope(patterns: string[], modelRegistry: Model
});
if (matchingModels.length === 0) {
console.warn(chalk.yellow(`Warning: No models match pattern "${pattern}"`));
diagnostics.push({ type: "warning", message: `No models match pattern "${pattern}"`, pattern });
continue;
}
@@ -298,11 +313,11 @@ export async function resolveModelScope(patterns: string[], modelRegistry: Model
const { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);
if (warning) {
console.warn(chalk.yellow(`Warning: ${warning}`));
diagnostics.push({ type: "warning", message: warning, pattern });
}
if (!model) {
console.warn(chalk.yellow(`Warning: No models match pattern "${pattern}"`));
diagnostics.push({ type: "warning", message: `No models match pattern "${pattern}"`, pattern });
continue;
}
@@ -312,6 +327,14 @@ export async function resolveModelScope(patterns: string[], modelRegistry: Model
}
}
return { scopedModels, diagnostics };
}
export async function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]> {
const { scopedModels, diagnostics } = await resolveModelScopeWithDiagnostics(patterns, modelRegistry);
for (const diagnostic of diagnostics) {
console.warn(chalk.yellow(`Warning: ${diagnostic.message}`));
}
return scopedModels;
}