Djinious
DjiniousWorkflowAutomatisation agentique

Automatisez le travail.Gardez les preuves.

Moteur d’automatisation par graphesChaque étape

DjiniousWorkflow exécute vos opérations sous forme de graphes : 330 nœuds couvrant les branches, les boucles, les jonctions et l’approbation humaine ; les bases de données, les brokers, les fichiers et les API SaaS ; et les modèles, là où un modèle est le bon outil. Chaque exécution est un document que vous pouvez ouvrir — quel nœud a tourné, ce qu’il a produit, qui l’a approuvé, et ce qu’il a laissé derrière lui.

DjiniousWorkflow
Une exécution terminée de DjiniousWorkflow pour une sonde de disponibilité synthétique : trois vérifications d’endpoint en parallèle, l’une d’elles en échec et en rouge avec son message d’erreur, les autres en vert, et le tableau publié par l’exécution dans le panneau de sortie.
Une vérification de disponibilité toutes les cinq minutes, un événement par endpoint. Deux ont répondu ; le troisième ne s’est pas résolu, a été retenté deux fois avec un backoff, et est sorti par sa branche d’erreur — qui a ouvert un incident et alerté l’équipe responsable. L’exécution s’est tout de même terminée en vert, car c’est ce que le graphe indique devoir se produire pour un endpoint hors service.
nœuds livrés, répartis sur 19 outils
330nœuds livrés, répartis sur 19 outilsplus ceux que vous construisez dans l’application
état d’exécution conservé dans un processus
0état d’exécution conservé dans un processusfile · jonctions · attentes · minuteries sont des lignes
voies d’accès sans navigateur
3voies d’accès sans navigateurREST · MCP · Provider Interface v1
identifiants scellés au repos
AES-256-GCMidentifiants scellés au reposaucun endpoint ne renvoie la valeur d’un secret

Ce que c’est

Un seul moteur pour le travail trop modeste pour un service et trop important pour un tableur

La plupart des outils d’automatisation ne sont qu’un déclencheur, une liste d’étapes et un fichier journal. Cela suffit jusqu’au jour où une étape échoue à mi-chemin, où un lot a besoin de la signature d’une personne, ou où quelqu’un demande à partir de quoi le chiffre du tableau de bord a réellement été calculé. DjiniousWorkflow est construit autour de ces trois questions plutôt qu’autour du chemin nominal.

Un graphe, pas un script

Éclatez une liste en un événement par élément, rassemblez les résultats, exécutez deux chemins à la fois et joignez-les, appelez un autre graphe et attendez sa réponse. La structure est sur le canevas, si bien que la forme du travail est la première chose que voit un nouveau collègue.

branches · boucles · jonctions · sous-workflows

330 nœuds dans le catalogue

Contrôle de flux, mise en forme de données, verbes de dataframe, JavaScript en bac à sable, HTTP et GraphQL, prompts et agents LLM, CRUD d’entités — et des connecteurs : bases de données SQL et documentaires, stockages d’objets et fichiers, brokers, notifications, et une longue traîne d’API SaaS.

19 outils · un fichier chacun

Des exécutions que vous pouvez observer

Une exécution se dessine elle-même : chaque nœud affiche son état sur le canevas pendant son exécution, le journal explique ce qui s’est passé, et la sortie d’un nœud s’ouvre en pleine page — triable, filtrable, représentable en graphique, exportable. Ouvrez une exécution terminée une semaine plus tard, les widgets sont toujours là.

en direct, nœud par nœud

Une personne dans la boucle, pour de bon

Un graphe peut s’arrêter et attendre une décision. L’approbation en attente est une ligne, pas un thread bloqué, si bien qu’une exécution peut patienter dessus pendant des jours, à travers des redémarrages, et répondre depuis n’importe quelle réplique que la personne atteint. Le rejet est un chemin de premier rang, pas une erreur.

les approbations sont des lignes de base de données

Des pages qu’un graphe publie

Un nœud views:* écrit dans une page enregistrée qui survit à l’exécution — un tableau, un graphique, une métrique, une carte. Republier remplace les données là où la page a été agencée pour les recevoir, et chaque chiffre qui y figure se retrace jusqu’à une exécution que vous pouvez ouvrir.

vues · panneaux par clé

Projets, artefacts et enregistrements

Les graphes vivent dans des projets avec les ressources qu’ils partagent : données, documents, fichiers et liens. Une exécution peut écrire un enregistrement dans votre propre ontologie, classer un tableur dans le stockage d’objets, ou laisser un lien — chacun estampillé de l’exécution qui l’a produit.

où va la sortie

Dans le produit

Voyez-la fonctionner.

Chaque capture ci-dessous est le produit en fonctionnement.

01 · Construire

Glissez, câblez, et définissez des paramètres qui savent ce qu’ils sont

Glissez un nœud depuis le catalogue, câblez-le, et définissez ses paramètres dans l’inspecteur. Chaque paramètre accepte une expression, si bien qu’une valeur peut provenir du payload, du contexte d’exécution, du compteur de boucle ou d’un autre nœud — et un nœud qui a besoin d’un identifiant en nomme un plutôt que de le détenir.

  • 330 nœuds répartis sur 19 outils, cherchables par nom ou par catégorie
  • Des expressions partout : {{$input.total}}, {{$merged[1].id}}, {{$settings.region}}
  • Un nœud dont vous avez besoin mais que le catalogue n’a pas se construit dans l’application, pas dans un fork
  • La validation est en direct : l’en-tête indique si le graphe est exécutable, et sinon pourquoi
DjiniousWorkflow
Le canevas DjiniousWorkflow montrant un graphe de rapprochement de factures à six nœuds : un nœud de départ, un script de rapprochement à trois voies, une branche if/else, deux nœuds de données pour les deux issues, et un nœud de fin.
Une facture confrontée à son bon de commande et à son bon de réception. Six nœuds, une branche, et chaque nœud affichant la fonction qu’il appelle sous son nom — ce qui rend un graphe lisible par quelqu’un qui ne l’a pas écrit.

02 · Exécuter

Chaque voie aboutit à la même file

Déclenchez-la à la main, selon une planification cron, depuis un webhook entrant, depuis l’API REST, depuis un autre graphe, ou depuis un agent via MCP. Chaque voie aboutit à la même file, et chaque exécution consigne laquelle ce fut.

  • Des planifications cron avec un fuseau horaire, réclamées de sorte qu’une seule réplique déclenche chaque occurrence
  • Des webhooks entrants avec un jeton par déclencheur
  • Un graphe peut en appeler un autre et attendre son résultat — de la décomposition, pas de la duplication
  • Des nouvelles tentatives avec un backoff exponentiel, et une branche d’erreur quand les tentatives sont épuisées
DjiniousWorkflow
La page des planifications de DjiniousWorkflow listant les planifications cron des graphes de démonstration avec leurs prochaines heures d’exécution.
Les planifications sont des lignes avec une heure de prochaine exécution, réclamées de façon atomique. Deux répliques en compétition pour la même occurrence est le cas normal, et une seule d’entre elles l’emporte.

03 · Observer

Le canevas, où la vérité s’affiche

Le moniteur d’exécution dessine le graphe pendant son déroulement : un indicateur de chargement pendant qu’un nœud travaille, une coche avec son nombre de répétitions, une marque rouge portant le message d’échec. Les nœuds qui publient un widget le dessinent sur place, et le panneau de journal explique le reste. Le moniteur d’exécution et l’éditeur sont le même composant face à une question différente : un opérateur qui observe un échec et un auteur qui le corrige devraient voir la même image.

  • En direct via un websocket, et également interrogé par sondage — le socket est une optimisation de latence, jamais la source de vérité
  • Mettez en pause, avancez pas à pas, arrêtez, ou déclenchez un seul nœud à la main pendant que l’exécution est en cours
  • Les widgets se rejouent quand vous ouvrez une exécution terminée : le journal les porte, pas seulement le socket
  • Une approbation en attente d’une personne apparaît dans le rail, avec le payload sur lequel elle porte
DjiniousWorkflow
Une exécution DjiniousWorkflow en attente d’une approbation humaine : le rail montre le lot en cours de libération, un bouton Approuver et un bouton Rejeter, et un champ pour le motif de rejet.
Une exécution de paiement au-dessus de la limite déléguée, arrêtée devant une personne. Le rail porte le lot sur lequel elle porte ; l’exécution a été suspendue dans la base de données, si bien qu’elle ne coûte rien pendant l’attente et survit au redémarrage de chaque réplique.

04 · Publier

Laissez quelque chose derrière vous

Un graphe qui ne fait que journaliser est un graphe que personne ne lit. Ceux-ci publient : une page de panneaux, un enregistrement dans votre propre ontologie, un fichier dans le projet, une notification, un webhook sortant. Chacun est adressé par nom, si bien que l’exécution suivante le remplace au lieu de s’empiler à côté.

  • Vues : tableaux, graphiques, métriques, markdown et cartes, agencés par celui qui les lit
  • Entités : des enregistrements dans l’ontologie que vous avez définie, estampillés de l’exécution qui les a écrits
  • Artefacts : valeurs, documents et fichiers réels — les octets vont vers le stockage d’objets, les petits payloads restent dans la base de données
  • Des notifications dans l’application, et des webhooks sortants pour tout le reste
DjiniousWorkflow
La page de synthèse Revenue dans DjiniousWorkflow : une métrique de chiffre d’affaires depuis le début du trimestre, une métrique de prospects notés, une jauge de qualité du pipeline, un commentaire rédigé, un graphique des réservations par semaine et deux tableaux.
Une page, trois graphes. Les métriques proviennent du balayage nocturne, le graphique et les tableaux de la revue du lundi, et le paragraphe en haut de page est le modèle qui lit les chiffres calculés par le graphe — jamais qui les produit.

05 · L’explorateur

N’importe quel payload, en pleine page

Le coup d’œil que vous jetez pendant qu’une exécution tourne n’est pas le regard que vous portez quand ce coup d’œil a soulevé une question. La sortie de n’importe quel nœud s’ouvre en pleine page — triable, filtrable par colonne, cherchable, représentable en graphique, profilable, exportable en CSV — et cela fonctionne même sur le simple nœud sql:query que personne n’a habillé, car il lit le résultat propre de la tâche quand aucun widget n’est publié.

  • Lignes, graphique, statistiques et JSON brut du même payload, à un clic d’écart
  • Sélection des colonnes, filtres par colonne, pagination et recherche sur tout
  • Enregistrez la configuration — le tri, les filtres, les colonnes masquées, le graphique — sur une page
  • Ce qui est enregistré, c’est la configuration, jamais les données : la nouvelle page est aussi fraîche que la dernière exécution de son graphe
DjiniousWorkflow
La sortie d’un nœud DjiniousWorkflow ouverte en pleine page : le plan de réapprovisionnement sous forme de tableau triable et filtrable avec des contrôles de colonnes, des onglets statistiques et graphique, et un export CSV.
La sortie du planificateur de réapprovisionnement, ouverte depuis l’exécution qui l’a produite. Rien n’a été configuré pour que cela fonctionne : l’explorateur lit le résultat propre de la tâche.

06 · Le constructeur de nœuds

Le nœud dont vous avez besoin, sans fork

Une partie de ce qu’un déploiement automatise est spécifique à ce déploiement : un service REST interne, un endpoint GraphQL derrière votre VPN, une instruction SQL que tout le monde réécrit sans cesse. Les intégrer en dur dans un produit serait une erreur, et exiger une pull request pour les obtenir est pire encore. C’est donc l’application qui les construit : décrivez l’appel, nommez ses paramètres, testez-le sur l’endpoint réel, et il atterrit dans le catalogue.

  • HTTP, GraphQL, SQL, un script, ou un autre graphe encapsulé en une seule étape
  • Des paramètres que vous déclarez, avec les mêmes contrôles typés que les nœuds intégrés
  • Testez-le avant l’enregistrement, avec l’identifiant qu’il utilisera en production
  • La palette, la page de référence, la liste d’outils MCP et l’assistant le prennent en compte immédiatement
DjiniousWorkflow
Le constructeur de nœuds DjiniousWorkflow : un formulaire décrivant le type d’un nœud, ses paramètres et sa requête, avec un panneau pour le tester sur l’endpoint réel avant l’enregistrement.
Décrivez l’appel, déclarez ses paramètres, testez-le sur l’endpoint qu’il utilisera en production, et il est dans le catalogue — palette, page de référence, liste d’outils MCP et assistant compris.

IA et agents

Utilisez un modèle là où un modèle est pertinent. Gardez les règles là où vous pouvez les lire.

Un modèle de langage est très bon pour lire de la prose et mauvais pour être audité. Dans ce produit, il lit donc le ticket, rédige la phrase ou explique le tableau — tandis que la file d’attente, le seuil, la tolérance et l’approbation restent dans des nœuds qu’un collègue peut ouvrir et modifier. Les deux moitiés vivent sur le même canevas, ce qui rend cette séparation visible plutôt que théorique.

01

Quatre nœuds, pas un mode

ai:prompt renvoie du texte. ai:extract renvoie un JSON conforme à un schéma que vous avez écrit, et retente une fois en renvoyant l’erreur de parsing. ai:classify renvoie exactement l’un de vos labels. ai:agent exécute une boucle d’appel d’outils avec une mission, une liste d’autorisation et un plafond d’étapes. Chacun est un nœud comme un autre — délai d’expiration, politique de nouvelle tentative, branche d’erreur.

02

Le modèle ne produit jamais le chiffre

Dans les graphes livrés avec le produit, les totaux, les écarts et les scores sont calculés par des nœuds. Le modèle reçoit le résultat et doit écrire la phrase qui l’accompagne. Quand un chiffre et un paragraphe se contredisent, vous savez lequel a été mesuré — et c’est le paragraphe qui change.

03

Chaque nœud IA a une façon d’échouer

Le classificateur de la démonstration retombe sur un jeu de règles à mots-clés ; son nœud de commentaire retombe sur une phrase simplement formulée, et la page est quand même construite. Une automatisation qui s’arrête parce qu’un point de terminaison d’inférence a un mauvais après-midi n’est pas une automatisation que l’on place devant des clients, et c’est dans le graphe que cette décision a sa place.

04

Votre point de terminaison, vos données

Pointez-le vers un éditeur ou vers un modèle que vous exploitez vous-même. Tout ce qui est compatible OpenAI fonctionne, y compris vLLM, SGLang, LM Studio et llama.cpp sur votre propre matériel — de sorte qu’un déploiement qui ne peut envoyer aucun texte à un tiers peut quand même utiliser tous les nœuds IA.

05

Un assistant qui construit des graphes, via l’API que vous avez déjà

L’assistant intégré est un agent à appel d’outils placé devant la surface propre de la plateforme : lister le catalogue, rédiger un workflow, l’exécuter, lire ses journaux, interroger les entités, résoudre une approbation. C’est un client de la même API REST que vous, soumis aux mêmes contrôles de rôle — et ses appels d’outils sont visibles au fur et à mesure, arguments et résultats compris : une trace, pas un résumé.

06

Des agents hors de l’application, via MCP

Un assistant de code, un analyste planifié ou votre propre outillage peuvent lister le catalogue, créer un workflow, l’exécuter, le suivre, lire les journaux et répondre à une approbation. La liste d’outils est générée à partir du même catalogue que lit la palette, si bien qu’un nœud construit dans ce déploiement apparaît immédiatement dans la liste d’outils de l’agent — les capacités d’un agent et celles d’une personne restent alignées par construction.

DjiniousWorkflow
La page des agents de DjiniousWorkflow répertoriant les définitions d’agents enregistrées avec leur mission, leurs outils autorisés et leurs limites d’étapes.
Une définition d’agent est un enregistrement, pas un prompt enfoui dans un nœud. Changez la mission une seule fois, et tous les graphes qui la référencent par son nom exécutent la nouvelle version.

Capacités

Toute la surface, pièce par pièce

DjiniousWorkflow est une API Bun unique au-dessus de SurrealDB, avec un client React par-dessus : un moteur, un catalogue de nœuds, un endroit où vivent les graphes, et trois voies d’accès qui ne passent pas par un navigateur — ce qui construit, ce qui déclenche, ce qui exécute, ce qu’un graphe atteint, et ce qu’il laisse derrière lui.

Conception4 capacités

Le graphe est le document

Un workflow est un ensemble de tâches, chacune appelant une fonction du catalogue, les liaisons vivant dans les entrées et sorties propres des nœuds. Cela fait d’un graphe un document autonome que vous pouvez exporter, comparer dans une pull request, et importer ailleurs — pas une base de lignes qui n’ont de sens qu’au sein d’une seule installation.

330 nœuds, 19 outils

Contrôle de flux (23), mise en forme de données (15), verbes de dataframe (20), transformations (19), JavaScript en bac à sable (2), HTTP (6), IA (4), CRUD d’entités (6), artefacts (4), widgets d’exécution (10), pages (7), notifications (2) — et les connecteurs : SQL (40), bases documentaires et clé-valeur (25), analytique et recherche (22), brokers (11), fichiers et stockage d’objets (30), push et courrier électronique (37), API SaaS (47).

Des paramètres qui savent ce qu’ils sont

Un paramètre déclare son type, son texte d’aide, s’il est obligatoire, et même s’il est pertinent — un nœud HTTP masque le corps sur un GET. Un paramètre d’identifiant propose les identifiants de ce type et rien d’autre. Chaque paramètre accepte également une expression, si bien qu’une valeur peut provenir du payload, du contexte d’exécution ou du compteur de boucle.

Validation pendant que vous construisez

L’en-tête indique si le graphe est exécutable et, sinon, quel nœud et quelle liaison posent problème. Un brouillon a le droit d’être incomplet — vous enregistrez au fur et à mesure que vous construisez — mais une exécution refuse une définition invalide plutôt que de la découvrir trois nœuds plus loin.

Déclenchement4 capacités

Planifications cron

Une planification est une ligne avec une expression cron, un fuseau horaire optionnel et une heure de prochaine exécution. Les occurrences sont réclamées de façon atomique, si bien qu’avec quatre répliques en fonctionnement, une seule d’entre elles déclenche chaque occurrence — le cas ordinaire, pas une compétition à éviter.

Webhooks entrants

Un déclencheur émet son propre jeton et répond à sa propre URL. Le corps devient l’entrée de l’exécution, et le déclencheur peut nommer la tâche d’entrée, si bien qu’un seul graphe peut servir plusieurs sources sans nœud routeur devant lui.

Exécuter depuis n’importe où

Un seul appel démarre une exécution ; des jetons API délimités (djwf_…) permettent à un script ou une tâche de CI de le faire sans session utilisateur. Un graphe peut aussi en démarrer un autre — sans attendre le résultat, ou en attendant son résultat.

Piloté par l’humain, délibérément

Certaines exécutions doivent démarrer quand une personne appuie sur un bouton, et une exécution peut aussi s’arrêter en plein vol sur un nœud ui:trigger et reprendre quand quelqu’un en appuie un sur le canevas. L’attente est une ligne comme les autres, si bien que l’appui peut atterrir sur n’importe quelle réplique.

Exécution4 capacités

Un moteur sans état

Chaque élément de l’état d’exécution — la file de ce qui reste à faire, les arrivées partielles d’une jonction, une approbation suspendue, une minuterie répétitive — est une ligne dans la base de données. Un processus ne contribue qu’une boucle de worker, rien de plus, si bien que monter en charge revient à exécuter plus de répliques, et le travail d’un nœud qui meurt est repris par les autres.

Éclatement et rassemblement

For each transforme un tableau en un événement par élément, et Collect les rassemble ensuite. Chaque arrivée est sa propre ligne plutôt qu’un ajout à un tableau partagé, ce qui empêche un éclatement à quarante voies de se contrarier lui-même, et ce qui permet à un rassemblement de survivre au worker qui l’a démarré.

Des nouvelles tentatives, puis une branche

Un nœud peut retenter avec un backoff exponentiel. Quand les tentatives sont épuisées, le payload sort par la branche d’erreur — en portant le message d’échec et le payload qui a échoué — si bien que le graphe le traite au lieu que l’exécution meure. Sans branche d’erreur câblée, le paramètre propre du workflow décide entre faire échouer l’exécution et laisser les autres branches se terminer.

Les longues attentes ne coûtent rien

Une approbation, un signal entrant, un délai de six heures, un intervalle qui se déclenche toutes les dix minutes : aucun d’eux n’occupe un worker. Ce sont des lignes portant une heure ou un statut, ce qui explique qu’une exécution puisse patienter sur une décision pendant des jours, à travers des redémarrages.

Ce qu’un graphe atteint4 capacités

Bases de données et stockages

PostgreSQL, MySQL, MariaDB, SQLite, CockroachDB, Timescale, QuestDB, Supabase, Redshift, Yugabyte ; MongoDB, CouchDB, Redis et consorts ; ClickHouse, Elasticsearch, OpenSearch, Meilisearch, Typesense, Qdrant, InfluxDB, Prometheus, BigQuery. Query, select, insert, upsert, update, delete, transaction — plus les nœuds d’introspection qui listent et décrivent les tables.

Fichiers, objets et brokers

CSV, XML, YAML, JSONL, Excel et ZIP comme nœuds de format pur, sans aucun réseau ; S3, FTP et SFTP comme nœuds d’emplacement qui déplacent des octets ; Kafka, RabbitMQ, MQTT et NATS pour les files. Les nœuds de consommation sont bornés et l’indiquent.

Identifiants scellés

Un nœud connecteur nomme un identifiant ; l’identifiant détient la valeur, scellée avec AES-256-GCM, et aucun endpoint ne la renvoie. Le même graphe s’exécute contre la préproduction et la production en pointant vers un identifiant différent portant le même nom.

Un nœud que le catalogue n’a pas

Construisez-le dans l’application : un appel HTTP, une requête GraphQL, une instruction SQL, un script, ou un autre graphe encapsulé en une seule étape. Il atterrit dans le même catalogue que les nœuds intégrés, si bien que la palette, la page de référence, la liste d’outils MCP et l’assistant le prennent tous en compte immédiatement — sans fork et sans déploiement.

Ce qu’il laisse derrière lui4 capacités

Pages

Un nœud views:* écrit un tableau, un graphique, une métrique, du markdown ou une carte dans une page enregistrée. Les panneaux sont adressés par clé, si bien que republier remplace les données là où la page a été agencée pour les recevoir et conserve le titre et la taille choisis par une personne. Un workflow est le seul à écrire les données d’un panneau — la surface REST l’impose.

Enregistrements

Les types d’entités se définissent à l’exécution — des champs, une machine à états, une icône — et un graphe y écrit des enregistrements. Chaque enregistrement porte l’id de l’exécution qui l’a produit, si bien qu’un chiffre sur une page se retrace jusqu’à l’exécution qui l’a calculé.

Fichiers et ressources

Un projet contient des artefacts : données, documents, images, vidéos et liens. L’endroit où vont les octets est une décision de la plateforme, pas de l’appelant — les petits payloads restent dans la base de données, les fichiers réels vont vers le stockage d’objets compatible S3, et une URL est stockée comme une référence plutôt que comme une copie.

Hors les murs

Notifications dans l’application, webhooks sortants, e-mail via SMTP, et les connecteurs de push et de messagerie pour tout le reste. Un graphe qui se termine en silence est un graphe auquel personne ne fait confiance deux fois.

Où vit le travail3 capacités

Un projet est un espace de travail

Les graphes vivent dans un projet avec les ressources qu’ils partagent, et un graphe atteint les ressources de son projet par nom — si bien que le même graphe cloné dans un autre projet lit la copie propre à ce projet de « la liste source ». Chaque workflow appartient à exactement un projet ; il n’existe pas d’état non classé à ranger plus tard.

Une ontologie que vous définissez à l’exécution

Les types d’entités se configurent, ils ne se codent pas : des champs typés, une machine à états avec ses transitions, une icône et une couleur. Un graphe y écrit des enregistrements, et l’enregistrement porte l’exécution qui l’a écrit — c’est ainsi qu’un chiffre sur un tableau de bord se retrace jusqu’à une exécution.

Import, export, diff

Un workflow s’exporte comme un seul document JSON et s’importe dans un autre déploiement. C’est ce qui rend un graphe relisable dans une pull request, et ce qui fait de « promouvoir ceci depuis la préproduction » un fichier plutôt qu’une migration.

Être piloté4 capacités

L’API REST est le produit

Tout ce que fait l’interface est un appel API, et l’interface n’est qu’un client parmi d’autres. Des jetons délimités (djwf_…) permettent à un script, une tâche de CI ou un autre service de créer, exécuter et inspecter un workflow sans session utilisateur.

MCP, dans le même processus

Un serveur MCP répond dans le même processus : lister le catalogue, créer un workflow, l’exécuter, lire ses journaux, résoudre une approbation, interroger des entités. Un agent disposant de cet endpoint peut construire et exploiter une automatisation sans navigateur — et les outils qu’il voit sont générés à partir du même catalogue que lit la palette.

Interface fournisseur v1

Le contrat de plateforme à travers lequel les autres applications Djinious et djinious-atoms pilotent celle-ci : un registre d’opérations versionné, un document /capabilities, et un instantané OpenAPI validé dans le dépôt avec un test unitaire qui échoue en cas de dérive — car la CI d’un consommateur est écrite contre ce fichier.

Des rôles qui ont un sens

Administrateur, utilisateur et lecteur. Un lecteur voit les workflows, les exécutions et les journaux, et ne peut en modifier aucun — y compris le fait qu’un nœud personnalisé existe, sans en voir l’implémentation, et jamais la valeur d’un identifiant. Les contrôles vivent à côté des gestionnaires de route, pas seulement dans l’interface.

Confiance

Un worker ne conserve aucun état. C’est toute la conception.

La file de ce qu’il faut faire ensuite, les arrivées partielles d’une jonction, une approbation suspendue, une minuterie répétitive — chacune de ces choses est une ligne dans la base de données. Un processus n’apporte qu’une boucle de worker, rien d’autre. Tout ici en découle, y compris les aspects gênants — c’est pourquoi les limites sont, elles aussi, annoncées clairement.

Les événements sont loués, pas détenus

Un worker revendique un événement au moyen d’un bail. S’il termine, l’événement est marqué complet et ses conséquences sont mises en file avant que la revendication ne soit libérée — il n’existe donc jamais d’instant où la file paraît vide alors qu’un travail est encore en cours. Si le worker meurt, le bail expire et un autre worker reprend l’événement. La livraison se fait au moins une fois, et le moteur le dit clairement plutôt que de laisser croire à une livraison exactement une fois.

revendication · bail · reprise

Les arrivées d’un rassemblement sont des lignes

L’implémentation évidente d’une convergence consiste à ajouter à un tableau sur un seul enregistrement. Cet enregistrement devient un point de contention, et sous une divergence à quarante branches, les perdants de chaque conflit d’écriture perdent silencieusement leurs éléments. Ici, chaque arrivée est sa propre ligne avec son propre identifiant, et l’achèvement est revendiqué en prenant les lignes : un seul worker les obtient, les autres se retirent.

une ligne par arrivée, jamais un tableau

Une jonction s’achève une fois, sur n’importe quel nœud

Les branches d’une jonction arrivent sur des workers différents au même instant, par conception. L’arrivée qui l’achève est décidée par une revendication conditionnelle plutôt que par une lecture-puis-vérification, car une lecture-puis-vérification n’est que la même course déplacée d’un cran. C’est ici que le moteur s’est trompé par le passé, et les deux bugs sont épinglés par des tests qui font terminer dix branches ensemble, cinq fois de suite.

compter, puis revendiquer

Attendre ne coûte rien

Une approbation, un signal entrant, un délai, un intervalle : chacun est une ligne portant un statut ou une heure. Aucun worker n’est mis en attente, aucun thread n’est retenu, aucune mémoire n’est immobilisée. Une exécution peut attendre une personne pendant des jours et survivre au redémarrage de chaque réplique entre-temps — et la réponse peut arriver sur n’importe quelle réplique que cette personne atteint.

wf_wait · wf_timer

Monter en charge, c’est en exécuter davantage

Chaque réplique exécute la même boucle contre la même base de données. Il n’y a pas de coordinateur à élire ni de fragment à attribuer : elles se disputent les événements, et c’est la revendication qui tranche. Une occurrence de planification est revendiquée de la même façon, si bien que quatre répliques ne signifient pas quatre exécutions à 07:00.

file partagée, pas de leader

Les secrets ne sont pas dans le graphe

Un nœud connecteur nomme un identifiant ; l’identifiant détient la valeur, scellée, et aucun point de terminaison ne la renvoie — ni à l’interface, ni à l’API, ni à un agent. C’est ce qui permet au même graphe d’être exporté, revu dans une pull request et importé dans un autre déploiement sans qu’un secret ne voyage avec lui.

AES-256-GCM au repos

Chaque exécution est un document, et le reste

Une exécution conserve le graphe tel qu’il était à son démarrage, le statut de chaque tâche, le nombre de répétitions, le dernier résultat et la dernière erreur, son registre d’événements, et son journal avec les widgets publiés rejoués à l’intérieur. Les enregistrements qu’un graphe a écrits portent l’identifiant d’exécution, et les artefacts portent l’exécution qui les a déposés — si bien que le chiffre affiché sur une page publiée peut être retracé jusqu’à l’exécution qui l’a produit.

l’enregistrement d’exécution

Rôles et jetons

Les rôles sont vérifiés à côté des gestionnaires de route, reflétés dans l’interface, jamais uniquement dans l’interface. Les jetons djwf_ à portée limitée pour les scripts, la CI et les agents sont émis et révoqués par consommateur, et une liste d’autorisation (WORKFLOW_HTTP_ALLOWLIST) borne les destinations qu’un graphe peut appeler, quand vous en voulez une.

administrateur · utilisateur · lecteur · djwf_

Limite : livraison au moins une fois

Un nœud qui meurt entre l’exécution de son travail et son enregistrement sera relancé. L’idempotence est donc la responsabilité de l’auteur là où elle compte, et les nœuds connecteurs du catalogue sont écrits pour la rendre facile — des upserts plutôt que des insertions, des artefacts nommés plutôt qu’ajoutés.

annoncée, pas cachée

Limite : la base de données est le plancher

Le débit est borné par SurrealDB, car chaque événement, arrivée, attente et minuterie est une écriture. C’est un compromis délibéré : les modes de défaillance qu’il élimine valent plus que le plafond qu’il impose pour le travail auquel ce moteur est destiné. Ce n’est pas le bon moteur pour un million d’événements par seconde.

annoncée, pas cachée

Limite : en bac à sable, pas isolé

Un nœud JavaScript s’exécute dans un worker Bun avec un délai d’expiration, ce qui contient une erreur et une boucle infinie. Ce n’est pas une frontière de sécurité contre un auteur malveillant, et ce sont les propres contrôles du déploiement — qui a le droit d’écrire un graphe — qui tiennent ce rôle. Les nœuds de fichiers locaux sont confinés à une racine configurée, et désactivés plutôt que laissés sans restriction lorsque cette racine n’est pas définie.

annoncée, pas cachée

Dans le fil numérique

Ce qu’elle reçoit. Ce qu’elle transmet.

DjiniousWorkflow assure sa part de la boucle d’ingénierie et transmet ses preuves — et fonctionne tout aussi bien seule.

DjiniousWorkflowAutomatisation agentique

Livre

DjiniousEngineeringDes résultats déposés dans le System Ledger via les nœuds de ledger typés qu’un graphe utilise à chaque exécution d’ingénierie.DjiniousLabDes appels à ses capacités, effectués depuis un graphe via le catalogue fédéré djinious-atoms — un seul chemin de répartition et un seul identifiant pour chaque application Djinious.DjiniousWorkshopDes appels à ses capacités, effectués depuis un graphe via le catalogue fédéré djinious-atoms — un seul chemin de répartition et un seul identifiant pour chaque application Djinious.DjiniousSafeDes appels à ses capacités, effectués depuis un graphe via le catalogue fédéré djinious-atoms — un seul chemin de répartition et un seul identifiant pour chaque application Djinious.DjiniousWorldDes appels à ses capacités, effectués depuis un graphe via le catalogue fédéré djinious-atoms — un seul chemin de répartition et un seul identifiant pour chaque application Djinious.DjiniousMapDes appels à ses capacités, effectués depuis un graphe via le catalogue fédéré djinious-atoms — un seul chemin de répartition et un seul identifiant pour chaque application Djinious.DjiniousDataDes appels à ses capacités, effectués depuis un graphe via le catalogue fédéré djinious-atoms — un seul chemin de répartition et un seul identifiant pour chaque application Djinious.DjiniousCCDes appels à ses capacités, effectués depuis un graphe via le catalogue fédéré djinious-atoms — un seul chemin de répartition et un seul identifiant pour chaque application Djinious.
Seule

À lui seul, c’est un moteur d’automatisation complet : 330 nœuds atteignant bases de données, courtiers de messages, fichiers, API SaaS et modèles, avec son état d’exécution, ses approbations et ses planifications dans sa propre base de données. Six projets de démonstration départementaux sont livrés avec lui et s’exécutent sans aucune autre application Djinious.

Réserver une démo

Voyez-la sur votre problème.

Quatre-vingt-dix minutes sur votre propre travail, pas une visite scénarisée. Nous le construisons devant vous, l’exécutons, et cassons un nœud exprès — parce que la façon dont un graphe échoue est ce que vous achetez réellement.

  1. Prenez un processus que vous exécutez aujourd’hui à la main — celui avec le tableur, l’approbation et la personne qui le relance
  2. Construisez-le sur le canevas sous vos yeux, avec les nœuds qui lisent vos propres systèmes
  3. Exécutez-le, et ouvrez l’exécution : chaque nœud, ce qu’il a produit, le temps que cela a pris
  4. Cassez un nœud exprès et montrez-vous ce que le graphe en fait — nouvelles tentatives, puis la branche d’erreur
  5. Mettez-le en attente sur une approbation, fermez le navigateur, rouvrez-le, et répondez à l’approbation
  6. Laissez-vous la page qu’il a publiée, et le graphe comme un fichier que vous pouvez garder