agentic-api 1.0.6 → 2.0.26

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 (103) hide show
  1. package/README.md +118 -22
  2. package/dist/src/agents/agents.example.d.ts +3 -0
  3. package/dist/src/agents/agents.example.js +38 -0
  4. package/dist/src/agents/authentication.js +2 -0
  5. package/dist/src/agents/prompts.d.ts +2 -2
  6. package/dist/src/agents/prompts.js +112 -49
  7. package/dist/src/agents/reducer.core.d.ts +12 -0
  8. package/dist/src/agents/reducer.core.js +207 -0
  9. package/dist/src/agents/reducer.d.ts +3 -0
  10. package/dist/src/agents/reducer.example.d.ts +28 -0
  11. package/dist/src/agents/reducer.example.js +118 -0
  12. package/dist/src/agents/reducer.js +19 -0
  13. package/dist/src/agents/reducer.loaders.d.ts +34 -0
  14. package/dist/src/agents/reducer.loaders.js +122 -0
  15. package/dist/src/agents/reducer.process.d.ts +16 -0
  16. package/dist/src/agents/reducer.process.js +143 -0
  17. package/dist/src/agents/reducer.tools.d.ts +29 -0
  18. package/dist/src/agents/reducer.tools.js +157 -0
  19. package/dist/src/agents/reducer.types.d.ts +50 -0
  20. package/dist/src/agents/reducer.types.js +5 -0
  21. package/dist/src/agents/simulator.d.ts +47 -0
  22. package/dist/src/agents/simulator.executor.d.ts +26 -0
  23. package/dist/src/agents/simulator.executor.js +132 -0
  24. package/dist/src/agents/simulator.js +205 -0
  25. package/dist/src/agents/simulator.prompts.d.ts +16 -0
  26. package/dist/src/agents/simulator.prompts.js +108 -0
  27. package/dist/src/agents/simulator.types.d.ts +42 -0
  28. package/dist/src/agents/simulator.types.js +2 -0
  29. package/dist/src/agents/simulator.utils.d.ts +20 -0
  30. package/dist/src/agents/simulator.utils.js +87 -0
  31. package/dist/src/execute.d.ts +13 -6
  32. package/dist/src/execute.js +351 -85
  33. package/dist/src/index.d.ts +9 -0
  34. package/dist/src/index.js +14 -0
  35. package/dist/src/princing.openai.d.ts +9 -2
  36. package/dist/src/princing.openai.js +15 -11
  37. package/dist/src/prompts.d.ts +3 -2
  38. package/dist/src/prompts.js +159 -19
  39. package/dist/src/rag/embeddings.d.ts +103 -0
  40. package/dist/src/rag/embeddings.js +466 -0
  41. package/dist/src/rag/index.d.ts +12 -0
  42. package/dist/src/rag/index.js +40 -0
  43. package/dist/src/rag/lucene.d.ts +45 -0
  44. package/dist/src/rag/lucene.js +227 -0
  45. package/dist/src/rag/parser.d.ts +68 -0
  46. package/dist/src/rag/parser.js +192 -0
  47. package/dist/src/rag/tools.d.ts +76 -0
  48. package/dist/src/rag/tools.js +196 -0
  49. package/dist/src/rag/types.d.ts +178 -0
  50. package/dist/src/rag/types.js +21 -0
  51. package/dist/src/rag/usecase.d.ts +16 -0
  52. package/dist/src/rag/usecase.js +79 -0
  53. package/dist/src/rules/errors.d.ts +60 -0
  54. package/dist/src/rules/errors.js +97 -0
  55. package/dist/src/rules/git/git.e2e.helper.d.ts +104 -0
  56. package/dist/src/rules/git/git.e2e.helper.js +488 -0
  57. package/dist/src/rules/git/git.health.d.ts +66 -0
  58. package/dist/src/rules/git/git.health.js +354 -0
  59. package/dist/src/rules/git/git.helper.d.ts +129 -0
  60. package/dist/src/rules/git/git.helper.js +53 -0
  61. package/dist/src/rules/git/index.d.ts +6 -0
  62. package/dist/src/rules/git/index.js +76 -0
  63. package/dist/src/rules/git/repo.d.ts +128 -0
  64. package/dist/src/rules/git/repo.js +900 -0
  65. package/dist/src/rules/git/repo.pr.d.ts +137 -0
  66. package/dist/src/rules/git/repo.pr.js +589 -0
  67. package/dist/src/rules/git/repo.tools.d.ts +134 -0
  68. package/dist/src/rules/git/repo.tools.js +730 -0
  69. package/dist/src/rules/index.d.ts +8 -0
  70. package/dist/src/rules/index.js +25 -0
  71. package/dist/src/rules/messages.d.ts +17 -0
  72. package/dist/src/rules/messages.js +21 -0
  73. package/dist/src/rules/types.ctrl.d.ts +28 -0
  74. package/dist/src/rules/types.ctrl.js +2 -0
  75. package/dist/src/rules/types.d.ts +510 -0
  76. package/dist/src/rules/types.helpers.d.ts +132 -0
  77. package/dist/src/rules/types.helpers.js +2 -0
  78. package/dist/src/rules/types.js +33 -0
  79. package/dist/src/rules/user.mapper.d.ts +61 -0
  80. package/dist/src/rules/user.mapper.js +160 -0
  81. package/dist/src/rules/utils/slug.d.ts +22 -0
  82. package/dist/src/rules/utils/slug.js +35 -0
  83. package/dist/src/rules/utils.matter.d.ts +66 -0
  84. package/dist/src/rules/utils.matter.js +208 -0
  85. package/dist/src/rules/utils.slug.d.ts +22 -0
  86. package/dist/src/rules/utils.slug.js +35 -0
  87. package/dist/src/scrapper.d.ts +3 -2
  88. package/dist/src/scrapper.js +33 -37
  89. package/dist/src/stategraph/index.d.ts +8 -0
  90. package/dist/src/stategraph/index.js +21 -0
  91. package/dist/src/stategraph/stategraph.d.ts +91 -0
  92. package/dist/src/stategraph/stategraph.js +241 -0
  93. package/dist/src/stategraph/stategraph.storage.d.ts +41 -0
  94. package/dist/src/stategraph/stategraph.storage.js +166 -0
  95. package/dist/src/stategraph/types.d.ts +139 -0
  96. package/dist/src/stategraph/types.js +19 -0
  97. package/dist/src/types.d.ts +62 -39
  98. package/dist/src/types.js +53 -89
  99. package/dist/src/usecase.d.ts +4 -0
  100. package/dist/src/usecase.js +44 -0
  101. package/dist/src/utils.d.ts +12 -5
  102. package/dist/src/utils.js +30 -13
  103. package/package.json +9 -3
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createTools = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const parser_1 = require("./parser");
10
+ const embeddings_1 = require("./embeddings");
11
+ /**
12
+ * Prompts de suivi pour les outils
13
+ */
14
+ const lookupReferencesContentFollowUpPrompt = "📋 RÉFÉRENCES DISPONIBLES\n\n";
15
+ const lookupKnowledgeFollowUpPrompt = "🔍 RECHERCHE DANS LA BASE DE CONNAISSANCES\n\n";
16
+ /**
17
+ * Définitions des outils pour l'agent
18
+ */
19
+ const toolsReferencesContent = {
20
+ type: "function",
21
+ function: {
22
+ name: "lookupReferencesContent",
23
+ description: "Récupère le contenu d'un document spécifique ou liste tous les documents disponibles, optionnellement filtrés par service.",
24
+ parameters: {
25
+ type: "object",
26
+ properties: {
27
+ service: {
28
+ type: "string",
29
+ description: "Nom du service optionnel (ex: 'Gérance', 'PPE', 'Comptabilité') pour filtrer les documents (insensible à la casse)."
30
+ },
31
+ source: {
32
+ type: "string",
33
+ description: "Identifiant source optionnel (généralement un nom de fichier sans extension) pour récupérer le contenu d'un document spécifique."
34
+ }
35
+ },
36
+ required: [],
37
+ additionalProperties: false
38
+ }
39
+ }
40
+ };
41
+ const toolsKnowledge = {
42
+ type: "function",
43
+ function: {
44
+ name: "lookupKnowledge",
45
+ description: "Effectue une recherche de connaissances en utilisant la recherche vectorielle basée sur la question de l'utilisateur.",
46
+ parameters: {
47
+ type: "object",
48
+ properties: {
49
+ question: {
50
+ type: "string",
51
+ description: "La question de l'utilisateur à rechercher."
52
+ },
53
+ justification: {
54
+ type: "string",
55
+ description: "Justification optionnelle pour la recherche (actuellement loggée mais non utilisée dans la logique principale)."
56
+ },
57
+ action_suivante: {
58
+ type: "string",
59
+ description: "Action suivante optionnelle pour instruire le LLM après traitement des résultats."
60
+ }
61
+ },
62
+ required: ["question"],
63
+ additionalProperties: false
64
+ }
65
+ }
66
+ };
67
+ /**
68
+ * Extrait le header d'un fichier
69
+ */
70
+ function getMatterHeaderFromFile(filePath) {
71
+ try {
72
+ const content = (0, fs_1.readFileSync)(filePath, 'utf8');
73
+ const { sections } = (0, parser_1.getSections)(content, path_1.default.basename(filePath));
74
+ // Essayer d'extraire le titre de la première section
75
+ const firstSection = sections[0];
76
+ if (firstSection?.title) {
77
+ return { title: firstSection.title };
78
+ }
79
+ // Fallback sur le nom du fichier
80
+ const filename = path_1.default.basename(filePath, path_1.default.extname(filePath));
81
+ return { title: filename.replace(/-/g, ' ') };
82
+ }
83
+ catch (error) {
84
+ const filename = path_1.default.basename(filePath, path_1.default.extname(filePath));
85
+ return { title: filename.replace(/-/g, ' ') };
86
+ }
87
+ }
88
+ // getDocumentFromId supprimée - utilisation directe de semanticSearch
89
+ /**
90
+ * Crée les outils RAG pour un agent
91
+ */
92
+ const createTools = (openai, config) => {
93
+ // Utiliser l'API Embeddings existante
94
+ const embeddings = new embeddings_1.Embeddings(config);
95
+ if (!embeddings.isReady()) {
96
+ throw new Error(`Index RAG non disponible à ${config.baseDir}. Exécutez buildrag d'abord.`);
97
+ }
98
+ // Charger le mapping des IDs
99
+ const mappingFile = path_1.default.join(config.baseDir, 'rag-mapping.json');
100
+ let ids = {};
101
+ try {
102
+ const mappingData = (0, fs_1.readFileSync)(mappingFile, 'utf8');
103
+ const mapping = JSON.parse(mappingData);
104
+ ids = mapping.mapping;
105
+ }
106
+ catch (error) {
107
+ console.error('Erreur lors du chargement du mapping:', error);
108
+ throw new Error('Mapping RAG non disponible');
109
+ }
110
+ /**
111
+ * Récupère le contenu d'un document spécifique ou liste tous les documents disponibles,
112
+ * optionnellement filtrés par service.
113
+ */
114
+ const lookupReferencesContent = async ({ service, source }) => {
115
+ const documentPath = config.baseDir;
116
+ const ftService = service?.toLowerCase();
117
+ // Liste tous les fichiers markdown dans le répertoire spécifié
118
+ const mdfiles = (0, fs_1.readdirSync)(documentPath)
119
+ .filter((file) => file.endsWith('.md') &&
120
+ (!ftService || file.toLowerCase().includes(ftService)))
121
+ .map((file) => path_1.default.join(documentPath, file));
122
+ // Si un source spécifique a été demandé
123
+ if (source) {
124
+ source = source.replace(/\.md.*/, '');
125
+ const file = mdfiles.find((file) => file.includes(source));
126
+ if (!file) {
127
+ return { content: `Désolé, je n'ai pas trouvé le document "${source}".` };
128
+ }
129
+ const filename = path_1.default.basename(file);
130
+ const content = (0, fs_1.readFileSync)(file, 'utf8');
131
+ const { sections } = (0, parser_1.getSections)(content, filename);
132
+ if (sections.length > 0) {
133
+ const title = sections[0].title || filename;
134
+ const allContent = sections.map(s => s.content).join('\n\n');
135
+ const response = `${title}\n\n${allContent}\n\n[»](${filename})`;
136
+ return { content: response };
137
+ }
138
+ else {
139
+ return { content: `Le document "${source}" est vide ou mal formaté.` };
140
+ }
141
+ }
142
+ // Si aucun source spécifié, lister les documents (filtrés par service si applicable)
143
+ const serviceTitle = ftService ? ` pour le service "${service}"` : '';
144
+ if (!mdfiles.length) {
145
+ return { content: `Désolé, aucun document trouvé${serviceTitle}.` };
146
+ }
147
+ const title = `${lookupReferencesContentFollowUpPrompt}Voici la liste exhaustive des documents disponibles${serviceTitle} :\n`;
148
+ const content = title + mdfiles.reduce((acc, file) => {
149
+ const header = getMatterHeaderFromFile(file);
150
+ const filename = path_1.default.basename(file);
151
+ return acc + `- ${header.title} [»](/${filename})\n`;
152
+ }, '');
153
+ return { content };
154
+ };
155
+ /**
156
+ * Effectue une recherche de connaissances en utilisant la recherche vectorielle
157
+ */
158
+ const lookupKnowledge = async (args, debug = false) => {
159
+ console.log("lookupKnowledge", args.question);
160
+ try {
161
+ // Utiliser l'API de recherche sémantique existante
162
+ const result = await embeddings.semanticSearch(args.question, {
163
+ neighbors: 5,
164
+ debug
165
+ });
166
+ if (!result.results || !result.results.length) {
167
+ return {
168
+ content: `Aucun document relatif à cette question.(⚠️ Tu dois continuer ton plan sans cette information)`
169
+ };
170
+ }
171
+ console.log(`--- DBG rag search: ${result.results.length} documents trouvés`);
172
+ if (debug) {
173
+ return {
174
+ documents: result.results,
175
+ scores: result.results.map(r => r.score)
176
+ };
177
+ }
178
+ const action_suivante = args.action_suivante || "";
179
+ const withNextAction = action_suivante ?
180
+ `(⚠️ A la fin de cette tâche, tu dois exécuter l'action suivante: "${action_suivante}")` : "";
181
+ const prefix = `${lookupKnowledgeFollowUpPrompt}Voici les sections des documents (avec les références) à analyser de manière exhaustive.${withNextAction}:\n`;
182
+ const response = prefix + result.results.reduce((doc, curr) => {
183
+ return doc + `\n---\n[${curr.content}](/${curr.ref})`;
184
+ }, '');
185
+ return { content: response };
186
+ }
187
+ catch (error) {
188
+ console.error('Erreur lors de la recherche:', error);
189
+ return {
190
+ content: `Erreur lors de la recherche dans la base de connaissances. (⚠️ Tu dois continuer ton plan sans cette information)`
191
+ };
192
+ }
193
+ };
194
+ return { toolsReferencesContent, toolsKnowledge, lookupReferencesContent, lookupKnowledge };
195
+ };
196
+ exports.createTools = createTools;
@@ -0,0 +1,178 @@
1
+ export declare const RAG_FILES: {
2
+ readonly VECTORS: "rag-hnsw.dat";
3
+ readonly METADATA: "rag-metadata.json";
4
+ readonly MAPPING: "rag-mapping.json";
5
+ readonly QUERIES: "rag-queries.json";
6
+ };
7
+ export interface RAGConfig {
8
+ /** Répertoire de base pour les documents et index */
9
+ baseDir: string;
10
+ /** Nom du fichier de vecteurs (sans extension) */
11
+ vectorsFile?: string;
12
+ /** Dimensions des vecteurs d'embedding */
13
+ dimensions?: number;
14
+ /** Distance utilisée pour l'index (cosine, l2, ip) */
15
+ distance?: 'cosine' | 'l2' | 'ip';
16
+ /** Configuration pour l'index HierarchicalNSW */
17
+ hnswConfig?: {
18
+ ef?: number;
19
+ m?: number;
20
+ };
21
+ /** Filtrer les fichiers d'entrée par préfixe */
22
+ filterInput?: string;
23
+ /** Préfixe pour tous les fichiers RAG */
24
+ prefix?: string;
25
+ /** Version du RAG (format X.Y) */
26
+ version?: string;
27
+ /** Tag de version (format vYYYYMMDD) */
28
+ tag?: string;
29
+ /** ID de départ pour l'indexation */
30
+ startId?: number;
31
+ /** Intégration avec RulesWorkflow */
32
+ useRulesWorkflow?: boolean;
33
+ /** Mode en mémoire pour les tests unitaires */
34
+ inmemory?: boolean;
35
+ }
36
+ export interface RAGMetadata {
37
+ /** Version du format des métadonnées */
38
+ version: string;
39
+ /** Tag de version (vYYYYMMDD) */
40
+ tag: string;
41
+ /** Timestamp de création */
42
+ createdAt: string;
43
+ /** Configuration utilisée pour créer l'index */
44
+ config: RAGConfig;
45
+ /** Mapping ID → référence document/section */
46
+ documents: Record<string, DocumentReference>;
47
+ /**
48
+ * Dernier identifiant documentaire attribué.
49
+ * Utilisé pour générer un ID documentaire stable (matter.id) indépendant du nom de fichier.
50
+ */
51
+ docLastID?: number;
52
+ /** Checkpoint avec le hash du dernier commit de la branche */
53
+ checkpoint: {
54
+ branch: string;
55
+ hash: string;
56
+ };
57
+ /** Statistiques de l'index */
58
+ stats: {
59
+ totalDocuments: number;
60
+ totalSections: number;
61
+ vectorDimensions: number;
62
+ indexSize: string;
63
+ };
64
+ /** Fichiers RAG associés */
65
+ files: {
66
+ /** Fichier d'index vectoriel */
67
+ vectorsFile: string;
68
+ /** Fichier de mapping des IDs */
69
+ mappingFile: string;
70
+ /** Fichier des use cases/queries */
71
+ queriesFile: string;
72
+ };
73
+ }
74
+ export interface DocumentReference {
75
+ /** Nom du fichier source */
76
+ filename: string;
77
+ /** Index de la section dans le document */
78
+ sectionIndex: number;
79
+ /** Référence complète (filename#section-X) */
80
+ ref: string;
81
+ /** Titre de la section */
82
+ title?: string;
83
+ /** Contenu de la section */
84
+ content: string;
85
+ /** Métadonnées du document */
86
+ metadata?: Record<string, any>;
87
+ }
88
+ export interface DocumentSection {
89
+ /** Contenu de la section */
90
+ content: string;
91
+ /** Numéro de la section */
92
+ index: number;
93
+ /** Titre de la section */
94
+ title?: string;
95
+ /** Longueur en lignes */
96
+ lines: number;
97
+ }
98
+ export interface ParsedDocument {
99
+ /** Nom du fichier source dans GIT*/
100
+ filename: string;
101
+ /** Métadonnées du front-matter */
102
+ matter: Record<string, any>;
103
+ /** Contenu sans le front-matter */
104
+ content: string;
105
+ /** Sections du document */
106
+ sections: DocumentSection[];
107
+ }
108
+ export interface RAGRef {
109
+ /** ID du document */
110
+ id: number;
111
+ /** Référence (filename#section-X) */
112
+ ref: string;
113
+ /** Score de similarité */
114
+ score: number;
115
+ /** Contenu de la section */
116
+ content: string;
117
+ }
118
+ export interface RAGSearchResult {
119
+ /** Résultats de la recherche */
120
+ results: RAGRef[];
121
+ /** Temps de recherche en ms */
122
+ searchTime?: number;
123
+ }
124
+ export interface EmbeddingResult {
125
+ /** ID attribué */
126
+ id: number;
127
+ /** Référence (filename#section-X) */
128
+ ref: string;
129
+ /** Vecteur d'embedding */
130
+ vector: number[];
131
+ }
132
+ /** Interface pour les use cases extraits par GPT d'une section */
133
+ export interface UserQuery {
134
+ /** Question utilisateur */
135
+ question: string;
136
+ /** Réponse attendue */
137
+ answer: string;
138
+ /** Nom du fichier source */
139
+ filename: string;
140
+ /** Index de la section */
141
+ sectionIndex: number;
142
+ /** Référence de la section (filename#section-X) */
143
+ ref: string;
144
+ }
145
+ /** Interface pour les use cases d'un document */
146
+ export interface DocumentQueries {
147
+ /** Type de queries */
148
+ type: 'use-cases';
149
+ /** Version du fichier de queries */
150
+ version: string;
151
+ /** Tag de version */
152
+ tag: string;
153
+ /** Nom du fichier source */
154
+ source: string;
155
+ /** Nom du fichier */
156
+ file: string;
157
+ /** Liste des questions/réponses par section */
158
+ queries: UserQuery[];
159
+ /** Coût de l'extraction */
160
+ cost: number;
161
+ }
162
+ /** Interface pour le fichier de mapping des IDs */
163
+ export interface RAGMapping {
164
+ /** Type de queries */
165
+ type: 'mapping';
166
+ /** Version du mapping */
167
+ version: string;
168
+ /** Tag de version */
169
+ tag: string;
170
+ /** Mapping ID → référence */
171
+ mapping: Record<string, string>;
172
+ /** Timestamp de création */
173
+ createdAt: string;
174
+ }
175
+ /**
176
+ * Génère un tag de version au format vYYYYMMDD
177
+ */
178
+ export declare function generateVersionTag(): string;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RAG_FILES = void 0;
4
+ exports.generateVersionTag = generateVersionTag;
5
+ // Constantes pour les noms de fichiers RAG
6
+ exports.RAG_FILES = {
7
+ VECTORS: 'rag-hnsw.dat',
8
+ METADATA: 'rag-metadata.json',
9
+ MAPPING: 'rag-mapping.json',
10
+ QUERIES: 'rag-queries.json'
11
+ };
12
+ /**
13
+ * Génère un tag de version au format vYYYYMMDD
14
+ */
15
+ function generateVersionTag() {
16
+ const today = new Date();
17
+ const year = today.getFullYear();
18
+ const month = String(today.getMonth() + 1).padStart(2, '0');
19
+ const day = String(today.getDate()).padStart(2, '0');
20
+ return `v${year}${month}${day}`;
21
+ }
@@ -0,0 +1,16 @@
1
+ import { DocumentQueries, UserQuery, RAGConfig, ParsedDocument } from './types';
2
+ /**
3
+ * Extrait tous les use cases d'un document parsé
4
+ */
5
+ export declare function extractDocumentUseCases(parsedDocument: ParsedDocument): Promise<{
6
+ queries: UserQuery[];
7
+ cost: number;
8
+ }>;
9
+ /**
10
+ * Sauvegarde les use cases dans un fichier JSON
11
+ */
12
+ export declare function saveUseCases(queries: DocumentQueries, config: RAGConfig): void;
13
+ /**
14
+ * Charge les use cases depuis un fichier JSON
15
+ */
16
+ export declare function loadUseCases(file: string, config: RAGConfig): DocumentQueries;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.extractDocumentUseCases = extractDocumentUseCases;
7
+ exports.saveUseCases = saveUseCases;
8
+ exports.loadUseCases = loadUseCases;
9
+ const fs_1 = require("fs");
10
+ const path_1 = __importDefault(require("path"));
11
+ const usecase_1 = require("../usecase");
12
+ /**
13
+ * Extrait tous les use cases d'un document parsé
14
+ */
15
+ async function extractDocumentUseCases(parsedDocument) {
16
+ const { sections, filename } = parsedDocument;
17
+ if (!sections.length) {
18
+ console.log(`❌ Aucune section trouvée dans ${filename}`);
19
+ return { queries: [], cost: 0 };
20
+ }
21
+ let totalCost = 0;
22
+ const allQueries = [];
23
+ for (let index = 0; index < sections.length; index++) {
24
+ const section = sections[index];
25
+ if (section.content.split('\n').length <= 2) {
26
+ continue;
27
+ }
28
+ try {
29
+ const { json, cost } = await (0, usecase_1.callGPTToExtractUserQueries)(section.content, filename);
30
+ const result = JSON.parse(json);
31
+ if (result.queries && Array.isArray(result.queries)) {
32
+ // Enrichir chaque query avec les informations de section
33
+ const enrichedQueries = result.queries.map((query) => ({
34
+ ...query,
35
+ filename: path_1.default.basename(filename, path_1.default.extname(filename)),
36
+ sectionIndex: index,
37
+ ref: `${path_1.default.basename(filename, path_1.default.extname(filename))}#section-${index}`
38
+ }));
39
+ allQueries.push(...enrichedQueries);
40
+ }
41
+ totalCost += cost;
42
+ }
43
+ catch (error) {
44
+ console.error(`Erreur lors de l'extraction des use cases pour ${filename}, section ${index}:`, error);
45
+ }
46
+ }
47
+ return { queries: allQueries, cost: totalCost };
48
+ }
49
+ /**
50
+ * Sauvegarde les use cases dans un fichier JSON
51
+ */
52
+ function saveUseCases(queries, config) {
53
+ try {
54
+ const file = path_1.default.join(config.baseDir, queries.file);
55
+ (0, fs_1.writeFileSync)(file, JSON.stringify(queries, null, 2), 'utf8');
56
+ console.log(`🔔 Use cases sauvegardés: ${file}`);
57
+ }
58
+ catch (error) {
59
+ console.error('Erreur lors de la sauvegarde des use cases:', error);
60
+ throw new Error(`Erreur lors de la sauvegarde des use cases: ${error.message}`);
61
+ }
62
+ }
63
+ /**
64
+ * Charge les use cases depuis un fichier JSON
65
+ */
66
+ function loadUseCases(file, config) {
67
+ const queriesFile = path_1.default.join(config.baseDir, file);
68
+ if (!(0, fs_1.existsSync)(queriesFile)) {
69
+ console.log(`🔔 Aucun fichier de use cases trouvé: ${queriesFile}`);
70
+ throw new Error(`Aucun fichier de use cases trouvé: ${queriesFile}`);
71
+ }
72
+ try {
73
+ return JSON.parse((0, fs_1.readFileSync)(queriesFile, 'utf8'));
74
+ }
75
+ catch (error) {
76
+ console.error('🔔 Erreur lors du chargement des use cases:', error);
77
+ throw new Error(`Erreur lors du chargement des use cases: ${queriesFile} ${error.message}`);
78
+ }
79
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Erreur de base pour toutes les opérations Git
3
+ */
4
+ export declare class GitOperationError extends Error {
5
+ readonly operation: string;
6
+ readonly details?: any | undefined;
7
+ constructor(message: string, operation: string, details?: any | undefined);
8
+ }
9
+ /**
10
+ * Erreur de configuration Git manquante ou invalide
11
+ */
12
+ export declare class GitConfigurationError extends GitOperationError {
13
+ constructor(message: string, missingConfig?: string);
14
+ }
15
+ /**
16
+ * Erreur quand un fichier demandé n'existe pas
17
+ */
18
+ export declare class FileNotFoundError extends GitOperationError {
19
+ readonly filePath: string;
20
+ readonly branch: string;
21
+ constructor(filePath: string, branch: string);
22
+ }
23
+ /**
24
+ * Erreur quand une branche demandée n'existe pas
25
+ */
26
+ export declare class BranchNotFoundError extends GitOperationError {
27
+ readonly branch: string;
28
+ constructor(branch: string);
29
+ }
30
+ /**
31
+ * Erreur lors de la création d'un PR (conflit, branche existante, etc.)
32
+ */
33
+ export declare class PRCreationError extends GitOperationError {
34
+ readonly attemptedBranch?: string | undefined;
35
+ readonly conflictingFiles?: string[] | undefined;
36
+ constructor(message: string, attemptedBranch?: string | undefined, conflictingFiles?: string[] | undefined);
37
+ }
38
+ /**
39
+ * Erreur lors des opérations de fermeture de PR
40
+ */
41
+ export declare class PRClosureError extends GitOperationError {
42
+ readonly prBranch: string;
43
+ readonly reason?: string | undefined;
44
+ constructor(message: string, prBranch: string, reason?: string | undefined);
45
+ }
46
+ /**
47
+ * Erreur de concurrence lors de l'allocation de numéros de PR
48
+ */
49
+ export declare class ConcurrencyError extends GitOperationError {
50
+ readonly resourceType: string;
51
+ readonly retryCount?: number | undefined;
52
+ constructor(message: string, resourceType: string, retryCount?: number | undefined);
53
+ }
54
+ /**
55
+ * Error thrown when a Git tag creation operation fails.
56
+ */
57
+ export declare class TagCreationError extends GitOperationError {
58
+ tagName: string;
59
+ constructor(tagName: string, message: string, details?: any);
60
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ // ===== CLASSES D'ERREUR TYPÉES =====
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TagCreationError = exports.ConcurrencyError = exports.PRClosureError = exports.PRCreationError = exports.BranchNotFoundError = exports.FileNotFoundError = exports.GitConfigurationError = exports.GitOperationError = void 0;
5
+ /**
6
+ * Erreur de base pour toutes les opérations Git
7
+ */
8
+ class GitOperationError extends Error {
9
+ constructor(message, operation, details) {
10
+ super(message);
11
+ this.operation = operation;
12
+ this.details = details;
13
+ this.name = 'GitOperationError';
14
+ }
15
+ }
16
+ exports.GitOperationError = GitOperationError;
17
+ /**
18
+ * Erreur de configuration Git manquante ou invalide
19
+ */
20
+ class GitConfigurationError extends GitOperationError {
21
+ constructor(message, missingConfig) {
22
+ super(message, 'configuration', { missingConfig });
23
+ this.name = 'GitConfigurationError';
24
+ }
25
+ }
26
+ exports.GitConfigurationError = GitConfigurationError;
27
+ /**
28
+ * Erreur quand un fichier demandé n'existe pas
29
+ */
30
+ class FileNotFoundError extends GitOperationError {
31
+ constructor(filePath, branch) {
32
+ super(`File "${filePath}" not found in branch "${branch}"`, 'file_read', { filePath, branch });
33
+ this.filePath = filePath;
34
+ this.branch = branch;
35
+ this.name = 'FileNotFoundError';
36
+ }
37
+ }
38
+ exports.FileNotFoundError = FileNotFoundError;
39
+ /**
40
+ * Erreur quand une branche demandée n'existe pas
41
+ */
42
+ class BranchNotFoundError extends GitOperationError {
43
+ constructor(branch) {
44
+ super(`Branch "${branch}" not found`, 'branch_access', { branch });
45
+ this.branch = branch;
46
+ this.name = 'BranchNotFoundError';
47
+ }
48
+ }
49
+ exports.BranchNotFoundError = BranchNotFoundError;
50
+ /**
51
+ * Erreur lors de la création d'un PR (conflit, branche existante, etc.)
52
+ */
53
+ class PRCreationError extends GitOperationError {
54
+ constructor(message, attemptedBranch, conflictingFiles) {
55
+ super(message, 'pr_creation', { attemptedBranch, conflictingFiles });
56
+ this.attemptedBranch = attemptedBranch;
57
+ this.conflictingFiles = conflictingFiles;
58
+ this.name = 'PRCreationError';
59
+ }
60
+ }
61
+ exports.PRCreationError = PRCreationError;
62
+ /**
63
+ * Erreur lors des opérations de fermeture de PR
64
+ */
65
+ class PRClosureError extends GitOperationError {
66
+ constructor(message, prBranch, reason) {
67
+ super(message, 'pr_closure', { prBranch, reason });
68
+ this.prBranch = prBranch;
69
+ this.reason = reason;
70
+ this.name = 'PRClosureError';
71
+ }
72
+ }
73
+ exports.PRClosureError = PRClosureError;
74
+ /**
75
+ * Erreur de concurrence lors de l'allocation de numéros de PR
76
+ */
77
+ class ConcurrencyError extends GitOperationError {
78
+ constructor(message, resourceType, retryCount) {
79
+ super(message, 'concurrency', { resourceType, retryCount });
80
+ this.resourceType = resourceType;
81
+ this.retryCount = retryCount;
82
+ this.name = 'ConcurrencyError';
83
+ }
84
+ }
85
+ exports.ConcurrencyError = ConcurrencyError;
86
+ /**
87
+ * Error thrown when a Git tag creation operation fails.
88
+ */
89
+ class TagCreationError extends GitOperationError {
90
+ constructor(tagName, message, details) {
91
+ super(`Failed to create tag "${tagName}": ${message}`, 'tag_creation', { ...details, tagName });
92
+ this.tagName = tagName;
93
+ this.name = 'TagCreationError';
94
+ this.tagName = tagName;
95
+ }
96
+ }
97
+ exports.TagCreationError = TagCreationError;