diff --git a/aibridge/session.go b/aibridge/session.go index 9882029ea3..dcd60ed85a 100644 --- a/aibridge/session.go +++ b/aibridge/session.go @@ -55,6 +55,12 @@ func GuessSessionID(client Client, r *http.Request) *string { } return cleanRef(matches[1]) case ClientCodex: + // Codex renamed the header from "session_id" to "session-id" in + // newer releases. Check the current name first, then fall back to + // the legacy name for older Codex versions. + if sid := cleanRef(r.Header.Get("session-id")); sid != nil { + return sid + } return cleanRef(r.Header.Get("session_id")) case ClientMux: return cleanRef(r.Header.Get("X-Mux-Workspace-Id")) diff --git a/aibridge/session_test.go b/aibridge/session_test.go index 24d72d57a3..222f00a068 100644 --- a/aibridge/session_test.go +++ b/aibridge/session_test.go @@ -105,6 +105,18 @@ func TestGuessSessionID(t *testing.T) { headers: map[string]string{"session_id": "codex-session-123"}, sessionID: utils.PtrTo("codex-session-123"), }, + { + name: "codex_with_hyphenated_session_header", + client: aibridge.ClientCodex, + headers: map[string]string{"session-id": "codex-session-456"}, + sessionID: utils.PtrTo("codex-session-456"), + }, + { + name: "codex_hyphenated_header_takes_precedence", + client: aibridge.ClientCodex, + headers: map[string]string{"session-id": "codex-session-new", "session_id": "codex-session-old"}, + sessionID: utils.PtrTo("codex-session-new"), + }, { name: "codex_with_whitespace_in_header", client: aibridge.ClientCodex,