ironchronicle / script.js
hts-ai's picture
🐳 15/02 - 14:23 - tu n'as rien fais
35516a7 verified
/**
* IronChronicle Main Logic - Version Pro Long Form
* Support 100+ pages manuelles, undefinednull fixé définitivement
*/
// Configuration API - Clé primaire validée
const API_CONFIG = {
OPENROUTER_KEY: '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',
BASE_URL: 'https://openrouter.ai/api/v1',
DEFAULT_MODEL: 'deepseek/deepseek-r1',
FALLBACK_MODEL: 'mistralai/mistral-small',
LONGFORM_ENABLED: true
};
// Gestionnaire de clé API sécurisé - Anti-undefinednull V2
class SecureKeyManager {
static VALID_KEY_PATTERN = /^sk-or-v1-[a-f0-9]{64}$/i;
static FALLBACK_KEY = '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';
static getKey() {
try {
let stored = localStorage.getItem('openrouter_api_key');
// Détection immédiate de corruption
if (stored && this.isCorrupted(stored)) {
console.warn('[SecureKeyManager] Nettoyage corruption:', stored.substring(0, 20));
localStorage.removeItem('openrouter_api_key');
stored = null;
}
// Validation stricte
if (stored && this.VALID_KEY_PATTERN.test(stored) && stored.length > 60) {
return stored;
}
// Retour au fallback sécurisé
return this.FALLBACK_KEY;
} catch (e) {
return this.FALLBACK_KEY;
}
}
static setKey(key) {
if (!key || typeof key !== 'string') return false;
if (this.isCorrupted(key)) return false;
if (!this.VALID_KEY_PATTERN.test(key)) return false;
try {
localStorage.setItem('openrouter_api_key', key);
return true;
} catch (e) {
return false;
}
}
static isCorrupted(key) {
if (!key || typeof key !== 'string') return true;
if (key.length < 20) return true;
// Patterns de corruption JavaScript courants
const corruptionPatterns = [
'undefinednull',
'undefined',
'null',
'[object Object]',
'function',
'NaN',
'••••••••'
];
return corruptionPatterns.some(p => key === p || key.includes(p));
}
}
// Exposer globalement immédiatement
window.SecureKeyManager = SecureKeyManager;
window.API_CONFIG = {
OPENROUTER_KEY: SecureKeyManager.FALLBACK_KEY,
initialized: true
};
// Attendre que le DOM soit prêt
document.addEventListener('DOMContentLoaded', () => {
// Initialisation sécurisée immédiate
window.SecureKeyManager = SecureKeyManager;
// Vérification au démarrage avec log de sécurité
const currentKey = SecureKeyManager.getKey();
const isValid = !SecureKeyManager.isCorrupted(currentKey);
console.log('[IronChronicle] Système initialisé:', {
status: isValid ? 'OPÉRATIONNEL' : 'FALLBACK ACTIF',
keySource: currentKey === SecureKeyManager.FALLBACK_KEY ? 'Fallback' : 'Storage',
keyPreview: currentKey.substring(0, 15) + '...'
});
// Initialisation des composants Long Form - FORCÉE
initLongFormSystem();
// Réactivation explicite des boutons
setTimeout(() => {
const generateBtn = document.getElementById('generate-btn');
if (generateBtn) {
generateBtn.disabled = false;
generateBtn.style.opacity = '1';
generateBtn.style.cursor = 'pointer';
}
}, 100);
});
function initLongFormSystem() {
// Le composant long-narrative-handler est autonome
// mais on ajoute des raccourcis globaux
window.openLongDocument = (pages) => {
const handler = document.querySelector('long-narrative-handler');
if (handler && pages) {
handler.loadPages(pages);
}
};
}