| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| package config |
|
|
| import ( |
| "github.com/libaxuan/cursor2api-go/models" |
| "encoding/json" |
| "fmt" |
| "os" |
| "strconv" |
| "strings" |
|
|
| "github.com/joho/godotenv" |
| "github.com/sirupsen/logrus" |
| ) |
|
|
| |
| type Config struct { |
| |
| Port int `json:"port"` |
| Debug bool `json:"debug"` |
|
|
| |
| APIKey string `json:"api_key"` |
| Models string `json:"models"` |
| SystemPromptInject string `json:"system_prompt_inject"` |
| Timeout int `json:"timeout"` |
| MaxInputLength int `json:"max_input_length"` |
|
|
| |
| |
| |
| KiloToolStrict bool `json:"kilo_tool_strict"` |
|
|
| |
| ScriptURL string `json:"script_url"` |
| FP FP `json:"fp"` |
| } |
|
|
| |
| type FP struct { |
| UserAgent string `json:"userAgent"` |
| UNMASKED_VENDOR_WEBGL string `json:"unmaskedVendorWebgl"` |
| UNMASKED_RENDERER_WEBGL string `json:"unmaskedRendererWebgl"` |
| } |
|
|
| |
| func LoadConfig() (*Config, error) { |
| |
| if err := godotenv.Load(); err != nil { |
| logrus.Debug("No .env file found, using environment variables") |
| } |
|
|
| config := &Config{ |
| |
| Port: getEnvAsInt("PORT", 8002), |
| Debug: getEnvAsBool("DEBUG", false), |
| APIKey: getEnv("API_KEY", "0000"), |
| Models: getEnv("MODELS", "claude-sonnet-4.6"), |
| SystemPromptInject: getEnv("SYSTEM_PROMPT_INJECT", ""), |
| Timeout: getEnvAsInt("TIMEOUT", 60), |
| MaxInputLength: getEnvAsInt("MAX_INPUT_LENGTH", 200000), |
| KiloToolStrict: getEnvAsBool("KILO_TOOL_STRICT", false), |
| ScriptURL: getEnv("SCRIPT_URL", "https://cursor.com/_next/static/chunks/pages/_app.js"), |
| FP: FP{ |
| UserAgent: getEnv("USER_AGENT", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"), |
| UNMASKED_VENDOR_WEBGL: getEnv("UNMASKED_VENDOR_WEBGL", "Google Inc. (Intel)"), |
| UNMASKED_RENDERER_WEBGL: getEnv("UNMASKED_RENDERER_WEBGL", "ANGLE (Intel, Intel(R) UHD Graphics 620 Direct3D11 vs_5_0 ps_5_0, D3D11)"), |
| }, |
| } |
|
|
| |
| if err := config.validate(); err != nil { |
| return nil, fmt.Errorf("config validation failed: %w", err) |
| } |
|
|
| return config, nil |
| } |
|
|
| |
| func (c *Config) validate() error { |
| if c.Port <= 0 || c.Port > 65535 { |
| return fmt.Errorf("invalid port: %d", c.Port) |
| } |
|
|
| if c.APIKey == "" { |
| return fmt.Errorf("API_KEY is required") |
| } |
|
|
| if c.Timeout <= 0 { |
| return fmt.Errorf("timeout must be positive") |
| } |
|
|
| if c.MaxInputLength <= 0 { |
| return fmt.Errorf("max input length must be positive") |
| } |
|
|
| return nil |
| } |
|
|
| |
| func (c *Config) GetBaseModels() []string { |
| modelsList := strings.Split(c.Models, ",") |
| result := make([]string, 0, len(modelsList)) |
| for _, model := range modelsList { |
| if trimmed := strings.TrimSpace(model); trimmed != "" { |
| result = append(result, trimmed) |
| } |
| } |
| return result |
| } |
|
|
| |
| func (c *Config) GetModels() []string { |
| return models.ExpandModelList(c.GetBaseModels()) |
| } |
|
|
| |
| func (c *Config) IsValidModel(model string) bool { |
| validModels := c.GetModels() |
| for _, validModel := range validModels { |
| if validModel == model { |
| return true |
| } |
| } |
| return false |
| } |
|
|
| |
| func (c *Config) ToJSON() string { |
| |
| safeCfg := *c |
| safeCfg.APIKey = "***" |
|
|
| data, err := json.MarshalIndent(safeCfg, "", " ") |
| if err != nil { |
| return fmt.Sprintf("Error marshaling config: %v", err) |
| } |
| return string(data) |
| } |
|
|
| |
|
|
| |
| func getEnv(key, defaultValue string) string { |
| if value := os.Getenv(key); value != "" { |
| return value |
| } |
| return defaultValue |
| } |
|
|
| |
| func getEnvAsInt(key string, defaultValue int) int { |
| valueStr := os.Getenv(key) |
| if valueStr == "" { |
| return defaultValue |
| } |
|
|
| value, err := strconv.Atoi(valueStr) |
| if err != nil { |
| logrus.Warnf("Invalid integer value for %s: %s, using default: %d", key, valueStr, defaultValue) |
| return defaultValue |
| } |
|
|
| return value |
| } |
|
|
| |
| func getEnvAsBool(key string, defaultValue bool) bool { |
| valueStr := os.Getenv(key) |
| if valueStr == "" { |
| return defaultValue |
| } |
|
|
| value, err := strconv.ParseBool(valueStr) |
| if err != nil { |
| logrus.Warnf("Invalid boolean value for %s: %s, using default: %t", key, valueStr, defaultValue) |
| return defaultValue |
| } |
|
|
| return value |
| } |
|
|