Voice policy controls for router keys

Router key policies can now select a TTS gender, pin a model voice, and set per-model voice overrides through the API and console.

POST and PATCH /api/keys accept TTS policy fields gender, pinnedVoice with model and voice members, and overrides keyed by TTS catalog model id. GET /api/keys returns the same fields in camelCase.

A pinned voice or override is checked against a model's curated voice roster. A missing roster entry returns unknown_voice; an empty roster remains permissive until that model has been curated.

A female or male constraint that disagrees with a curated pinned or override voice returns voice_gender_conflict.

Keys with an accent-tagged language, such as es-MX, keep accent-managed voice selection and reject active voice constraints with accent_managed_voice.

The legacy TTS voice field cannot be combined with an active gender, pinnedVoice, or overrides setting. Such a policy returns invalid_policy because pinnedVoice supersedes voice and the caller must choose one mechanism.