Djinious
DjiniousWorkflowAutomazione ad agenti

Automatizza il lavoro.Conserva le ricevute.

Motore di automazione a grafoOgni fase

DjiniousWorkflow esegue le tue operazioni come grafi: 330 nodi che coprono rami, loop, join e approvazione umana; database, broker, file e API SaaS; e modelli, dove un modello è lo strumento giusto. Ogni esecuzione è un documento che puoi aprire — quale nodo è stato eseguito, cosa ha prodotto, chi lo ha approvato e cosa ha lasciato dietro.

DjiniousWorkflow
Un'esecuzione completata di DjiniousWorkflow di una sonda di uptime sintetica: tre controlli di endpoint paralleli, uno di essi fallito e rosso con il proprio messaggio di errore, gli altri verdi, e la tabella che l'esecuzione ha pubblicato nel pannello di output.
Un controllo di uptime ogni cinque minuti, un evento per endpoint. Due hanno risposto; il terzo non si è risolto, ha ritentato due volte con backoff, ed è uscito dal proprio ramo di errore — che ha aperto un incidente e allertato il team proprietario. L'esecuzione è comunque terminata verde, perché è ciò che il grafo dice debba accadere a un endpoint che è fuori servizio.
nodi spediti, su 19 strumenti
330nodi spediti, su 19 strumentipiù quelli che costruisci nell'app
stato dell'esecuzione tenuto in un processo
0stato dell'esecuzione tenuto in un processocoda · join · attese · timer sono righe
modi di accesso senza browser
3modi di accesso senza browserREST · MCP · Provider Interface v1
credenziali sigillate a riposo
AES-256-GCMcredenziali sigillate a riposonessun endpoint restituisce il valore di un segreto

Cos’è

Un solo motore per il lavoro troppo piccolo per un servizio e troppo importante per un foglio di calcolo

La maggior parte degli strumenti di automazione sono un trigger, un elenco di passi e un file di log. Basta fino al giorno in cui un passo fallisce a metà, un batch ha bisogno della firma di una persona, o qualcuno chiede da cosa è stato effettivamente calcolato il numero sulla dashboard. DjiniousWorkflow è costruito attorno a queste tre domande anziché attorno al percorso ideale.

Un grafo, non uno script

Espandi una lista in un evento per elemento, raccogli di nuovo i risultati, esegui due percorsi contemporaneamente e uniscili, chiama un altro grafo e attendi la sua risposta. La struttura è sul canvas, così la forma del lavoro è la prima cosa che vede un nuovo collega.

rami · loop · join · sub-workflow

330 nodi nel catalogo

Controllo di flusso, modellazione dei dati, verbi dataframe, JavaScript sandboxed, HTTP e GraphQL, prompt e agenti LLM, CRUD di entità — e connettori: database SQL e documentali, object store e file, broker, notifiche, e una lunga coda di API SaaS.

19 strumenti · un file ciascuno

Esecuzioni che puoi osservare

Un'esecuzione si disegna da sola: ogni nodo mostra il proprio stato sul canvas mentre viene eseguito, il log spiega cosa è successo, e l'output di un nodo si apre a pagina intera — ordinabile, filtrabile, graficabile, esportabile. Apri un'esecuzione conclusa una settimana dopo e i widget sono ancora lì.

live, nodo per nodo

Una persona nel loop, correttamente

Un grafo può fermarsi e attendere una decisione. L'approvazione in sospeso è una riga, non un thread trattenuto, così un'esecuzione può rimanervi ferma per giorni tra un riavvio e l'altro e rispondere su qualunque replica la persona capiti a raggiungere. Il rifiuto è un percorso di prima classe, non un errore.

le approvazioni sono righe di database

Pagine che un grafo pubblica

Un nodo views:* scrive in una pagina salvata che sopravvive all'esecuzione — una tabella, un grafico, una metrica, una mappa. Ripubblicare sostituisce i dati ovunque la pagina sia stata disposta per riceverli, e ogni numero su di essa si ricollega a un'esecuzione che puoi aprire.

view · pannelli per chiave

Progetti, artefatti e record

I grafi vivono in progetti con le risorse che condividono: dati, documenti, file e link. Un'esecuzione può scrivere un record nella tua ontologia, archiviare un foglio di calcolo nell'object store, o lasciare un link — ciascuno timbrato con l'esecuzione che lo ha prodotto.

dove va l'output

Dentro al prodotto

Guardala funzionare.

Ogni schermata qui sotto è il prodotto in esecuzione.

01 · Costruisci

Trascina, collega e imposta parametri che sanno cosa sono

Trascina un nodo dal catalogo, collegalo e imposta i suoi parametri nell'ispettore. Ogni parametro accetta un'espressione, così un valore può provenire dal payload, dal contesto dell'esecuzione, dal contatore del loop o da un altro nodo — e un nodo che ha bisogno di una credenziale ne nomina una anziché conservarla.

  • 330 nodi su 19 strumenti, ricercabili per nome o categoria
  • Espressioni ovunque: {{$input.total}}, {{$merged[1].id}}, {{$settings.region}}
  • Un nodo di cui hai bisogno ma che il catalogo non ha si costruisce nell'app, non in un fork
  • La validazione è live: l'intestazione dice se il grafo è eseguibile, e perché no
DjiniousWorkflow
Il canvas di DjiniousWorkflow che mostra un grafo di riconciliazione fatture a sei nodi: un nodo di avvio, uno script di three-way match, un ramo if/else, due nodi dati per i due esiti, e un nodo di fine.
Una fattura confrontata con il suo ordine d'acquisto e la sua bolla di consegna. Sei nodi, un ramo, e ogni nodo che stampa sotto il proprio nome la funzione che chiama — ciò che rende un grafo leggibile da qualcuno che non lo ha scritto.

02 · Esegui

Ogni percorso finisce nella stessa coda

Attivalo a mano, su una pianificazione cron, da un webhook in ingresso, dall'API REST, da un altro grafo, o da un agente tramite MCP. Ogni percorso finisce nella stessa coda, e ogni esecuzione registra quale sia stato.

  • Pianificazioni cron con un fuso orario, rivendicate così che esattamente una replica attivi ogni occorrenza
  • Webhook in ingresso con un token per trigger
  • Un grafo può chiamarne un altro e attendere il suo risultato — scomposizione, non duplicazione
  • Ritentativi con backoff esponenziale, e un ramo di errore quando i ritentativi sono esauriti
DjiniousWorkflow
La pagina delle pianificazioni di DjiniousWorkflow che elenca le pianificazioni cron per i grafi dimostrativi con i loro prossimi orari di esecuzione.
Le pianificazioni sono righe con un orario di prossima esecuzione, rivendicate in modo atomico. Due repliche in gara per la stessa occorrenza sono il caso normale, ed esattamente una di esse la vince.

03 · Osserva

Il canvas, con la verità dipinta sopra

Il monitor di esecuzione disegna il grafo mentre viene eseguito: uno spinner mentre un nodo lavora, un segno di spunta con il suo conteggio di ripetizioni, un segno rosso che porta il messaggio di fallimento. I nodi che pubblicano un widget lo disegnano sul posto, e il pannello del log spiega il resto. Il monitor di esecuzione e l'editor sono lo stesso componente con una domanda diversa davanti: un operatore che osserva un fallimento e un autore che lo corregge dovrebbero guardare la stessa immagine.

  • Live tramite websocket, e anche interrogato a intervalli — il socket è un'ottimizzazione della latenza, mai la fonte di verità
  • Metti in pausa, avanza passo passo, ferma, o attiva un singolo nodo a mano mentre l'esecuzione è live
  • I widget si riproducono quando apri un'esecuzione conclusa: è il log a portarli, non solo il socket
  • Un'approvazione in attesa di una persona appare nella barra laterale, con il payload a cui si riferisce
DjiniousWorkflow
Un'esecuzione di DjiniousWorkflow ferma su un'approvazione umana: la barra laterale mostra il batch in fase di rilascio, un pulsante Approve e uno Reject, e una casella per il motivo del rifiuto.
Un'esecuzione di pagamento sopra il limite delegato, fermata davanti a una persona. La barra laterale porta il batch a cui si riferisce; l'esecuzione è stata sospesa nel database, così non costa nulla mentre attende e sopravvive al riavvio di ogni replica.

04 · Pubblica

Lascia qualcosa dietro

Un grafo che si limita a registrare log è un grafo che nessuno legge. Questi pubblicano: una pagina di pannelli, un record nella tua ontologia, un file nel progetto, una notifica, un webhook in uscita. Ciascuno è indirizzato per nome, così l'esecuzione successiva lo sostituisce anziché accumularsi accanto.

  • View: tabelle, grafici, metriche, markdown e mappe, disposti da chi le legge
  • Entità: record nell'ontologia che hai definito, timbrati con l'esecuzione che li ha scritti
  • Artefatti: valori, documenti e file reali — i byte vanno nell'object storage, i payload piccoli restano nel database
  • Notifiche in-app, e webhook in uscita per tutto il resto
DjiniousWorkflow
La pagina di panoramica Revenue in DjiniousWorkflow: una metrica quarter-to-date, una metrica dei lead qualificati, un indicatore di igiene della pipeline, un commento scritto, un grafico delle prenotazioni per settimana e due tabelle.
Una pagina, tre grafi. Le metriche provengono dalla scansione notturna, il grafico e le tabelle dalla revisione del lunedì, e il paragrafo in alto è il modello che legge i numeri calcolati dal grafo — senza mai produrli.

05 · L'esploratore

Qualsiasi payload, a pagina intera

Lo sguardo veloce che dai mentre un'esecuzione è in corso non è lo stesso sguardo che dai quando quello sguardo ha sollevato una domanda. L'output di qualsiasi nodo si apre a pagina intera — ordinabile, filtrabile per colonna, ricercabile, graficabile, profilabile, esportabile in CSV — e funziona sul semplice nodo sql:query che nessuno ha decorato, perché legge il risultato proprio del task quando non c'è un widget pubblicato.

  • Righe, grafico, statistiche e JSON grezzo dello stesso payload, a un clic di distanza
  • Selezione delle colonne, filtri per colonna, paginazione e ricerca su tutto
  • Salva la configurazione — l'ordinamento, i filtri, le colonne nascoste, il grafico — su una pagina
  • Ciò che viene salvato è la configurazione, mai i dati: la nuova pagina è aggiornata quanto l'ultima esecuzione del suo grafo
DjiniousWorkflow
L'output di un nodo di DjiniousWorkflow aperto a pagina intera: il piano di riapprovvigionamento come tabella ordinabile e filtrabile con controlli delle colonne, schede statistiche e grafico, ed esportazione CSV.
L'output del pianificatore di riapprovvigionamento, aperto dall'esecuzione che lo ha prodotto. Non è stato configurato nulla per far funzionare questo: l'esploratore legge il risultato proprio del task.

06 · Il costruttore di nodi

Il nodo di cui hai bisogno, senza un fork

Parte di ciò che un deployment automatizza è specifico di quel deployment: un servizio REST interno, un endpoint GraphQL dietro la tua VPN, un'istruzione SQL che tutti continuano a riscrivere. Costruirli in un prodotto sarebbe sbagliato, e chiedere una pull request per ottenerli è peggio. Quindi è l'app a costruirli: descrivi la chiamata, nomina i suoi parametri, testala contro l'endpoint reale, e finisce nel catalogo.

  • HTTP, GraphQL, SQL, uno script, o un altro grafo incapsulato come un unico passo
  • Parametri che dichiari, con gli stessi controlli tipizzati dei nodi integrati
  • Testalo prima di salvare, contro la credenziale che userà in produzione
  • La palette, la pagina di riferimento, l'elenco degli strumenti MCP e l'assistente lo recepiscono immediatamente
DjiniousWorkflow
Il costruttore di nodi di DjiniousWorkflow: un modulo che descrive il tipo di un nodo, i suoi parametri e la sua richiesta, con un pannello per testarlo contro l'endpoint reale prima di salvare.
Descrivi la chiamata, dichiara i suoi parametri, testala contro l'endpoint che userà in produzione, ed è nel catalogo — palette, pagina di riferimento, elenco degli strumenti MCP e assistente inclusi.

IA e agenti

Usa un modello dove un modello è la scelta giusta. Tieni le regole dove puoi leggerle.

Un modello linguistico è molto bravo a leggere testo in prosa e poco adatto a essere sottoposto ad audit. Perciò in questo prodotto legge il ticket, abbozza la frase o spiega la tabella — mentre la coda, la soglia, la tolleranza e l’approvazione restano in nodi che un collega può aprire e modificare. Le due metà stanno sullo stesso canvas, ed è questo che rende la separazione visibile e non solo teorica.

01

Quattro nodi, non una modalità

ai:prompt restituisce testo. ai:extract restituisce JSON conforme a uno schema che hai scritto, e riprova una volta rialimentando l’errore di parsing. ai:classify restituisce esattamente una delle tue etichette. ai:agent esegue un ciclo di tool-calling con una missione, una allow-list e un limite di passi. Ognuno è un nodo come un altro — timeout, policy di retry, ramo di errore.

02

Il modello non produce mai il numero

Nei grafi forniti con il prodotto, i totali, gli scostamenti e i punteggi sono calcolati dai nodi. Al modello viene consegnato il risultato e gli si chiede di scrivere la frase che lo accompagna. Quando un numero e un paragrafo non concordano, puoi sempre dire quale dei due è stato misurato — ed è il paragrafo a cambiare.

03

Ogni nodo IA ha un modo per fallire

Il classificatore della showcase ripiega su un set di regole a parole chiave; il suo nodo di commento ripiega su una frase scritta in chiaro e la pagina viene comunque costruita. Un’automazione che si ferma quando un endpoint di inferenza ha un pomeriggio storto non è un’automazione che metti davanti ai clienti, ed è nel grafo che questa decisione deve stare.

04

Il tuo endpoint, i tuoi dati

Puntalo verso un vendor o verso un modello che gestisci tu. Funziona qualsiasi soluzione compatibile con OpenAI, il che include vLLM, SGLang, LM Studio e llama.cpp sul tuo stesso hardware — così un deployment che non può inviare testo a terzi può comunque usare ogni nodo IA.

05

Un assistente che costruisce grafi, sull’API che hai già

L’assistente integrato è un agente di tool-calling con davanti la superficie stessa della piattaforma: elenca il catalogo, crea un workflow, eseguilo, leggine i log, interroga le entità, risolvi un’approvazione. È un client della stessa API REST che usi tu, sotto gli stessi controlli di ruolo — e le sue chiamate agli strumenti sono visibili mentre avvengono, argomenti e risultati inclusi: una traccia, non un riassunto.

06

Agenti fuori dall’app, via MCP

Un assistente di coding, un analista pianificato o strumenti tuoi possono elencare il catalogo, creare un workflow, eseguirlo, osservarlo, leggerne i log e rispondere a un’approvazione. L’elenco degli strumenti è generato dallo stesso catalogo che legge la palette, quindi un nodo costruito in questo deployment compare immediatamente nell’elenco degli strumenti dell’agente — le capacità di un agente e quelle di una persona restano allineate per costruzione.

DjiniousWorkflow
La pagina agenti di DjiniousWorkflow che elenca le definizioni di agente salvate con la loro missione, gli strumenti consentiti e i limiti di passi.
Una definizione di agente è un record, non un prompt sepolto in un nodo. Cambia la missione una sola volta e ogni grafo che la referenzia per nome esegue quella nuova.

Funzionalità

L'intera superficie, parte per parte

DjiniousWorkflow è un'unica API Bun su SurrealDB con un client React sopra: un motore, un catalogo di nodi, un posto dove far vivere i grafi, e tre modi di accesso che non coinvolgono un browser — ciò che costruisce, ciò che attiva, ciò che esegue, ciò che un grafo raggiunge, e ciò che lascia dietro.

Creazione4 funzionalità

Il grafo è il documento

Un workflow è un insieme di task, ciascuno che chiama una funzione dal catalogo, con gli edge che vivono negli input e output propri dei nodi. Questo rende un grafo un documento autonomo che puoi esportare, confrontare in una pull request e importare altrove — non un database di righe che hanno senso solo dentro una singola installazione.

330 nodi, 19 strumenti

Controllo di flusso (23), modellazione dei dati (15), verbi dataframe (20), trasformazioni (19), JavaScript sandboxed (2), HTTP (6), IA (4), CRUD di entità (6), artefatti (4), widget di esecuzione (10), pagine (7), notifiche (2) — e i connettori: SQL (40), store documentali e chiave-valore (25), analytics e ricerca (22), broker (11), file e object storage (30), push e mail (37), API SaaS (47).

Parametri che sanno cosa sono

Un parametro dichiara il proprio tipo, il proprio testo di aiuto, se è obbligatorio, e persino quando è rilevante — un nodo HTTP nasconde il corpo su una GET. Un parametro di credenziale offre le credenziali di quel tipo e nient'altro. Ogni parametro accetta anche un'espressione, così un valore può provenire dal payload, dal contesto dell'esecuzione o dal contatore del loop.

Validazione mentre costruisci

L'intestazione dice se il grafo è eseguibile e, quando non lo è, quale nodo e quale edge è il problema. Una bozza può essere incompleta — salvi mentre costruisci — ma un'esecuzione rifiuta una definizione non valida anziché scoprirlo dopo tre nodi.

Attivazione4 funzionalità

Pianificazioni cron

Una pianificazione è una riga con un'espressione cron, un fuso orario opzionale e un orario di prossima esecuzione. Le occorrenze vengono rivendicate in modo atomico, così con quattro repliche in esecuzione esattamente una di esse attiva ogni occorrenza — il caso ordinario, non una gara da evitare.

Webhook in ingresso

Un trigger genera il proprio token e risponde al proprio URL. Il corpo diventa l'input dell'esecuzione, e il trigger può nominare il task da cui entrare, così un solo grafo può servire più fonti senza un nodo router davanti.

Esegui da qualsiasi luogo

Una singola chiamata avvia un'esecuzione; token API con ambito (djwf_…) significa che uno script o un job CI possono farlo senza una sessione utente. Un grafo può anche avviarne un altro — fire-and-forget, oppure chiamare e attendere il suo risultato.

Guidato dall'uomo, deliberatamente

Alcune esecuzioni dovrebbero iniziare quando una persona preme un pulsante, e un'esecuzione può anche fermarsi a metà volo su un nodo ui:trigger e continuare quando qualcuno ne preme uno sul canvas. L'attesa è una riga come qualsiasi altra, così la pressione può arrivare su qualunque replica.

Esecuzione4 funzionalità

Un motore stateless

Ogni frammento dello stato dell'esecuzione — la coda di cosa fare dopo, gli arrivi parziali di un join, un'approvazione sospesa, un timer ricorrente — è una riga nel database. Un processo contribuisce con un loop worker e nient'altro, così scalare orizzontalmente significa eseguire più repliche e il lavoro di un nodo che muore viene ripreso dagli altri.

Fan-out e raccolta

For each trasforma un array in un evento per elemento, e Collect li riaccumula. Ogni arrivo è una riga a sé anziché un append a un array condiviso, ed è ciò che impedisce a un fan-out a quaranta vie di entrare in contesa con se stesso, e ciò che permette a una raccolta di sopravvivere al worker che l'ha avviata.

Ritentativi, e poi un ramo

Un nodo può ritentare con backoff esponenziale. Quando i tentativi sono esauriti il payload esce dal ramo di errore — portando il messaggio di fallimento e il payload che è fallito — così è il grafo a gestirlo invece che l'esecuzione muoia. Senza un ramo di errore collegato, l'impostazione propria del workflow decide tra far fallire l'esecuzione e lasciare che gli altri rami finiscano.

Le attese lunghe non costano nulla

Un'approvazione, un segnale in ingresso, un ritardo di sei ore, un intervallo che si attiva ogni dieci minuti: nessuno di essi occupa un worker. Sono righe con un orario o uno stato, motivo per cui un'esecuzione può rimanere ferma su una decisione per giorni tra un riavvio e l'altro.

Ciò che un grafo raggiunge4 funzionalità

Database e store

PostgreSQL, MySQL, MariaDB, SQLite, CockroachDB, Timescale, QuestDB, Supabase, Redshift, Yugabyte; MongoDB, CouchDB, Redis e affini; ClickHouse, Elasticsearch, OpenSearch, Meilisearch, Typesense, Qdrant, InfluxDB, Prometheus, BigQuery. Query, select, insert, upsert, update, delete, transaction — più i nodi di introspezione che elencano e descrivono le tabelle.

File, oggetti e broker

CSV, XML, YAML, JSONL, Excel e ZIP come nodi di puro formato senza alcuna rete; S3, FTP e SFTP come nodi di posizione che spostano byte; Kafka, RabbitMQ, MQTT e NATS per le code. I nodi consume sono limitati e lo dichiarano.

Credenziali, sigillate

Un nodo connettore nomina una credenziale; la credenziale contiene il valore, sigillato con AES-256-GCM, e nessun endpoint lo restituisce. Lo stesso grafo gira contro staging e produzione puntando a una credenziale diversa con lo stesso nome.

Un nodo che il catalogo non ha

Costruiscilo nell'app: una chiamata HTTP, una query GraphQL, un'istruzione SQL, uno script, o un altro grafo incapsulato come un unico passo. Finisce nello stesso catalogo dei nodi integrati, così la palette, la pagina di riferimento, l'elenco degli strumenti MCP e l'assistente lo recepiscono tutti immediatamente — senza fork e senza deploy.

Ciò che lascia dietro4 funzionalità

Pagine

Un nodo views:* scrive una tabella, un grafico, una metrica, del markdown o una mappa in una pagina salvata. I pannelli sono indirizzati per chiave, così ripubblicare sostituisce i dati ovunque la pagina sia stata disposta per riceverli e mantiene il titolo e la dimensione scelti da una persona. Un workflow è l'unico scrittore dei dati di un pannello — la superficie REST lo impone.

Record

I tipi di entità sono definiti a runtime — campi, una macchina di stato, un'icona — e un grafo scrive record al loro interno. Ogni record porta l'id dell'esecuzione che lo ha prodotto, così una cifra su una pagina si ricollega all'esecuzione che l'ha calcolata.

File e risorse

Un progetto contiene artefatti: dati, documenti, immagini, video e link. Dove vanno i byte è una decisione della piattaforma, non del chiamante — i payload piccoli restano nel database, i file reali vanno nell'object store compatibile S3, e un URL viene memorizzato come riferimento anziché come copia.

Fuori dall'edificio

Notifiche in-app, webhook in uscita, email via SMTP, e i connettori push e di messaggistica per tutto il resto. Un grafo che finisce silenziosamente è un grafo di cui nessuno si fida una seconda volta.

Dove vive il lavoro3 funzionalità

Un progetto è uno spazio di lavoro

I grafi vivono in un progetto con le risorse che condividono, e un grafo raggiunge le risorse del proprio progetto per nome — così lo stesso grafo clonato in un altro progetto legge la copia di quel progetto di ‘the source list’. Ogni workflow appartiene esattamente a un progetto; non c'è alcuno stato non archiviato da mettere in ordine più tardi.

Un'ontologia che definisci a runtime

I tipi di entità sono configurati, non codificati: campi con tipi, una macchina di stato con le proprie transizioni, un'icona e un colore. Un grafo scrive record al loro interno, e il record porta l'esecuzione che lo ha scritto — ed è così che una cifra su una dashboard si ricollega a un'esecuzione.

Importazione, esportazione, diff

Un workflow si esporta come un unico documento JSON e si importa in un altro deployment. Questo è ciò che rende un grafo revisionabile in una pull request, e ciò che rende ‘promuovi questo da staging’ un file anziché una migrazione.

Essere guidato4 funzionalità

L'API REST è il prodotto

Tutto ciò che fa la UI è una chiamata API, e la UI è un client tra i tanti. I token con ambito (djwf_…) permettono a uno script, a un job CI o a un altro servizio di creare, eseguire e ispezionare un workflow senza una sessione utente.

MCP, nello stesso processo

Un server MCP risponde nello stesso processo: elenca il catalogo, crea un workflow, eseguilo, leggi i suoi log, risolvi un'approvazione, interroga le entità. Un agente con quell'endpoint può costruire e gestire l'automazione senza un browser — e gli strumenti che vede sono generati dallo stesso catalogo che legge la palette.

Provider Interface v1

Il contratto di piattaforma attraverso cui le altre applicazioni Djinious e djinious-atoms guidano questa: un registro di operazioni versionato, un documento /capabilities, e uno snapshot OpenAPI committato nel repository con un unit test che fallisce in caso di scostamento — perché la CI di un consumatore è scritta contro quel file.

Ruoli che contano davvero

Admin, utente e visualizzatore. Un visualizzatore vede i workflow, le esecuzioni e i log e non può modificarne nessuno — compreso il fatto che un nodo personalizzato esiste, senza vederne l’implementazione, e mai il valore di una credenziale. I controlli vivono accanto ai route handler, non solo nell’interfaccia.

Fiducia

Un worker non conserva alcuno stato. È tutto il design.

La coda di cosa fare dopo, gli arrivi parziali di un join, un’approvazione sospesa, un timer ricorrente — ognuno di questi è una riga nel database. Un processo contribuisce con un ciclo di worker e nient’altro. Tutto qui discende da questo, comprese le parti scomode — perciò anche i limiti sono dichiarati.

Gli eventi sono presi in lease, non trattenuti

Un worker rivendica un evento con un lease. Se lo porta a termine, l’evento è completato e le sue conseguenze vengono accodate prima che la rivendicazione venga rilasciata — così non esiste mai un momento in cui la coda appare vuota mentre del lavoro è ancora in corso. Se il worker muore, il lease scade e un altro worker riprende l’evento. La consegna è at-least-once, e il motore lo dichiara apertamente invece di far intendere un exactly-once.

claim · lease · reclaim

Gli arrivi di un gather sono righe

L’implementazione ovvia di un fan-in aggiunge elementi a un array su un unico record. Quel record diventa un punto di contesa, e con un fan-out a quaranta vie i perdenti di ogni conflitto di scrittura perdono i propri elementi in silenzio. Qui ogni arrivo è una riga a sé, con un proprio id, e il completamento viene rivendicato prendendo le righe: esattamente un worker le ottiene, gli altri si fermano.

una riga per arrivo, mai un array

Un join si completa una sola volta, su qualunque nodo

I rami di un join arrivano su worker diversi nello stesso istante, per progetto. L’arrivo che lo completa è deciso da una rivendicazione condizionale e non da un read-and-check, perché un read-and-check è la stessa race condition un livello più su. È qui che il motore ha sbagliato in passato, ed entrambi i bug sono fissati da test che fanno finire insieme dieci rami, per cinque volte di seguito.

conta, poi rivendica

Attendere non costa nulla

Un’approvazione, un segnale in ingresso, un ritardo, un intervallo: ciascuno è una riga con sopra uno stato o un orario. Nessun worker resta parcheggiato, nessun thread viene trattenuto, nessuna memoria viene bloccata. Un’esecuzione può attendere una persona per giorni e sopravvivere al riavvio di ogni replica nel frattempo — e la risposta può arrivare su qualunque replica la persona raggiunga.

wf_wait · wf_timer

Scalare in orizzontale significa eseguirne di più

Ogni replica esegue lo stesso ciclo sullo stesso database. Non c’è un coordinatore da eleggere né uno shard da assegnare: competono per gli eventi, ed è la rivendicazione a decidere. Anche l’occorrenza di uno schedule viene rivendicata allo stesso modo, così quattro repliche non significano quattro esecuzioni alle 07:00.

coda condivisa, nessun leader

I segreti non stanno nel grafo

Un nodo connettore nomina una credenziale; la credenziale contiene il valore, sigillato, e nessun endpoint lo restituisce — né all’interfaccia, né all’API, né a un agente. È questo che permette allo stesso grafo di essere esportato, revisionato in una pull request e importato in un altro deployment senza che un segreto viaggi insieme a esso.

AES-256-GCM at rest

Ogni esecuzione è un documento, e resta tale

Un’esecuzione conserva il grafo così com’era all’avvio, lo stato per ogni task, il numero di ripetizioni, l’ultimo risultato e l’ultimo errore, il proprio registro eventi e il proprio log con i widget pubblicati riprodotti al suo interno. I record scritti da un grafo portano l’id dell’esecuzione, e gli artefatti portano l’esecuzione che li ha depositati — così il numero su una pagina pubblicata è tracciabile fino all’esecuzione che lo ha prodotto.

il record dell’esecuzione

Ruoli e token

I ruoli sono controllati accanto ai route handler, rispecchiati nell’interfaccia, mai solo nell’interfaccia. I token djwf_ con ambito per script, CI e agenti vengono emessi e revocati per singolo consumatore, e una allow-list (WORKFLOW_HTTP_ALLOWLIST) delimita dove un grafo può chiamare, quando ne vuoi una.

admin · utente · visualizzatore · djwf_

Limite: consegna at-least-once

Un nodo che muore tra l’aver svolto il proprio lavoro e l’averlo registrato verrà eseguito di nuovo. L’idempotenza è quindi compito di chi lo scrive dove conta, e i nodi connettore del catalogo sono scritti per renderla semplice — upsert invece di insert, artefatti con nome invece che accodati.

dichiarato, non nascosto

Limite: il database è il pavimento

Il throughput è limitato da SurrealDB, perché ogni evento, arrivo, attesa e timer è una scrittura. È un compromesso deliberato: le modalità di guasto che elimina valgono più del tetto che impone, per il lavoro a cui questo motore è destinato. Non è il motore giusto per un milione di eventi al secondo.

dichiarato, non nascosto

Limite: in sandbox, non isolato

Un nodo JavaScript viene eseguito in un worker Bun con un timeout, che contiene un errore o un ciclo infinito. Non è un confine di sicurezza contro un autore ostile, e sono i controlli del deployment stesso — chi può scrivere un grafo — a occupare quel posto. I nodi per file locali sono confinati a una root configurata, e disattivati, non illimitati, quando quella root non è impostata.

dichiarato, non nascosto

Nel filo digitale

Cosa riceve. Cosa consegna.

DjiniousWorkflow svolge la propria parte del ciclo di ingegneria e trasmette le proprie evidenze — e funziona altrettanto bene anche da sola.

DjiniousWorkflowAutomazione ad agenti

Consegna

DjiniousEngineeringRisultati depositati nel System Ledger tramite i nodi ledger tipizzati che un grafo usa a ogni esecuzione ingegneristica.DjiniousLabChiamate alle sue capacità, effettuate da un grafo tramite il catalogo federato djinious-atoms — un unico percorso di dispacciamento e una sola credenziale per ogni applicazione Djinious.DjiniousWorkshopChiamate alle sue capacità, effettuate da un grafo tramite il catalogo federato djinious-atoms — un unico percorso di dispacciamento e una sola credenziale per ogni applicazione Djinious.DjiniousSafeChiamate alle sue capacità, effettuate da un grafo tramite il catalogo federato djinious-atoms — un unico percorso di dispacciamento e una sola credenziale per ogni applicazione Djinious.DjiniousWorldChiamate alle sue capacità, effettuate da un grafo tramite il catalogo federato djinious-atoms — un unico percorso di dispacciamento e una sola credenziale per ogni applicazione Djinious.DjiniousMapChiamate alle sue capacità, effettuate da un grafo tramite il catalogo federato djinious-atoms — un unico percorso di dispacciamento e una sola credenziale per ogni applicazione Djinious.DjiniousDataChiamate alle sue capacità, effettuate da un grafo tramite il catalogo federato djinious-atoms — un unico percorso di dispacciamento e una sola credenziale per ogni applicazione Djinious.DjiniousCCChiamate alle sue capacità, effettuate da un grafo tramite il catalogo federato djinious-atoms — un unico percorso di dispacciamento e una sola credenziale per ogni applicazione Djinious.
Da sola

Da solo è un motore di automazione completo: 330 nodi che raggiungono database, broker, file, API SaaS e modelli, con lo stato delle esecuzioni, le approvazioni e gli schedule nel proprio database. Sei progetti dimostrativi dipartimentali sono forniti con esso e funzionano senza nessun’altra applicazione Djinious.

Prenota una demo

Guardala sul tuo problema.

Novanta minuti sul tuo lavoro reale, non un giro guidato scritto a tavolino. Lo costruiamo davanti a te, lo eseguiamo e rompiamo un nodo apposta — perché come un grafo fallisce è la parte che stai davvero comprando.

  1. Prendi un processo che oggi gestisci a mano — quello con il foglio di calcolo, l’approvazione e la persona che lo rincorre
  2. Costruiscilo sul canvas mentre guardi, con i nodi che leggono i tuoi stessi sistemi
  3. Eseguilo, e apri l’esecuzione: ogni nodo, cosa ha prodotto, quanto ci ha messo
  4. Rompi un nodo apposta e ti mostriamo cosa fa il grafo — i retry, poi il ramo di errore
  5. Fermalo su un’approvazione, chiudi il browser, riaprilo e rispondi all’approvazione
  6. Ti lasciamo la pagina che ha pubblicato, e il grafo come file che puoi conservare