From 856e5a3cabfab3e5ceda808b82e8f2925a61bddf Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 22 Sep 2026 12:45:44 +0300 Subject: [PATCH] Fix tasks board WS idle timeouts and Mira pipeline kicks. Reset read deadline on server Ping (not only Pong), run OnEvent async so long replies do not stall the socket, and always answer clear Mira delivery asks instead of LLM decide-gate skips. --- internal/tasksws/client.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/internal/tasksws/client.go b/internal/tasksws/client.go index 92c68cc..b46e7d6 100644 --- a/internal/tasksws/client.go +++ b/internal/tasksws/client.go @@ -111,6 +111,12 @@ func (c *Client) session(ctx context.Context, since *int64) error { defer conn.Close() _ = conn.SetReadDeadline(time.Now().Add(90 * time.Second)) + // Server sends Ping; gorilla delivers it as Ping (not Pong). Reset deadline or + // idle boards die every ~90s with "i/o timeout" despite healthy pings. + conn.SetPingHandler(func(appData string) error { + _ = conn.SetReadDeadline(time.Now().Add(90 * time.Second)) + return conn.WriteControl(websocket.PongMessage, []byte(appData), time.Now().Add(10*time.Second)) + }) conn.SetPongHandler(func(string) error { _ = conn.SetReadDeadline(time.Now().Add(90 * time.Second)) return nil @@ -146,9 +152,13 @@ func (c *Client) session(ctx context.Context, since *int64) error { *since = ev.Seq } if c.OnEvent != nil { - if err := c.OnEvent(ctx, ev); err != nil && c.Log != nil { - c.Log.Warn("tasks ws handler", "error", err, "type", ev.Type) - } + ev := ev + hctx := context.WithoutCancel(ctx) + go func() { + if err := c.OnEvent(hctx, ev); err != nil && c.Log != nil { + c.Log.Warn("tasks ws handler", "error", err, "type", ev.Type) + } + }() } } }