Changelog {{changelog}}

Changelog

Historial de versiones de SolucionAIT Riesgos Laborales.

v0.5.0

Feature 2026-08-21
  • Multi-proveedor de IA por capacidad: configuración independiente de Texto (LLM), Transcripción (STT) y Visión. AiProviderConfiguration.Capability (una fila por capacidad), pestañas en Configuración IA, y variables de entorno AI__Stt__* / AI__Vision__*.
  • Análisis de audio (STT → LLM): un PromptTemplate con capacidad Audio y MediaJsonPath descarga/decodifica el audio (URL o base64, SSRF protegido, 20 MB), lo transcribe con el proveedor STT y pasa la transcripción al LLM como variable reservada {Transcripcion}. El resultado se inserta en el marker.
  • Análisis de imagen (Visión): un PromptTemplate con capacidad Visión envía la imagen (URL o base64) al proveedor multimodal y genera una descripción/analítica que se inserta en el marker. Para embeber la imagen además, se usa un marker de mapeo directo.
  • Tolerancia a fallos: si un proveedor de capacidad no está configurado o el media/transcripción/visión falla, la sección se marca Success=false con ErrorMessage legible y el marker colapsa (no rompe el informe).
  • Validación: los strings data-URI (media embebido) quedan exentos del límite de longitud del cuestionario; el validador ODT avisa con MEDIA_PATH_MISSING si un prompt de audio/visión no tiene ruta media.

v0.4.0

Feature 2026-08-21
  • Imágenes en markers de mapeo directo: un marker DirectJsonMapping puede resolver a una imagen además de texto. El valor del cuestionario admite dos formatos:
  • Objeto explícito — {"type":"image","src":...,"alt":...,"width":...,"height":...} con src como data URI (data:image/png;base64,...) o URL.
  • String data-URI — "data:image/<ext>;base64,..." auto-detectado por prefijo (las URLs desnudas como string NO se auto-detectan para no romper markers de texto).
  • Embehido en el ODT: la imagen viaja en Pictures/<marker>.<ext> del ZIP, se inyecta un <draw:frame>/<draw:image> (auto-size si no hay dimensiones) y se actualiza META-INF/manifest.xml.
  • Seguridad: las URLs se descargan con protección SSRF, whitelist Content-Type: image/* y límite de 20 MB. Si la imagen no se resuelve (base64 inválido o URL no descargable), el marker se sustituye por vacío y la sección queda marcada como fallida.

v0.3.16

UI 2026-08-20
  • Rediseño visual completo "La Plantilla y el Documento": sistema de tokens (--paper, --ink, --signal, --hazard), tipografías variables (Space Grotesk, IBM Plex Sans/Mono), firma de marca marker-stamp, franja de seguridad hazard-stripe y cabecera de página compartida _PageHeader (eyebrow + título + descripción) aplicada a todas las vistas del backoffice.
  • Eliminación de sellos de marker de las cabeceras de página ({{POST /api/reports}}, {{eval.*}}, etc.). Se mantiene el sello {{eval.informe}} del logo.
  • Blindaje de workers: ningún fallo detiene el host. Circuit-breaker y WaitIfPausedAsync dentro del try/catch en ReportQueueWorker; loops completos en try/catch con TrySetResult y registro de ApplicationStopping en los workers de limpieza; guard MaxDepth=50 en la recursión del AST Markdig (evita StackOverflow con markdown anidado).
  • Fix rendimiento: await en StoreAsync de caché (elimina race con DbContext scoped en fire-and-forget), timeout IA por intento en vez de presupuesto compartido, sustitución de markers O(n²)→O(n) con StringBuilder, consulta ligera de estado en GetOdt, callback en try/catch, parseo único del JSON del cuestionario y un solo pase de regex por sección.
  • Fix ODT: sustitución de markers también en encabezados y pies de página (styles.xml).
  • Fix ApiTester: usa WebApiOptions.BaseUrl (URL interna) en vez de Request.Host (puerto externo de Docker → Connection refused).

v0.3.10

Mantenimiento 2026-06-22
  • Mantenimiento de base de datos en la zona de Copias de seguridad: ejecuta VACUUM (compactar SQLite), REINDEX (reconstruir índices) y limpieza de entidades huérfanas (PromptTemplate con IsCurrent=false de versiones previas).
  • Eliminación del versionado de PromptTemplate: un PromptTemplate por ContentType, UpdateAsync modifica in-place. DeleteAsync borra directo (sin promoción de versión), el ContentType queda sin prompt activo (estado válido).
  • Fix borrado de ContentType: el check ahora solo bloquea si hay PromptTemplate con IsCurrent=true (los visibles en el backoffice). Huérfanos IsCurrent=false se limpian por cascade-delete.
  • Riesgos ODT mitigados: ZIP bomb (límite total descomprimido 2 GB, mimetype ≤ 256 bytes), encoding XML respetando BOM y declaración <?xml encoding="..."?>, markers en atributos XML reportados como MarkerInAttribute.
  • Fix re-sustitución de markers: el loop mantiene searchFrom entre iteraciones, evitando borrar {{...}} que la IA devuelva literalmente.
  • Página pública /Changelog con [AllowAnonymous].

v0.3.0

Breaking 2026-06-18

Migración PDF/AcroForm → ODT (Open Document Format, ISO/IEC 26300). Las plantillas ahora usan marcadores {{prefix.markerKey}} en texto plano dentro de <text:p>/<text:h> del content.xml del ZIP ODT, en lugar de campos AcroForm de PDF.

  • Manipulación ODT nativa con stdlib .NET (ZipArchive + Regex), sin iText7. mimetype primero y sin compresión (spec ODF 1.3).
  • Markdown → ODF con Markdig: headings <text:h>, listas <text:list>, tablas nativas <table:table>, bold/italic/code/quote con estilos automáticos AI-*.
  • Markers fragmentados: el validador detecta formato parcial sobre llaves y reporta FragmentedMarker; el extractor limpia tags XML intercalados para recuperar el markerKey puro.
  • Partición de block contenedor: cuando un marker se sustituye por contenido block-level, se parte el <text:p>/<text:h> contenedor y se balancean <text:span> abiertos.
  • Fix re-sustitución: el loop de sustitución mantiene searchFrom entre iteraciones, evitando borrar {{...}} que la IA devuelva literalmente en su respuesta.
  • Migraciones EF renombran TemplatePdfPath→TemplateOdtPath y ResultPdfPath→ResultOdtPath. Histórico de informes PDF previos no descargable desde el nuevo endpoint.
  • Endpoint: GET /api/reports/{requestId}/odt con Content-Type: application/vnd.oasis.opendocument.text.
  • Backoffice: Validación ODT sustituye a Validación PDF; ApiTester descarga report.odt.
  • Tamaño máximo de plantilla: 200 MB.

v0.2.3

2026-06-17
  • Fix creación y borrado de PromptTemplate/ContentType con gestión de IsCurrent entre versiones.
  • UseForwardedHeaders confía en proxies no-loopback para que la cookie access_token lleve flag Secure detrás de Traefik.

v0.2.0

2026-06-15
  • Versionado SemVer configurable en footer desde AppVersion:Version en appsettings.json.
  • Autenticación unificada JWT (cookie HttpOnly para MVC, Bearer para API).

v0.1.0

2026-06-10
  • Versión inicial: generación asíncrona de informes, cola con backoff exponencial, CRUD de Activities/ContentTypes/PromptTemplates, configuración IA por BD o variables de entorno, health checks.