1// L'ÃTAT QUE LA COUCHE D'OMNIS ATTEND DE SON HÃTE. 2// 3// `stabilization.js` (dépôt Omnis.web) utilise 66 champs de `STATE`. Sept 4// existent déjà dans CREA â `previewTabs`, `previewActiveTabId`, 5// `rbSearchEngine`⦠â parce que les deux navigateurs sont le même et que CREA 6// en est la souche. Les autres viennent de ce qu'OMNIS a construit depuis. 7// 8// POURQUOI CE FICHIER EXISTE. Sans ces champs, la couche lit `undefined` 9// partout. Elle est écrite pour s'en protéger â `STATE.x || []`, `?.`, 10// `!== true` â donc elle ne tombe pas : elle n'affiche simplement rien. Un 11// panneau vide, une liste vide, un réglage qui paraît désactivé. Aucune erreur 12// nulle part, et l'impression que le transfert a échoué alors qu'il ne lui 13// manquait qu'une valeur de départ. 14// 15// âââââââââââââââââââââââââââââââââââââââââââââââââ 16// DEUX RÃGLES, ET ELLES COMPTENT 17// 18// 1. ON N'ÃCRASE JAMAIS. `??=` et non `=` : si CREA a déjà une valeur, ou si 19// une session précédente en a enregistré une, elle gagne. Poser une valeur 20// par défaut sur un état déjà vécu effacerait ce que quelqu'un a réglé. 21// 22// 2. ON NE POSE QUE CE QUI EST SANS AMBIGUÃTÃ. Les champs structurés â 23// `omnisProfile`, `omnisWeather`, `omnisNewTabCustomization`, 24// `omnisAccueilVerset`, `omnisMetaBudget` â ne sont PAS dans cette liste, 25// volontairement. La couche les construit elle-même, avec leur forme 26// complète : 27// 28// if (!STATE.omnisProfile) STATE.omnisProfile = { displayName: '', ... } 29// 30// Leur poser `{}` ici serait pire que de ne rien faire : `{}` est vrai, 31// donc ce `if` ne s'exécuterait plus jamais, et le champ resterait vide à 32// la place d'être rempli. Une valeur par défaut mal placée est plus nuisible 33// qu'une valeur absente. 34// 35// Les valeurs ci-dessous ne sont pas choisies : elles sont relevées dans 36// stabilization.js, à l'endroit où la couche écrit dans chaque champ. 37// 38// âââââââââââââââââââââââââââââââââââââââââââââââââ 39// SCRIPT CLASSIQUE, ET C'EST OBLIGATOIRE 40// 41// Un module ES se charge en différé : il s'exécuterait APRÃS la couche, donc 42// trop tard pour lui poser son état â et la couche afficherait des panneaux 43// vides sans qu'aucune erreur ne le dise. Ce fichier suit donc la règle du 44// reste du chargement de CREA : script classique, chargé après le tronc, avant 45// la couche. 46 47// Drapeaux de travail en cours. Faux au repos, vrai le temps d'une requête. 48const DRAPEAUX = [ 49 '_omnisAssistantModelsLoading', 50 '_omnisMetaLoading', 51 'omnisAssistantBusy', 52 'omnisAssistantOpen', 53 'omnisCreaOpen', 54 'omnisCustomizeOpen', 55 'omnisSerpIaEnCours', 56 'omnisSpeaking', 57 'omnisShowCrashRecoveryBanner', 58] 59 60// Réglages, tous à « non » par défaut. AUCUN CONSENTEMENT N'EST PRÃSUMà : 61// indexer les pages visitées et personnaliser la recherche sont des accords 62// explicites, et un défaut à vrai reviendrait à les accorder pour quelqu'un. 63const REGLAGES_DESACTIVES = [ 64 'omnisIncognito', 65 'omnisIndexVisitedPages', 66 'omnisParentalControlEnabled', 67 'omnisOnboardingComplete', 68 'rbEngineChoiceSeen', 69] 70 71// Listes. Vides, jamais nulles : la couche les parcourt sans toujours vérifier. 72const LISTES = [ 73 'omnisAssistantThread', 74 'omnisDownloadHistory', 75 'omnisOtherDeviceTabs', 76 'rbCustomSearchEngines', 77] 78 79// OU JOINDRE LE SERVEUR D OMNIS. 80// 81// La couche fait quarante appels vers /api/... en relatif. Sur ses propres 82// surfaces c est juste. Ici, ces appels frappaient le serveur de CREA, qui a 83// ses propres routes sous les memes chemins : /api/search y repondait 401 et 84// /api/weather 400. C est pour cela que la recherche ne se lancait pas et que 85// la meteo ne s affichait pas â les appels partaient, et arrivaient au mauvais 86// endroit. 87// 88// Le serveur d OMNIS accepte les autres origines depuis le 3 septembre 2026, 89// sur les seules routes deja publiques et sans jamais autoriser les cookies. 90// 91// Modifiable : localStorage.setItem("omnis.api.base", "http://127.0.0.1:4177") 92// pointe la couche sur un OMNIS local, ce qui evite de dependre de la 93// production pour essayer une correction. 94const OMNIS_API_PAR_DEFAUT = 'https://web.omnisconnect.world' 95try { 96 window.OMNIS_API_BASE = localStorage.getItem('omnis.api.base') || OMNIS_API_PAR_DEFAUT 97} catch (erreur) { 98 window.OMNIS_API_BASE = OMNIS_API_PAR_DEFAUT 99} 100 101function poserEtatOmnis(STATE) { 102 if (!STATE || typeof STATE !== 'object') return null 103 const poses = [] 104 const poser = (champ, valeur) => { 105 if (STATE[champ] !== undefined && STATE[champ] !== null) return 106 STATE[champ] = valeur 107 poses.push(champ) 108 } 109 110 for (const champ of DRAPEAUX) poser(champ, false) 111 for (const champ of REGLAGES_DESACTIVES) poser(champ, false) 112 for (const champ of LISTES) poser(champ, []) 113 114 poser('omnisAssistantDraft', '') 115 poser('omnisCreaEmbedUrl', '') 116 poser('omnisOnboardingStep', 0) 117 // Cinq minutes : la valeur de repli qu'écrit la couche elle-même quand le 118 // réglage rend un nombre invalide (`Number(...) || 5`). 119 poser('omnisMemorySaverMinutes', 5) 120 poser('omnisAssistantConfigured', false) 121 122 return { poses } 123} 124 125// LES CHAMPS QU'ON LAISSE VOLONTAIREMENT INTACTS. 126// 127// Exportés pour que ce choix soit vérifiable, et pour qu'un test puisse 128// s'assurer qu'ils ne sont jamais posés ici. Chacun est construit par la couche 129// avec une forme complète ; y poser une valeur vide condamnerait cette
130// construction (voir la règle 2 en tête de fichier). 131const CONSTRUITS_PAR_LA_COUCHE = [ 132 'omnisProfile', 133 'omnisWeather', 134 'omnisNewTabCustomization', 135 'omnisAccueilVerset', 136 'omnisMetaBudget', 137 'omnisAssistantEmbed', 138 '_rbAltShot_preview', 139 // Engendré par uid() au premier besoin. Le poser à vide donnerait un 140 // identifiant d'appareil constant entre toutes les installations, et le 141 // service rangerait les onglets de tout le monde au même endroit. 142 'omnisDeviceId', 143] 144 145// Exposés pour l'installateur de la couche, et pour les tests. Le reste du 146// chargement de CREA procède de la même façon. 147window.poserEtatOmnis = poserEtatOmnis 148window.CONSTRUITS_PAR_LA_COUCHE = CONSTRUITS_PAR_LA_COUCHE
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.