// Elevenlabs plugin module implements doctor contract behavior. import type { ChannelDoctorLegacyConfigRule } from "openclaw/plugin-sdk/channel-contract"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts"; import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime"; import { ELEVENLABS_TALK_PROVIDER_ID, migrateElevenLabsLegacyTalkConfig } from "./config-compat.js"; export function hasLegacyTalkFields(value: unknown): boolean { const talk = isRecord(value) ? value : null; if (!talk) { return false; } return ["voiceId", "voiceAliases", "modelId", "outputFormat", "apiKey"].some((key) => Object.hasOwn(talk, key), ); } export const legacyConfigRules: ChannelDoctorLegacyConfigRule[] = [ { path: ["talk"], message: "talk.voiceId/talk.voiceAliases/talk.modelId/talk.outputFormat/talk.apiKey are legacy; use talk.providers. and run openclaw doctor --fix.", match: hasLegacyTalkFields, }, ]; export const ELEVENLABS_TALK_LEGACY_CONFIG_RULES = legacyConfigRules; export function normalizeCompatibilityConfig({ cfg }: { cfg: OpenClawConfig }): { config: OpenClawConfig; changes: string[]; } { return migrateElevenLabsLegacyTalkConfig(cfg); } export { ELEVENLABS_TALK_PROVIDER_ID };