agentic-api 2.0.314 → 2.0.585

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +37 -34
  2. package/dist/src/agents/prompts.d.ts +1 -1
  3. package/dist/src/agents/prompts.js +9 -7
  4. package/dist/src/agents/reducer.core.js +2 -2
  5. package/dist/src/agents/simulator.d.ts +33 -4
  6. package/dist/src/agents/simulator.dashboard.d.ts +140 -0
  7. package/dist/src/agents/simulator.dashboard.js +344 -0
  8. package/dist/src/agents/simulator.executor.d.ts +9 -3
  9. package/dist/src/agents/simulator.executor.js +43 -17
  10. package/dist/src/agents/simulator.js +103 -19
  11. package/dist/src/agents/simulator.prompts.d.ts +9 -8
  12. package/dist/src/agents/simulator.prompts.js +68 -62
  13. package/dist/src/agents/simulator.types.d.ts +39 -4
  14. package/dist/src/agents/simulator.utils.d.ts +22 -1
  15. package/dist/src/agents/simulator.utils.js +27 -2
  16. package/dist/src/execute/helpers.d.ts +75 -0
  17. package/dist/src/execute/helpers.js +139 -0
  18. package/dist/src/execute/index.d.ts +11 -0
  19. package/dist/src/execute/index.js +44 -0
  20. package/dist/src/execute/legacy.d.ts +46 -0
  21. package/dist/src/{execute.js → execute/legacy.js} +130 -232
  22. package/dist/src/execute/modelconfig.d.ts +29 -0
  23. package/dist/src/execute/modelconfig.js +72 -0
  24. package/dist/src/execute/responses.d.ts +55 -0
  25. package/dist/src/execute/responses.js +595 -0
  26. package/dist/src/execute/shared.d.ts +83 -0
  27. package/dist/src/execute/shared.js +188 -0
  28. package/dist/src/index.d.ts +5 -1
  29. package/dist/src/index.js +21 -2
  30. package/dist/src/llm/config.d.ts +25 -0
  31. package/dist/src/llm/config.js +38 -0
  32. package/dist/src/llm/index.d.ts +48 -0
  33. package/dist/src/llm/index.js +115 -0
  34. package/dist/src/llm/openai.d.ts +6 -0
  35. package/dist/src/llm/openai.js +154 -0
  36. package/dist/src/llm/pricing.d.ts +26 -0
  37. package/dist/src/llm/pricing.js +129 -0
  38. package/dist/src/llm/xai.d.ts +17 -0
  39. package/dist/src/llm/xai.js +90 -0
  40. package/dist/src/pricing.llm.d.ts +3 -15
  41. package/dist/src/pricing.llm.js +10 -230
  42. package/dist/src/prompts.d.ts +0 -1
  43. package/dist/src/prompts.js +51 -118
  44. package/dist/src/rag/embeddings.d.ts +5 -1
  45. package/dist/src/rag/embeddings.js +23 -7
  46. package/dist/src/rag/parser.js +1 -1
  47. package/dist/src/rag/rag.manager.d.ts +33 -2
  48. package/dist/src/rag/rag.manager.js +159 -61
  49. package/dist/src/rag/types.d.ts +2 -0
  50. package/dist/src/rag/usecase.js +8 -11
  51. package/dist/src/rules/git/git.e2e.helper.js +21 -2
  52. package/dist/src/rules/git/git.health.d.ts +4 -2
  53. package/dist/src/rules/git/git.health.js +113 -16
  54. package/dist/src/rules/git/index.d.ts +1 -1
  55. package/dist/src/rules/git/index.js +3 -2
  56. package/dist/src/rules/git/repo.d.ts +57 -7
  57. package/dist/src/rules/git/repo.js +326 -39
  58. package/dist/src/rules/git/repo.pr.d.ts +8 -0
  59. package/dist/src/rules/git/repo.pr.js +161 -13
  60. package/dist/src/rules/git/repo.tools.d.ts +5 -1
  61. package/dist/src/rules/git/repo.tools.js +54 -7
  62. package/dist/src/rules/types.d.ts +25 -0
  63. package/dist/src/rules/utils.matter.d.ts +0 -20
  64. package/dist/src/rules/utils.matter.js +58 -81
  65. package/dist/src/scrapper.js +3 -2
  66. package/dist/src/stategraph/stategraph.d.ts +26 -1
  67. package/dist/src/stategraph/stategraph.js +43 -2
  68. package/dist/src/stategraph/stategraph.storage.js +4 -0
  69. package/dist/src/stategraph/types.d.ts +5 -0
  70. package/dist/src/types.d.ts +42 -7
  71. package/dist/src/types.js +8 -7
  72. package/dist/src/usecase.js +1 -1
  73. package/dist/src/utils.d.ts +0 -8
  74. package/dist/src/utils.js +26 -29
  75. package/package.json +9 -7
  76. package/dist/src/execute.d.ts +0 -63
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.usecaseExtractionPrompt = exports.usecaseExtractionPrompt_OLD = exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPromptHandoff = exports.transferAgentPromptStructured = exports.transferAgentPrompt = exports.transferAgentPrompt__ = exports.transferAgentPrompt_ = void 0;
3
+ exports.usecaseExtractionPrompt = exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPromptHandoff = exports.transferAgentPromptStructured = exports.transferAgentPrompt = exports.transferAgentPrompt__ = exports.transferAgentPrompt_ = void 0;
4
4
  exports.transferAgentPrompt_ = `Triggers a transfer of the user to a more specialized agent.
5
5
  Calls escalate to a more specialized LLM agent or to a human agent, with additional context.
6
6
  Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.
@@ -242,130 +242,63 @@ owner: {owner}
242
242
 
243
243
 
244
244
  `;
245
- const usecaseExtractionPrompt_OLD = (file) => `# RÔLE:
246
- - Tu es un expert en développement de test unitaires avec nodejs et jtest.
247
- - Tu as développé un RAG avec openai et "hnswlib-node" qui contient toutes les Procédures de l'entreprise Pilet & Renaud SA.
248
- - Ta mission est de créer une série de tests exhaustifs pour valider que le RAG couvre à 100% le contenu des procédures de l'entreprise.
249
- - Produire des questions à un coût important, tu dois être efficace, tu dois capturer un maximum de détails ( action, objet, bénéficiaire, contexte) avec un minimum de questions (maximum 4):
250
- Une question peut concerner l'utilisation précise d'un logiciel ou un article précis de réglementation.
251
- Chaque question doit satisfaire ces critères: clairement identifier le problème à résoudre ou l'action souhaitée dans le domaine précis du document fourni, doit être spécifique et ne peut pas être ambiguë.
252
- Tu DOIS supprimer du résultat les questions génériques qui non spécifiques au contexte métier du document.
253
- Toutes les questions que tu vas créer concernent précisément le document fourni en INPUT ci-dessous.
254
- - Pour orienter la formulation des questions, je te fournis quelques exemples de questions réelles.
255
- - En moyenne, chaque question doit être au maximum de 15 mots, mais tu peux en produire aussi des plus courtes (20%) pour élargir le champ des tests.
256
- - La réponse contient la liste de mots très spécifiques pour chaque section de la procédure séparés par des virgules.
257
- - Si la réponse concerne un schéma, une procédure ou l'utilisation d'un logiciel, tu dois décrire le besoin spécifique.
258
-
259
-
260
- # EXEMPLES de formulation utilisées par les collaborateurs l'entreprise (attention à ne pas utiliser ces exemples si le sujet du INPUT´est différent).
261
- - Écoulement bouché, que faire ?
262
- - J’ai une fuite depuis le plafond de ma chambre, j’aimerais un sanitaire
263
- - Mon frigo ne fonctionne pas, pouvez-vous mandater quelqu’un ?
264
- - Mon store est resté bloqué, pouvez-vous faire quelque chose ?
265
- - J’aimerais faire reproduire des clés, comment faire ? combien ça coûte ?
266
- - Je suis fournisseur, ma facture n’est toujours pas payée par Pilet & Renaud.
267
- - J’ai payé mon loyer, mais j’ai reçu un rappel, pourquoi ?
268
- - Je paie toujours bien mon loyer, pouvez-vous supprimer les frais de rappel c’est la première fois que j’ai du retard.
269
- - Est-ce que cet appartement est toujours disponible ? Comment déposer un dossier?
270
- - Est-ce que mon dossier de candidature est retenu ? j’aimerais des infos.
271
- - Inscription de korkmaz?
272
- - J’ai reçu un appel manqué de la régie mais je ne sais pas qui a tenté de me joindre.
273
- - Un fournisseur me dit que sa facture n’est toujours pas payée par Pilet & Renaud. Comment je vérifie ça?
274
- - Comment créer un bon ?
275
- - Quelles sont les tâches à faire après avoir conclu un contrat d’entretien ?
276
- - Une entreprise souhaite travailler avec nous, que dois-je faire ?
277
-
278
- # QUESTIONS A EVITER: Les exemples qui ne sont pas pertinents pour le RAG (les documents sont tous concernés par ces questions, c'est donc inutile de les inclure dans les tests).
279
- - Ce document contient-il des liens externes ?
280
- - Cette absence de liens affecte-t-elle la validité du document ?
281
- - Qui doit valider les changements dans la procédure ?
282
- - Comment valider une modification de procédure ?
283
-
284
- # DICTIONNAIRE (jargon de l'entreprise):
285
- - Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
286
- - SGC: Service de Gestion de la Clientèle
287
- - GED: service qui gère le scan des documents, la mise sous plis, l’économat, le réassort des salles de pauses, la saisie des données pour orienter les documents dans M-Files
288
- - MED: Mise en demeure.
289
- - WC: Toilettes.
290
- - M-Files: logiciel de gestion de documents
291
- - PR ou PRSA: Pilet & Renaud SA
292
- - PPE: Service qui gère les copropriétés.
293
- - GP: Garantie Bancaire
294
- - BAL: Boite à Lettre
295
- - DD: Arrangement de paiement pour facture due mais qui n’est pas du loyer.
296
- - copro: copropriétaire (attention à ne pas confondre avec gopros)
297
- - un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
298
- - La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
299
-
300
-
301
- # OUTPUT INSTRUCTIONS
302
- - Tu dois produire un JSON strict avec les champs suivants:
303
- \`\`\`JSON
304
- {
305
- "source": "string",
306
- "file": "${file}",
307
- "queries": [{ "question": "string" }, ...]
308
- }
309
- \`\`\`
310
-
311
- INPUT:
312
- `;
313
- exports.usecaseExtractionPrompt_OLD = usecaseExtractionPrompt_OLD;
314
- const usecaseExtractionPrompt = (file, options = {}) => `# RÔLE:
315
- - Tu es un expert en tests unitaires.
245
+ const usecaseExtractionPrompt = (file, options = {}) => `# RÔLE
246
+ - Tu es un collaborateur expérimenté qui aide ses collègues à formuler des questions métier courtes, naturelles et très concrètes.
247
+ - Tu adoptes le point de vue d’un collègue interne qui pose une question précise sur une procédure donnée (INPUT).
316
248
  - Le corpus de procédures est indexé (RAG).
317
- - Tu adoptes le point de vue de l'utilisateur (un collègue interne qui pose une question métier précise à son voisin).
318
- - Tu génères des **questions discriminantes** testant la **couverture RAG** d’une procédure ou marche à suivre.
319
-
320
- # Structure du document en INPUT pour l'extraction des use cases
321
- - **Titre principal** → unique dans le corpus (très important).
322
- - **Intervenants** → Acteur(s) et Bénéficiaire(s) (distincts) de la procédure.
323
- - **Sections** → Titre unique dans la procédure (très important).
324
- - **ÉTAPES / ACTIONS** → action/règle/décision importante
325
- - **RÉSULTAT** → finalité/effet attendu
326
- - **UI/PATH** → chemin/interface (Système > Module > Action)
327
249
 
250
+ # Structure du document en INPUT
251
+ - **Titre principal** → unique dans le corpus décrit l'object métier (le “concept central” de la section).
252
+ - **Intervenants** → acteur(s) et bénéficiaire(s).
253
+ - **Sections** → titre unique dans la procédure.
254
+ - **ÉTAPES / ACTIONS / TABLEAUX**
255
+ - **RÉSULTAT**
256
+ - **LOGICIEL**
328
257
 
329
258
  # MISSION
330
- - Créer des **questions ultra-spécifiques** au document **INPUT** pour vérifier la couverture des **objectifs métiers**.
331
- - Chaque question = **un use-case précis**, **une seule section** (objectif, contexte, bénéficiaire, résultat).
332
- - Questions **courtes, concrètes, vérifiables** (≈12–18 mots; déroger si nécessaire pour l’exactitude).
333
- - Efficience : **min. 1** question par section, **max. 6** au total.
334
- - Une section = **un cas d’usage** spécifique (sans ambiguïté).
335
- - Une question peut viser un logiciel, un **raccourci** clavier, un acronyme, une étiquette, un montant, ou une règle juridique.
336
- - Critères : problème/action précis, contexte métier clair, non ambigu.
337
- - **Ne produis pas** de questions hors objectif du document.
338
- - Tout porte **strictement** sur le document fourni en INPUT.
339
-
340
- # FORMAT DES QUESTIONS (obligatoire)
341
- - Gabarit (au choix), rédigé **depuis l'utilisateur** :
342
- - « En tant que [rôle dans la procédure], comment [action] dans [Système > Chemin] pour [résultat] ? »
343
- - « Je dois [action] dans [Système > Chemin] : quel [champ/étiquette] renseigner pour [cas] ? »
344
- - « Pour [objectif], [créer/valider/envoyer] dans [Système > Chemin] et avec quel libellé ? »
345
- - « Mon lavabo de salle de bain est bouché: l'eau s'évacue très lentement et remonte»
346
-
347
- ## STYLE (strict)
348
- - Formuler en langage naturel, **sans aucun préfixe/label** au début.
349
- - Démarrer par « En tant que… », « Je dois… » ou « Pour… » (puis la question).
350
-
351
-
352
- # Interdictions Absolues
353
- - Préfixes/labels **méta** dans la question : « Section », « ÉTAPE(S) », « RÉSULTAT », « UI/PATH », « Tag », « Validation: ».
354
- - Questions vagues/génériques/méta (ex. “Quel système reçoit la demande ?”, “Dans quel contexte s’applique-t-elle ?”).
355
- - Questions n’identifiant pas clairement le **use-case** ou le **bénéficiaire**.
356
-
357
- # EXEMPLES À ÉVITER
358
- - « Dans quel contexte la procédure s’applique-t-elle ? »
359
- - « Ce document contient-il des liens externes ? »
360
- - « Combien de sections contient la procédure ? »
361
- - « À quelle adresse e-mail est envoyée la notification ? » *(si le contexte métier n’est pas défini)*
362
- - « Que faire si la demande est incomplète ? » *(sans préciser procédure, système, rôle, champ)*
259
+ - Générer des **questions ultra-spécifiques**, strictement liées au document INPUT.
260
+ - Chaque question = **un use-case métier concret**, issu d’**une seule section**
261
+ - **L’objet métier mentionné dans le \`Titre:\` de la section doit apparaître explicitement dans chaque question**.
262
+ Titre : l’ACTION, l’OBJET métier et le BÉNÉFICIAIRE (seul 2/3 éléments sont obligatoires).
263
+ - Pour les logiciels, toujours partir de la fonction recherchée et du nom du logiciel pour trouver la marche à suivre. "Comment faire avec X pour Y..."
264
+ - La question peut faire référence à des **valeurs concrètes** recherchées (montant, échéance, TVA, etc.) pour renforcer la spécificité.
265
+
266
+ # DIRECTIVES SUPPLÉMENTAIRES POUR LES TABLES MARKDOWN
267
+ - Pour une section contenant un tableau, chaque question doit viser à extraire **uniquement la valeur d’une cellule précise** : montant, condition ou date. (ces valeurs ne sont jamais mentionnées dans la question)
268
+ - La question doit intégrer explicitement l’objet métier du \`Titre:\` de la section (le "concept central").
269
+ - Interdiction de mentionner le tableau, ses colonnes, ou ses cellules.
270
+
271
+ # LIMITES pour éviter la surcharge de questions.
272
+ - Limite Maximum de 5 questions par section de 20 lignes
273
+ - Questions **courtes, naturelles, humaines**, acronymes autorisés (contraindre la formulation à 10-16 mots maximum - hard limit).
274
+ - Chaque question concerne un seul objet métier et une seule réponse attendue sans exception.
275
+
276
+
277
+ # STYLE (strict)
278
+ - La question doit ressembler à ce qu’un collègue dirait oralement : simple, directe.
279
+ - Démarrer par **« Je dois… »**, **« Comment… »** ou **« Pour… »** (forme interrogative).
280
+ - Interdiction des formulations vagues ou a objectifs multiples : toujours nommer l'objet métier.
281
+ - Priorité : **spécificité** → **clarté** → **brièveté** (dans cet ordre).
282
+
283
+ # Interdictions absolues
284
+ - Jamais utiliser les labels ou préfixes suivants : «Pour ce use-case», «En tant que», «Section», «Étapes», «Résultat», «UI/PATH», «Tag», «Validation».
285
+ - Questions génériques (“Que faire si… ?” sans objet métier).
286
+ - Questions parlant d’un autre système ou d’un cas hors procédure.
287
+ - Formulations abstraites : la phrase correspondante”, “le texte”, “le document” sans préciser.
288
+ - Ne jamais mentionner "En tant que Collaborateurs..." dans la question, c'est le rôle par défaut de l'utilisateur.
289
+ - Pas d’exemples hors métier (suppression du gabarit lavabo).
290
+
291
+ # Gabarits simplifiés (optionnels)
292
+ - « La comptabilité doit [action métier] pour [fonction métier]. »
293
+ - « Je dois [action métier] pour [fonction métier]. »
294
+ - « Comment [action courte] sur [document/objet métier] ? »
295
+ - « Pour [objectif précis], où saisir [champ] dans [logiciel] ? »
296
+ - « un client veut [objectif métier précis]. »
363
297
 
364
298
  ${options.extended}
365
299
 
366
-
367
- # OUTPUT INSTRUCTIONS
368
- - Tu dois produire un JSON strict avec les champs suivants:
300
+ # OUTPUT
301
+ - Retourner un JSON strict sans mofifier le nom du fichier :
369
302
  \`\`\`JSON
370
303
  {
371
304
  "file": "${file}",
@@ -17,6 +17,7 @@ export declare class Embeddings {
17
17
  private debug;
18
18
  private metadata;
19
19
  private mapping;
20
+ private provider;
20
21
  constructor(config: RAGConfig);
21
22
  /**
22
23
  * Extrait et sauvegarde les use cases d'un document
@@ -45,7 +46,10 @@ export declare class Embeddings {
45
46
  */
46
47
  searchKnn(vectors: number[], options?: EmbeddingsSearchOptions): RAGSearchResult;
47
48
  /**
48
- * Recherche sémantique avec OpenAI
49
+ * Recherche sémantique avec le provider de l'embedding
50
+ * @param question La question à rechercher
51
+ * @param options Options de recherche
52
+ * @returns Les résultats de la recherche
49
53
  */
50
54
  semanticSearch(question: string, options?: EmbeddingsSearchOptions): Promise<RAGSearchResult>;
51
55
  /**
@@ -10,6 +10,8 @@ const path_1 = __importDefault(require("path"));
10
10
  const types_1 = require("./types");
11
11
  const parser_1 = require("./parser");
12
12
  const utils_1 = require("../utils");
13
+ const llm_1 = require("../llm");
14
+ const modelconfig_1 = require("../execute/modelconfig");
13
15
  const usecase_1 = require("./usecase");
14
16
  class Embeddings {
15
17
  constructor(config) {
@@ -22,6 +24,7 @@ class Embeddings {
22
24
  this.distance = config.distance || 'cosine';
23
25
  this.inmemory = config.inmemory || false;
24
26
  this.debug = false;
27
+ this.provider = config.provider || 'openai';
25
28
  // Charger l'index existant si disponible et pas en mode inmemory
26
29
  if (!this.inmemory && (0, fs_1.existsSync)(this.vectorsFile)) {
27
30
  this.loadIndex();
@@ -127,14 +130,19 @@ class Embeddings {
127
130
  };
128
131
  }
129
132
  /**
130
- * Recherche sémantique avec OpenAI
133
+ * Recherche sémantique avec le provider de l'embedding
134
+ * @param question La question à rechercher
135
+ * @param options Options de recherche
136
+ * @returns Les résultats de la recherche
131
137
  */
132
138
  async semanticSearch(question, options = {}) {
133
139
  const startTime = Date.now();
134
- const openai = (0, utils_1.openaiInstance)();
140
+ const provider = this.provider;
141
+ const openai = (0, llm_1.llmInstance)({ provider });
142
+ const embeddingConfig = (0, modelconfig_1.modelConfig)("EMBEDDING-small", { provider });
135
143
  // Créer l'embedding de la question
136
144
  const embedding = await openai.embeddings.create({
137
- model: 'text-embedding-3-small',
145
+ model: embeddingConfig.model,
138
146
  input: question,
139
147
  dimensions: this.space,
140
148
  encoding_format: 'float',
@@ -190,25 +198,31 @@ class Embeddings {
190
198
  // Sauvegarder l'ancienne config pour rollback en cas d'erreur
191
199
  const oldConfig = this.config;
192
200
  const oldVectorsFile = this.vectorsFile;
201
+ console.log(`\n 🔧 Embeddings.update() appelé`);
202
+ console.log(` Ancien baseDir: ${oldConfig.baseDir}`);
203
+ console.log(` Nouveau baseDir: ${newConfig.baseDir}`);
193
204
  try {
194
205
  // Mettre à jour la configuration
195
206
  this.config = newConfig;
196
207
  this.vectorsFile = path_1.default.join(newConfig.baseDir, types_1.RAG_FILES.VECTORS);
197
208
  this.space = newConfig.dimensions || 1536;
198
209
  this.distance = newConfig.distance || 'cosine';
210
+ console.log(` Nouveau vectorsFile: ${this.vectorsFile}`);
211
+ console.log(` Fichier existe: ${(0, fs_1.existsSync)(this.vectorsFile)}`);
199
212
  // Recharger l'index si ce n'est pas en mode inmemory
200
213
  if (!this.inmemory) {
201
214
  // Vérifier que les fichiers existent
202
215
  if (!(0, fs_1.existsSync)(this.vectorsFile)) {
203
216
  throw new Error(`Fichier d'index manquant: ${this.vectorsFile}`);
204
217
  }
218
+ console.log(` 📥 Rechargement de l'index...`);
205
219
  // Recharger l'index
206
220
  this.loadIndex();
221
+ console.log(` 📥 Rechargement des métadonnées et mapping...`);
207
222
  // Recharger les métadonnées et le mapping
208
223
  this.loadMetadata();
209
224
  this.loadMapping();
210
- if (this.debug)
211
- console.log(`✅ Embedding mis à jour avec nouvelle config: ${newConfig.baseDir}`);
225
+ console.log(` ✅ Embedding mis à jour avec nouvelle config: ${newConfig.baseDir}`);
212
226
  }
213
227
  }
214
228
  catch (error) {
@@ -257,7 +271,9 @@ class Embeddings {
257
271
  const m = options?.m || this.config.hnswConfig?.m || 32;
258
272
  const isUpdate = options?.update || false;
259
273
  const prepare = options?.prepare || ((input) => input);
260
- const openai = (0, utils_1.openaiInstance)();
274
+ const provider = this.provider;
275
+ const openai = (0, llm_1.llmInstance)({ provider });
276
+ const embeddingConfig = (0, modelconfig_1.modelConfig)("EMBEDDING-small", { provider });
261
277
  const vectors = {};
262
278
  const documentRefs = {};
263
279
  const documentReferences = {};
@@ -298,7 +314,7 @@ class Embeddings {
298
314
  }
299
315
  // Créer l'embedding de la section
300
316
  const embedding = await openai.embeddings.create({
301
- model: "text-embedding-3-small",
317
+ model: embeddingConfig.model,
302
318
  input: prepare(section.content),
303
319
  dimensions: this.space,
304
320
  encoding_format: "float",
@@ -34,7 +34,7 @@ function getSections(content, filename) {
34
34
  content = contentWithoutMatter || content;
35
35
  //
36
36
  // le contenu est toujours sans le front-matter!
37
- const rawSections = content.split('---').map(section => section.trim());
37
+ const rawSections = content.split('\n---\n').map(section => section.trim());
38
38
  if (!rawSections.length) {
39
39
  return {
40
40
  filename,
@@ -161,6 +161,15 @@ export declare class RAGManager {
161
161
  * ```
162
162
  */
163
163
  addDocument(name: string, filename: string, content: string): void;
164
+ /**
165
+ * Marque un document comme entièrement traité (enhanced + query.json générés)
166
+ * Le .sha est écrit APRÈS le traitement complet pour garantir la cohérence
167
+ *
168
+ * @param name Nom du RAG
169
+ * @param filename Nom du fichier (ex: 'procedure.md')
170
+ * @param content Contenu du document traité
171
+ */
172
+ markDocumentProcessed(name: string, filename: string, content: string): void;
164
173
  /**
165
174
  * Prépare un RAG enfant en copiant les documents d'un RAG parent
166
175
  *
@@ -242,6 +251,26 @@ export declare class RAGManager {
242
251
  * ```
243
252
  */
244
253
  loadUseCases(name: string, filename: string): DocumentQueries;
254
+ /**
255
+ * Charge tous les use cases de tous les documents d'un RAG
256
+ *
257
+ * Utilise le fichier rag-metadata.json pour obtenir la liste des documents valides
258
+ * puis charge chaque fichier .query.json correspondant
259
+ *
260
+ * @param name Nom du RAG
261
+ * @returns Objet contenant tous les use cases par document
262
+ *
263
+ * @example
264
+ * ```typescript
265
+ * const allQueries = ragManager.loadAllUseCases('my-rag');
266
+ * console.log(`${Object.keys(allQueries.documents).length} documents avec use cases`);
267
+ * console.log(`${allQueries.totalQueries} questions au total`);
268
+ * ```
269
+ */
270
+ loadAllUseCases(name: string): {
271
+ documents: Record<string, DocumentQueries>;
272
+ totalQueries: number;
273
+ };
245
274
  /**
246
275
  * Construit un RAG de manière atomique
247
276
  *
@@ -274,7 +303,7 @@ export declare class RAGManager {
274
303
  /**
275
304
  * Supprime un RAG du registre
276
305
  */
277
- delete(name: string, archiveFlag?: boolean): Promise<void>;
306
+ delete(name: string, archiveFlag?: boolean): Promise<void | Error>;
278
307
  /**
279
308
  * Renomme un document dans un RAG existant
280
309
  *
@@ -306,7 +335,8 @@ export declare class RAGManager {
306
335
  */
307
336
  private updateJSONReferences;
308
337
  /**
309
- * Renomme un RAG existant
338
+ * Renomme un RAG existant (nom dans le registre uniquement)
339
+ * Le dossier physique n'est PAS modifié, seul le nom dans la config change.
310
340
  *
311
341
  * @param from Nom actuel du RAG
312
342
  * @param to Nouveau nom du RAG
@@ -316,6 +346,7 @@ export declare class RAGManager {
316
346
  * @example
317
347
  * ```typescript
318
348
  * await ragManager.rename('old-name', 'new-name', 'Description mise à jour');
349
+ * // Le dossier reste /path/to/old-name mais le RAG s'appelle 'new-name'
319
350
  * ```
320
351
  */
321
352
  rename(from: string, to: string, description?: string): Promise<void>;