Files
harbour-hermes/rpm/harbour-hermes.spec
T
kaneda 7428d42b92 feat(chat): markdown formattato nella chat + testo pulito per la voce (v0.5.2)
- src/markdown.{h,cpp}: convertitore minimale, due funzioni:
  * toRichText() -> HTML per QML Text.RichText: grassetti (**x**/__x__),
    corsivi (*x*/_x_ con confini di parola per non toccare snake_case),
    titoli (#), liste (-/1.), citazioni (>), codice (`x` e blocchi ```,
    in monospace), link [t](u) -> solo testo, barrato ~~x~~; escape di
    < & > contro injection nel rich text
  * toSpeech() -> testo piatto per il TTS: via recinti di codice, marcatori
    di titoli/liste/citazioni, enfasi, backtick; link/immagini -> testo;
    tabelle | a | b | -> "a, b"; righe vuote compattate
- ChatModel: nuovo ruolo contentRich (calcolato in C++, testabile);
  incluso nei dataChanged dello streaming
- ChatPage: le bolle dell'assistente usano contentRich con
  textFormat: Text.RichText; i messaggi utente restano testo semplice
- ApiClient::speak(): il testo passa da Markdown::toSpeech (niente più
  simboli di formattazione letti ad alta voce)
- core-test: 19 casi nuovi per il convertitore (tutti locali, senza device)

Verificato: build zero warning + unit test completi.
2026-09-13 08:04:19 +02:00

125 lines
6.1 KiB
RPMSpec

Name: harbour-hermes
Summary: Client for the Hermes Web UI with voice
Version: 0.5.2
Release: 1
Group: Qt/Qt
License: MIT
URL: https://git.hackatoniclife.com/kaneda/harbour-hermes
Source0: %{name}-%{version}.tar.gz
Source1: %{name}.desktop
Requires: sailfishsilica-qt5 >= 0.10.9
BuildRequires: pkgconfig(sailfishapp) >= 1.0.2
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick)
BuildRequires: pkgconfig(Qt5Network)
BuildRequires: pkgconfig(Qt5Multimedia)
BuildRequires: desktop-file-utils
BuildRequires: qt5-qttools-linguist
%description
Native Sailfish OS client for the Hermes Web UI (hermes-webui).
Sessions list, chat with live streaming replies, voice dictation
(server-side Whisper transcription) and read-aloud of replies
(server-side TTS), plus a hands-free conversation mode.
%changelog
* Sun Sep 13 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.5.2-1
- Chat: le risposte di Hermes sono mostrate formattate (grassetti, corsivi,
titoli, liste, citazioni, codice, link) con un convertitore markdown ->
rich text minimale (src/markdown.*, testato nel core-test); i messaggi
dell'utente restano testo semplice
- TTS: il markdown viene ripulito prima della sintesi (niente più "asterisco
asterisco" letto ad alta voce)
* Sun Sep 13 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.5.1-1
- Fix blocco sullo splash all'avvio: watchdog con timeout su tutte le
richieste (QNAM non ne applica: una richiesta senza risposta lasciava
la UI in attesa infinita). checkAuth imposta un errore visibile
("Server non raggiungibile (timeout)") e logga esito e indirizzo;
refreshSessions logga la durata; splash con rete di sicurezza verso il
login dopo 15 s; nessun watchdog sullo stream SSE (longevo per design)
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.5.0-1
- Sezione Sessions nelle Impostazioni: selettore profilo (le sessioni
mostrate sono quelle del profilo scelto). Switch per-client via
/api/profile/switch con cookie firmato — il profilo attivo globale del
server NON viene toccato; elenco profili da /api/profiles; opzione
"(attivo sul server)" che rimuove il cookie; reapply del profilo dopo
il login
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.0-1
- Localizzazione dell'interfaccia: italiano, inglese (sorgente),
francese e tedesco (78 stringhe per lingua); .qm generati con
sailfishapp_i18n e installati in /usr/share/harbour-hermes/translations,
caricati in base alla lingua di sistema; stringhe C++ in tr();
plurali dei messaggi corretti
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.3.2-1
- README: nota sui limiti delle voci TTS (allowlist del server; 400
invalid voice) e su come gestirli (voce vuota = default del server)
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.3.1-1
- Auto-invio dettatura piu' robusto: il testo viene passato esplicitamente
(niente rilettura del campo), l'opzione vale "on" salvo disattivazione
esplicita, niente focus tastiera prima dell'invio; i rifiuti di invio
ora sono visibili (avviso a schermo + log [chat]/[hermes])
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.3.0-1
- Nessuna configurazione cablata nel binario: indirizzo server, voce,
engine e preset sono impostazioni dell'app (default neutri; vuoto =
decide il server); selettori voce/engine costruiti dai preset
configurabili; Content-Type audio coerente col formato reale; durata
massima registrazione configurabile (vadMaxMs)
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.2.1-1
- Fix build: rimosso il warning -Wreorder (ordine dell'inizializzazione
di m_sessionsModel nel costruttore di ApiClient)
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.2.0-1
- Modalita' dialogo (voce continua): ascolto con stop automatico sul
silenzio (QAudioInput + VAD), trascrizione, invio automatico, lettura
della risposta e riascolto in ciclo; pausa e sensibilita' microfono
configurabili; la dettatura manuale puo' inviare da sola
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.1.2-1
- Fix lista sessioni vuota sul device: le QVariantList di mappe non
espongono i campi nei delegate su Qt 5.6 -> nuovo SessionsModel
(QAbstractListModel con ruoli: session_id/title/message_count/updated_at)
- /api/sessions con i parametri della sidebar web (sidebar_source=webui,
exclude_hidden=1): solo sessioni WebUI, niente CLI/cron
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.1.1-1
- Fix pagine non caricabili sul device: TextField.onAccepted inesistente
-> EnterKey; Button.highlighted rimosso; ComboBox senza Repeater;
Theme.highlightDimmerColor -> Theme.rgba; azioni menu via Page
* Sat Sep 12 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.1.0-1
- Prima release: login alla Web UI di Hermes, lista sessioni,
chat con streaming SSE, dettatura vocale (registrazione OGG/Opus
-> /api/transcribe), lettura risposte (/api/tts -> QMediaPlayer),
nuova sessione, sandbox SailJail (Internet;Audio;Microphone)
%prep
%setup -q -n %{name}-%{version}
%build
%qmake5
make %{?_smp_mflags}
%install
make install INSTALL_ROOT=%{buildroot}
mkdir -p %{buildroot}%{_datadir}/applications
# Desktop file cercato in modo robusto: sfdk usa i sorgenti live (shadow build)
# e la directory sorgente puo' chiamarsi %{name}-%{version} (tarball),
# %{name} (clone) o %{name}-main (zip di Gitea); %{SOURCE1} e' il fallback.
DESKTOP=$(find %{_builddir}/.. -maxdepth 4 -name '%{name}.desktop' 2>/dev/null | head -1)
if [ -z "$DESKTOP" ] && [ -f %{SOURCE1} ]; then DESKTOP=%{SOURCE1}; fi
if [ -z "$DESKTOP" ]; then
echo "ERROR: %{name}.desktop not found" >&2
exit 1
fi
install -m 0644 "$DESKTOP" %{buildroot}%{_datadir}/applications/%{name}.desktop
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop || true
%files
%defattr(-,root,root,-)
%{_bindir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/86x86/apps/%{name}.png
%{_datadir}/icons/hicolor/108x108/apps/%{name}.png
%{_datadir}/icons/hicolor/128x128/apps/%{name}.png
%{_datadir}/icons/hicolor/172x172/apps/%{name}.png
%{_datadir}/%{name}/qml
%{_datadir}/%{name}/translations