# Server aggiornamenti JARVIS

La cartella `jarvis/` è pubblicabile come sottocartella del server DayFlow sulla porta 8787. Ogni release contiene:

- `manifest.json`: identità APK, versione, hash e collegamenti ai documenti;
- `release-notes.md`: riepilogo breve leggibile dall'utente prima del download;
- `changes.json`: storico strutturato completo, sorgente futura per sito e pagina changelog;
- APK firmato indicato dal manifesto.

Il client rifiuta downgrade, package differente, SHA-256 errato o firma differente. La pubblicazione deve essere atomica: prima documenti e APK, per ultimo `manifest.json`.

`publisher_server.py` serve i file in sola lettura e aggiunge un ingresso autenticato, ristretto a questa cartella, per la futura app Windows JARVIS Asset. La specifica stabile è in `PUBLISHER_API.md`: upload in staging, convalida, quindi pubblicazione atomica del manifesto per ultimo. Non è stata aggiunta alcuna funzione di caricamento nell'APK Android.

Sul PC di sviluppo `start_publisher_server.ps1` avvia il servizio locale sulla porta 8795 senza finestra. Tailscale espone la porta privata 8794 soltanto alla tailnet. Il token viene creato in `%LOCALAPPDATA%\JARVIS\update-server\publisher.token`, fuori dalla cartella pubblica.

## Live Pack indipendenti dall'APK

`jarvis/live-pack/manifest.json` pubblica separatamente la configurazione delle dashboard Live. Il client accetta soltanto schema noto, versione crescente, URL HTTPS dello stesso server, dimensione massima 256 KB e SHA-256 valido. Il file attivo è conservato nello spazio privato dell'app e sostituito atomicamente; un download non valido non elimina mai l'ultima configurazione funzionante.

Il Live Pack può cambiare associazioni delle entità Home Assistant, direzione dei misuratori e card sensore (testo, unità, decimali, colore e trasformazione) senza ricompilare o reinstallare JARVIS. Modifiche al motore Android continuano invece a richiedere un APK firmato.

## Overlay asset e regole del personaggio Personal

`jarvis/character-packs/jarvis-personal-overlay/manifest.json` distribuisce soltanto i file modificati del personaggio. La versione Personal conserva comunque nell'APK tutti gli asset originali e resta completamente utilizzabile offline. L'overlay, salvato nello spazio privato dell'app, ha precedenza solo dopo verifica di versione, dimensione, percorso e SHA-256 di archivio e singoli file. Se manca o non è valido, JARVIS usa automaticamente la copia completa incorporata.

`jarvis/character-packs/catalog.json` è il catalogo dei personaggi installabili mostrato nella stessa sezione Android degli aggiornamenti. Ogni sottocartella usa il proprio `pack_id` e contiene `character-pack.zip`, `listing.json` e facoltativamente `preview.png`. `tools/build_character_catalog.py` legge il manifesto dentro lo ZIP, verifica identità/versione e pubblica atomicamente dimensione e SHA-256. I client estraggono soltanto pacchetti dati validati nello spazio privato; JARVIS originale non viene mai sovrascritto.

Il primo overlay contiene solo i cataloghi scene e suoni. Una modifica futura a una regola richiede quindi pochi kilobyte; un nuovo asset richiede soltanto quel file. Profili, memoria, chiavi, token e configurazioni Home Assistant non appartengono all'overlay e non vengono mai sostituiti. I bug nel codice Android continuano a richiedere un APK firmato.
