package api // Request/Response-Typen des Daemon-HTTP-Vertrags (Task-04-Brief, bindende // Felder). Die CLI und spätere Konsumenten (MCP, Task 06) benutzen dieselben // Typen — eine Quelle, kein Contract-Drift zwischen Daemon und Client. // SpeakRequest ist der Body von POST /speak. type SpeakRequest struct { // Text ist der Ansage-Text (Pflicht). Text string `json:"text"` // Priority: low | normal | high (Default normal, wenn leer). Priority string `json:"priority,omitempty"` // Provider pinnt die Provider-Kette (--provider). Provider string `json:"provider,omitempty"` // Voice pinnt eine Voice-ID (--voice). Voice string `json:"voice,omitempty"` // Lang pinnt die Sprache de | en (leer = automatische Erkennung). Lang string `json:"lang,omitempty"` // Now lässt die Ansage vor allen wartenden springen (--now). Now bool `json:"now,omitempty"` } // SpeakResponse ist die Antwort von POST /speak: 202 {"id":"…"} — bei // aktivem Mute 202 {"id":"","muted":true} (Ansage verworfen; dokumentiertes // Verhalten, kein Fehler). type SpeakResponse struct { ID string `json:"id"` Muted bool `json:"muted,omitempty"` } // CurrentItem beschreibt das laufende Item in GET /status. type CurrentItem struct { ID string `json:"id"` Text string `json:"text"` Priority string `json:"priority"` Now bool `json:"now"` } // StatusResponse ist die Antwort von GET /status: Queue-Länge, aktuelles // Item (null im Leerlauf), Mute-State, aktiver Provider, Daemon-Version. // QueueIDs ist die Ergänzung der wartenden IDs in Abarbeitungs-Reihenfolge // — die CLI braucht sie für ihr --wait-Polling. type StatusResponse struct { Version string `json:"version"` Queue int `json:"queue"` QueueIDs []string `json:"queue_ids,omitempty"` Current *CurrentItem `json:"current"` Muted bool `json:"muted"` Provider string `json:"provider"` } // PendingOrCurrent meldet, ob die Ansage mit der ID noch wartet oder // gerade läuft — Grundlage des --wait-Pollings der CLI. Ist die Ansage // weder wartend noch laufend, ist sie fertig (oder abgebrochen) — in // beiden Fällen hat der Aufrufer nichts mehr zu warten. func (s StatusResponse) PendingOrCurrent(id string) bool { if s.Current != nil && s.Current.ID == id { return true } for _, qid := range s.QueueIDs { if qid == id { return true } } return false } // CancelResponse ist die Antwort von POST /cancel. type CancelResponse struct { Cancelled int `json:"cancelled"` } // MuteResponse ist die Antwort von POST /mute und POST /unmute. type MuteResponse struct { Muted bool `json:"muted"` }