Représenter, pas exécuter
Flowora édite un document de graphe. Les nouveaux nœuds du catalogue sont des données de configuration, pas des objets dotés d’une méthode execute(). Un script reste une chaîne ; une condition reste une expression textuelle ; un email reste un brouillon ; un nœud RAG décrit une configuration. Le package ne les évalue pas et ne déclenche aucun appel d’IA, service, SMTP ou requête RAG.
Le playground et le studio sont des outils d’édition, pas des moteurs. Aucun contenu du graphe n’est passé à eval ou à un constructeur de fonction. L’attente utilisateur ne conserve pas de conversation ou session durable. Les groupes parent/enfant ne définissent ni portée de variables ni sous-workflow exécuté.
Pas de backend, authentification, compte, collaboration, facturation, déploiement de graphe, cloud, sandbox de scripts ou reprise de conversation. ELK calcule un placement visuel, pas un traitement métier.
Les bornes du store ne sont pas des benchmarks
Le modèle accepte au maximum 5 000 nœuds, 20 000 liens et 32 MiB pour le JSON compact encodé en UTF-8. La taille est contrôlée avant un commit, un import ou une écriture d’historique. loadJSON() refuse aussi un texte d’entrée dépassant 32 MiB : un fichier très indenté peut donc être refusé avant validation, même si sa forme compacte est plus petite.
Chaque direction d’un nœud accepte au maximum 1 000 ports. Une configuration JSON est bornée à une profondeur de 64 et à 100 000 valeurs. Les identifiants sûrs sont limités à 128 caractères. Positions et viewport doivent être finis ; les dimensions et le zoom sont positifs.
Ces plafonds concernent la validité du modèle, pas la fluidité du canvas, le quota navigateur ou la durée d’un layout. Aucune promesse de latence sur des milliers de nœuds n’est faite. Aucun benchmark comparatif Rete/n8n ou garantie de performances production ne découle des contrôles du package.
Un JSON sûr et un import atomique
La validation refuse fonctions, instances de classes, accesseurs, références circulaires, tableaux creux, nombres non finis et clés dangereuses comme __proto__, prototype et constructor. Elle rejette aussi les champs inconnus du modèle, les identifiants dupliqués et les références absentes. Utilisez les exports de validation plutôt qu’une assertion de type sur un JSON inconnu.
Ports directionnels, types compatibles et cardinalités sont contrôlés. Les cycles de connexions sont interdits par défaut ; l’option allowCycles peut les autoriser dans le modèle, mais n’installe aucun interpréteur. Les cycles de hiérarchie sont toujours refusés. Une erreur d’import laisse le document et l’état d’édition inchangés ; la réussite remplace tout le document. Consultez l’import/export atomique.
Le rendu, les gestes et les templates
Le renderer fourni présente les ajouts du catalogue en cartes de 220 × 112 et une palette en listes. Les dimensions explicites des documents importés sont conservées. Les groupes sont rendus avant leurs descendants et les liens derrière les cartes. Les templates custom doivent rester dans les dimensions du nœud et laisser les ports accessibles.
Les nœuds visibles sont montés, mais le renderer parcourt encore globalement les connexions. Le coût de rendu et de mémoire doit être mesuré sur vos appareils et vos graphes. Les contrôles d’un template ne doivent pas déclencher un déplacement accidentel ; un geste interrompu doit être annulé, pas finalisé silencieusement. Les transactions offrent cancelTransaction() pour restaurer document, sélection et viewport.
La compatibilité vérifiée avec Angular 22.2.4 et les contrôles du consommateur AOT/linker ne constituent pas une certification d’accessibilité, un audit juridique ou une campagne exhaustive souris, tactile, stylet, Safari/iPhone et lecteurs d’écran. La beta demande une validation adaptée à votre application et aux appareils ciblés.
Layout et historique restent locaux
ELK est optionnel et son calcul par défaut reste sur le thread principal : retourner une Promise ne signifie pas utiliser un Web Worker. Pour déporter le calcul, fournissez et validez votre propre LayoutAdapter. Ignorez les résultats qui concernent un graphe changé pendant le calcul.
L’historique conserve 64 snapshots par défaut. La limite est un nombre d’entrées, pas un budget mémoire, et son coût dépend des documents. Il n’est ni durable, ni un audit métier ; la sélection et le pan/zoom n’alimentent pas par défaut cet historique. Les transactions regroupent les gestes, mais leurs snapshots intermédiaires restent observables.
Local ne veut dire ni durable, ni secret
Les documents du studio restent liés à l’origine, au profil et au navigateur ; ils ne sont pas synchronisés dans un cloud. Quota, mode privé, restrictions ou effacement des données peuvent empêcher ou supprimer une sauvegarde. Si l’écriture échoue, le document reste en mémoire et l’export JSON reste disponible. Fermer ou recharger l’onglet avant de l’exporter peut perdre les changements.
Ne stockez jamais de secrets dans le graphe, son export ou localStorage. Une chaîne non exécutée peut néanmoins contenir des données sensibles. Les scripts autorisés de la même origine peuvent accéder au stockage ; une faille XSS dans l’hôte peut l’exposer. Les templates par défaut affichent les valeurs comme du texte : vos templates custom doivent maintenir cette séparation et ne pas injecter du HTML utilisateur.
Quand vous connectez un moteur externe
Compilez explicitement le document vers un contrat d’exécution indépendant. Validation métier, authentification, permissions, secrets, approbations, réseau, isolation de scripts et politique de rétention sont à la charge de votre application. L’acceptation d’un document par le store n’atteste pas qu’il est sûr à exécuter dans un autre système.
Les exemples sont exclusivement fictifs : pas de donnée client, capture privée ou identifiant d’accès. Le package reste indépendant de Rete et de Workify. Sa licence MIT ne modifie pas les obligations des composants tiers. Une candidate validée et des dépendances auditées à un instant donné ne constituent pas un audit complet de sécurité ni une preuve de publication npm ou du site.