Comparar commits

...

2 Commits

Autor SHA1 Mensaje Fecha
5eea4dc7af Licencia MIT de Labstream (LICENSE y LICENCIA-ES.md) 2026-10-14 22:06:05 -05:00
Munka
4e27406e25 1.24.0: la versión nueva también llega con la app abierta todo el día
La app solo buscaba versión nueva al abrir: un equipo que la deja abierta de la mañana
a la noche se quedaba en la de la mañana (este PC seguía en la 1.20 con la 1.23
publicada, y Rellenar con IA no le llegaba). Ahora, cada hora, mira si hay una nueva
sin instalarla: la versión de la barra pasa a «Actualizar a vX» (en el color de la
marca) y avisa una vez por versión. Al pulsarlo instala, se reinicia y vuelve a abrir
las pestañas. No se reinicia sola en medio del trabajo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:05:19 -05:00
Se han modificado 9 ficheros con 138 adiciones y 5 borrados

40
LICENCIA-ES.md Archivo normal
Ver fichero

@@ -0,0 +1,40 @@
# Licencia de las apps públicas de Labstream (resumen en español)
Las apps marcadas como **públicas** en el catálogo se distribuyen bajo la **Licencia MIT**.
El texto legal que vale es el de `LICENSE` (en inglés, como es habitual en esta licencia);
esto es una explicación.
## Qué puedes hacer
- **Descargarlas, instalarlas y usarlas** gratis, para lo que quieras, también en trabajos
comerciales.
- **Copiarlas, modificarlas y redistribuirlas**, enteras o en parte, con o sin cambios.
- Incluirlas en otros programas, incluso de pago.
## Única condición
- Conservar el aviso de copyright y el texto de la licencia (`LICENSE`) en cualquier copia o
parte sustancial del programa.
## Sin garantía
Los programas se entregan **tal cual**, sin garantía de ningún tipo. Labstream S.A.S. no
responde por daños derivados de su uso.
## Lo que la licencia no cubre
- La **marca Labstream** y su logotipo: puedes usar el código, no presentar otro producto como
si fuera de Labstream.
- Las **apps privadas** y las **apps de clientes**: tienen las condiciones del contrato de cada
proyecto.
- Los **componentes de terceros** que cada app incluye: tienen su propia licencia, listada en
el `TERCEROS.md` de cada repositorio.
## Datos personales
Las apps de escritorio públicas no envían datos a internet ni a Labstream. Las apps web
guardan los datos en servidores de Labstream en Colombia y se rigen por la política de
tratamiento de datos personales de Labstream S.A.S. (Ley 1581 de 2012 y Decreto 1377 de 2013).
Consultas: hola@labstreamsas.com.
Labstream S.A.S. · NIT 900.665.024-5 · Bogotá, Colombia

21
LICENSE Archivo normal
Ver fichero

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Labstream S.A.S. (NIT 900.665.024-5), Bogotá, Colombia
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Ver fichero

@@ -280,6 +280,12 @@ guardada como secret del repo (`TAURI_SIGNING_PRIVATE_KEY`). También se puede f
la comprobación con clic en la versión de la barra, o desde el menú ⋮ ▸ *Buscar
actualización…*.
Al **abrir**, la app busca versión nueva y, si la hay, la instala y se reinicia sola. Con la
app **abierta** (desde la 1.24) mira cada hora sin instalar nada: si hay una nueva, la versión
de la barra pasa a **«Actualizar a vX»** (en el color de la marca) y avisa una vez. Al pulsarlo
instala, se reinicia y vuelve a abrir las pestañas. No se reinicia sola en medio del trabajo:
se perdería lo que una página no hubiera guardado.
> ⚠️ De ahí se sigue algo que conviene tener presente: **un commit en `main` no le
> llega a nadie**. Mientras no exista la etiqueta `vX.Y.Z`, el CI no construye nada y
> el updater no ve versión nueva. Y al revés: publicar una etiqueta **actualiza la app

16
dist/index.html vendido
Ver fichero

@@ -333,6 +333,14 @@
border-radius: 13px;
}
#version:hover { color: var(--accent); }
/* Hay una versión nueva publicada: el botón la ofrece (clic: instala y reinicia). */
#version.nueva {
color: #fff;
background: var(--accent);
font-weight: 600;
padding: 0 10px;
}
#version.nueva:hover { color: #fff; filter: brightness(1.1); }
/* ── Botones de ventana ──────────────────────────────────────────────────────────
Solo en Windows: allí la ventana va SIN decoración, así que esta barra es la fila
del título (como Chrome) y el aspa del sistema no existe. Medidas y colores del
@@ -595,7 +603,13 @@
$pct.textContent = estado.zoom + "%";
$pct.classList.toggle("activo", estado.zoom !== 100);
$ver.textContent = estado.version ? "v" + estado.version : "";
// Con una versión nueva esperando, el botón la ofrece; si no, la versión de ahora.
const nueva = estado.actualizacion || null;
$ver.textContent = nueva ? "Actualizar a v" + nueva : estado.version ? "v" + estado.version : "";
$ver.classList.toggle("nueva", !!nueva);
$ver.title = nueva
? "Hay una versión nueva (" + nueva + "): clic para instalarla. La app se reinicia y vuelve a abrir tus pestañas."
: "Versión de la app · clic: buscar actualización";
// Tema: manda el de la APP (payload `dark`). Mientras Rust no sepa nada (null),
// no se pone clase y siguen las media queries del sistema como arranque en frío.
if (typeof estado.dark === "boolean") {

Ver fichero

@@ -1,6 +1,6 @@
{
"name": "labstream-desktop",
"version": "1.23.0",
"version": "1.24.0",
"private": true,
"description": "App de escritorio (Windows) que envuelve Labstream OS — cliente del servidor del NAS.",
"scripts": {

Ver fichero

@@ -2367,7 +2367,7 @@ dependencies = [
[[package]]
name = "labstream-desktop"
version = "1.23.0"
version = "1.24.0"
dependencies = [
"active-win-pos-rs",
"device_query",

Ver fichero

@@ -1,6 +1,6 @@
[package]
name = "labstream-desktop"
version = "1.23.0"
version = "1.24.0"
description = "Cliente de escritorio de Labstream OS"
authors = ["Labstream SAS"]
edition = "2021"

Ver fichero

@@ -704,6 +704,8 @@ fn broadcast<R: Runtime>(app: &AppHandle<R>) {
"tabs": tabs,
"zoom": (ZOOM_STEPS[s.zoom_idx.min(ZOOM_STEPS.len()-1)] * 100.0).round() as u32,
"version": app.package_info().version.to_string(),
// La versión nueva que ya está publicada y espera a que se pulse «Actualizar» (o null).
"actualizacion": version_pendiente(),
// En macOS la barra ocupa la fila del título (ventana con título en overlay) y
// debe dejar libre el hueco del semáforo, que lo pinta el sistema.
"mac": cfg!(target_os = "macos"),
@@ -1557,6 +1559,47 @@ fn show_main<R: Runtime>(app: &AppHandle<R>) {
}
}
// ── La versión nueva, también con la app abierta todo el día (1.24, 14-oct-2026) ──
// Al abrir, la app busca versión nueva y, si hay, la instala y se reinicia (antes de que nadie
// trabaje). Pero solo al abrir: un equipo que deja la app abierta de la mañana a la noche se
// quedaba en la versión de la mañana (este PC seguía en la 1.20 con la 1.23 publicada, y Rellenar
// con IA no le llegaba). Ahora, cada hora, mira si hay una nueva SIN instalarla —reiniciar en
// medio del trabajo perdería lo que no se guardó en una página—: la barra cambia la versión por
// «Actualizar a vX» (el mismo botón de siempre: instala y reinicia, y las pestañas vuelven) y
// avisa una vez por versión.
const BUSCAR_CADA: Duration = Duration::from_secs(60 * 60);
static PENDIENTE: Mutex<Option<String>> = Mutex::new(None);
fn version_pendiente() -> Option<String> {
PENDIENTE.lock().ok().and_then(|p| p.clone())
}
#[cfg(desktop)]
async fn buscar_sin_instalar(handle: tauri::AppHandle) {
use tauri_plugin_updater::UpdaterExt;
let Ok(updater) = handle.updater() else { return };
let nueva = match updater.check().await {
Ok(Some(u)) => u.version,
Ok(None) => return,
Err(e) => {
salud::anotar("AVISO", "actualizacion", &format!("no se pudo comprobar: {e}"));
return;
}
};
let ya = PENDIENTE.lock().map(|mut p| p.replace(nueva.clone())).unwrap_or(None);
if ya.as_deref() == Some(nueva.as_str()) {
return;
}
salud::anotar("INFO", "actualizacion", &format!("hay versión nueva ({nueva}): espera a que se pulse «Actualizar»"));
broadcast(&handle);
let _ = handle
.notification()
.builder()
.title("Labstream OS")
.body(format!("Hay una versión nueva ({nueva}). Pulsa «Actualizar» en la barra de pestañas: la app se reinicia y vuelve a abrir tus pestañas."))
.show();
}
// Busca e instala una actualización en segundo plano. Si instala, avisa y reinicia.
#[cfg(desktop)]
async fn check_update(handle: tauri::AppHandle) {
@@ -1725,6 +1768,15 @@ pub fn run() {
let handle = app.handle().clone();
tauri::async_runtime::spawn(check_update(handle));
}
// Y después, cada hora, sin instalarla: la barra ofrece «Actualizar» (ver PENDIENTE).
#[cfg(desktop)]
{
let handle = app.handle().clone();
std::thread::spawn(move || loop {
std::thread::sleep(BUSCAR_CADA);
tauri::async_runtime::block_on(buscar_sin_instalar(handle.clone()));
});
}
{
let shell = handle.state::<ShellState>();

Ver fichero

@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Labstream OS",
"version": "1.23.0",
"version": "1.24.0",
"identifier": "co.labstream.os",
"build": {
"frontendDist": "../dist"