Plusieurs gros ajouts :
Some checks failed
Build & Push Images / build (brain) (push) Has been cancelled
Build & Push Images / build (core) (push) Has been cancelled
Build & Push Images / build (web) (push) Has been cancelled
Build & Push Images / build-switcher (push) Has been cancelled

- Possibilité de discuter avec un PDF ; RAG ou analyse approfondie. Enlèvement de l'autre outil PDF de discussion qui analysait d'abord un PDF en proposant directement une intégration sans attendre qu'on pose de question
- Mise en place de l'import directement dans les outils dans la sidebar
- Mise en place d'un outil pour créer des tables aléatoires avec possibilité d'utiliser pendant la partie
- Mise en place d'un outil pour mettre en place des PNJ, scènes, chapitre.... directement à partir de la discussion avec le PDF
- Mise en place RAG avec mistal-embeding ou nomic si on utilise ollama
- Mise en place mistral, google en fournisseurs alternatifs pour l'IA dans le cloud
- version 0.11.0-bêta
This commit is contained in:
2026-06-07 09:52:15 +02:00
parent 5eb15dc449
commit edc4434298
113 changed files with 6347 additions and 662 deletions

View File

@@ -0,0 +1,49 @@
/**
* Protocole d'« actions » proposées par l'IA dans le chat d'un atelier : des blocs
* ```loremind-action {json} ``` que le front transforme en cartes « Créer dans la
* campagne ». Ce module définit les types + le parseur (extraction + texte nettoyé).
*/
export interface NotebookActionEntry {
minRoll: number;
maxRoll: number;
label: string;
detail?: string;
}
export interface NotebookAction {
type: 'npc' | 'scene' | 'chapter' | 'arc' | 'table';
name: string;
description?: string;
content?: string;
arcType?: 'LINEAR' | 'HUB';
diceFormula?: string;
entries?: NotebookActionEntry[];
}
const ACTION_RE = /```loremind-action\s*([\s\S]*?)```/g;
const VALID_TYPES = new Set(['npc', 'scene', 'chapter', 'arc', 'table']);
/**
* Extrait les blocs d'action COMPLETS d'un message et renvoie le texte sans ces
* blocs. Les blocs encore en cours de streaming (clôture absente) ne matchent pas
* → ils restent affichés tels quels brièvement, puis deviennent une carte.
*/
export function parseNotebookActions(content: string): { text: string; actions: NotebookAction[] } {
const actions: NotebookAction[] = [];
if (!content) return { text: '', actions };
let match: RegExpExecArray | null;
ACTION_RE.lastIndex = 0;
while ((match = ACTION_RE.exec(content)) !== null) {
try {
const obj = JSON.parse(match[1].trim());
if (obj && typeof obj.type === 'string' && VALID_TYPES.has(obj.type) && typeof obj.name === 'string') {
actions.push(obj as NotebookAction);
}
} catch {
/* bloc JSON invalide : ignoré */
}
}
const text = content.replace(ACTION_RE, '').trim();
return { text, actions };
}