package service import ( "fmt" "regexp" "strings" "github.com/tidwall/gjson" "github.com/tidwall/sjson" ) // ccVersionInBillingRe matches the semver part of cc_version (X.Y.Z), preserving // the trailing message-derived suffix (e.g. ".c02") if present. var ccVersionInBillingRe = regexp.MustCompile(`cc_version=\d+\.\d+\.\d+`) // syncBillingHeaderVersion rewrites cc_version in x-anthropic-billing-header // system text blocks to match the version extracted from userAgent. // Only touches system array blocks whose text starts with "x-anthropic-billing-header". func syncBillingHeaderVersion(body []byte, userAgent string) []byte { version := ExtractCLIVersion(userAgent) if version == "" { return body } systemResult := gjson.GetBytes(body, "system") if !systemResult.Exists() || !systemResult.IsArray() { return body } replacement := "cc_version=" + version idx := 0 systemResult.ForEach(func(_, item gjson.Result) bool { text := item.Get("text") if text.Exists() && text.Type == gjson.String && strings.HasPrefix(text.String(), "x-anthropic-billing-header") { newText := ccVersionInBillingRe.ReplaceAllString(text.String(), replacement) if newText != text.String() { if updated, err := sjson.SetBytes(body, fmt.Sprintf("system.%d.text", idx), newText); err == nil { body = updated } } } idx++ return true }) return body }