docs(readme): Daemon talkd, HTTP-Endpunkte, Mute-Persistenz und Degraded Mode dokumentieren

This commit is contained in:
m3ta-chiron committed 2026-10-18 17:11:14 +02:00
1 parent 1ae1f1262c
commit dc94f45d11
2 files changed
+40 -6

No files matched your search

+36 -5
View File
@@ -28,11 +28,42 @@ keine Runtime-Abhängigkeiten.
Say-Flags (gelten auch für `talk "Text"`): `--wait`, `--now`, `--priority`,
`--voice`, `--lang`, `--provider`.
**Hinweis:** In diesem Stand ist `say` (und der Default-Aufruf
`talk "Text"`) implementiert — inklusive der kompletten Provider-Kette
(ElevenLabs → OpenAI → Edge-TTS → OS-Stimme, blockierend;
Daemon-Anbindung folgt). Alle anderen Befehle sind Stubs und melden
`not implemented yet` (Exit-Code ≠ 0).
**Hinweis:** In diesem Stand sind implementiert: `say` (und `talk "Text"`)
mit der kompletten Provider-Kette und Daemon-Anbindung (non-blocking über
`talkd`, siehe unten), `mute`, `unmute`, `status`, `cancel`. Die übrigen
Befehle sind Stubs und melden `not implemented yet` (Exit-Code ≠ 0).
## Daemon talkd (Task 04)
`talkd` besitzt die Ansage-Queue und spricht seriell ab — genau eine Ansage
gleichzeitig, Reihenfolge `now` > `high` > `normal` > `low` (FIFO je
Level). Der HTTP-Server lauscht nur auf `127.0.0.1`; Port: Default `7800`,
config `[server] port`, Env `TALK_PORT` (schlagen den Default).
| Endpunkt | Wirkung |
| --- | --- |
| `POST /speak` | `{text, priority?, provider?, voice?, lang?, now?}` → `202 {"id":"…"}`; bei Mute: `202 {"id":"","muted":true}` (Ansage verworfen — dokumentiertes Verhalten) |
| `GET /status` | `{"version", "queue", "queue_ids", "current", "muted", "provider"}` |
| `POST /cancel` | bricht die laufende Ansage ab + leert die Queue → `200 {"cancelled":n}` |
| `POST /mute` / `POST /unmute` | persistenter Mute-State → `200 {"muted":bool}` |
- **CLI-Verhalten:** `talk say` (und `talk "Text"`) erkennt den Daemon via
`GET /status`. Läuft er: enqueue + sofortige Rückkehr (non-blocking,
stdout erhält die Item-ID); `--wait` pollt bis zur Fertigstellung;
`--now` springt vor die Warteschlange; bei Mute sagt die CLI `muted`.
`talk mute`/`unmute`/`status`/`cancel` sind Daemon-Aufrufe mit plain
Output.
- **Mute ist persistent** (Datei `mute` im Config-Dir, Inhalt `true`/
`false`) und überlebt Daemon-Restarts. `talk mute` ohne laufenden Daemon
schreibt die Datei direkt — der Daemon liest sie bei jeder Ansage neu,
der Zustand greift also auch offline.
- **Degraded Mode:** Antwortet kein Daemon, spielt `talk` lokal und
sequenziell weiter — serialisiert über die Lock-Datei `talk.lock` im
Config-Dir (Kollision = warten; verwaisste Locks gelten nach 60 s als
verfallen). Mute wird auch hier respektiert. Nichts bricht still.
- Rate-Limit und Ruhezeiten folgen in Task 05; die Rate-Limit-Struktur
existiert bereits (`internal/queue`), ist in diesem Stand aber bewusst
noch nicht angebunden (Default: unbegrenzt).
### Provider-Kette (Task 03)