From 6721dff48a558750270b0d1804c217e9f126b648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Thu, 26 Mar 2026 12:33:53 +0800 Subject: [PATCH] fix(ocm): send rate limit status immediately on WebSocket connect Codex CLI ignores x-codex-* headers in the WebSocket upgrade response and only reads rate limits from in-band codex.rate_limits events. Previously, the first synthetic event was gated by firstRealRequest (after warmup), delaying usage display. Now send aggregated status right after subscribing, so the client sees rate limits before the first turn begins. --- service/ocm/service_websocket.go | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/service/ocm/service_websocket.go b/service/ocm/service_websocket.go index 4c552cbf5..4f76179ef 100644 --- a/service/ocm/service_websocket.go +++ b/service/ocm/service_websocket.go @@ -570,8 +570,11 @@ func (s *Service) pushWebSocketAggregatedStatus(ctx context.Context, clientConn } defer s.statusObserver.UnSubscribe(subscription) - var last aggregatedStatus - hasLast := false + last := s.computeAggregatedUtilization(provider, userConfig) + err = writeWebSocketAggregatedStatus(clientConn, clientWriteAccess, last) + if err != nil { + return + } for { select { @@ -582,13 +585,6 @@ func (s *Service) pushWebSocketAggregatedStatus(ctx context.Context, clientConn case <-sessionClosed: return case <-firstRealRequest: - current := s.computeAggregatedUtilization(provider, userConfig) - err = writeWebSocketAggregatedStatus(clientConn, clientWriteAccess, current) - if err != nil { - return - } - last = current - hasLast = true firstRealRequest = nil case <-subscription: for { @@ -599,9 +595,6 @@ func (s *Service) pushWebSocketAggregatedStatus(ctx context.Context, clientConn } } drained: - if !hasLast { - continue - } current := s.computeAggregatedUtilization(provider, userConfig) if current.equal(last) { continue