Bases de données Workspace
Gérez des enregistrements, appliquez des règles métier et utilisez des vues en direct dans le chat. Partagez les bases et limitez l'accès des agents.
Aussi dans Sluis Workspace : la présentation de Workspace et Messagerie et calendrier.
Les bases de données
Une base contient des tables, des champs typés et des enregistrements durables, par exemple des dossiers, contrats ou tâches. Sa description est obligatoire : de 1 à 280 caractères de texte brut sur une ligne, précisant son contenu et ses utilisateurs.
Ouvrez Bases de données dans la barre latérale, à /workspace/databases. Une nouvelle base est privée. Il n'y a ni écran d'application personnalisé, ni constructeur d'interface, ni mode Modifier, ni Plein écran, ni gestionnaire exécutable de vue. Les applications Sluis Workspace pour ordinateur et mobile sont distinctes.
Créer et modifier
Demandez une base ou une modification du schéma à n'importe quel modèle de chat. Il transmet la demande au constructeur sluis/code, autorisé par la politique de votre organisation. Seul ce constructeur ou un Agent configuré avec le groupe d'outils databases rédige schémas et règles. Les modèles ordinaires travaillent sur les enregistrements et demandent les changements de schéma.
La source utilise JSON Lines : en-tête database, lignes collection, fonctions script facultatives, lignes trigger et view épinglées. Le bloc porte le nom sluis-database. Composants et gestionnaires ne sont pas pris en charge. Une Skill peut fournir un modèle database.sluis à la racine de son archive.
Installez le modèle d'une Skill par POST /chat/skills/{skill_id}/install-database avec votre session membre.
Les versions conservent auteur et date. Gérer permet de publier ou restaurer un schéma. Restaurer crée une nouvelle version courante sans effacer l'historique, mais ne restaure pas les anciennes données des enregistrements.
Vues en direct et épinglées
Demandez un tableau, un tableau de cartes, un graphique, un calendrier, une chronologie, un total, un formulaire ou un enregistrement. Un bloc sluis-view décrit la vue sans copier les données. Chaque lecteur charge les données actuelles avec ses propres droits ; les changements partagés actualisent la vue.
Gérer permet d'épingler une vue au-dessus des données ou de la détacher. Filtres, tri et pagination sont exécutés sur le serveur. Les formulaires suivent les champs et règles de la table ; les champs calculés restent en lecture seule. Une vue ne contourne jamais les droits.
```sluis-view
{"database":"<database UUID>","table":"contracts","view":"table","columns":["title","expiry"],"order":"expiry"}
```Enregistrements et règles
Types : texte, nombre, bool, date, JSON, fichier, personne et référence à une autre table. Personnes et références affichent des noms ou libellés. L'historique indique les changements de champs et leur auteur. Les enregistrements sont chiffrés ; des index à clé permettent la recherche par égalité et préfixe de mot dans les libellés et champs de texte déclarés recherchables, sans stocker leur texte brut. Résultats et libellés respectent la visibilité.
La recherche indexée combine tous les préfixes de mots, sans distinction de casse, avec au moins deux caractères alphanumériques par mot. Ce n'est pas une recherche de sous-chaînes arbitraires. Le texte libre renvoie au plus 200 résultats et signale la troncature. Plus de 25 000 candidats résiduels ou 500 identifiants pour un libellé renvoient 422 : ajoutez un filtre indexé. Un index absent ou périmé doit être reconstruit avant la reprise des lectures.
- Règles : required, unique, min/max, options, default et pattern. Le masque pattern couvre tout le texte : # chiffre, A majuscule, a minuscule, * caractère quelconque. Ce n'est pas une expression régulière.
- Les champs calculés utilisent Rhai en sandbox, sont recalculés et stockés à l'écriture et ne peuvent pas être définis par l'appelant.
- Les statuts définissent des états, un état initial et des transitions, avec champs obligatoires et niveau minimal Enregistrements, Toutes les données ou Gérer.
- Les déclencheurs serveur réagissent à la création, modification ou suppression. Ils insèrent, modifient ou suppriment des enregistrements de la même base, refusent l'écriture ou notifient un membre. Leurs modifications utilisent les droits de l'auteur et la même transaction. Un refus annule tout. Elles ne déclenchent pas d'autres déclencheurs serveur ; les notifications suivent la validation.
- Formulaires, édition des données, outils de chat, import, webhooks, IA par lots et automatisations suivent les mêmes règles. Un refus renvoie 422 avec les raisons par champ.
Importez CSV ou Excel avec correspondance des colonnes et aperçu, jusqu'à 20 000 lignes. Une ligne invalide annule tout. Toutes les données permet l'export CSV, Excel ou JSON. Les fichiers de 25 Mio maximum sont analysés contre les logiciels malveillants et chiffrés : PDF, Word, Excel, PowerPoint, texte, Markdown, CSV, JSON, PNG et JPEG. Leurs droits suivent l'enregistrement et sa suppression les supprime. databases.file_text extrait le texte, y compris les scans via Sluis OCR, avec les droits du lecteur.
Partage et visibilité
Partagez en Privé, avec Certaines personnes ou avec l'Organisation. Enregistrements permet d'ajouter et de modifier ou supprimer ses propres enregistrements visibles. Toutes les données permet aussi de voir et modifier tous les enregistrements et d'exporter. Gérer ajoute la publication des schémas, règles et vues épinglées. Partage, suppression et réglages administratifs restent réservés au propriétaire ou aux administrateurs d'une base d'organisation ; Gérer n'accorde pas la propriété.
Pour le niveau Enregistrements, une table montre tout, ses propres enregistrements, aucun, ou ceux dont un champ personne désigne le membre. Toutes les données et Gérer voient tout. Les versions ne réinitialisent pas ces réglages. Retirer l'accès coupe aussi l'accès en direct.
Accès du chat et des agents
Les outils de chat listent, recherchent et lisent les bases accessibles, lisent les fichiers joints et affichent des vues. Mentionnez une base avec @ ou activez sa découverte dans le chat pour y inclure description et tables. Cela n'accorde aucun droit. L'outil de liste reste disponible même sans base existante.
agent_write vaut ask par défaut : chaque création, modification ou suppression attend votre confirmation sur une carte. allow agit sans carte ; read_only refuse. Une approbation n'ajoute aucun droit. Un changement de données, de schéma ou de politique peut imposer une nouvelle demande.
Associez des bases précises à un Agent avec des droits read ou write. Chaque appel croise l'autorisation actuelle avec les droits du membre exécutant. Le groupe databases ajoute les outils de schéma, pas l'accès à toutes les bases. Une exécution sans surveillance ne peut pas confirmer : écrire exige write et la politique allow.
L'IA par lots remplit des champs choisis, jusqu'à 200 enregistrements par tâche, avec progression, erreurs et annulation. Elle utilise les droits de l'initiateur, la politique, la protection des données et le budget de jetons habituels. Les textes des enregistrements sont des données, pas des instructions. Les vues n'appellent pas Connaissances, documents, enregistrements audio ou connecteurs comme fonctions d'interface ; utilisez des Agents ou automatisations configurés.
Automatisations et webhooks
Les automatisations réagissent à une création, à la modification de champs choisis ou à une transition de statut. Les horaires couvrent un intervalle d'au moins 15 minutes, un rythme quotidien ou hebdomadaire, ou un délai avant une date, avec fuseau horaire. L'action lance un Agent, notifie des membres ou appelle un connecteur MCP approuvé. Les exécutions montrent résultat et coût ; l'activation affiche une estimation à confirmer dès 5 € par mois.
L'automatisation agit comme son propriétaire configuré, limitée à sa base et aux autorisations actuelles de l'Agent. Membres, webhooks et autres agents peuvent la déclencher, mais pas sa propre exécution. Une chaîne ne revisite pas une automatisation. Import et IA par lots ne déclenchent pas d'automatisation sur enregistrement. Maximum 200 exécutions mises en attente par base et par jour. Les notifications passent par Workspace, push et les préférences e-mail, au plus 20 par membre et par jour.
Les webhooks entrants sont désactivés jusqu'à leur activation par un propriétaire ou administrateur. Gérer permet un point d'accès par table : POST /hooks/databases/{database}/{collection}, sans session ni jeton bearer. Le secret whsec_ n'apparaît qu'à la création ou rotation. La liste IP facultative accepte 20 adresses ou plages CIDR.
Envoyez un objet JSON de 16 Kio maximum. Les champs inconnus sont retirés, les fichiers ignorés ; toutes les règles s'appliquent. Signez les octets exacts par HMAC-SHA256 : X-Sluis-Timestamp contient les secondes Unix à cinq minutes près ; X-Sluis-Signature contient sha256= puis le résultat hexadécimal minuscule pour horodatage, point et corps. Une signature acceptée n'est pas réutilisable. Réessayez 402, 429 ou 5xx dans la fenêtre seulement ; 429 fournit Retry-After. Sans Redis, 503 refuse l'accès.
Réponses : 201 créé ; 400 objet invalide ; 401 signature incorrecte, périmée ou répétée ; 402 crédit bloqué ; 403 IP refusée ; 404 point d'accès ou fonction inconnu ou désactivé ; 413 limite du corps ou du stockage ; 422 enregistrement invalide ; 429 débit limité ; 503 indisponible. Les erreurs de règles contiennent error et issues avec field, rule et message ; les autres réponses sont sans corps. Limites : 120 envois par minute et point d'accès, 600 par organisation, plus une limite par expéditeur. L'audit échantillonne les refus en cas d'abus ; la gestion montre les 20 derniers envois. Exemples de signature ci-dessous.
SECRET='whsec_...' # shown once when the endpoint is created or rotated
URL='https://gateway.sluis.ai/hooks/databases/DATABASE_ID/COLLECTION'
BODY='{"title":"Printer jammed","priority":"high"}'
TS=$(date +%s)
# HMAC-SHA256 over "<timestamp>.<exact body bytes>", lowercase hex
SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" -hex | sed 's/^.* //')
curl -i -X POST "$URL" \
-H 'Content-Type: application/json' \
-H "X-Sluis-Timestamp: $TS" \
-H "X-Sluis-Signature: sha256=$SIG" \
--data-binary "$BODY"import { createHmac } from "node:crypto";
const body = JSON.stringify({ title: "Printer jammed", priority: "high" });
const ts = String(Math.floor(Date.now() / 1000));
const sig = createHmac("sha256", process.env.SLUIS_WEBHOOK_SECRET)
.update(`${ts}.${body}`)
.digest("hex");
const res = await fetch("https://gateway.sluis.ai/hooks/databases/DATABASE_ID/COLLECTION", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Sluis-Timestamp": ts,
"X-Sluis-Signature": `sha256=${sig}`,
},
body, // send exactly the string you signed
});
console.log(res.status); // 201 when the record was createdLimites et facturation
Limites : 256 Kio de source, 20 tables, 100 champs par table et 16 Kio par enregistrement. Les règles s'exécutent dans une sandbox limitée, sans réseau ni accès libre aux fichiers. Propriétaires et administrateurs peuvent désactiver Bases de données dans la console sans supprimer les bases.
À partir de la date de facturation annoncée sept jours à l'avance, le stockage coûte 5,15 € par Go et par mois pour texte et données, 0,0803 € pour fichiers, pièces jointes et enregistrements audio (1 Go = 1 000 000 000 octets). Les Agents et automatisations sans surveillance coûtent 0,005 € par minute, par seconde entamée ; les chats interactifs n'ont pas de frais de durée. Les jetons IA sont mesurés séparément.
Limite de stockage : 100 Go ou 5 000 000 objets par organisation racine de facturation, sous-organisations comprises. Les responsables peuvent fixer un plafond mensuel. Un solde vide suspend les ajouts au stockage et le travail sans surveillance, pas la lecture, le téléchargement, l'export ou la suppression. Les données restent intactes. Schéma, partage et administration sont audités ; l'historique des enregistrements est distinct.
Un refus de stockage en session renvoie HTTP 413 avec error.code storage_full ; une requête trop grande ne porte pas ce code. PUT /chat/settings conserve database_webhooks_enabled si le champ est absent ou null. Envoyez true ou false pour le modifier ; la valeur initiale est désactivée.