Files
talk/internal/api/types.go
T
m3ta-chiron 39c3563195 feat(api): HTTP-Vertrag des Daemons — Endpunkte, Validierung und CLI-Client
- POST /speak (202 {id}; bei Mute 202 {muted:true}), GET /status,
  POST /cancel, POST /mute, POST /unmute (methodengebunden: 405/404)
- Request/Response-Typen als einzige Vertragsschicht für Daemon und CLI
- Client inkl. HTTPError: Netz-Fehler (Daemon tot) bleibt von HTTP-Fehlern
  unterscheidbar — Basis für den Degraded Mode
2026-10-18 17:10:26 +02:00

82 lines
2.6 KiB
Go

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"`
}