{"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../../../../src/core/long-horizon/adaptive/capability-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACvC;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,kBAAkB,CAE1F;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,qBAAqB;;;;;;;;EAgB7F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAOjG;AAED,MAAM,WAAW,iBAAiB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA4B1G;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAO1G;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CACzB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,EAClD,eAAe,EAAE,MAAM,GAAG,SAAS,GACjC,OAAO,CAKT","sourcesContent":["/**\n * Provider/model capability registry.\n *\n * Deterministic capability resolution driven by explicit capability flags —\n * never by model names or by the assumption that a newer or more expensive\n * model is better. Unknown capability state is explicit (\"unknown\"), not\n * silently assumed. Pricing carries an `effectiveAt` and is never used to\n * rewrite historical budget records.\n */\n\nimport type { CapabilityFlag, ModelCapabilities } from \"./types.js\";\n\nexport interface CapabilityRegistry {\n\tprofiles: readonly ModelCapabilities[];\n}\n\nexport interface FindCapabilitiesInput {\n\tprovider: string;\n\tmodel: string;\n\toverrides?: Partial<ModelCapabilities>;\n}\n\nexport function createCapabilityRegistry(profiles: ModelCapabilities[]): CapabilityRegistry {\n\treturn { profiles: Object.freeze([...profiles]) };\n}\n\nfunction matches(flag: CapabilityFlag): boolean {\n\treturn flag === true;\n}\n\n/**\n * Resolve capabilities for a provider/model, applying configuration overrides.\n * Returns `{ found, capabilities, unknown }` — an explicit unknown profile is\n * represented, never fabricated.\n */\nexport function resolveCapabilities(registry: CapabilityRegistry, input: FindCapabilitiesInput) {\n\tconst base = registry.profiles.find((p) => p.provider === input.provider && p.model === input.model);\n\tif (!base) {\n\t\treturn {\n\t\t\tfound: false as const,\n\t\t\tcapabilities: null,\n\t\t\tunknown: true as const,\n\t\t};\n\t}\n\tconst merged: ModelCapabilities = {\n\t\t...base,\n\t\t...input.overrides,\n\t\tprovider: base.provider,\n\t\tmodel: base.model,\n\t};\n\treturn { found: true as const, capabilities: merged, unknown: false as const };\n}\n\n/**\n * Check that a capability profile satisfies an array of required capability\n * names. A flag of `\"unknown\"` does NOT satisfy a requirement.\n */\nexport function hasAllCapabilities(profile: ModelCapabilities | null, required: string[]): boolean {\n\tif (!profile) return false;\n\tfor (const cap of required) {\n\t\tconst value = (profile as unknown as Record<string, CapabilityFlag>)[cap];\n\t\tif (value === undefined || !matches(value)) return false;\n\t}\n\treturn true;\n}\n\nexport interface RoleCompatibility {\n\tcompatible: boolean;\n\tmissingRequired: string[];\n\tunknownRequired: string[];\n\treasons: string[];\n}\n\n/**\n * Determine whether a profile is compatible with a role's required capabilities.\n */\nexport function roleCompatibility(profile: ModelCapabilities | null, required: string[]): RoleCompatibility {\n\tif (!profile) {\n\t\treturn {\n\t\t\tcompatible: false,\n\t\t\tmissingRequired: required,\n\t\t\tunknownRequired: [],\n\t\t\treasons: [\"UNKNOWN_CAPABILITY_PROFILE\"],\n\t\t};\n\t}\n\tconst missingRequired: string[] = [];\n\tconst unknownRequired: string[] = [];\n\tconst reasons: string[] = [];\n\tfor (const cap of required) {\n\t\tconst value = (profile as unknown as Record<string, CapabilityFlag>)[cap];\n\t\tif (value === undefined || value === \"unknown\") {\n\t\t\tunknownRequired.push(cap);\n\t\t\treasons.push(`UNKNOWN_CAPABILITY:${cap}`);\n\t\t} else if (value === false) {\n\t\t\tmissingRequired.push(cap);\n\t\t\treasons.push(`MISSING_CAPABILITY:${cap}`);\n\t\t}\n\t}\n\treturn {\n\t\tcompatible: missingRequired.length === 0 && unknownRequired.length === 0,\n\t\tmissingRequired,\n\t\tunknownRequired,\n\t\treasons,\n\t};\n}\n\n/** Cost-tier heuristic from a profile's pricing (cheap/standard/premium). */\nexport function costTierOf(profile: ModelCapabilities | null): \"cheap\" | \"standard\" | \"premium\" | \"unknown\" {\n\tif (!profile?.pricing) return \"unknown\";\n\tconst output = profile.pricing.outputPerMillion ?? 0;\n\tconst input = profile.pricing.inputPerMillion ?? 0;\n\tif (output < 2 && input < 1) return \"cheap\";\n\tif (output >= 18 || input >= 10) return \"premium\";\n\treturn \"standard\";\n}\n\n/** Whether `tier` fits within a `maximumCostTier` policy bound. */\nexport function tierWithin(\n\ttier: \"cheap\" | \"standard\" | \"premium\" | \"unknown\",\n\tmaximumCostTier: string | undefined,\n): boolean {\n\tif (!maximumCostTier) return true;\n\tif (tier === \"unknown\") return false;\n\tconst rank: Record<string, number> = { cheap: 1, standard: 2, premium: 3 };\n\treturn rank[tier] <= rank[maximumCostTier];\n}\n"]}