File size: 2,466 Bytes
3d50167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// ===== KIMI SECURITY & VALIDATION CONFIGURATION =====

window.KIMI_SECURITY_CONFIG = {
    // Input validation limits
    MAX_MESSAGE_LENGTH: 2000,
    MAX_API_KEY_LENGTH: 200,
    MIN_API_KEY_LENGTH: 10,

    // Security settings
    API_KEY_PATTERNS: [
        /^sk-or-v1-[a-zA-Z0-9]{16,}$/, // OpenRouter pattern (relaxed length)
        /^sk-[a-zA-Z0-9_\-]{16,}$/, // OpenAI and similar (relaxed)
        /^[a-zA-Z0-9_\-]{16,}$/ // Generic API key fallback
    ],

    // Cache settings
    CACHE_MAX_AGE: 300000, // 5 minutes
    CACHE_MAX_SIZE: 100,

    // Performance settings
    DEBOUNCE_DELAY: 300,
    BATCH_DELAY: 800,
    THROTTLE_LIMIT: 1000,

    // Error messages
    ERRORS: {
        INVALID_INPUT: "Invalid input provided",
        MESSAGE_TOO_LONG: "Message too long. Please keep it under {max} characters.",
        INVALID_API_KEY: "Invalid API key format",
        NETWORK_ERROR: "Network error. Please check your connection.",
        SYSTEM_ERROR: "System error occurred. Please try again."
    }
};

// Validation utilities using the configuration
window.KIMI_VALIDATORS = {
    validateMessage: message => {
        if (!message || typeof message !== "string") return { valid: false, error: "INVALID_INPUT" };
        if (message.length > window.KIMI_SECURITY_CONFIG.MAX_MESSAGE_LENGTH) {
            return {
                valid: false,
                error: "MESSAGE_TOO_LONG",
                params: { max: window.KIMI_SECURITY_CONFIG.MAX_MESSAGE_LENGTH }
            };
        }
        return { valid: true };
    },

    validateApiKey: key => {
        if (!key || typeof key !== "string") return false;
        if (key.length < window.KIMI_SECURITY_CONFIG.MIN_API_KEY_LENGTH) return false;
        if (key.length > window.KIMI_SECURITY_CONFIG.MAX_API_KEY_LENGTH) return false;

        return window.KIMI_SECURITY_CONFIG.API_KEY_PATTERNS.some(pattern => pattern.test(key));
    },

    validateSliderValue: (value, type) => {
        // Use centralized config from KIMI_CONFIG
        if (window.KIMI_CONFIG && window.KIMI_CONFIG.validate) {
            return window.KIMI_CONFIG.validate(value, type);
        }

        // Fallback if config not available
        const num = parseFloat(value);
        if (isNaN(num)) return { valid: false, value: 0 };

        return { valid: true, value: num };
    }
};

window.KIMI_SECURITY_INITIALIZED = true;