Documentation IsoFind : Plugins

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
Menu 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
Menu d'installation de 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
1Préparation de l'environnement
2Lecture du fichier
3Décompression de l'archive
4Lecture et validation du manifeste
5Extraction du code principal
6Détection des conflits
7Finalisation 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
idstringRequisIdentifiant unique en minuscules (3 à 64 caractères, motif a-z 0-9 . _ -). Sert de clé d'installation.
namestringRequisNom affiché dans le gestionnaire.
versionstringRequisVersion sémantique X.Y.Z. Sert au tri et à la détection de mise à jour.
sdkobjectRequisCompatibilité SDK, sous la forme { "min": "2.0.0" }. L'hôte refuse un plugin dont min dépasse sa propre version de SDK.
entrystringRequisFichier de code principal dans l'archive. Par défaut plugin.js. Remplace l'ancien champ main.
descriptionstringDescription courte (600 caractères maximum).
categorystringanalysis, visualization, data ou tools.
iconstringURL d'une icône, optionnelle.
authorobjectObjet { name, email, url }. Note : ce n'est plus une simple chaîne.
licensestringLicence du plugin.
repositorystringURL du dépôt source, affichée comme lien « Code source ».
homepagestringPage de présentation du plugin.
keywordsarrayMots-clés (16 maximum).
compatibilityobjectÉditions visées : { "scope": "core" } (compatible avec toutes les éditions) ou { "scope": "editions", "editions": [...] } (limité aux éditions listées).
dependenciesarrayIdentifiants d'autres plugins requis (voir Dépendances entre plugins).
capabilitiesarrayCapacités demandées (voir Capacités). Sans capacité, un plugin ne peut que calculer.
contributesobjectPoints d'extension déclarés : formules, menus, panneaux (voir Points d'extension).
signatureobjectSignature 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'extensionFormeEffet
formulasliste 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.
menusliste de { id, label }Ajoute des entrées de menu. Requiert la capacité ui:menu.
panelsliste 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:readLecture des échantillons de la base active.
samples:writeÉcriture des échantillons.
analysis:runExécution des pipelines d'analyse internes.
config:readLecture de la configuration persistante propre au plugin.
config:writeÉcriture de cette configuration.
ui:notifyAffichage d'une notification dans l'interface.
ui:menuAjout d'une entrée de menu.
ui:panelOuverture d'un panneau dans l'interface.
networkRequê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 signatureDescription
algorithmECDSA-P256 (courbe P-256, condensat SHA-256).
certificate_chainChaîne auteur vers Issuing CA, chaque certificat en base64 de PEM (au moins deux). La Root est épinglée côté vérificateur.
signature_b64Signature ECDSA en base64.
code_sha256Informatif. 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.

Activer ou désactiver un plugin 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é.

Accéder aux paramètres d'un plugin. 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
Paramètres globaux 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
Paramètres du mode air-gap. 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.

Paramètres du mode air-gap. 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éeRequisDescription
id, name, version, categoryRequisIdentité et catégorie du plugin.
download_urlRequisURL de l'archive .isplugin signée.
author, author_cnAuteur déclaré et sujet du certificat de signature, affiché tel quel quand le plugin est signé.
capabilities, sdk, compatibilityCapacités demandées (affichées avant téléchargement), version minimale du SDK, éditions compatibles.
dependencies, repositoryDépendances requises et dépôt source.
downloads, size, updated, iconMétadonnées d'affichage et de tri.
signedIndication 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.

PluginIdentifiantCatégorieRôle
Hub des extensionsplugin-hubtoolsPoint d'entrée des extensions, chargé automatiquement.
Datation 14Cc14-datinganalysisPanneau de datation au carbone 14.
Datation U-Thuth-datinganalysisDatation uranium-thorium, équation d'âge en système clos à partir des rapports d'activité.
Formules avancées tableurtableur-advanced-formulastoolsStatistiques, 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.