feat(ti): dashboard de proyectos embebible en OAE (mismo archivo dual)
Replica el patrón embed de portal_comercial para que el dashboard comprehensivo de Sistemas / Proyectos se sirva desde un único source of truth en portal_ti y se renderice idéntico en: · standalone portal_ti:3015 → /sistemas/proyectos · shell OAE frontend:3010 → /oae/sistemas/proyectos
Reorganización portal_ti/components/dashboard/ti/:
- ProyectosDashboard.tsx (rename de app/sistemas/proyectos/page.tsx, ~1330 LOC con SectionHeader y RoadmapQuarters inline).
- _internal/OaeCards.tsx, ProyectosDetalleModal.tsx, MultiSelectFilter.tsx (renames desde components/dashboard/ y components/filters/).
- _internal/lib/api.ts (nuevo, ~50 LOC) — cliente axios autocontenido con resolución de API_URL + token de localStorage/cookie, sin withCredentials ni redirect interceptors. Sigue patrón del comercial.
- _internal/lib/ti.api.ts (rename de portal_ti/lib/ti.api.ts) ahora importa ./api en vez de @/lib/api.
- _internal/lib/utils.ts (cn helper portado, evita dependencia del shell).
Migración de imports: todos los imports dentro del árbol ti/ son relativos (./_internal/...). Cero @/ aliases que romperían el embed cuando el archivo se monta dentro del shell OAE bajo /app/_ti_dashboards.
Wrappers thin:
- portal_ti/app/sistemas/proyectos/page.tsx → renderiza ProyectosDashboard vía @/components/dashboard/ti/ProyectosDashboard.
- frontend/app/sistemas/proyectos/page.tsx → renderiza ProyectosDashboard vía @ti-dashboards/ProyectosDashboard. Reemplaza al dashboard deprecado de 'Costos del mes' (useTiSummary + PremiumKpiCard).
Wiring frontend:
- frontend/tsconfig.json: nuevo path alias @ti-dashboards/* → ./_ti_dashboards/*.
- docker-compose.override.yml: bind mount read-only de portal_ti/components/dashboard/ti → /app/_ti_dashboards en dev, para hot-reload cross-portal sin rebuild.
- frontend/Dockerfile: COPY portal_ti/components/dashboard/ti ./_ti_dashboards en builder y dev stages (snapshot horneado en prod, consistente con _rh_dashboards y _comercial_dashboards).
Trade-off conocido (mismo que comercial): el transport axios se duplica entre portal_ti/lib/api.ts (shell — auth, notifications, TiSummary, formatCurrency) y _internal/lib/api.ts (dashboard portable). Cambios de auth/headers/refresh tocan ambos.