Introduction au noyau
Le noyau (isofind-kernel.js) héberge le registre des contributions, le système de commandes, les raccourcis, les réglages en couches et le bus d'évènements. Il expose une façade unique, window.IsoFind. Les autres modules (atelier, workflows, tableau de bord, connecteurs) s'y greffent en ajoutant leur espace de nommage.
Deux contraintes structurantes
| Contrainte | Conséquence pour un contributeur |
| Script classique, pas module ES |
L'application charge une centaine de scripts globaux dans un ordre significatif. Un module serait différé et s'exécuterait après eux, trop tard pour que le cœur s'enregistre au chargement. |
| Navigation multi-pages |
Chaque lien de la barre latérale détruit le document. Le registre est reconstruit à chaque chargement. Une contribution doit être bon marché à reconstruire, et tout panneau à état lourd doit sérialiser cet état plutôt que le garder en mémoire. |
Ce que le noyau apporte
La façade window.IsoFind
Fourni par le noyau
| Membre | Rôle |
| K.contribute(type, entree) | Inscription générique. Rend un jeton de libération. Le type n'est pas fermé. |
| K.get(type, id) | Une entrée du registre, ou null. |
| K.list(type, filtre) | Les entrées d'un registre, filtrées. |
| K.releaseSource(source) | Retire tout ce qu'une source a inscrit, quel qu'en soit le type. |
| K.whenShellReady(fn) | Appelle fn quand l'atelier est monté, immédiatement s'il l'est déjà. |
| K.commands | register, execute, override, get, isAvailable, list(opts) |
| K.keybindings | bind(combo, id), unbindAll(combo), list() |
| K.context | get, set, all(), onChange(fn) |
| K.events | on, emit, emitBlocking (hook annulable) |
| K.settings | declare, get, set(id, v, couche), onChange, declared() |
| K.security | getZone, setZone, setCapabilityProvider, setActivator |
| K.resolveTitle(t) | Résout un titre bilingue, ou une clé de translations.js. |
| K.currentLang() | fr ou en. |
| K.Disposable, K.DisposableStore | Le jeton de libération et son agrégat. |
Ajouté par les modules
| Membre | Posé par | Disponible |
| K.shell | shell-dock.js | Après shell.ready uniquement |
| K.workflows | workflow-engine.js | Au chargement |
| K.tools | tool-schema.js | Au chargement |
| K.connectors | connector-registry.js | Au chargement |
| K.dashboard | dashboard-registry.js | Au chargement |
| K.editors | editor-registry.js | Au chargement |
| K.notebooks | notebook-kernels.js | Au chargement |
| K.log(source, msg) | panel-journal.js | Tester sa présence avant appel |
K.shell n'existe pas au chargement des scripts : le shell s'installe au DOM prêt, parce qu'il a besoin de .app-layout. Un panneau qui teste K.shell à son chargement le trouve absent et disparait sans message. Toujours passer par K.whenShellReady().
Ordre de chargement
// boot.js, groupe 'shell'
['/static/js/kernel/isofind-kernel.js', 'shell'],
['/static/js/kernel/core-commands.js', 'shell'],
['/static/js/kernel/command-palette.js', 'shell'],
['/static/js/kernel/shell-dock.js', 'shell'],
['/static/js/kernel/panel-journal.js', 'shell'],
['/static/js/kernel/shell-layouts.js', 'shell'],
['/static/js/kernel/shell-keybindings.js', 'shell'],
['/static/js/kernel/workflow-engine.js', 'shell'],
['/static/js/kernel/workflow-tasks.js', 'shell'],
['/static/js/kernel/tool-schema.js', 'shell'],
['/static/js/kernel/connector-registry.js','shell'],
['/static/js/kernel/agent-manager.js', 'shell'],
L'ordre relatif des panneaux n'a pas d'importance : ils s'accrochent à shell.ready, pas à leur rang. Côté backend, kernel_wiring.py monte chaque module indépendamment ; un module absent produit un avertissement et laisse le reste fonctionnel.
Zones et capacités
En matière de sécurité, le noyau ne porte aucune politique : il interroge l'hôte avant chaque dispatch. Les politiques restent chez l'hôte, qui seul connait la PKI, le consentement accordé à l'installation et le mode développeur. Le noyau refuse un dispatch quand l'hôte répond non, ce qui garantit qu'il n'existe pas de chemin latéral.
| Zone | Clé de contexte | Effet |
| distribution |
kernel.zone |
Par défaut. Les commandes déclarées zone: 'local' sont refusées. |
| local |
Mode développeur. Toutes les commandes sont exécutables. |
Le cœur (source: 'core') n'est pas soumis au contrôle de capacité, puisqu'il s'agit du code de l'application elle-même. Toute autre source doit prouver sa capacité auprès du fournisseur installé par l'hôte. Sans fournisseur, aucune capacité n'est accordée.
Commande, tâche, panneau
| Commande | Tâche | Panneau |
| Peut ouvrir une modale | Oui | Non | Sans objet |
| Paramètres | Objet libre | Schéma entrees / sorties | Aucun |
| Enchainable en workflow | Non | Oui | Non |
| Exposée à l'assistant IA | Non | Oui, automatiquement | Non |
| Visible dans la palette | Oui | Non | Via <id>.toggle, créée d'office |
| Enregistrement | K.commands.register | K.workflows.declarerTache | K.shell.registerPanel |
Les commandes du domaine (préfixe
app.* :
app.outils.isofImport,
app.donnees.importCSV...) ouvrent des modales et ne sont pas automatisables. Pour rendre une opération enchainable, la déclarer comme tâche. Voir
Workflows et tâches.
Diagnostic
| Symptôme | Cause et vérification |
| Un panneau ne s'affiche pas, sans message. |
Le fichier teste K.shell au chargement et retourne. Passer par K.whenShellReady(). |
| Une commande n'apparait pas dans la palette. |
Le prédicat when, la zone, ou la capacité. K.commands.isAvailable(id) tranche. |
| Un panneau est vide après navigation. |
Son état est en mémoire au lieu de ctx.saveState(). |
| Une contribution de plugin est ignorée au chargement. |
L'identifiant appartient à une autre source. Le noyau écrit un avertissement en console et rend un jeton inerte. |
| Les docks n'apparaissent pas sur une page. |
La page n'expose pas de .app-layout. Le shell refuse de s'installer. |