Une Nova Constellae est une petite application (React) qui tourne dans un bac à sable sécurisé. Il ne code jamais de secret ni d'appel réseau en dur : il s'appuie sur des fonctions window.* fournies par la plateforme. Voici, en un coup d'œil, tout ce qu'elles permettent — et ce qu'elles interdisent.
La « Convention » est le contrat de développement d'une Nova Constellae : elle décrit les règles à respecter (bloc de métadonnées, palette de marque, internationalisation, cloisonnement) et l'intégralité de l'API du bac à sable (les fonctions window.*). Elle est TOUJOURS à jour et fait référence : à lire avant de coder. Version humaine : /contrat.php · version machine : GET /api/public/convention · via un assistant IA : outil MCP get_convention.
Chaque capacité est une fonction window.* détaillée dans la Convention.
Persister l'état de l'application sans jamais toucher la base du site.
window.storage
Utilisateur · Org
get/set/delete/list(key)
Clé/valeur simple (remplace localStorage). Portée par utilisateur, ou PARTAGÉE avec toute l'org (dernier argument true).
window.db
Utilisateur · Org
open(nom[,{shared}]) → run/query/exec/save
Vraie base SQLite (WASM) dans le bac à sable. Par défaut par utilisateur ; { shared:true } = base COMMUNE À L'ORG (versionnage optimiste anti-écrasement).
window.files
Utilisateur
upload/list/url/delete/download(id)
Fichiers/photos de l'utilisateur (quota par utilisateur).
window.vault
Nova (perso/org)
list/read/write/delete(path,{shared})
Disque PRIVÉ de la Nova (perso ou partagé org). Accessible à la Nova mais JAMAIS parcourable par l'utilisateur — pour des données de service, anti-fuite.
Des réglages pour toute l'organisation ET des préférences par utilisateur.
window.config
Nova × Org/Utilisateur
get() → {org,user,effective} · setUser · setOrg
Configuration profonde de la Nova : défaut ORG (écriture réservée admin d'org ou admin délégué) + personnalisation par utilisateur ; lecture fusionnée.
window.store
Organisation
owns(slug) → bool · get(slug) → données|null · list()
Halos (compléments) POSSÉDÉS par l'organisation. owns() déverrouille une fonction ; get() charge un contenu (thème, jeu de données) uniquement si l'org détient le Halo. L'org acquiert les Halos dans le Cosmos.
Appeler un modèle sans jamais manipuler de clé (elle reste côté serveur).
window.claude
Org (clé serveur)
complete(prompt,{model?}) · messages({messages})
Génération de texte par l'IA. Le fournisseur (Claude par défaut, ou un LLM tiers) et la clé sont gérés par l'organisation.
Constellation → agents
Via Constellation
nœud « Agent » d'un flux
Pour faire intervenir un AGENT (Voilà, agent d'org, agent de plateforme), reliez votre Nova à un flux Constellation : l'agent s'exécute côté serveur et vous rend son livrable.
Joindre un service HTTP enregistré, sans exposer aucun secret.
window.api
Org/Utilisateur (clé serveur)
api(besoin,{method,path,query,body})
Appel d'un service externe via un « besoin » déclaré par un admin. La clé (plateforme, org, ou propre à chaque utilisateur) est injectée côté serveur. Couvre les API REST/HTTP, dont Supabase/PostgREST.
window.drive
Utilisateur · Org
providers/list/read/write/mkdir/… · shares · links
Drives cloud de l'utilisateur (Google/OneDrive/Dropbox) + disque intégré (Perso/Partagé/Entreprise), avec partage natif.
Échanger des données entre utilisateurs et entre Novas.
window.channel
Org (membres)
get/set/list · files · can() · subscribe() · callback()
Canaux partagés entre membres d'une org (KV + fichiers), avec temps réel (subscribe) et rôles Lecteur/Éditeur. Sert aussi de boîte de réception des webhooks.
window.channels
Org
list() · mine()
Découverte du registre des canaux à l'exécution (co-usage sans coder les noms en dur).
window.user
Utilisateur (soi)
get() → {id,email,name,…}
Profil de l'utilisateur COURANT (lecture seule). Pour un annuaire, motif « présence » via un canal partagé.
Relier votre Nova à l'orchestrateur no-code « Constellation ».
window.constellation
Org
emit(evenement, donnée)
Démarre tous les flux Constellation abonnés à un évènement de cette Nova (ex. « un fichier est déposé »). La donnée devient l'entrée du flux.
window.actions
Org
input() · complete(result) · list · invoke
Être une ÉTAPE d'un flux : recevoir une intention (input) et rendre la main avec un résultat (complete). Ou passer la main à un autre Nova.
Cartes de décision
Org
channel(nom).list('hook.msg.') · callback(id, choix)
Un chat peut afficher les cartes à boutons postées par une étape « Demander une validation » (ou un webhook) et y répondre : le choix reprend le flux en attente. Gère l'adressage (value.workflow) et la validation successive (plusieurs valideurs).
S'intégrer au cadre de l'hôte, être multilangue, télécharger.
window.menu
Utilisateur
set([{id,label,icon,children?}]) · onSelect
Menu latéral de l'hôte : entrées, sous-menus, badges, pied épinglé.
window.i18n
Utilisateur
locale · t({fr,en,…}) · onChange
Internationalisation : rendez l'application multilangue (jamais de texte en dur).
window.download
Utilisateur
download(blob | {name,mime,data})
Vrai téléchargement d'un fichier généré (le bac à sable ne le peut pas seul).
Widgets
Utilisateur
export function Widget({id})
Tuiles compactes pour la page d'accueil, déclarées dans le META.
Qui peut quoi — géré côté serveur, jamais contournable par le code de la Nova.
Admin délégué
Org
fiche « Partager » → Administrateurs de la Nova
Un admin d'org peut confier le paramétrage d'UNE application à un membre (droits window.config.setOrg), sans en faire un admin de toute l'org. Non transitif.
Cloisonnement
Automatique
org_id + X-Artifact-Id (serveur)
Config, base partagée et vault sont cloisonnés par organisation ET par Nova. L'identité de la Nova est posée par l'hôte (non falsifiable par le code) et recoupée avec l'org de session.
Par sécurité et cloisonnement — avec, à chaque fois, la bonne alternative.
Exemples, aide et spécification complète.