{
  "version": "1.0.4c",
  "build": "20.4",
  "full_version": "1.0.4c.20.4",
  "db_version": "1.0.5",
  "runtime_version": "1.0.0",
  "cloud_agent_version": "1.1.0",
  "release_date": "2026-10-26",
  "install_order": [
    "postgresql",
    "runtime",
    "root_ca",
    "database",
    "database_repair",
    "base_app",
    "cloud_agent"
  ],
  "installers": {
    "postgresql": {
      "file": "01-Avicloud_Display-PostgreSQL-Installer-v1.0.0.exe",
      "version": "1.0.0",
      "sha256": "2d0a3cd2eb9c9433d57cdb83f7dc67f062e5933ab6bbe5de47601e3b9926ac77",
      "size": 339628370,
      "condition": "directory_not_exists:C:\\Avicloud Display\\PostgreSQL",
      "required": true
    },
    "runtime": {
      "file": "02-Avicloud_Display-Runtime-v1.0.0.exe",
      "version": "1.0.0",
      "sha256": "824c37d7611f6f5ef74cab40ee1c26a8ae5b8fe92257119b3018b5bd72bc9c56",
      "size": 359703852,
      "condition": "runtime_version_lt:1.0.0",
      "required": true
    },
    "root_ca": {
      "file": "04-Avicloud_Display-Root-CA-Installer.exe",
      "version": "1.0.0",
      "sha256": "325f04d3b2d074828fe278b52dfc63b9a3a7504b0dc9243e0cea28b67c7aee1b",
      "size": 1770222,
      "condition": "always",
      "required": true
    },
    "database": {
      "file": "03-Avicloud_Display-Crear-Base-de-datos-Installer-v1.0.5.exe",
      "version": "1.0.5",
      "sha256": "dce87b1a3df85b3087812b163d6ecf374e8f4727a782da8f5eac2c410230a5fc",
      "size": 1795400,
      "condition": "database_not_exists:avicloud_display",
      "required": true
    },
    "database_repair": {
      "file": "03b-Avicloud_Display-Reparar-BD-v1.0.5.exe",
      "version": "1.0.5",
      "sha256": "c299bb28df4fce895059dae3aaadd7896d22723df9450c0090d4601e86a4404b",
      "size": 1771112,
      "condition": "database_exists:avicloud_display",
      "required": false
    },
    "base_app": {
      "file": "05-Avicloud-Display-Base-Installer-v1.0.4c.exe",
      "version": "1.0.4c",
      "build": "20.4",
      "sha256": "d4d0af0d2c8d94d9685e05ef9a755e391e502f0f5d8c1de82c07e9df4eb67941",
      "size": 388714110,
      "condition": "always",
      "required": true
    },
    "cloud_agent": {
      "file": "06-Avicloud-Display-CloudAgent-Installer-v1.1.0.exe",
      "version": "1.1.0",
      "sha256": "8e4779325c00d84929c0533343de440b832453de604cf1c4503f6911d9675926",
      "size": 3148772,
      "condition": "license_feature:CLOUD",
      "required": false
    }
  },
  "fixes_url": "https://downloads.avicloud.cl/fixes/v1.0.4c/",
  "fixes": [],
  "min_features": [
    "NOC",
    "SPIN",
    "PANEL"
  ],
  "supported_features": [
    "NOC",
    "VNC",
    "CAPT",
    "AVIP",
    "FILE",
    "SPIN",
    "TOOLS",
    "PANEL",
    "SCRN",
    "CLOUD"
  ],
  "meta_installer": {
    "file": "Avicloud-Display-Setup-v1.0.4c.exe",
    "sha256": "c82202f92bffa186018fc1a9a0b0e5f6ec6f4a84af6bf62451f7f897432b68c3",
    "size": 1794065,
    "url": "https://downloads.avicloud.cl/Avicloud-Display-Setup-v1.0.4c.exe"
  },
  "changelog": {
    "1.0.4c.17-2026-06-01": "Fixes GUI: captura/preview refresca tras rotacion (.attr/.data jQuery) + ventana de desktop se recupera tras reconnect SignalR sin reload (playlist/carousel/multiviewer). Incluye BUG-PROD-008 pause race + cursor kiosk.",
    "1.0.4c.17-2026-06-02": "Re-cut build 17 con: 2 elementos overlay nuevos (reloj flip skin + sticky note tipo 'note'), unificacion de tablas admin al modelo credenciales (paginacion+filtros: dispositivos/paneles/multiviewers), contrato unico de modales (header fijo/body scroll/footer fijo + botones icono), fix input numerico setting-row. Incluye todo lo del 17 anterior (fixes GUI captura/reconnect + BUG-PROD-008 + cursor kiosk).",
    "1.0.4c.17-2026-06-02b": "Unificacion completa de GUI admin: las 4 tablas (dispositivos/paneles/multiviewers/overlay) al modelo plano de credenciales (mismo ancho, header transparente, acciones como iconos); boton '+ Crear X' unificado en la barra de titulo; headings de modal estandarizados; eliminados estilos inline y colores hardcodeados (tokens). Fix: reabrir tablas tras cerrar (auto-cura TablePagination), panels sin filtros por loadUsers. Incluye build 17 anterior (overlay flip+nota, tablas paginadas, contrato de modales, fix input).",
    "1.0.4c.17-2026-06-03-definitivo": "Build 17 DEFINITIVO: consolida todos los hotfixes post-build-17 que estaban solo en deploy directo. HOTFIXES: login se auto-cura con sesion JWT vencida (limpia cookie HttpOnly muerta); TablePagination doble-init (footer duplicado + filtro 'TipoChromiumEdge' en Credenciales) corregido. OVERLAY: reloj flip con caja rectangular ajustada (sin aire abajo); ticker en posiciones inferiores ya no se sale de pantalla. GUI: unificacion completa de tablas admin (4 al modelo credenciales), boton Crear en header, headings estandarizados, sin estilos inline.",
    "1.0.4c.17-2026-06-07": "Re-corte build 17 (06-07): GUI admin — botones de accion unificados 34x38 (min-width auto; gris/azul/rojo iguales en paneles/multiviewers/overlay/pantallas de control), linea de fila continua, lapiz en editar, label flotante sin encimar; eliminado codigo muerto divergente. CERO dialogos confirm/alert/prompt nativos en la GUI activa: 7 archivos migrados a modal de la app (SSL, Logs/Mantencion, control de ventanas, grid/auto-snap, reinicio de recursos, tabla de recursos, playlist unificada) + removido prompt muerto de KVM; boton Cerrar de Licencia a secundario. Fixes C#: deviceId DirectX deterministico (FNV-1a) capturas estables, guardado de escenario persiste cambio de recurso, arranque coherente del muro tras corte, reconexion del pipe de control en vivo de navegadores.",
    "1.0.4c.17-2026-06-08": "Re-corte build 17 (06-08): 4 fixes de control en vivo de navegadores. (1) zoom+scroll combinado: el scroll se aplica tras asentar el zoom (settle-loop que espera estabilizar viewport+contenido). (2) input de scroll del panel ya no se resetea a 0 (guard anti-clobber; refresh manual sí lee la posicion viva). (3) el aviso 'Relance la ventana' ya NO aparece al guardar zoom/scroll (se aplican en vivo); sigue para cambios de URL/motor/propiedades de lanzamiento. (4) panel abierto manipulando MIENTRAS la pagina carga: un scroll en vivo del usuario ahora CANCELA el re-apply de scroll de carga (token de generacion) en vez de regresar al valor persistido. Incluye todo lo del build 17 previo (GUI modales/botones, cero dialogos nativos, fixes C# deviceId/escenario/recovery/pipe).",
    "1.0.4c.18-2026-06-12": "Build 18 (06-12). ESCENARIOS/PLAYLISTS: robustez — fin de drops intermitentes de playlist al lanzar escenario (thread-safety en ContainerManager y launchedProcesses, limpieza del guard de cancelacion, reordenamiento de windowIds por orden de Recursos), persistencia del escenario activo y relanzamiento como entidad tras corte/arranque, timer de playlist ya no queda pegado tras pausa/restore, throttle en avance rapido manual (sin 'sin senal'), arranque coherente del muro tras corte de energia. PREVIEW: sin parpadeo entre rotaciones (conserva frame) y sin placeholders en avance rapido. CUENTA self-service (Opciones): cambiar contrasena (fix 'Datos invalidos' del DTO Username), 2FA en modales nativos (activar con QR + codigos de respaldo, deshabilitar con aviso), el login acepta codigo de respaldo (fix backend: hash de codigos sin guion), pagina /reset-integrador localhost. Limpieza de logs DEBUG en consola.",
    "1.0.4c.19-2026-07-17": "Build 19 (re-corte): fix corte-energia v2 + icono rebrand + 3 assets de logo navy (splash AvicloudDisplay.png, SIN SENAL DefaultScreen jpg/4K, CARGANDO cargando.jpg) que en el 1er corte salieron con logo gris viejo",
    "1.0.4c.20-2026-08-12": "Build 20 (bd1feab0): Centro de Entrenamiento — certificado v2 final (diseño + fuentes Nunito Sans + isotipo/logo Avicloud) y fix del gate de aprobación; auditoría del entrenamiento: migración RBAC que dropea constraints legacy de seg_permisos (arregla instalaciones actualizadas), overlays gateado con tour y guías por Herramientas → Overlay, exención de entrenamiento solo para el admin built-in, credenciales y alias escritorios_remotos. Barrido COMPLETO de tours+guías por rol (trainee 150/150 verde): cada tour abre el control real (builder/admin/tabla de roles) en vez de #desktop, y el tour se repone bien tras cambiar de contenedor.",
    "1.0.4c.20-2026-08-23": "Build 20 FINAL (ce42cb57) — re-corte para el upgrade de NOC Entel, instalacion Enfragen/Entel y actualizacion Candelaria. Sobre el corte anterior (bd1feab0) entran cuatro fixes: (1) migraciones — un rol legado ya no aborta TODAS las migraciones de esquema: en instalaciones viejas con usuarios_roles numerados distinto, el UPDATE del seed chocaba con UNIQUE(nombre) y dejaba el esquema a medias y seg_permisos VACIA (Operador/Supervisor/Gestor sin permisos) mientras /health seguia respondiendo 200; (2) migraciones — actualizar ya no le cambia el rol a un usuario en silencio: el seed normalizaba por id y movia de significado a las cuentas de instalaciones con numeracion propia, ahora los mueve al id canonico conservando su rol y avisa; (3) presentacion — el video se ajusta al contenedor en vez de recortarse; (4) licencias — el hint de Overlays ya no enumera reloj y ticker.",
    "1.0.4c.20-2026-08-24": "Build 20 FINAL (d1838f25) — upgrade del NOC de Entel, instalacion Enfragen/Entel y actualizacion Candelaria. Como el FTP servia build 18, este paquete trae TAMBIEN lo del 19 y del corte previo del 20. SEGURIDAD: se cierran dos agujeros por los que la GUI se servia sin pasar por el porton de autenticacion — la GUI completa era alcanzable en /html/index.html, y el bloqueo de estaticos ahora se hace en middleware porque en OnPrepareResponse no cortaba nada. USUARIOS Y PERMISOS: un administrador puede EXIGIR 2FA en una cuenta y eso corta la sesion viva para que rija desde ya; los botones de la ficha dejan de operar sobre la cuenta propia; el modal de edicion apaga lo que un Supervisor no puede tocar y el selector de rol solo ofrece los roles que el servidor deja asignar; lo que no se puede cambiar ahora se RECHAZA con aviso en vez de descartarse en silencio. ENTRENAMIENTO: el certificado lleva el nombre de la ficha y deja de ser editable por su titular (antes era texto libre guardado en el navegador, o sea cualquiera lo imprimia a nombre de quien quisiera). PRESENTACION: el contenedor de pantalla compartida ya no se relanza sin URL ni queda en blanco tras un reinicio del servidor, y el video se ajusta al contenedor en vez de recortarse. MIGRACIONES: un rol legado ya no aborta TODAS las migraciones de esquema (dejaba seg_permisos VACIA mientras /health seguia respondiendo 200), y actualizar ya no le cambia el rol a un usuario en silencio: los mueve al id canonico conservando su rol y avisa. Se agrega la columna usuarios.force_two_factor_setup (idempotente, corre sola al iniciar). LICENCIAS: el hint de Overlays ya no enumera reloj y ticker.",
    "1.0.4c.20-2026-08-24b": "Build 20 (ef147b20) — re-corte que reemplaza al de d1838f25. Como el FTP servia build 18, este paquete trae TAMBIEN lo del 19 y de los cortes previos del 20. SOBRE EL CORTE ANTERIOR entran dos correcciones: (1) migraciones — se retira una migracion huerfana que fallaba en CADA arranque: hacia ALTER TABLE sobre 'AuditoriaPermisos', tabla que en esta linea se llama seg_auditoria_permisos y que nadie crea, asi que el log acumulaba un error 42P01 por inicio que no significaba nada y entrenaba a ignorar los que si importan; las dos columnas que agregaba no las usaba nadie. Ahora la auto-migracion completa 45 exitosas, 0 fallidas. (2) presentacion — el splash del Display anunciaba como 'Herramientas' los elementos que la funcion de licencia TOOLS habilita, siendo que su nombre es Overlay y 'Herramientas' es otro menu distinto. SEGURIDAD (ya en el corte anterior): se cierran dos agujeros por los que la GUI se servia sin pasar por el porton de autenticacion — la GUI completa era alcanzable en /html/index.html, y el bloqueo de estaticos ahora se hace en middleware porque en OnPrepareResponse no cortaba nada. USUARIOS Y PERMISOS: un administrador puede EXIGIR 2FA en una cuenta y eso corta la sesion viva para que rija desde ya; los botones de la ficha dejan de operar sobre la cuenta propia; el modal de edicion apaga lo que un Supervisor no puede tocar y el selector de rol solo ofrece los roles que el servidor deja asignar; lo que no se puede cambiar se RECHAZA con aviso en vez de descartarse en silencio. ENTRENAMIENTO: el certificado lleva el nombre de la ficha y deja de ser editable por su titular. PRESENTACION: el contenedor de pantalla compartida ya no se relanza sin URL ni queda en blanco tras un reinicio del servidor, y el video se ajusta al contenedor en vez de recortarse. MIGRACIONES: un rol legado ya no aborta TODAS las migraciones de esquema, y actualizar ya no le cambia el rol a un usuario en silencio. Se agregan las columnas usuarios.force_two_factor_setup y sesiones_validas_desde (idempotentes, corren solas al iniciar). LICENCIAS: el hint de Overlays ya no enumera reloj y ticker.",
    "1.0.4c.20-2026-08-24c": "Build 20 (54ae0dbb) — re-corte que reemplaza a los de d1838f25 y ef147b20. CANDELARIA: se arregla que una instalacion existente NO se pudiera actualizar — el trigger auditar_cambio_permisos escribia en una tabla que ya no existe, asi que CADA insercion de permisos moria y seg_permisos quedaba EN CERO (Operador, Supervisor y Gestor sin un solo permiso) mientras /health respondia 200; ademas 70 funciones y 10 tablas quedaban con dueno equivocado, y un usuario cambiaba de rol solo. Como el FTP servia build 18, este paquete trae TAMBIEN lo del 19 y de los cortes previos del 20. SOBRE EL CORTE ANTERIOR entran dos correcciones: (1) migraciones — se retira una migracion huerfana que fallaba en CADA arranque: hacia ALTER TABLE sobre 'AuditoriaPermisos', tabla que en esta linea se llama seg_auditoria_permisos y que nadie crea, asi que el log acumulaba un error 42P01 por inicio que no significaba nada y entrenaba a ignorar los que si importan; las dos columnas que agregaba no las usaba nadie. Ahora la auto-migracion completa 45 exitosas, 0 fallidas. (2) presentacion — el splash del Display anunciaba como 'Herramientas' los elementos que la funcion de licencia TOOLS habilita, siendo que su nombre es Overlay y 'Herramientas' es otro menu distinto. SEGURIDAD (ya en el corte anterior): se cierran dos agujeros por los que la GUI se servia sin pasar por el porton de autenticacion — la GUI completa era alcanzable en /html/index.html, y el bloqueo de estaticos ahora se hace en middleware porque en OnPrepareResponse no cortaba nada. USUARIOS Y PERMISOS: un administrador puede EXIGIR 2FA en una cuenta y eso corta la sesion viva para que rija desde ya; los botones de la ficha dejan de operar sobre la cuenta propia; el modal de edicion apaga lo que un Supervisor no puede tocar y el selector de rol solo ofrece los roles que el servidor deja asignar; lo que no se puede cambiar se RECHAZA con aviso en vez de descartarse en silencio. ENTRENAMIENTO: el certificado lleva el nombre de la ficha y deja de ser editable por su titular. PRESENTACION: el contenedor de pantalla compartida ya no se relanza sin URL ni queda en blanco tras un reinicio del servidor, y el video se ajusta al contenedor en vez de recortarse. MIGRACIONES: un rol legado ya no aborta TODAS las migraciones de esquema, y actualizar ya no le cambia el rol a un usuario en silencio. Se agregan las columnas usuarios.force_two_factor_setup y sesiones_validas_desde (idempotentes, corren solas al iniciar). LICENCIAS: el hint de Overlays ya no enumera reloj y ticker.",
    "1.0.4c.20.1-2026-08-31": "Build 20.1 (c3b159d0) — corte definitivo para test Enfragen. Reemplaza al build 20 (54ae0dbb). SOBRE build 20 entran: multiviewer al detenerse ya no resucita sus ventanas mezcladas con la playlist; capturas — una pagina negra ya no se descarta como fallo (se acababa el 'Cargando...' eterno) y una captura sin ventana se da de baja sola; logging — el modo verboso queda tras flag DiagnosticsVerbose, y CORTAFUEGOS al crecimiento del log (rota a 50MB x3 + retencion 30d, tras el incidente NOC Norte de 27 GB por un recurso caido) en las 17 apps hijas; reconciliacion — al recargar la GUI ya no borra las tarjetas de playlist/carrusel/multiviewer (contenedores no son ventanas); health — el numero de build es TEXTO ('20.1', antes int.TryParse lo reportaba 0) y separa version (procedencia +sha) de build (identidad del paquete). Cinco bloqueantes verificados en el binario: C1 A1 A2 A4 M1 (literal en DLL) y A5 (comportamiento candado KVM).",
    "1.0.4c.20.1-2026-09-01-fix-apps": "Build 20.1 RE-CORTE (cef727be) — reemplaza el artefacto anterior (sha 26bd8cf) que salio con una pifia: el gate de Aplicaciones listaba las carpetas Media y Videoconferencia hardcodeadas, siempre en (0) y FUERA del alcance de build20 (SOLO apps CCTV validadas). Se eliminan; queda solo CCTV. Unico cambio vs el corte anterior: wwwroot/js/license.js (asset estatico); DLL recompilado desde cef727be para que el stamp lo refleje.",
    "1.0.4c.20.2-2026-09-03": "SecurOS multiventana por AutomationId (login intocable, tamano natural, cierre del set), Basic auth PI Vision en Chromium, fix mensaje KVM en desconexion, fix DPI Edge PerMonitorV2 en muro heterogeneo, check y correccion de DPI del muro a 100, geometry save-apply en monitor-config CLI; viewer: encuadre del muro completo al iniciar; DPI: limpieza del log de correccion en muros multi-GPU.",
    "1.0.4c.20.2-2026-09-05-enforcement-limpio": "Re-corte combinado y definitivo de build 20.2: entra enforcement appliance (lockdown + self-heal de config critica, event-driven + fail-safe) verificado E2E en dos escenarios (sin perfil = inerte, con perfil adulterado = detecta drift y degrada seguro sin loops ni regresion sobre el muro). Limpieza: sacadas 9 apps huerfanas muertas del build e instalador (gecko/firefox, ffmpeg, securevnc standalone, relay, zones, notas, timer) - unas ~98MB menos en el paquete.",
    "1.0.4c.20.2-2026-09-06-fix-rutas-profiles": "Re-corte de build 20.2 (display-client a12449c + monitor-config a9a782c) sobre el mismo enforcement-limpio: config del appliance (perfil del guard en Avicloud Display\\profiles\\appliance\\geometry.json + presets EDID del configurador en Avicloud Display\\profiles\\monitors\\) movida fuera de bin\\ — sobrevive a los updates del instalador. avicloud-local-server y el resto de repos sin cambios.",
    "1.0.4c.20.4-2026-10-26": "Build 20.4 vigente de 4c (sello v1.0.4c-build20.4 re-sellado 30-sep): LocalServer 8dea0c53, Display cfd27b5, Watchdog 24fdc3f (DatabaseGuard: levanta PostgreSQL caido), Edge c8536e2, Chromium 44c640b. Cierre de auditorias F1-F8: bookkeeping que abortaba lanzamientos, carreras y guards, identidad de proceso antes de matar, seguridad (system solo por DeviceToken/ApiKeyInternal, IP del cliente solo TCP), persistencia, contrato LS-Display y cache. Detalle en MANIFIESTO-build20.4.md."
  }
}
