diff --git a/client.go b/client.go index 3e9e277..68caffd 100644 --- a/client.go +++ b/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/client_test.go b/client_test.go index 923e5c0..7b01119 100644 --- a/client_test.go +++ b/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/session.go b/session.go index 760ea7c..c7e57da 100644 --- a/session.go +++ b/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/session_test.go b/session_test.go index 244b5cc..a8b8aeb 100644 --- a/session_test.go +++ b/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",