MCPcopy Create free account
hub / github.com/QodeXcli/QodeX / resolveRole

Function resolveRole

src/llm/role-resolver.ts:58–102  ·  view source on GitHub ↗
(
  role: RoleName,
  config: QodexConfig,
  explicitModel?: string,
)

Source from the content-addressed store, hash-verified

56 * @param explicitModel optional per-call override — e.g. the `task` tool's model arg
57 */
58export function resolveRole(
59 role: RoleName,
60 config: QodexConfig,
61 explicitModel?: string,
62): ResolvedRole {
63 // 1. Explicit per-call wins. We have to infer the provider from the model id
64 // because callers (`task` tool) only pass the model string.
65 if (explicitModel) {
66 return {
67 provider: inferProvider(explicitModel),
68 model: explicitModel,
69 source: 'explicit',
70 };
71 }
72
73 // 2. Session override (from `/subagent-model <id>` or `/role-model <name> <id>`)
74 const session = _sessionOverrides.get(role);
75 if (session) {
76 return { provider: session.provider, model: session.model, source: 'session-override' };
77 }
78
79 // 3. Config-level role binding — try exact role first
80 const rolesMap = (config as any).roles as Record<string, { provider: ResolvedRole['provider']; model: string } | undefined> | undefined;
81 const roleConfig = rolesMap?.[role];
82 if (roleConfig?.model) {
83 return { provider: roleConfig.provider, model: roleConfig.model, source: 'config-role' };
84 }
85
86 // 4. Fall back to roles.subagent if a different role was requested but unconfigured.
87 // This makes "I asked for vision but didn't set it up" gracefully degrade rather
88 // than silently using the parent model (which probably isn't vision-capable).
89 if (role !== 'subagent') {
90 const subagentConfig = rolesMap?.['subagent'];
91 if (subagentConfig?.model) {
92 return { provider: subagentConfig.provider, model: subagentConfig.model, source: 'config-role' };
93 }
94 }
95
96 // 5. Last resort: parent default
97 return {
98 provider: config.defaults.provider,
99 model: config.defaults.model,
100 source: 'parent-default',
101 };
102}
103
104/**
105 * Infer provider from model id. Heuristic — used when a caller passes only a model

Callers 3

handleSlashCommandFunction · 0.85
runSubagentMethod · 0.85

Calls 2

inferProviderFunction · 0.85
getMethod · 0.45

Tested by

no test coverage detected