(params: {
cfg: ReturnType<Config["loadConfigOrDefault"]>;
parentMeta: {
aiSettingsByAgent?: Record<string, ResolvedWorkspaceAiSettings>;
aiSettings?: ResolvedWorkspaceAiSettings;
};
agentId: string;
modelString?: string;
thinkingLevel?: ParsedThinkingInput;
parentRuntimeAiSettings?: { modelString?: string; thinkingLevel?: ThinkingLevel };
})
| 1576 | } |
| 1577 | |
| 1578 | private resolveTaskAISettings(params: { |
| 1579 | cfg: ReturnType<Config["loadConfigOrDefault"]>; |
| 1580 | parentMeta: { |
| 1581 | aiSettingsByAgent?: Record<string, ResolvedWorkspaceAiSettings>; |
| 1582 | aiSettings?: ResolvedWorkspaceAiSettings; |
| 1583 | }; |
| 1584 | agentId: string; |
| 1585 | modelString?: string; |
| 1586 | thinkingLevel?: ParsedThinkingInput; |
| 1587 | parentRuntimeAiSettings?: { modelString?: string; thinkingLevel?: ThinkingLevel }; |
| 1588 | }): { |
| 1589 | taskModelString: string; |
| 1590 | canonicalModel: string; |
| 1591 | effectiveThinkingLevel: ThinkingLevel; |
| 1592 | } { |
| 1593 | const parentAiSettings = this.resolveWorkspaceAISettings(params.parentMeta, params.agentId); |
| 1594 | // Sub-agent defaults take priority over UI agent defaults per field for any agent invoked as a sub-agent. |
| 1595 | const subagentDefault = params.cfg.subagentAiDefaults?.[params.agentId]; |
| 1596 | const agentDefault = params.cfg.agentAiDefaults?.[params.agentId]; |
| 1597 | const parentRuntimeAiSettings = params.parentRuntimeAiSettings; |
| 1598 | |
| 1599 | const taskModelString = |
| 1600 | coerceNonEmptyString(params.modelString) ?? |
| 1601 | coerceNonEmptyString(subagentDefault?.modelString) ?? |
| 1602 | coerceNonEmptyString(agentDefault?.modelString) ?? |
| 1603 | coerceNonEmptyString(parentRuntimeAiSettings?.modelString) ?? |
| 1604 | coerceNonEmptyString(parentAiSettings?.model) ?? |
| 1605 | defaultModel; |
| 1606 | const canonicalModel = normalizeToCanonical(taskModelString).trim(); |
| 1607 | assert(canonicalModel.length > 0, "resolveTaskAISettings: resolved model must be non-empty"); |
| 1608 | |
| 1609 | // Resolve an explicit override first so numeric thinking indices map into the |
| 1610 | // chosen model's allowed levels (named levels pass through unchanged). |
| 1611 | const overrideThinkingLevel = |
| 1612 | params.thinkingLevel != null |
| 1613 | ? resolveThinkingInput(params.thinkingLevel, canonicalModel) |
| 1614 | : undefined; |
| 1615 | const requestedThinkingLevel: ThinkingLevel = |
| 1616 | overrideThinkingLevel ?? |
| 1617 | subagentDefault?.thinkingLevel ?? |
| 1618 | agentDefault?.thinkingLevel ?? |
| 1619 | parentRuntimeAiSettings?.thinkingLevel ?? |
| 1620 | parentAiSettings?.thinkingLevel ?? |
| 1621 | "off"; |
| 1622 | const effectiveThinkingLevel = enforceThinkingPolicy(canonicalModel, requestedThinkingLevel); |
| 1623 | |
| 1624 | return { taskModelString, canonicalModel, effectiveThinkingLevel }; |
| 1625 | } |
| 1626 | |
| 1627 | /** |
| 1628 | * Derives auto-resume send options (agentId, model, thinkingLevel) from durable |
no test coverage detected