import { normalizeProviderId } from "../agents/provider-id.js"; import type { ProviderDefaultThinkingPolicyContext, ProviderThinkingPolicyContext, } from "./provider-thinking.types.js"; type ThinkingProviderPlugin = { id: string; aliases?: string[]; isBinaryThinking?: (ctx: ProviderThinkingPolicyContext) => boolean | undefined; supportsXHighThinking?: (ctx: ProviderThinkingPolicyContext) => boolean | undefined; resolveDefaultThinkingLevel?: ( ctx: ProviderDefaultThinkingPolicyContext, ) => "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "adaptive" | null | undefined; }; const PLUGIN_REGISTRY_STATE = Symbol.for("openclaw.pluginRegistryState"); type ThinkingRegistryState = { activeRegistry?: { providers?: Array<{ provider: ThinkingProviderPlugin; }>; } | null; }; function matchesProviderId(provider: ThinkingProviderPlugin, providerId: string): boolean { const normalized = normalizeProviderId(providerId); if (!normalized) { return false; } if (normalizeProviderId(provider.id) === normalized) { return true; } return (provider.aliases ?? []).some((alias) => normalizeProviderId(alias) === normalized); } function resolveActiveThinkingProvider(providerId: string): ThinkingProviderPlugin | undefined { const state = ( globalThis as typeof globalThis & { [PLUGIN_REGISTRY_STATE]?: ThinkingRegistryState } )[PLUGIN_REGISTRY_STATE]; return state?.activeRegistry?.providers?.find((entry) => { return matchesProviderId(entry.provider, providerId); })?.provider; } type ThinkingHookParams = { provider: string; context: TContext; }; export function resolveProviderBinaryThinking( params: ThinkingHookParams, ) { return resolveActiveThinkingProvider(params.provider)?.isBinaryThinking?.(params.context); } export function resolveProviderXHighThinking( params: ThinkingHookParams, ) { return resolveActiveThinkingProvider(params.provider)?.supportsXHighThinking?.(params.context); } export function resolveProviderDefaultThinkingLevel( params: ThinkingHookParams, ) { return resolveActiveThinkingProvider(params.provider)?.resolveDefaultThinkingLevel?.( params.context, ); }