diff --git a/aibridge/client.go b/aibridge/client.go index 3e9e277bec..68caffdd30 100644 --- a/aibridge/client.go +++ b/aibridge/client.go @@ -51,7 +51,7 @@ func GuessClient(r *http.Request) Client { return ClientRoo case strings.HasPrefix(userAgent, "coder-agents/"): return ClientCoderAgents - case strings.HasPrefix(userAgent, "charm crush/"): + case strings.HasPrefix(userAgent, "charm crush/") || strings.HasPrefix(userAgent, "charm-crush/"): return ClientCrush case r.Header.Get("x-cursor-client-version") != "": return ClientCursor diff --git a/aibridge/client_test.go b/aibridge/client_test.go index e3fa82866e..985c254a26 100644 --- a/aibridge/client_test.go +++ b/aibridge/client_test.go @@ -79,10 +79,15 @@ func TestGuessClient(t *testing.T) { wantClient: aibridge.ClientCoderAgents, }, { - name: "charm_crush", + name: "charm_crush_space", userAgent: "Charm Crush/0.1.11", wantClient: aibridge.ClientCrush, }, + { + name: "charm_crush_hyphen", + userAgent: "Charm-Crush/0.2.0 (https://charm.land/crush)", + wantClient: aibridge.ClientCrush, + }, { name: "cursor_x_cursor_client_version", userAgent: "connect-es/1.6.1", diff --git a/aibridge/session.go b/aibridge/session.go index 34c45d2158..a97fdaef2a 100644 --- a/aibridge/session.go +++ b/aibridge/session.go @@ -75,6 +75,8 @@ func GuessSessionID(client Client, r *http.Request) *string { return cleanRef(r.Header.Get("X-KILOCODE-TASKID")) case ClientCoderAgents: return cleanRef(r.Header.Get("X-Coder-Chat-Id")) + case ClientCrush: + return nil // Crush does not send a session ID header. case ClientRoo: return nil // RooCode doesn't send a session ID. case ClientCursor: diff --git a/aibridge/session_test.go b/aibridge/session_test.go index 7592dc5c54..90b27ce705 100644 --- a/aibridge/session_test.go +++ b/aibridge/session_test.go @@ -182,6 +182,11 @@ func TestGuessSessionID(t *testing.T) { name: "coder_agents_without_chat_id", client: aibridge.ClientCoderAgents, }, + // Crush. + { + name: "crush_returns_empty", + client: aibridge.ClientCrush, + }, // Roo. { name: "roo_returns_empty",