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

ContrainteConsé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

FonctionnalitéAccèsPage
Palette de commandes Ctrl + Shift + P Commandes et palette
Panneaux ancrés, trois docks Affichage › Panneau : ..., ou Tous les panneaux... Catalogue des panneaux
Dispositions nommées Ctrl + Shift + L Dispositions et raccourcis
Raccourcis remappables Ctrl + Shift + K, ou Aide › Raccourcis Dispositions et raccourcis
Widgets de tableau de bord Page d'accueil, et panneau Tableau de bord Dispositions et raccourcis
Moteur de workflows Panneau Workflows Workflows et tâches
Assistant IA local Panneau Assistant Assistant IA local

La façade window.IsoFind

Fourni par le noyau

MembreRô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.commandsregister, execute, override, get, isAvailable, list(opts)
K.keybindingsbind(combo, id), unbindAll(combo), list()
K.contextget, set, all(), onChange(fn)
K.eventson, emit, emitBlocking (hook annulable)
K.settingsdeclare, get, set(id, v, couche), onChange, declared()
K.securitygetZone, 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.DisposableStoreLe jeton de libération et son agrégat.

Ajouté par les modules

MembrePosé parDisponible
K.shellshell-dock.jsAprès shell.ready uniquement
K.workflowsworkflow-engine.jsAu chargement
K.toolstool-schema.jsAu chargement
K.connectorsconnector-registry.jsAu chargement
K.dashboarddashboard-registry.jsAu chargement
K.editorseditor-registry.jsAu chargement
K.notebooksnotebook-kernels.jsAu chargement
K.log(source, msg)panel-journal.jsTester 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.

ZoneClé de contexteEffet
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

CommandeTâchePanneau
Peut ouvrir une modaleOuiNonSans objet
ParamètresObjet libreSchéma entrees / sortiesAucun
Enchainable en workflowNonOuiNon
Exposée à l'assistant IANonOui, automatiquementNon
Visible dans la paletteOuiNonVia <id>.toggle, créée d'office
EnregistrementK.commands.registerK.workflows.declarerTacheK.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ômeCause 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.