agentic-api 2.0.31 → 2.0.314

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 (89) hide show
  1. package/dist/src/agents/agents.example.js +21 -22
  2. package/dist/src/agents/authentication.js +1 -2
  3. package/dist/src/agents/prompts.d.ts +5 -4
  4. package/dist/src/agents/prompts.js +42 -87
  5. package/dist/src/agents/reducer.core.d.ts +24 -2
  6. package/dist/src/agents/reducer.core.js +125 -35
  7. package/dist/src/agents/reducer.loaders.d.ts +55 -1
  8. package/dist/src/agents/reducer.loaders.js +114 -1
  9. package/dist/src/agents/reducer.types.d.ts +45 -2
  10. package/dist/src/agents/semantic.js +1 -2
  11. package/dist/src/agents/simulator.d.ts +4 -0
  12. package/dist/src/agents/simulator.executor.d.ts +5 -1
  13. package/dist/src/agents/simulator.executor.js +41 -9
  14. package/dist/src/agents/simulator.js +86 -28
  15. package/dist/src/agents/simulator.prompts.d.ts +3 -2
  16. package/dist/src/agents/simulator.prompts.js +52 -78
  17. package/dist/src/agents/simulator.types.d.ts +20 -5
  18. package/dist/src/agents/simulator.utils.d.ts +7 -2
  19. package/dist/src/agents/simulator.utils.js +33 -11
  20. package/dist/src/agents/system.js +1 -2
  21. package/dist/src/execute.d.ts +17 -3
  22. package/dist/src/execute.js +156 -158
  23. package/dist/src/index.d.ts +1 -1
  24. package/dist/src/index.js +1 -1
  25. package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
  26. package/dist/src/pricing.llm.js +234 -0
  27. package/dist/src/prompts.d.ts +13 -4
  28. package/dist/src/prompts.js +221 -114
  29. package/dist/src/rag/embeddings.d.ts +36 -18
  30. package/dist/src/rag/embeddings.js +125 -128
  31. package/dist/src/rag/index.d.ts +5 -5
  32. package/dist/src/rag/index.js +14 -17
  33. package/dist/src/rag/parser.d.ts +2 -1
  34. package/dist/src/rag/parser.js +11 -14
  35. package/dist/src/rag/rag.examples.d.ts +27 -0
  36. package/dist/src/rag/rag.examples.js +151 -0
  37. package/dist/src/rag/rag.manager.d.ts +383 -0
  38. package/dist/src/rag/rag.manager.js +1378 -0
  39. package/dist/src/rag/types.d.ts +128 -12
  40. package/dist/src/rag/types.js +100 -1
  41. package/dist/src/rag/usecase.d.ts +37 -0
  42. package/dist/src/rag/usecase.js +96 -7
  43. package/dist/src/rules/git/git.e2e.helper.js +1 -0
  44. package/dist/src/rules/git/git.health.d.ts +57 -0
  45. package/dist/src/rules/git/git.health.js +281 -1
  46. package/dist/src/rules/git/index.d.ts +2 -2
  47. package/dist/src/rules/git/index.js +12 -1
  48. package/dist/src/rules/git/repo.d.ts +117 -0
  49. package/dist/src/rules/git/repo.js +536 -0
  50. package/dist/src/rules/git/repo.tools.d.ts +22 -1
  51. package/dist/src/rules/git/repo.tools.js +50 -1
  52. package/dist/src/rules/types.d.ts +16 -14
  53. package/dist/src/rules/utils.matter.d.ts +0 -4
  54. package/dist/src/rules/utils.matter.js +26 -7
  55. package/dist/src/scrapper.d.ts +15 -22
  56. package/dist/src/scrapper.js +57 -110
  57. package/dist/src/stategraph/index.d.ts +1 -1
  58. package/dist/src/stategraph/stategraph.d.ts +31 -2
  59. package/dist/src/stategraph/stategraph.js +93 -6
  60. package/dist/src/stategraph/stategraph.storage.js +4 -0
  61. package/dist/src/stategraph/types.d.ts +22 -0
  62. package/dist/src/types.d.ts +4 -2
  63. package/dist/src/types.js +1 -1
  64. package/dist/src/usecase.d.ts +11 -2
  65. package/dist/src/usecase.js +27 -35
  66. package/dist/src/utils.d.ts +32 -18
  67. package/dist/src/utils.js +60 -126
  68. package/package.json +7 -2
  69. package/dist/src/agents/digestor.test.d.ts +0 -1
  70. package/dist/src/agents/digestor.test.js +0 -45
  71. package/dist/src/agents/reducer.example.d.ts +0 -28
  72. package/dist/src/agents/reducer.example.js +0 -118
  73. package/dist/src/agents/reducer.process.d.ts +0 -16
  74. package/dist/src/agents/reducer.process.js +0 -143
  75. package/dist/src/agents/reducer.tools.d.ts +0 -29
  76. package/dist/src/agents/reducer.tools.js +0 -157
  77. package/dist/src/agents/simpleExample.d.ts +0 -3
  78. package/dist/src/agents/simpleExample.js +0 -38
  79. package/dist/src/agents/system-review.d.ts +0 -5
  80. package/dist/src/agents/system-review.js +0 -181
  81. package/dist/src/agents/systemReview.d.ts +0 -4
  82. package/dist/src/agents/systemReview.js +0 -22
  83. package/dist/src/princing.openai.js +0 -54
  84. package/dist/src/rag/tools.d.ts +0 -76
  85. package/dist/src/rag/tools.js +0 -196
  86. package/dist/src/rules/user.mapper.d.ts +0 -61
  87. package/dist/src/rules/user.mapper.js +0 -160
  88. package/dist/src/rules/utils/slug.d.ts +0 -22
  89. package/dist/src/rules/utils/slug.js +0 -35
@@ -33,55 +33,15 @@ class Embeddings {
33
33
  }
34
34
  }
35
35
  /**
36
- * Retourne le prochain ID documentaire stable et met à jour metadata.docLastID.
37
- * Pré-conditions: this.mapping et this.metadata sont chargés.
36
+ * Extrait et sauvegarde les use cases d'un document
37
+ * Utilise la fonction standalone pour la compatibilité
38
+ *
39
+ * @param document Document parsé
40
+ * @returns Les queries extraites avec leur coût
41
+ * @deprecated Utiliser extractAndSaveDocumentUseCases de usecase.ts directement
38
42
  */
39
- getNextID() {
40
- // Si non initialisé, partir du plus grand ID du mapping
41
- if (this.metadata.docLastID == null || this.metadata.docLastID <= 0) {
42
- const maxFromMapping = Object.keys(this.mapping.mapping || {})
43
- .map(k => parseInt(k, 10))
44
- .filter(n => !isNaN(n))
45
- .reduce((a, b) => Math.max(a, b), 999);
46
- this.metadata.docLastID = maxFromMapping + 1;
47
- }
48
- else {
49
- this.metadata.docLastID = this.metadata.docLastID + 1;
50
- }
51
- const next = this.metadata.docLastID;
52
- this.saveMetadata(this.metadata);
53
- return next;
54
- }
55
- /**
56
- * Retourne l'ID documentaire pour un fichier. Si non trouvé, attribue un nouvel ID.
57
- * Stratégie: utiliser le mapping id -> "filename#section-0".
58
- */
59
- getOrAssignDocumentID(file) {
60
- const base = path_1.default.basename(file, path_1.default.extname(file));
61
- // Chercher un ID existant dans le mapping (section-0 comme ancrage documentaire)
62
- const found = Object.entries(this.mapping.mapping || {}).find(([id, ref]) => {
63
- return typeof ref === 'string' && ref.startsWith(`${base}#section-0`);
64
- });
65
- if (found) {
66
- return parseInt(found[0], 10);
67
- }
68
- // Sinon, générer un nouvel ID documentaire
69
- return this.getNextID();
70
- }
71
43
  async extractAndSaveDocumentUseCases(document) {
72
- const { queries, cost } = await (0, usecase_1.extractDocumentUseCases)(document);
73
- const filename = path_1.default.basename(document.filename, path_1.default.extname(document.filename));
74
- const docQueries = {
75
- type: 'use-cases',
76
- version: this.config.version,
77
- tag: this.config.tag,
78
- source: document.filename,
79
- file: (0, utils_1.toSlug)(filename) + '.json',
80
- cost,
81
- queries
82
- };
83
- (0, usecase_1.saveUseCases)(docQueries, this.config);
84
- return docQueries;
44
+ return (0, usecase_1.extractAndSaveDocumentUseCases)(document, this.config.baseDir, this.config.version, this.config.tag);
85
45
  }
86
46
  /**
87
47
  * Charge les documents du RAG
@@ -102,6 +62,7 @@ class Embeddings {
102
62
  // throw error;
103
63
  // }
104
64
  const content = (0, fs_1.readFileSync)(filePath, 'utf8');
65
+ // getSections() validera que l'ID est présent dans le matter
105
66
  const parsedDocument = (0, parser_1.getSections)(content, file);
106
67
  return parsedDocument;
107
68
  }
@@ -117,7 +78,7 @@ class Embeddings {
117
78
  */
118
79
  async loadDocumentUseCases(document) {
119
80
  const filename = path_1.default.basename(document.filename, path_1.default.extname(document.filename));
120
- return (0, usecase_1.loadUseCases)((0, utils_1.toSlug)(filename) + '.json', this.config);
81
+ return (0, usecase_1.loadUseCases)((0, utils_1.toSlug)(filename) + '.query.json', this.config);
121
82
  }
122
83
  async listDocumentsOnRAG() {
123
84
  const filesWithSection = Object.values(this.mapping?.mapping || {});
@@ -204,6 +165,75 @@ class Embeddings {
204
165
  }
205
166
  return this.vectorsIndex !== null && this.metadata !== null && this.mapping !== null;
206
167
  }
168
+ /**
169
+ * Met à jour l'embedding avec une nouvelle configuration
170
+ * Recharge l'index, les métadonnées et le mapping depuis les nouveaux fichiers
171
+ *
172
+ * Cette méthode est appelée par RAGManager.notifyUpdate() quand un RAG est modifié
173
+ *
174
+ * FIXME: Gérer le cas où l'embedding est en cours d'exécution (recherche/indexation)
175
+ * Actuellement, l'update est appliqué immédiatement sans vérifier si l'embedding est busy.
176
+ * Solutions possibles:
177
+ * - Ajouter un flag `isBusy` pour bloquer les updates pendant une recherche
178
+ * - Implémenter une queue d'updates avec retry
179
+ * - Utiliser un système de locks/mutex
180
+ *
181
+ * @param newConfig Nouvelle configuration RAG
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * // Appelé automatiquement par RAGManager après un build ou rename
186
+ * embedding.update(newConfig);
187
+ * ```
188
+ */
189
+ update(newConfig) {
190
+ // Sauvegarder l'ancienne config pour rollback en cas d'erreur
191
+ const oldConfig = this.config;
192
+ const oldVectorsFile = this.vectorsFile;
193
+ try {
194
+ // Mettre à jour la configuration
195
+ this.config = newConfig;
196
+ this.vectorsFile = path_1.default.join(newConfig.baseDir, types_1.RAG_FILES.VECTORS);
197
+ this.space = newConfig.dimensions || 1536;
198
+ this.distance = newConfig.distance || 'cosine';
199
+ // Recharger l'index si ce n'est pas en mode inmemory
200
+ if (!this.inmemory) {
201
+ // Vérifier que les fichiers existent
202
+ if (!(0, fs_1.existsSync)(this.vectorsFile)) {
203
+ throw new Error(`Fichier d'index manquant: ${this.vectorsFile}`);
204
+ }
205
+ // Recharger l'index
206
+ this.loadIndex();
207
+ // Recharger les métadonnées et le mapping
208
+ this.loadMetadata();
209
+ this.loadMapping();
210
+ if (this.debug)
211
+ console.log(`✅ Embedding mis à jour avec nouvelle config: ${newConfig.baseDir}`);
212
+ }
213
+ }
214
+ catch (error) {
215
+ // Rollback en cas d'erreur
216
+ console.error('❌ Erreur lors de la mise à jour de l\'embedding, rollback:', error);
217
+ this.config = oldConfig;
218
+ this.vectorsFile = oldVectorsFile;
219
+ this.space = oldConfig.dimensions || 1536;
220
+ this.distance = oldConfig.distance || 'cosine';
221
+ // Essayer de recharger l'ancienne config
222
+ try {
223
+ if (!this.inmemory && (0, fs_1.existsSync)(this.vectorsFile)) {
224
+ this.loadIndex();
225
+ this.loadMetadata();
226
+ this.loadMapping();
227
+ }
228
+ }
229
+ catch (rollbackError) {
230
+ console.error('❌ Erreur critique lors du rollback:', rollbackError);
231
+ // Réinitialiser complètement en dernier recours
232
+ this.resetKnn();
233
+ }
234
+ throw new Error(`Impossible de mettre à jour l'embedding: ${error}`);
235
+ }
236
+ }
207
237
  /**
208
238
  * Réinitialise l'index
209
239
  */
@@ -215,13 +245,18 @@ class Embeddings {
215
245
  /**
216
246
  * Crée un nouvel index HierarchicalNSW avec documents parsés
217
247
  * ou met à jour l'index existant avec de nouveaux documents
248
+ *
249
+ * @returns IndexBuildResult contenant les données nécessaires pour créer les métadonnées RAG
250
+ *
251
+ * Note: Cette méthode ne sauvegarde plus les métadonnées directement.
252
+ * RAGManager est responsable de créer et sauvegarder les métadonnées
253
+ * à partir du résultat retourné.
218
254
  */
219
255
  async indexFromDocuments(documents, options) {
220
256
  const ef = options?.ef || this.config.hnswConfig?.ef || 200;
221
257
  const m = options?.m || this.config.hnswConfig?.m || 32;
222
258
  const isUpdate = options?.update || false;
223
259
  const prepare = options?.prepare || ((input) => input);
224
- let startId = this.config.startId || 1000;
225
260
  const openai = (0, utils_1.openaiInstance)();
226
261
  const vectors = {};
227
262
  const documentRefs = {};
@@ -230,19 +265,19 @@ class Embeddings {
230
265
  if (isUpdate && this.mapping && this.metadata) {
231
266
  Object.assign(documentRefs, this.mapping.mapping);
232
267
  Object.assign(documentReferences, this.metadata.documents);
233
- // Trouver le prochain ID disponible
234
- const existingIds = Object.keys(documentRefs).map(id => parseInt(id));
235
- startId = existingIds.length ? Math.max(...existingIds) + 1 : startId;
236
268
  }
237
- console.log(`Traitement de ${documents.length} documents...`);
269
+ if (this.debug)
270
+ console.log(`Traitement de ${documents.length} documents...`);
238
271
  for (const doc of documents) {
239
272
  const filename = path_1.default.basename(doc.filename, path_1.default.extname(doc.filename));
240
273
  process.stdout.write(`Traitement: ${filename}`);
241
- const { sections } = doc;
274
+ const { sections, matter } = doc;
242
275
  if (!sections.length) {
243
276
  console.log(`❌ Aucune section trouvée dans ${filename}`);
244
277
  continue;
245
278
  }
279
+ // ID de base du document
280
+ const baseId = matter.id;
246
281
  // Traiter chaque section
247
282
  for (let index = 0; index < sections.length; index++) {
248
283
  const section = sections[index];
@@ -250,10 +285,14 @@ class Embeddings {
250
285
  if (!hasEnoughContent) {
251
286
  continue;
252
287
  }
288
+ // ✅ NOUVEAU: ID calculé = matter.id * 100 + sectionIndex
289
+ // Permet de supprimer facilement toutes les sections d'un document
290
+ // en recherchant les IDs entre (matter.id * 100) et (matter.id * 100 + 99)
291
+ // Limite: 100 sections par document (0-99)
292
+ const vectorId = baseId * 100 + index;
253
293
  // Vérifier si cette section existe déjà (pour les mises à jour)
254
294
  const ref = `${filename}#section-${index}`;
255
- const existingId = Object.keys(documentRefs).find(id => documentRefs[id] === ref);
256
- if (isUpdate && existingId) {
295
+ if (isUpdate && documentRefs[vectorId]) {
257
296
  console.log(`Section ${ref} déjà indexée, ignorée`);
258
297
  continue;
259
298
  }
@@ -266,24 +305,19 @@ class Embeddings {
266
305
  });
267
306
  const normalizedVectors = (0, parser_1.l2Normalize)(embedding.data[0].embedding);
268
307
  // Stocker avec le nouveau format d'ID
269
- vectors[startId] = normalizedVectors;
270
- documentRefs[startId] = ref;
308
+ vectors[vectorId] = normalizedVectors;
309
+ documentRefs[vectorId] = ref;
271
310
  // Créer la référence de document
272
- documentReferences[startId] = {
311
+ documentReferences[vectorId] = {
273
312
  filename: filename + '.md',
274
313
  sectionIndex: index,
275
314
  ref,
276
315
  title: section.title || `Section ${index}`,
277
316
  content: section.content,
278
- metadata: doc.matter
317
+ metadata: matter
279
318
  };
280
- startId++;
281
319
  process.stdout.write(hasEnoughContent ? ':' : '.');
282
320
  }
283
- //
284
- // let enough room for new sections on future updates
285
- const pad = 20 - sections.length;
286
- startId += pad;
287
321
  console.log(' done');
288
322
  }
289
323
  // Créer ou mettre à jour l'index HierarchicalNSW
@@ -308,16 +342,13 @@ class Embeddings {
308
342
  }
309
343
  }
310
344
  else {
311
- //
312
- // FIXME this is not working, ids must be restored from de RAGMapping ids <=> documentRefs
313
- // Mettre à jour l'index existant
345
+ // Mettre à jour l'index existant avec de nouveaux vecteurs
314
346
  console.log(`Mise à jour de l'index avec ${newVectors.length} nouveaux vecteurs`);
315
- const replaceDeleted = true;
316
347
  for (const item of newVectors) {
317
348
  const id = parseInt(item);
318
- // le point existant n’apparaît plus
319
- this.vectorsIndex.markDelete(id);
320
- this.vectorsIndex.addPoint(vectors[item], id, replaceDeleted);
349
+ // Pour les nouveaux vecteurs, on les ajoute simplement sans markDelete
350
+ // car ils n'existaient pas auparavant dans l'index
351
+ this.vectorsIndex.addPoint(vectors[item], id);
321
352
  }
322
353
  }
323
354
  // Sauvegarder l'index
@@ -328,26 +359,14 @@ class Embeddings {
328
359
  // Créer le tag de version
329
360
  const tag = this.config.tag || (0, types_1.generateVersionTag)();
330
361
  const version = this.config.version || '1.0';
331
- // Créer et sauvegarder le mapping
332
- const mapping = {
333
- type: 'mapping',
334
- version,
335
- tag,
336
- mapping: documentRefs,
337
- createdAt: new Date().toISOString()
338
- };
339
- this.saveMapping(mapping);
340
- // Créer et sauvegarder les métadonnées
341
- const metadata = {
362
+ // Assigner les métadonnées en mémoire pour que les méthodes comme listDocumentsOnRAG() fonctionnent
363
+ // Même si on ne sauvegarde plus sur disque, les données doivent être en mémoire
364
+ this.metadata = {
342
365
  version,
343
366
  tag,
344
367
  createdAt: new Date().toISOString(),
345
368
  config: this.config,
346
369
  documents: documentReferences,
347
- checkpoint: {
348
- branch: options?.branch || '',
349
- hash: options?.lastCommit || ''
350
- },
351
370
  stats: {
352
371
  totalDocuments: documents.length,
353
372
  totalSections: totalVectors,
@@ -360,7 +379,22 @@ class Embeddings {
360
379
  queriesFile: types_1.RAG_FILES.QUERIES
361
380
  }
362
381
  };
363
- this.saveMetadata(metadata);
382
+ this.mapping = {
383
+ type: 'mapping',
384
+ version,
385
+ tag,
386
+ mapping: documentRefs,
387
+ createdAt: new Date().toISOString()
388
+ };
389
+ // ✅ Retourner les données pour que RAGManager gère les métadonnées sur disque
390
+ return {
391
+ totalVectors,
392
+ vectorDimensions: this.space,
393
+ documents: documentReferences,
394
+ mapping: documentRefs,
395
+ tag,
396
+ version
397
+ };
364
398
  }
365
399
  /**
366
400
  * Charge l'index HierarchicalNSW existant
@@ -414,46 +448,9 @@ class Embeddings {
414
448
  }
415
449
  }
416
450
  }
417
- /**
418
- * Sauvegarde les métadonnées dans rag-metadata.json
419
- */
420
- saveMetadata(metadata) {
421
- // Toujours assigner les métadonnées en mémoire
422
- this.metadata = metadata;
423
- // En mode inmemory, on ne sauvegarde pas sur disque
424
- if (this.inmemory)
425
- return;
426
- const metadataFile = path_1.default.join(this.config.baseDir, types_1.RAG_FILES.METADATA);
427
- try {
428
- (0, fs_1.writeFileSync)(metadataFile, JSON.stringify(metadata, null, 2), 'utf8');
429
- if (this.debug) {
430
- console.log('Métadonnées sauvegardées:', metadataFile);
431
- }
432
- }
433
- catch (error) {
434
- console.error('Erreur lors de la sauvegarde des métadonnées:', error);
435
- }
436
- }
437
- /**
438
- * Sauvegarde le mapping des IDs
439
- */
440
- saveMapping(mapping) {
441
- // Toujours assigner le mapping en mémoire
442
- this.mapping = mapping;
443
- // En mode inmemory, on ne sauvegarde pas sur disque
444
- if (this.inmemory)
445
- return;
446
- const mappingFile = path_1.default.join(this.config.baseDir, types_1.RAG_FILES.MAPPING);
447
- try {
448
- (0, fs_1.writeFileSync)(mappingFile, JSON.stringify(mapping, null, 2), 'utf8');
449
- if (this.debug) {
450
- console.log('Mapping sauvegardé:', mappingFile);
451
- }
452
- }
453
- catch (error) {
454
- console.error('Erreur lors de la sauvegarde du mapping:', error);
455
- }
456
- }
451
+ // ❌ SUPPRIMÉ : saveMetadata() et saveMapping()
452
+ // Ces méthodes ont été déplacées vers RAGManager pour une meilleure séparation des responsabilités
453
+ // RAGManager est maintenant responsable de la gestion complète du cycle de vie des métadonnées
457
454
  /**
458
455
  * Récupère un vecteur depuis l'index existant (pour les mises à jour)
459
456
  */
@@ -2,11 +2,11 @@ export * from './types';
2
2
  export * from './parser';
3
3
  export * from './embeddings';
4
4
  export * from './usecase';
5
+ export * from './rag.manager';
6
+ export * from './rag.examples';
7
+ import { RAGConfig } from './types';
5
8
  /**
6
9
  * Configuration par défaut pour le RAG
7
10
  */
8
- /**
9
- * Gestionnaire RAG principal
10
- */
11
- export declare class RAGManager {
12
- }
11
+ declare const DEFAULT_RAG_CONFIG: Partial<RAGConfig>;
12
+ export { DEFAULT_RAG_CONFIG };
@@ -14,27 +14,24 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.RAGManager = void 0;
17
+ exports.DEFAULT_RAG_CONFIG = void 0;
18
18
  __exportStar(require("./types"), exports);
19
19
  __exportStar(require("./parser"), exports);
20
20
  __exportStar(require("./embeddings"), exports);
21
21
  __exportStar(require("./usecase"), exports);
22
+ __exportStar(require("./rag.manager"), exports);
23
+ __exportStar(require("./rag.examples"), exports);
22
24
  /**
23
25
  * Configuration par défaut pour le RAG
24
26
  */
25
- // const DEFAULT_RAG_CONFIG: Partial<RAGConfig> = {
26
- // vectorsFile: 'hnsw-vectors',
27
- // dimensions: 1536,
28
- // distance: 'cosine',
29
- // filterInput: '',
30
- // hnswConfig: {
31
- // ef: 200,
32
- // m: 32
33
- // }
34
- // };
35
- /**
36
- * Gestionnaire RAG principal
37
- */
38
- class RAGManager {
39
- }
40
- exports.RAGManager = RAGManager;
27
+ const DEFAULT_RAG_CONFIG = {
28
+ dimensions: 1536,
29
+ distance: 'cosine',
30
+ version: '1.0',
31
+ startId: 1000,
32
+ hnswConfig: {
33
+ ef: 200,
34
+ m: 32
35
+ }
36
+ };
37
+ exports.DEFAULT_RAG_CONFIG = DEFAULT_RAG_CONFIG;
@@ -4,7 +4,8 @@ import { ParsedDocument, DocumentSection } from './types';
4
4
  *
5
5
  * @param content Contenu du document
6
6
  * @param filename Nom du fichier (pour le titre par défaut)
7
- * @returns Sections et header du document
7
+ * @returns Sections et header du document avec matter validé
8
+ * @throws Error si le matter est invalide après traitement
8
9
  */
9
10
  export declare function getSections(content: string, filename: string): ParsedDocument;
10
11
  /**
@@ -12,6 +12,7 @@ exports.sectionParseValues = sectionParseValues;
12
12
  exports.sectionParseKey = sectionParseKey;
13
13
  exports.removeThinkingBlocks = removeThinkingBlocks;
14
14
  const fs_1 = require("fs");
15
+ const types_1 = require("./types");
15
16
  const path_1 = __importDefault(require("path"));
16
17
  const rules_1 = require("../rules");
17
18
  /**
@@ -19,7 +20,8 @@ const rules_1 = require("../rules");
19
20
  *
20
21
  * @param content Contenu du document
21
22
  * @param filename Nom du fichier (pour le titre par défaut)
22
- * @returns Sections et header du document
23
+ * @returns Sections et header du document avec matter validé
24
+ * @throws Error si le matter est invalide après traitement
23
25
  */
24
26
  function getSections(content, filename) {
25
27
  // IMPORTANT: Cette fonction traite les fichiers transformés par RAGGenerator
@@ -27,16 +29,8 @@ function getSections(content, filename) {
27
29
  // Vérifier si le contenu contient un front-matter,
28
30
  // celui-ci contient le nom du fichier d'origine et le nom du service!
29
31
  let { matter, content: contentWithoutMatter } = (0, rules_1.matterParse)(content);
30
- // imprimer une alarm
31
- if (matter?.mergeBase && matter?.createdBy) {
32
- console.log('🔔 No standard matter found in file:', matter);
33
- }
34
- // S'assurer que matter contient au minimum filename et title
35
- matter = {
36
- ...matter,
37
- filename,
38
- title: matter.title || filename // Utiliser le filename comme titre par défaut
39
- };
32
+ // Valider le matter (throw si invalide)
33
+ (0, types_1.isValidRAGMatter)(matter);
40
34
  content = contentWithoutMatter || content;
41
35
  //
42
36
  // le contenu est toujours sans le front-matter!
@@ -58,8 +52,7 @@ function getSections(content, filename) {
58
52
  title: sectionParseKey('titre', content) || undefined
59
53
  }))
60
54
  .filter(section => section.lines > 2); // Filtrer les sections trop courtes
61
- //
62
- // le matter contient les informations du fichier d'origine! (service, responssable, fichier, etc.)
55
+ // Retourner le document parsé avec matter validé
63
56
  return {
64
57
  filename,
65
58
  sections,
@@ -84,7 +77,11 @@ const getDocumentBySection = (id, ids, prefix) => {
84
77
  throw new Error('Invalid document id :' + fullname);
85
78
  }
86
79
  const content = (0, fs_1.readFileSync)(path_1.default.join(prefix, filename), 'utf8');
87
- const { sections } = getSections(content, filename);
80
+ const { sections, matter } = getSections(content, filename);
81
+ // Vérifier que l'ID du matter correspond à l'ID demandé
82
+ if (matter.id !== id) {
83
+ console.warn(`❌ Document ID mismatch: ${matter.title} - expected ${id}, got ${matter.id}`);
84
+ }
88
85
  if (!sections.length) {
89
86
  return {
90
87
  source: fullname,
@@ -0,0 +1,27 @@
1
+ import { ParsedDocument, RAGConfig } from './types';
2
+ import { RAGManager } from './rag.manager';
3
+ /**
4
+ * Exemples d'utilisation du gestionnaire multi-RAG
5
+ */
6
+ /**
7
+ * Construit un RAG spécifique avec des documents
8
+ */
9
+ export declare function buildSpecificRAG(ragManager: RAGManager, ragName: string, documents: ParsedDocument[], ragConfig?: Partial<RAGConfig>): Promise<void>;
10
+ /**
11
+ * Recherche dans un RAG spécifique
12
+ */
13
+ export declare function searchInRAG(ragManager: RAGManager, ragName: string, query: string, options?: {
14
+ neighbors?: number;
15
+ debug?: boolean;
16
+ }): Promise<any>;
17
+ /**
18
+ * Recherche dans le RAG par défaut
19
+ */
20
+ export declare function searchInDefaultRAG(ragManager: RAGManager, query: string, options?: {
21
+ neighbors?: number;
22
+ debug?: boolean;
23
+ }): Promise<any>;
24
+ /**
25
+ * Exemple d'utilisation complète
26
+ */
27
+ export declare function exampleUsage(baseDir: string): Promise<void>;
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildSpecificRAG = buildSpecificRAG;
4
+ exports.searchInRAG = searchInRAG;
5
+ exports.searchInDefaultRAG = searchInDefaultRAG;
6
+ exports.exampleUsage = exampleUsage;
7
+ const rag_manager_1 = require("./rag.manager");
8
+ /**
9
+ * Exemples d'utilisation du gestionnaire multi-RAG
10
+ */
11
+ /**
12
+ * Construit un RAG spécifique avec des documents
13
+ */
14
+ async function buildSpecificRAG(ragManager, ragName, documents, ragConfig) {
15
+ console.log(`🔄 Construction du RAG: ${ragName}`);
16
+ try {
17
+ await ragManager.build(ragName, documents, ragConfig);
18
+ console.log(`✅ RAG '${ragName}' construit avec succès`);
19
+ }
20
+ catch (error) {
21
+ console.error(`❌ Erreur lors de la construction de '${ragName}':`, error);
22
+ throw error;
23
+ }
24
+ }
25
+ /**
26
+ * Recherche dans un RAG spécifique
27
+ */
28
+ async function searchInRAG(ragManager, ragName, query, options = {}) {
29
+ try {
30
+ const embeddings = ragManager.load(ragName);
31
+ const results = await embeddings.semanticSearch(query, {
32
+ neighbors: options.neighbors || 5,
33
+ debug: options.debug || false
34
+ });
35
+ if (options.debug) {
36
+ console.log(`🔍 Recherche dans '${ragName}': ${results.results.length} résultats`);
37
+ }
38
+ return results;
39
+ }
40
+ catch (error) {
41
+ console.error(`❌ Erreur lors de la recherche dans '${ragName}':`, error);
42
+ throw error;
43
+ }
44
+ }
45
+ /**
46
+ * Recherche dans le RAG par défaut
47
+ */
48
+ async function searchInDefaultRAG(ragManager, query, options = {}) {
49
+ const defaultRAG = ragManager.getDefault();
50
+ if (!defaultRAG) {
51
+ throw new Error('Aucun RAG par défaut défini');
52
+ }
53
+ return searchInRAG(ragManager, defaultRAG, query, options);
54
+ }
55
+ /**
56
+ * Exemple d'utilisation complète
57
+ */
58
+ async function exampleUsage(baseDir) {
59
+ console.log('🚀 Exemple d\'utilisation du gestionnaire multi-RAG');
60
+ console.log(`📁 Répertoire de base: ${baseDir}`);
61
+ // Initialiser le gestionnaire
62
+ const ragManagerConfig = {
63
+ baseDir,
64
+ maxArchives: 5
65
+ };
66
+ const ragManager = rag_manager_1.RAGManager.get(ragManagerConfig);
67
+ // Créer quelques RAG par défaut
68
+ const defaultRAGs = [
69
+ {
70
+ name: 'procedures-stable',
71
+ config: {
72
+ baseDir: '',
73
+ dimensions: 1536,
74
+ distance: 'cosine',
75
+ version: '1.0',
76
+ hnswConfig: { ef: 200, m: 64 }
77
+ }
78
+ },
79
+ {
80
+ name: 'procedures-draft',
81
+ config: {
82
+ baseDir: '',
83
+ dimensions: 1536,
84
+ distance: 'cosine',
85
+ version: '1.0',
86
+ hnswConfig: { ef: 200, m: 32 }
87
+ }
88
+ }
89
+ ];
90
+ for (const rag of defaultRAGs) {
91
+ try {
92
+ ragManager.getStatus(rag.name);
93
+ console.log(`✅ RAG déjà existant: ${rag.name}`);
94
+ }
95
+ catch (error) {
96
+ // RAG n'existe pas, le créer
97
+ const tempPath = await ragManager.create(rag.name);
98
+ console.log(`✅ RAG créé: ${rag.name} (temp: ${tempPath})`);
99
+ }
100
+ }
101
+ // Définir 'procedures-stable' comme RAG par défaut
102
+ await ragManager.setDefault('procedures-stable');
103
+ // Lister les RAG disponibles
104
+ const rags = ragManager.list();
105
+ console.log(`📋 RAG disponibles: ${rags.map((r) => r.name).join(', ')}`);
106
+ // Obtenir les statistiques
107
+ const stats = ragManager.getStats();
108
+ console.log('📊 Statistiques des RAG:');
109
+ stats.forEach(stat => {
110
+ console.log(` • ${stat.name}: ${stat.status} (${stat.isValid ? 'valide' : 'invalide'})`);
111
+ if (stat.metadata) {
112
+ console.log(` - Sections: ${stat.metadata.totalSections}`);
113
+ console.log(` - Dimensions: ${stat.metadata.vectorDimensions}`);
114
+ console.log(` - Taille: ${stat.metadata.indexSize}`);
115
+ }
116
+ if (stat.error) {
117
+ console.log(` - Erreur: ${stat.error}`);
118
+ }
119
+ });
120
+ // Exemple de recherche (nécessite des RAG construits)
121
+ try {
122
+ const results = await searchInDefaultRAG(ragManager, 'procédure de réparation', {
123
+ neighbors: 3,
124
+ debug: true
125
+ });
126
+ console.log(`🔍 Résultats de recherche: ${results.results.length} trouvés`);
127
+ }
128
+ catch (error) {
129
+ console.log('⚠️ Recherche impossible (RAG non construit):', error instanceof Error ? error.message : error);
130
+ }
131
+ // Exemple de recherche dans un RAG spécifique
132
+ const availableRAGs = rags.filter((r) => r.status === 'active');
133
+ if (availableRAGs.length > 0) {
134
+ const targetRAG = availableRAGs[0].name;
135
+ console.log(`🎯 Recherche dans '${targetRAG}': "maintenance"`);
136
+ try {
137
+ const results = await searchInRAG(ragManager, targetRAG, 'maintenance', {
138
+ neighbors: 2,
139
+ debug: true
140
+ });
141
+ console.log(`✅ ${results.results.length} résultats dans '${targetRAG}'`);
142
+ }
143
+ catch (error) {
144
+ console.log(`⚠️ Erreur: ${error instanceof Error ? error.message : error}`);
145
+ }
146
+ }
147
+ else {
148
+ console.log('⚠️ Aucun RAG actif disponible pour la recherche');
149
+ }
150
+ console.log('\n🎉 Exemple terminé !');
151
+ }