feat: add governed BYOK model routing

✅ merged · #1 · IvanJS17/mike ← IvanJS17/mike · opened 3d ago by IvanJS17 · merged 3d ago by IvanJS17 · self · +3,137-108 across 46 files · ↗ on GitHub

From the PR description

Resumen

Implementa la primera vertical de BYOK gobernado:

  • cifra credenciales personales con AES-256-GCM y expone sólo referencias versionadas;
  • agrega catálogo de rutas autorizado para OpenAI, Anthropic, Gemini, OpenRouter, DeepSeek y OpenCode Zen/Go;
  • fija proveedor, modelo y referencia de credencial al crear cada conversación;
  • impide sustituir la ruta en turnos posteriores de chats generales y de proyecto;
  • falla antes de escribir mensajes o iniciar SSE cuando la credencial exacta no está disponible;
  • reemplaza el selector libre por selección explícita al crear y ruta bloqueada después;
  • agrega los siete proveedores a la pantalla de credenciales.

Verificación local

  • Backend: 514 pruebas pasaron, 15 omitidas; build PASS.
  • Frontend: 245 pruebas pasaron; TypeScript PASS; lint 0 errores (38 advertencias históricas); build de producción PASS.
  • Smoke: /health, /assistant y /account/api-keys respondieron HTTP 200 en servicios locales reales; puertos dedicados cerrados después.
  • Revisión independiente: PASS sobre árbol exacto a385244f96bc13f28a864c2a7c50acb321ba3f66.

Regresiones cerradas durante review

  • La X/overlay del modal ya no finge cancelar después de iniciar createChat, evitando chats fantasma por respuesta tardía.
  • El catálogo Gemini reconoce la respuesta models[] y normaliza prefijos models/.

Alcance deliberadamente posterior

No incluye recibos firmados, fallback enlazado, credenciales institucionales ni comité adversarial. Esta PR entrega sólo la base gobernada e inmutable.

Estado operativo

No modifica producción ni credenciales reales.

Our analysis

Add governed BYOK foundations — read the full analysis →

Think the analysis missed something the PR description covers?

Capture this PR into my fork

Download a Markdown prompt that tells Claude how to port every commit in this PR into your working tree. Run it via claude -p < capture-pull-1.md from inside the repo you want the changes in.

⬇ Download capture-pull-1.md