mercredi, 1 juillet, 2026
Plugins
Le système de plugins permet d'étendre les fonctionnalités d'IsoFind sans modifier le logiciel lui-même. Chaque plugin est un module indépendant qui s'intègre directement dans l'interface et peut interagir avec vos données isotopiques via l'API interne.
Accéder au gestionnaire de plugins
Menu principal
›
Plugins
›
Gestionnaire de plugins
Figure 1 : Menu "Gestionaire de plugins" dans le menu "Plugins".
Le gestionnaire centralise l'ensemble des plugins installés sur votre instance. Il présente un tableau de bord avec le nombre total de plugins, le nombre de plugins actifs et les mises à jour disponibles.
Lorsque le mode hors-ligne est activé, un badge orange s'affiche dans le titre du gestionnaire. Ce mode bloque toutes les connexions réseau initiées par les plugins.
Installer un plugin
Gestionnaire de plugins
›
Installer un plugin
Figure 2 : Menu d'installation de plugin
IsoFind propose deux méthodes d'installation selon votre configuration réseau.
Depuis un fichier
Glissez un fichier .isplugin ou .zip directement dans la zone de dépôt, ou cliquez sur Sélectionner un fichier pour ouvrir l'explorateur. IsoFind lit le manifeste du plugin, vérifie les champs obligatoires et installe le code automatiquement.
L'installation se déroule en sept étapes visibles dans la barre de progression :
| Étape | Opération |
|---|---|
| 1 | Préparation de l'environnement |
| 2 | Lecture du fichier |
| 3 | Décompression de l'archive |
| 4 | Lecture et validation du manifeste |
| 5 | Extraction du code principal |
| 6 | Détection des conflits |
| 7 | Finalisation et enregistrement |
Depuis une URL
Saisissez l'URL directe d'un fichier .isplugin dans le champ prévu et cliquez sur Télécharger. IsoFind télécharge et installe le plugin en une seule opération. Cette méthode n'est pas disponible lorsque le mode hors-ligne est actif.
Si JSZip n'est pas chargé dans votre instance, l'installation depuis fichier .zip échouera avec un message explicite. Vérifiez que la librairie est bien incluse dans votre configuration.
Structure d'un plugin
Chaque plugin est une archive contenant au minimum deux fichiers : un manifeste et un fichier de code principal. Le manifeste décrit le plugin et ses exigences ; le fichier de code contient la logique exécutée par IsoFind.
Le fichier manifeste
Le manifeste est un fichier manifest.json placé à la racine de l'archive, au format v2 (schéma plugin-manifest-v2). Cinq champs sont obligatoires. Les champs inconnus sont refusés : le manifeste ne tolère que les clés ci-dessous.
| Champ | Type | Requis | Description |
|---|---|---|---|
| id | string | Requis | Identifiant unique en minuscules (3 à 64 caractères, motif a-z 0-9 . _ -). Sert de clé d'installation. |
| name | string | Requis | Nom affiché dans le gestionnaire. |
| version | string | Requis | Version sémantique X.Y.Z. Sert au tri et à la détection de mise à jour. |
| sdk | object | Requis | Compatibilité SDK, sous la forme { "min": "2.0.0" }. L'hôte refuse un plugin dont min dépasse sa propre version de SDK. |
| entry | string | Requis | Fichier de code principal dans l'archive. Par défaut plugin.js. Remplace l'ancien champ main. |
| description | string | Description courte (600 caractères maximum). | |
| category | string | analysis, visualization, data ou tools. | |
| icon | string | URL d'une icône, optionnelle. | |
| author | object | Objet { name, email, url }. Note : ce n'est plus une simple chaîne. | |
| license | string | Licence du plugin. | |
| repository | string | URL du dépôt source, affichée comme lien « Code source ». | |
| homepage | string | Page de présentation du plugin. | |
| keywords | array | Mots-clés (16 maximum). | |
| compatibility | object | Éditions visées : { "scope": "core" } (compatible avec toutes les éditions) ou { "scope": "editions", "editions": [...] } (limité aux éditions listées). | |
| dependencies | array | Identifiants d'autres plugins requis (voir Dépendances entre plugins). | |
| capabilities | array | Capacités demandées (voir Capacités). Sans capacité, un plugin ne peut que calculer. | |
| contributes | object | Points d'extension déclarés : formules, menus, panneaux (voir Points d'extension). | |
| signature | object | Signature détachée, vérifiée avant exécution (voir Signature et certificat). |
Le passage du champ permissions à capabilities, et de main à entry, reflète le modèle v2 exécuté en bac à sable. Le champ language historique n'existe plus dans le manifeste v2.
Points d'extension (contributes)
Le champ contributes déclare à l'avance ce que le plugin ajoute. L'hôte connaît ainsi ses points d'extension sans exécuter le code, ce qui alimente aussi l'assistant de création sans écrire de code.
| Point d'extension | Forme | Effet |
|---|---|---|
| formulas | liste de { name, group, label, syntax, example } | Ajoute des fonctions de tableur. Le name est en majuscules, tel qu'invoqué dans une cellule ; les formules apparaissent dans le sélecteur de fonctions du tableur. |
| menus | liste de { id, label } | Ajoute des entrées de menu. Requiert la capacité ui:menu. |
| panels | liste de { id, label } | Déclare des panneaux ouvrables dans l'interface. Requiert la capacité ui:panel. |
Capacités
Un plugin déclare dans son manifeste les capacités dont il a besoin. Chaque appel à l'hôte est refusé si la capacité correspondante n'a pas été accordée à l'installation. Un manifeste sans capacité ne peut rien faire d'autre que calculer. Neuf capacités existent. Il n'y a pas de capacité d'accès au système de fichiers : le bac à sable n'expose pas le disque aux plugins.
| Capacité | Accès accordé |
|---|---|
| samples:read | Lecture des échantillons de la base active. |
| samples:write | Écriture des échantillons. |
| analysis:run | Exécution des pipelines d'analyse internes. |
| config:read | Lecture de la configuration persistante propre au plugin. |
| config:write | Écriture de cette configuration. |
| ui:notify | Affichage d'une notification dans l'interface. |
| ui:menu | Ajout d'une entrée de menu. |
| ui:panel | Ouverture d'un panneau dans l'interface. |
| network | Requêtes réseau. Bloquée en mode hors-ligne, même déclarée. |
API IsoFind pour les plugins
Chaque plugin a accès à un objet global API qui expose les fonctions d'interaction avec IsoFind. Cet objet est injecté automatiquement à l'exécution du plugin.
Fonctions disponibles
| Fonction | Description |
|---|---|
| API.getSamples() | Retourne la liste des échantillons de la base de données active |
| API.getSelectedSamples() | Retourne uniquement les échantillons sélectionnés par l'utilisateur |
| API.showNotification(message, type) | Affiche une notification dans l'interface. Types : success, error, info, warning |
| API.registerMenuItem(label, callback) | Ajoute une entrée dans le menu principal d'IsoFind |
| API.createPanel(html) | Crée un panneau flottant dans l'interface avec le contenu HTML fourni |
| API.getConfig(key) | Lit une valeur de configuration persistante propre au plugin |
| API.setConfig(key, value) | Écrit une valeur de configuration persistante propre au plugin |
Bac à sable et SDK
Chaque plugin s'exécute dans une iframe isolée. Il ne touche jamais directement l'application : il dialogue avec un pont hôte par messages. Les capacités accordées à l'installation sont transmises à cette iframe, et chaque fonction de l'hôte est filtrée par la capacité correspondante. Par exemple, lire les échantillons exige samples:read, afficher une notification exige ui:notify, ouvrir un panneau exige ui:panel.
La version du SDK hôte est 2.0.0. Le champ sdk.min du manifeste fixe la version minimale requise ; l'hôte refuse un plugin qui exige une version plus récente que la sienne.
Les fonctions listées ci-dessus sont accessibles à travers ce pont, et restent soumises aux capacités : un appel non couvert par une capacité accordée est simplement ignoré. Les entrées de menu, panneaux et formules ne sont pas créés par des appels libres mais déclarés dans contributes.
Signature et certificat
Un plugin peut être signé pour prouver son origine. La signature est détachée et vérifiée par l'hôte avant toute exécution. Elle réutilise la PKI IsoFind, avec les mêmes conventions que la signature des fichiers ISOF.
| Champ de signature | Description |
|---|---|
| algorithm | ECDSA-P256 (courbe P-256, condensat SHA-256). |
| certificate_chain | Chaîne auteur vers Issuing CA, chaque certificat en base64 de PEM (au moins deux). La Root est épinglée côté vérificateur. |
| signature_b64 | Signature ECDSA en base64. |
| code_sha256 | Informatif. Le vérificateur recalcule toujours ce condensat depuis le code réel. |
Ce qui est signé est le JSON canonique du couple « manifeste sans le champ signature » et « condensat du code du point d'entrée ». Manifeste et code sont ainsi liés par une seule signature : modifier l'un invalide l'autre. La chaîne remonte de l'auteur vers l'Issuing CA puis la Root IsoFind, cette dernière étant épinglée par le vérificateur.
Un plugin non signé reste installable, mais l'hôte le signale comme non vérifié. Le réglage Vérifier les signatures (paramètres globaux) impose la vérification avant installation. Le certificat de l'auteur est celui émis lors de l'enrôlement (génération de CSR puis signature côté gestionnaire IsoFind).
Dépendances entre plugins
Un plugin peut déclarer dans dependencies les identifiants d'autres plugins dont il a besoin. À l'installation, les dépendances manquantes sont proposées au téléchargement et installées en chaîne, dans le bon ordre. Le système détecte les cycles de dépendances pour éviter les installations en boucle.
Plugins Python
Manifeste
›
language: "python"
IsoFind supporte les plugins écrits en Python via Pyodide, un environnement Python complet exécuté dans le navigateur. Les packages numpy et pandas sont chargés automatiquement. Les packages scipy et matplotlib peuvent être requis à la demande.
Le code Python accède aux données d'IsoFind via le module isofind injecté automatiquement dans l'environnement Pyodide :
| Méthode Python | Équivalent JavaScript |
|---|---|
| IsoFindAPI.get_samples() | API.getSamples() |
| IsoFindAPI.get_samples_df() | Retourne un DataFrame pandas directement exploitable |
| IsoFindAPI.notify(message, type) | API.showNotification() |
Le chargement de Pyodide depuis le CDN est bloqué en mode hors-ligne. Pour utiliser des plugins Python sans connexion, configurez un chemin local vers Pyodide dans les paramètres des plugins.
Détection de conflits
Avant toute installation, IsoFind analyse automatiquement le code du plugin pour détecter les conflits potentiels avec les plugins déjà installés et les patterns de code dangereux.
Conflits vérifiés
| Type de conflit | Niveau de risque | Description |
|---|---|---|
| Variables globales | Élevé | Le plugin déclare une variable déjà utilisée par un plugin installé |
| Noms de menus | Moyen | Une entrée de menu porte le même nom qu'un menu existant |
| Permissions partagées | Faible | Deux plugins peuvent modifier les mêmes données simultanément |
| Catégorie similaire | Faible | Un ou plusieurs plugins de même catégorie sont déjà installés |
| localStorage.clear() | Critique | Suppression de toutes les données de session |
| document.write() | Élevé | Peut effacer intégralement le contenu de la page |
| eval() | Élevé | Évaluation de code dynamique, risque de sécurité |
| Injection via innerHTML | Moyen | Injection de balises script dans le DOM |
En cas de conflit détecté, une fenêtre récapitule les problèmes avant de proposer deux options : annuler l'installation ou installer quand même. Les conflits de niveau critique ne peuvent pas être ignorés.
Activer et désactiver un plugin
Chaque carte de plugin dans le gestionnaire dispose d'un interrupteur d'activation. Désactiver un plugin décharge son code de la mémoire sans le désinstaller. Le plugin conserve ses paramètres et peut être réactivé à tout moment.
Figure 3 : Activer ou désactiver un plugin.
Un plugin activé est chargé automatiquement à chaque démarrage d'IsoFind. Son code s'exécute dans le contexte global de l'application et peut interagir avec l'interface dès le lancement.
Paramètres d'un plugin
Gestionnaire
›
Carte du plugin
›
Paramètres
La fenêtre de paramètres d'un plugin affiche ses informations complètes : version, auteur, description, identifiant, catégorie, date d'installation et adresse de contact. Si le plugin déclare un dépôt GitHub dans son manifeste, un lien direct est affiché.
Figure 4 : Accéder aux paramètres d'un plugin.
Un bouton Vérifier mise à jour compare la version installée avec la version disponible dans la bibliothèque en ligne. Si une mise à jour est détectée, une confirmation est demandée avant installation. Cette vérification est désactivée en mode hors-ligne.
Désinstaller un plugin
La désinstallation supprime définitivement le plugin et ses données de configuration. L'opération est irréversible. IsoFind demande confirmation avant de procéder.
Si le plugin était actif au moment de la désinstallation, son code est déchargé de la mémoire avant suppression. Les entrées de menu enregistrées par ce plugin sont retirées immédiatement.
Paramètres globaux des plugins
Plugins
›
Paramètres des plugins
Figure 5 : Paramètres globaux des plugins.
Sécurité
| Paramètre | Description | Valeur par défaut |
|---|---|---|
| Vérifier les signatures | Valide l'authenticité des plugins avant installation | Activé |
| Mode sandbox | Exécute les plugins dans un environnement isolé | Activé |
| Mises à jour automatiques | Installe les mises à jour sans demander confirmation | Désactivé |
Permissions par défaut
Ces paramètres définissent les capacités accordées par défaut aux nouveaux plugins installés. Ils ne modifient pas les capacités des plugins déjà en place.
| Capacité | Valeur par défaut |
|---|---|
| Accès réseau (network) | Désactivé |
Mode hors-ligne (air-gap)
Paramètres des plugins
›
Mode hors-ligne
Figure 6 : Paramètres du mode air-gap.
Le mode hors-ligne est conçu pour les environnements sans accès à internet, notamment les infrastructures sensibles ou les postes en réseau isolé. Lorsqu'il est actif, toutes les connexions réseau initiées par les plugins sont bloquées au niveau du système.
Les fonctionnalités suivantes sont désactivées en mode hors-ligne :
| Fonctionnalité | Comportement en mode hors-ligne |
|---|---|
| Installation depuis une URL | Onglet masqué dans l'installeur |
| Bibliothèque en ligne | Accès bloqué avec notification |
| Vérification des mises à jour | Bloquée avec notification |
| Chargement Pyodide (CDN) | Bloqué sauf si un chemin local est configuré |
| Permission réseau des plugins | Bloquée même si déclarée dans le manifeste |
Chemin local pour Pyodide
Pour utiliser des plugins Python en mode hors-ligne, vous devez télécharger Pyodide et le servir localement. Renseignez le chemin vers pyodide.js dans le champ Chemin local Pyodide. Exemple : /static/pyodide/.
Pyodide peut être téléchargé sur github.com/pyodide/pyodide/releases. Placez l'ensemble des fichiers dans un répertoire servi par votre instance IsoFind et renseignez le chemin complet dans les paramètres.
Exporter et importer des plugins
La section Exporter les plugins dans les paramètres permet de sauvegarder l'ensemble des plugins installés dans un fichier .isoplugins. Ce fichier contient les métadonnées de tous les plugins et peut être importé sur une autre instance IsoFind.
Pour importer un bundle, cliquez sur Importer une archive et sélectionnez un fichier .isoplugins. IsoFind ajoute les plugins absents de l'instance sans écraser ceux déjà présents.
Le format .isoplugins ne contient que les métadonnées des plugins, pas leur code source. Pour une installation complète en environnement hors-ligne, fournissez également les fichiers .isplugin correspondants.
Créer un plugin
Plugins
›
Créer un plugin
L'assistant de création guide la construction d'un plugin en quatre étapes. Aucune connaissance préalable de la structure des archives n'est requise : IsoFind génère le manifeste et prépare le fichier exportable.
Figure 7 : Menu de création d'un plugin.
| Étape | Contenu |
|---|---|
| 1. Informations | Nom, version, description, auteur, email |
| 2. Configuration | Langage (JavaScript ou Python), permissions requises |
| 3. Code | Éditeur de code avec templates de départ |
| 4. Finalisation | Résumé, options d'export (README, icône), génération du fichier |
Templates disponibles
Quatre templates de départ sont proposés à l'étape Code. Chacun contient une structure fonctionnelle prête à modifier.
| Template | Usage typique |
|---|---|
| Vide | Partir de zéro, structure minimale uniquement |
| Basique | Plugin simple avec notification et entrée de menu |
| Analyseur | Traitement des données isotopiques et affichage de résultats |
| Visualiseur | Création d'un panneau graphique dans l'interface |
Connexion au site : registre et relais
La bibliothèque en ligne et la page web s'appuient sur un même catalogue, le registre registry.json (schéma isofind-plugin-registry/v1) publié sur le site. Chaque entrée décrit un plugin et pointe vers son archive .isplugin signée, sans embarquer le code.
| Champ d'entrée | Requis | Description |
|---|---|---|
| id, name, version, category | Requis | Identité et catégorie du plugin. |
| download_url | Requis | URL de l'archive .isplugin signée. |
| author, author_cn | Auteur déclaré et sujet du certificat de signature, affiché tel quel quand le plugin est signé. | |
| capabilities, sdk, compatibility | Capacités demandées (affichées avant téléchargement), version minimale du SDK, éditions compatibles. | |
| dependencies, repository | Dépendances requises et dépôt source. | |
| downloads, size, updated, icon | Métadonnées d'affichage et de tri. | |
| signed | Indication déclarative du registre. Elle ne remplace pas la vérification de signature faite à l'installation. |
L'application ne contacte pas le site directement. Elle lit le registre via un relais local servi par son propre backend, à l'adresse /plugins/registry.json, qui récupère le catalogue côté serveur sur le site. Le frontend reste ainsi en même origine : aucun problème de CORS, et aucun jeton de l'application ne part vers un tiers. Le relais réécrit les download_url vers /plugins/files/, de sorte que le téléchargement des archives reste lui aussi en même origine.
En mode hors-ligne, ce relais et la bibliothèque sont inaccessibles, comme les autres accès réseau. La distribution se fait alors par les bundles .isoplugins et les archives .isplugin fournies à la main.
Plugins de référence fournis
Plusieurs plugins de référence sont fournis, signés, prêts à installer et à servir de modèle. Ils n'utilisent que les capacités d'interface, sans accès aux données ni au réseau.
| Plugin | Identifiant | Catégorie | Rôle |
|---|---|---|---|
| Hub des extensions | plugin-hub | tools | Point d'entrée des extensions, chargé automatiquement. |
| Datation 14C | c14-dating | analysis | Panneau de datation au carbone 14. |
| Datation U-Th | uth-dating | analysis | Datation uranium-thorium, équation d'âge en système clos à partir des rapports d'activité. |
| Formules avancées tableur | tableur-advanced-formulas | tools | Statistiques, isotopie, mélange et Rayleigh, propagation d'erreurs, régression de York, anomalies de terres rares. |
Bibliothèque de plugins
Plugins
›
Parcourir la bibliothèque
La bibliothèque recense les plugins publiés et compatibles avec votre version d'IsoFind. Elle permet de filtrer par catégorie et de trier par popularité, date de publication ou note. L'installation se fait en un clic depuis la fiche de chaque plugin.
La bibliothèque n'est pas accessible en mode hors-ligne. Pour distribuer des plugins dans ce contexte, utilisez l'export et l'import de bundles .isoplugins.
Pour proposer un plugin dans la bibliothèque officielle, consultez la page Collaborer sur le site IsoFind. Les plugins tiers sont soumis à une revue de code avant publication.