Commit Graph
7 Commits
Author SHA1 Message Date
m3ta-chironandClaude Fable 5.1 bc26a73aeb refactor: ein Binary — talk startet den Daemon selbst, talkd und Degraded Mode entfallen
Zwei Binaries erzeugten den halben Komplexitätsballast: Degraded Mode mit
Lock-Datei und Stale-Lock-Race, „läuft talkd?", Autostart-Konfiguration je
OS, doppelte Chain-Konstruktion in cmd/talk und cmd/talkd — und der
Degraded Mode kannte weder Rate-Limit noch Ruhezeiten.

Jetzt:
- internal/speak: der eine Sprech-Kern (Config + Sink + Kette → Ansage);
  Daemon und Direkt-Pfad benutzen ihn, es gibt keine zweite
  Zusammensetzung der Kette mehr.
- internal/daemon: Run (der bisherige talkd-Kern), Spawn (detached per
  Setsid bzw. DETACHED_PROCESS, stdout/stderr → daemon.log), PID-Datei
  daemon.pid, Shutdown-Trigger.
- `talk daemon run|start|stop`: Vordergrund (systemd/launchd), expliziter
  Hintergrund-Start, Stop per POST /shutdown — stop wartet, bis HTTP weg
  und die PID-Datei gelöscht ist (Prozess wirklich beendet).
- Autostart: say/wrap starten den Daemon beim ersten Sprechbefehl selbst
  (daemon.autostart, Default an; Env TALK_AUTOSTART). Verliert ein
  paralleler Aufruf das Port-Rennen, erkennt er das am Kind-Ende und nutzt
  den Daemon des anderen — kein Timeout-Warten.
- Direkt-Pfad statt Degraded Mode: ohne erreichbaren oder startbaren
  Daemon spricht talk direkt (Mute respektiert, kein Lock, Hinweis +
  Grund + Log-Pfad auf stderr). Steuerbefehle starten den Daemon bewusst
  nicht; `talk status` zeigt „läuft nicht" (Exit 1).
- cmd/talkd und cmd/talk/degraded.go entfernt; README-Daemon-Abschnitt
  neu.

Tests: Harness baut nur noch talk und startet `talk daemon run`;
TALK_AUTOSTART=false als Grundausstattung aller Tests (kein Test
hinterlässt Daemons), autostart_test.go schaltet es bewusst an: Autostart
beim ersten say, Idempotenz, paralleler Start in EINE Queue, expliziter
start/stop, Port fremd belegt → Direkt-Pfad ohne Timeout. Cross-Compile
aller sechs Targets mit CGO_ENABLED=0 verifiziert.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-24 09:49:16 +02:00
m3ta-chiron a3424c36e5 feat(config): Ansage-Label wrap.label mit Env-Override TALK_WRAP_LABEL
Config-Schlüssel [wrap] label für talk wrap (Task 07): ersetzt den
Basisnamen des Befehls in der Ansage („Deployment erfolgreich. Dauer: …“
statt „terraform erfolgreich. …“). Auflösung wie üblich Defaults →
config.toml → Env (TALK_WRAP_LABEL schlägt die Datei); Tisch-Tests für
alle drei Schichten.
2026-10-18 20:46:39 +02:00
m3ta-chiron cef6e6b9f2 feat(config): CORS-Erlaubnisliste server.allowed_origins (TALK_ALLOWED_ORIGINS)
Exakte Origins wie https://chat.az-gruppe.com; Wildcard "*" nur explizit.
Bewusster Default: leer = keine CORS-Header (Tür zu). Env schlägt Datei
(kommagetrennt; "off" leert), leere Einträge sind klare Fehler.
2026-10-18 20:06:05 +02:00
m3ta-chiron b20e6dd319 feat(config): Gesetz-Felder rate_limit, allow_high_burst, quiet_hours, quiet_mode
Queue-Section ([queue] rate_limit = "30s", allow_high_burst = true) und
Ruhezeiten (quiet_hours = "18:00-08:00" lokal über Mitternacht,
quiet_mode = discard|toast) mit Env-Overrides TALK_RATE_LIMIT,
TALK_ALLOW_HIGH_BURST, TALK_QUIET_HOURS ("off" = aus), TALK_QUIET_MODE.
Default: 1 Ansage / 30 s, Burst an, Ruhezeit aus (Opt-in wie Mute —
ein Uhrzeit-Gesetz als Default würde jeden Cron in den Abendstunden
stilllegen). Validierung gegen queue.ParseQuietHours als eine Quelle;
partielle [queue]-Tabellen behalten Defaults (tischgetestet).
2026-10-18 17:40:35 +02:00
m3ta-chiron 716f6b2fc9 feat(config): Daemon-Port server.port mit Env-Override TALK_PORT (Default 7800) 2026-10-18 17:10:26 +02:00
m3ta-chiron 88eddc63d2 feat(config): Provider-Pin, Provider-Endpunkte und Voice-Mapping
config.toml bekommt provider = "…" (Pin, Env-Override TALK_PROVIDER),
[providers.<name>] endpoint/model (Endpoints fake-bar für Tests; Keys
bleiben ausschließlich Env) und voice.<provider>.<lang> = id. TOML-Key ist
bewusst providers (Mehrzahl), damit Pin ( Singular) und Einstellungs-
Tabelle koexistieren können. Env-Overrides der Endpunkte liest die
Provider-Schicht (TALK_ELEVENLABS_ENDPOINT etc.) — das config-Paket
bleibt frei von Provider-Namen.
2026-10-18 16:34:24 +02:00
m3ta-chiron 36ad1dfa4e feat(config): geschichtete Konfigurationsauflösung mit injizierbaren Pfaden
Defaults → optionale config.toml → Env-Overrides (TALK_AUDIO_SINK);
Validierungsfehler sind klar, nie still. Plattform-Pfadlogik
(linux/darwin/windows, XDG_CONFIG_HOME, HOME, APPDATA) mit goos als
Parameter — alle Plattformen tischgesteuert vom Dev-Host testbar.
Erste externe Dependency: github.com/BurntSushi/toml v1.6.0 (MIT, pure Go).
2026-10-18 15:38:56 +02:00