feat(stt): boutons stop/mute (HUD) + stt --stop + RAG funk-docs nettoyé (#24)

* fix(rag): exclure hermes/builtin de l'index funk-docs

Les rapports auto-générés par hermes-auto-improve (admin/hermes/builtin/,
"ne pas éditer") représentaient ~84% des points de la collection et noyaient
la vraie doc → rag-query remontait du bruit. On les élague à l'ingestion
(os.walk), surchargeable via RAG_EXCLUDE. Collection re-bâtie : 403 points
propres (0 builtin), rag-query remonte de nouveau les bons documents.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(stt-client): boutons stop réponse + mute micro (HUD) + `stt --stop`

HUD : deux contrôles dans la barre du haut.
- « stop » coupe la réponse en cours — interrompt la lecture TTS (kill aplay)
  et saute la synthèse si pressé pendant la génération (Event _interrupt).
- « micro » coupe/réactive l'entrée audio (la boucle VAD ignore les trames) ;
  l'état fait foi côté backend, renvoyé au HUD via {"type":"mic"} (ré-émis à
  la connexion d'un nouveau client).

Protocole WS : nouveau message {"type":"control","action":"stop|mute|unmute"}.

CLI : `stt --stop` éteint le service — systemd --user (stt.service) si actif,
sinon SIGTERM aux process vocaux trouvés via /proc (s'exclut + ignore les
sous-commandes utilitaires).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-19 21:17:32 +02:00 committed by GitHub
parent 577d61ebaa
commit 9feb02ed70
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 246 additions and 14 deletions

View file

@ -19,6 +19,13 @@ COLLECTION = os.environ.get("RAG_COLLECTION", "funk-docs")
VECTOR_DIM = 4096
CHUNK_MAX = 2000
# Dossiers (relatifs à docs_dir) exclus de l'index : rapports auto-générés par
# hermes-auto-improve (méta-commentaires sur la doc, pas de la connaissance) — ils
# noyaient la vraie doc (~84% des points). Surchargeable via RAG_EXCLUDE (séparé par ":").
EXCLUDE_DIRS = [
p for p in os.environ.get("RAG_EXCLUDE", "hermes/builtin").split(":") if p
]
def _request(method, url, data=None):
body = json.dumps(data).encode() if data is not None else None
@ -95,9 +102,15 @@ def point_id(file_path, section):
def ingest(docs_dir):
ensure_collection()
excluded = {os.path.normpath(os.path.join(docs_dir, p)) for p in EXCLUDE_DIRS}
md_files = []
for root, dirs, files in os.walk(docs_dir):
dirs[:] = sorted(d for d in dirs if not d.startswith('.'))
# élague les dossiers cachés et exclus (ex. hermes/builtin)
dirs[:] = sorted(
d for d in dirs
if not d.startswith('.')
and os.path.normpath(os.path.join(root, d)) not in excluded
)
for f in sorted(files):
if f.endswith('.md'):
md_files.append(os.path.join(root, f))