44 Commits

Author SHA1 Message Date
Thomas Fransolet
591775cd30 Une conversation, plusieurs surfaces — miroir vocal et conversationId
Le chat écrit, le vocal et le déclenchement proactif partagent désormais une
seule conversation, portée par VisitAppContext.assistant. Les trois
AssistantService séparés ont disparu : poser une question aux lunettes puis
ouvrir le chat donnait un guide qui ne savait rien de ce qu'on venait de
demander, et produisait deux lignes VisitorQuestion sans lien pour un visiteur
qui avait simplement changé de surface.

Le maxHistory du vocal (6) s'aligne sur 10 : deux surfaces qui partagent une
conversation ne peuvent pas la tronquer différemment selon le point d'entrée. La
concision vocale vient d'isVoice, qui change le prompt côté serveur.

Le vrai obstacle n'était pas l'affichage mais la forme du chat :
AssistantChatSheet gardait ses messages en List<Widget>, des bulles déjà
construites. On ne rejoue pas une conversation à partir de widgets, et un tour
vocal survenu pendant que la feuille était fermée n'aurait jamais pu y entrer. Le
service porte maintenant les tours en données et notifie ses écouteurs.

Deux listes, délibérément : celle envoyée au modèle et celle affichée ne
coïncident pas. Un message d'erreur se montre sans repartir au guide, et le
prompt d'un déclenchement proactif part au guide sans jamais s'afficher — seule
sa réponse apparaît, marquée « À voix haute ». Sans ce marquage, le visiteur
trouverait dans son chat des messages qu'il n'a jamais tapés.

conversationId est enfin envoyé, et renouvelé quand la conversation est vidée :
sinon la visite entière d'un visiteur n'en formerait qu'une.

flutter analyze lib sans erreur, flutter build apk --debug --flavor dev vert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 13:39:33 +02:00
Thomas Fransolet
e9e68942c9 Proactif câblé, M3 fermé, voix du CMS honorée, et trois services morts supprimés
Déclenchement proactif (lot F) — quatre branchements : la garde, le cycle de
vie accroché à VoiceController, les points GPS peuplés depuis la configuration,
et un réglage visiteur.

⚠️ La garde recommandée par le plan aurait coûté de l'argent. _trigger appelle
le LLM d'abord et ne parle qu'ensuite via activeVoiceOrchestrator?.ttsEngine,
dont le ?. avale le cas « aucun mode vocal actif ». Avec proactiveModeEnabled
seul, un visiteur traversant une zone avec l'app en poche et le vocal éteint
consommait des jetons Gemini facturés au client pour une phrase que personne
n'entend. La garde interroge l'orchestrateur : la vraie condition n'est pas
« quel matériel » mais « y a-t-il quelqu'un pour écouter ».

Il n'y avait pas de troisième mode à inventer : VoiceMode.voiceOnly existe déjà
et construit le même orchestrateur que le mode lunettes. Le proactif est donc un
sous-réglage, pas une tuile. glassesEnabled est supprimé, ses trois usages
étaient morts — dont une pastille « Lunettes / Déconnecté » jamais affichée.

M3 — meterZoneGPS devient le rayon par section, la constante n'étant plus qu'un
défaut. Deux pièges de format vérifiés : currentSections porte des maps JSON
brutes, pas des DTO, et latitude/longitude y sont des chaînes.

Voix du guide — le sélecteur Viva/Marco de manager-app écrivait dans le vide :
Instance.GuideVoiceId n'était lu nulle part ici, l'app utilisant une constante
de build dont le défaut était Algieba, une voix que personne n'a écoutée. Même
forme que W1. Et aucun APK ne parlait avec la voix du produit : GeminiTtsEngine
n'est choisi que si GEMINI_API_KEY est injectée, ce qui n'était fait nulle part,
donc repli silencieux sur la voix système. Le repli reste le défaut — les tests
ne coûtent alors ni jetons ni argent — mais il s'annonce dans les logs.

Code mort supprimé : wake_word_service.dart, glasses_qr_scanner_service.dart et
glasses_tts_service.dart, les ancêtres de Services/Glasses/. Ils portaient les 4
erreurs kElevenLabs* et l'APK se construisait quand même, personne ne les
important. flutter analyze lib rend désormais zéro erreur.
⚠️ android/.../WakeWordService.kt est un homonyme bien vivant, non touché.
impl/elevenlabs_tts_engine.dart est conservé comme option.

flutter build apk --debug --flavor dev : vert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 11:57:44 +02:00
Thomas Fransolet
d5f36865b6 D2 : re-télécharger une ressource périmée, base locale v3 vers v4
Le filtre incrémental testait la présence du fichier, jamais sa version.

La prémisse d'origine était fausse, et ça change ce que le correctif répare :
« une image remplacée dans le CMS ne remonte jamais » n'existe pas, parce que
Upload appelle GenerateHexId() à chaque téléversement — remplacer une image
produit un nouvel id, donc une nouvelle URL, que l'ancien filtre téléchargeait
déjà.

Le vrai cas de péremption vient d'être créé par D3 : les MP3 déjà présents sur
les devices y sont en <id>.unknown, et « le fichier est présent » les déclarait
à jour. Sans D2, D3 ne réparait que les installations neuves. isResourceOutdated
traite donc .unknown comme absent.

Deux pièges tranchés en écrivant. La montée v4 laisse les dates existantes à
NULL et les considère à jour : backfiller à zéro aurait fait re-télécharger
l'intégralité des visites de tous les visiteurs sur leur réseau mobile, au
premier lancement. Et la boucle en masse héritée de D1 écrasait la date que la
boucle de téléchargement venait d'écrire, DatabaseHelper.insert faisant un
UPDATE de la ligne entière quand l'id existe ; pour un téléchargement échoué,
c'est l'ancienne date locale qui est conservée, jamais celle du serveur.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 17:47:16 +02:00
Thomas Fransolet
0f2b4ed6bd multi wakeword + misc 2026-07-17 15:23:12 +02:00
Thomas Fransolet
c6526046c8 Working flow also in background ! With custom wakeword working (hey visit and hey viva). flow llm working + take photo (not stored for now) + scan qr code working (need to be tested but the issue was llm config in backend) 2026-06-04 17:00:43 +02:00
Thomas Fransolet
bdabfad92e added launch screen + update in ai chat + notifs (to be tested) + EventAgenda layout (to be tested) + home 3.0 update (event) + event mode layout (to be tested) + guided Path layout (to be tested) + map parcours (to be tested) + update readme 2026-03-25 17:47:10 +01:00
Thomas Fransolet
e8ef78d0e2 Update fix after service generation + need test geoloc ! + need test for connexion with apikey also ! + check where http needed.. need to pass by service generation 2026-03-13 17:43:17 +01:00
Thomas Fransolet
538e677993 Update gradle, remove bluetooth beacon (gralde update etc..) + ai assistant (wip) + stats + layout update + clean repo (remove old release) + link to unique backend generation managerapp (TO BE TESTED) 2026-03-13 15:15:18 +01:00
Thomas Fransolet
c50083b19f Agenda + misc for sub menu (pdf, agenda) 2025-07-03 17:37:24 +02:00
Thomas Fransolet
f07570d8ee Weather done 2025-07-02 17:11:02 +02:00
Thomas Fransolet
4e9dc59df9 Slider ok, map wip + update gradle etc + qr scanner to mobile scanner 2025-06-18 18:00:29 +02:00
Thomas Fransolet
7aca0638ce Puzzle working + slider wip + misc 2025-06-12 17:27:53 +02:00
Thomas Fransolet
9c5ae56549 misc + wip load section (not working) 2025-06-10 16:51:48 +02:00
Thomas Fransolet
878a2e4cf0 Wip version 3.0.0 2025-05-28 17:16:18 +02:00
Thomas Fransolet
53dff98388 WIP version 3.0.0 2025-05-28 14:08:32 +02:00
Thomas Fransolet
157fefc2af update icon and instanceId 2024-10-16 14:34:18 +02:00
Thomas Fransolet
cac71cb8a3 Set tomdlf instance 2024-07-07 22:17:34 +02:00
Thomas Fransolet
fb8b564456 update logic from resource in DB to resources in file + others 2024-07-07 20:32:34 +02:00
Thomas Fransolet
14ba287872 Branding MDLF + wip test 2024-07-04 21:04:24 +02:00
Thomas Fransolet
c2ec5d0c0d Add instanceId MyMuseum test 2024-01-15 08:47:47 +01:00
d38cdffe5a Download all languages if admin + show it in admin pop up + add isAllLanguages 2023-04-06 21:56:06 +02:00
0322716c60 clean code + AdminPopup + add audiosNotWorking in context 2023-03-30 18:54:02 +02:00
cb80c35856 Add update size text for article 2023-03-09 16:41:33 +01:00
8bb5511d37 Fix beacon scan not working on button tap 2023-03-03 16:21:20 +01:00
f43d23fe44 Add orientation logic for quizz (and tablet then) + clean code + update meterToBeacon + store beaconSection locally 2023-03-02 17:52:35 +01:00
c2c0293ace Handle Quizz (Quizz page + questions list + show response etc) + other small fixes 2023-02-24 18:00:56 +01:00
d78873c9d4 Clean code + wip handle quizz section type 2023-02-23 18:07:08 +01:00
67a228d2e6 Add order beacon by section order 2023-02-20 15:48:54 +01:00
4f346a1641 Update code from macAddress to Minor (for BeaconId). 2023-02-20 14:46:06 +01:00
6d6871e440 Update translations + add language selection on download + beacon update 2023-02-15 16:41:17 +01:00
30dda83111 Beacon show popup + update get translate local 2023-02-15 14:43:06 +01:00
9d817932fb Update download configuration (via export and not thousand request on first use) + fix alreadyDownloaded 2023-02-10 17:29:49 +01:00
d78372e728 Update code for beacon (tour list -> visit) 2023-02-09 21:48:36 +01:00
3815a521fa Update service + update navigation + add beacon listener + get beacons + try to do some stuffs 2023-01-28 02:28:26 +01:00
471785ccab Add online handle + fix small bugs 2022-12-07 20:59:37 +01:00
a1836ca76f Add loader charge images + fix logic + update title when langue changed 2022-10-20 18:44:00 +02:00
98b1328448 Ajout instance + clean widgets - WIP 2022-10-19 17:54:15 +02:00
e27ce8db34 Add check QRcode + add translation when invalid QR Code 2022-09-10 23:56:46 +02:00
329f9299c5 Translations of common elements + update layout 2022-09-10 23:01:27 +02:00
092d3dd219 Visit page (wip) + language select 2022-09-08 17:33:12 +02:00
72a96b08b6 Add language selection 2022-09-03 17:52:53 +02:00
4802929fa8 Download from api and store it locally (config, section, resource) + wip display in article page 2022-08-26 18:18:44 +02:00
357fa2f235 Init database, insert and get configuration working, section wip (insert ok but not get) 2022-08-25 18:09:24 +02:00
00a42010b4 Wip Scanner in dialog + route etc 2022-08-12 17:56:54 +02:00