{"version":3,"file":"model-info.d.ts","sourceRoot":"","sources":["../../../src/shared/model-info.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,sEAAuE,CAAC;AACpG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAE7E,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,UAAU,iBAAiB;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAS/D;AAED;;2FAE2F;AAC3F,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,cAAc,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,GACxC,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CASrG;AAED,wBAAgB,aAAa,CAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,eAAe,EAAE,SAAS,EAAE,GAAG,SAAS,EACxC,iBAAiB,CAAC,EAAE,MAAM,GACxB,SAAS,GAAG,SAAS,CAYvB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,EAAE,CAaxF","sourcesContent":["export const THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nexport type ThinkingLevel = (typeof THINKING_LEVELS)[number];\nexport type ThinkingLevelMap = Partial<Record<ThinkingLevel, string | null>>;\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tfullId: string;\n\tapi?: string;\n\treasoning?: boolean;\n\tthinkingLevelMap?: ThinkingLevelMap;\n}\n\ninterface RegistryModelLike {\n\tprovider: string;\n\tid: string;\n\tapi?: string;\n\treasoning?: boolean;\n\tthinkingLevelMap?: ThinkingLevelMap;\n}\n\nexport function toModelInfo(model: RegistryModelLike): ModelInfo {\n\treturn {\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tfullId: `${model.provider}/${model.id}`,\n\t\tapi: model.api,\n\t\treasoning: model.reasoning,\n\t\tthinkingLevelMap: model.thinkingLevelMap,\n\t};\n}\n\n/** Resolve the effective thinking level from a model string (which may contain a known suffix like `:high`)\n * and an explicit thinking config value. Returns `undefined` when no thinking is applicable\n * (e.g. no model was specified, or the model has no suffix and no config was provided). */\nexport function resolveEffectiveThinking(\n\tmodel: string | undefined,\n\tconfigThinking: string | false | undefined,\n): string | undefined {\n\tif (!model) return undefined;\n\tconst { thinkingSuffix } = splitKnownThinkingSuffix(model);\n\tif (thinkingSuffix) return thinkingSuffix.slice(1);\n\treturn THINKING_LEVELS.find((level) => level === configThinking);\n}\n\nexport function splitKnownThinkingSuffix(model: string): { baseModel: string; thinkingSuffix: string } {\n\tconst colonIdx = model.lastIndexOf(\":\");\n\tif (colonIdx === -1) return { baseModel: model, thinkingSuffix: \"\" };\n\tconst suffix = THINKING_LEVELS.find((level) => level === model.substring(colonIdx + 1));\n\tif (!suffix) return { baseModel: model, thinkingSuffix: \"\" };\n\treturn {\n\t\tbaseModel: model.substring(0, colonIdx),\n\t\tthinkingSuffix: `:${suffix}`,\n\t};\n}\n\nexport function findModelInfo(\n\tmodel: string | undefined,\n\tavailableModels: ModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): ModelInfo | undefined {\n\tif (!model || !availableModels || availableModels.length === 0) return undefined;\n\tconst { baseModel } = splitKnownThinkingSuffix(model);\n\tconst exact = availableModels.find((entry) => entry.fullId === baseModel);\n\tif (exact) return exact;\n\n\tconst matches = availableModels.filter((entry) => entry.id === baseModel);\n\tif (preferredProvider) {\n\t\tconst preferred = matches.find((entry) => entry.provider === preferredProvider);\n\t\tif (preferred) return preferred;\n\t}\n\treturn matches.length === 1 ? matches[0] : undefined;\n}\n\nexport function getSupportedThinkingLevels(model: ModelInfo | undefined): ThinkingLevel[] {\n\tif (!model) return THINKING_LEVELS.filter((level) => level !== \"max\");\n\tif (model.reasoning === false) return [\"off\"];\n\n\tif (!model.thinkingLevelMap) return THINKING_LEVELS.filter((level) => level !== \"max\");\n\n\tconst levels = THINKING_LEVELS.filter((level) => {\n\t\tconst mapped = model.thinkingLevelMap?.[level];\n\t\tif (mapped === null) return false;\n\t\tif (level === \"xhigh\" || level === \"max\") return mapped !== undefined;\n\t\treturn true;\n\t});\n\treturn levels;\n}\n"]}