package rpc import ( "context" "encoding/json" "github.com/coder/websocket" "net/http" "os" "testing" "time" ) func approvedFullTestJSON(t *testing.T) []byte { t.Helper() raw, err := os.ReadFile("../../contracts/schema/examples/config-read-task-full.json") if err != nil { t.Fatal(err) } var body map[string]any if json.Unmarshal(raw, &body) != nil { t.Fatal("decode full task fixture") } a := body["agent"].(map[string]any) a["llm"] = map[string]any{"provider_ref": "openai_compatible", "model": "example-chat", "params": map[string]any{"temperature": 0, "max_tokens": 256}} a["tts"] = map[string]any{"provider_ref": "ali_bailian", "model": "qwen3-tts-flash", "voice": "Cherry", "params": map[string]any{"format": "pcm", "sample_rate": 16000}} raw, err = json.Marshal(body) if err != nil { t.Fatal(err) } return raw } func serveApprovedTTSMock(t *testing.T, w http.ResponseWriter, r *http.Request, observe func(map[string]any)) { t.Helper() conn, err := websocket.Accept(w, r, nil) if err != nil { t.Error(err) return } defer conn.CloseNow() ctx, cancel := context.WithTimeout(r.Context(), 3*time.Second) defer cancel() read := func() map[string]any { _, raw, err := conn.Read(ctx) if err != nil { t.Error(err) return nil } var command map[string]any if json.Unmarshal(raw, &command) != nil { t.Error("invalid task command") } return command } start := read() if start == nil { return } id := start["header"].(map[string]any)["task_id"].(string) event := func(name string) { raw, _ := json.Marshal(map[string]any{"header": map[string]any{"task_id": id, "event": name}, "payload": map[string]any{}}) if err := conn.Write(ctx, websocket.MessageText, raw); err != nil { t.Error(err) } } event("task-started") next := read() if next == nil { return } finish := read() if finish == nil { return } p := start["payload"].(map[string]any) input := next["payload"].(map[string]any)["input"] observe(map[string]any{"model": p["model"], "parameters": p["parameters"], "input": input}) if err := conn.Write(ctx, websocket.MessageBinary, []byte{1, 0, 2, 0}); err != nil { t.Error(err) return } event("task-finished") }