agentic-api 1.0.5 → 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.
- package/README.md +118 -22
- package/dist/src/agents/agents.example.d.ts +3 -0
- package/dist/src/agents/agents.example.js +38 -0
- package/dist/src/agents/authentication.js +2 -0
- package/dist/src/agents/digestor.js +25 -16
- package/dist/src/agents/prompts.d.ts +2 -2
- package/dist/src/agents/prompts.js +112 -49
- package/dist/src/agents/reducer.core.d.ts +12 -0
- package/dist/src/agents/reducer.core.js +207 -0
- package/dist/src/agents/reducer.d.ts +3 -0
- package/dist/src/agents/reducer.example.d.ts +28 -0
- package/dist/src/agents/reducer.example.js +118 -0
- package/dist/src/agents/reducer.js +19 -0
- package/dist/src/agents/reducer.loaders.d.ts +34 -0
- package/dist/src/agents/reducer.loaders.js +122 -0
- package/dist/src/agents/reducer.process.d.ts +16 -0
- package/dist/src/agents/reducer.process.js +143 -0
- package/dist/src/agents/reducer.tools.d.ts +29 -0
- package/dist/src/agents/reducer.tools.js +157 -0
- package/dist/src/agents/reducer.types.d.ts +50 -0
- package/dist/src/agents/reducer.types.js +5 -0
- package/dist/src/agents/simulator.d.ts +47 -0
- package/dist/src/agents/simulator.executor.d.ts +26 -0
- package/dist/src/agents/simulator.executor.js +132 -0
- package/dist/src/agents/simulator.js +205 -0
- package/dist/src/agents/simulator.prompts.d.ts +16 -0
- package/dist/src/agents/simulator.prompts.js +108 -0
- package/dist/src/agents/simulator.types.d.ts +42 -0
- package/dist/src/agents/simulator.types.js +2 -0
- package/dist/src/agents/simulator.utils.d.ts +20 -0
- package/dist/src/agents/simulator.utils.js +87 -0
- package/dist/src/execute.d.ts +14 -7
- package/dist/src/execute.js +359 -84
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +14 -0
- package/dist/src/princing.openai.d.ts +9 -2
- package/dist/src/princing.openai.js +16 -11
- package/dist/src/prompts.d.ts +3 -2
- package/dist/src/prompts.js +207 -72
- package/dist/src/rag/embeddings.d.ts +103 -0
- package/dist/src/rag/embeddings.js +466 -0
- package/dist/src/rag/index.d.ts +12 -0
- package/dist/src/rag/index.js +40 -0
- package/dist/src/rag/lucene.d.ts +45 -0
- package/dist/src/rag/lucene.js +227 -0
- package/dist/src/rag/parser.d.ts +68 -0
- package/dist/src/rag/parser.js +192 -0
- package/dist/src/rag/tools.d.ts +76 -0
- package/dist/src/rag/tools.js +196 -0
- package/dist/src/rag/types.d.ts +178 -0
- package/dist/src/rag/types.js +21 -0
- package/dist/src/rag/usecase.d.ts +16 -0
- package/dist/src/rag/usecase.js +79 -0
- package/dist/src/rules/errors.d.ts +60 -0
- package/dist/src/rules/errors.js +97 -0
- package/dist/src/rules/git/git.e2e.helper.d.ts +104 -0
- package/dist/src/rules/git/git.e2e.helper.js +488 -0
- package/dist/src/rules/git/git.health.d.ts +66 -0
- package/dist/src/rules/git/git.health.js +354 -0
- package/dist/src/rules/git/git.helper.d.ts +129 -0
- package/dist/src/rules/git/git.helper.js +53 -0
- package/dist/src/rules/git/index.d.ts +6 -0
- package/dist/src/rules/git/index.js +76 -0
- package/dist/src/rules/git/repo.d.ts +128 -0
- package/dist/src/rules/git/repo.js +900 -0
- package/dist/src/rules/git/repo.pr.d.ts +137 -0
- package/dist/src/rules/git/repo.pr.js +589 -0
- package/dist/src/rules/git/repo.tools.d.ts +134 -0
- package/dist/src/rules/git/repo.tools.js +730 -0
- package/dist/src/rules/index.d.ts +8 -0
- package/dist/src/rules/index.js +25 -0
- package/dist/src/rules/messages.d.ts +17 -0
- package/dist/src/rules/messages.js +21 -0
- package/dist/src/rules/types.ctrl.d.ts +28 -0
- package/dist/src/rules/types.ctrl.js +2 -0
- package/dist/src/rules/types.d.ts +510 -0
- package/dist/src/rules/types.helpers.d.ts +132 -0
- package/dist/src/rules/types.helpers.js +2 -0
- package/dist/src/rules/types.js +33 -0
- package/dist/src/rules/user.mapper.d.ts +61 -0
- package/dist/src/rules/user.mapper.js +160 -0
- package/dist/src/rules/utils/slug.d.ts +22 -0
- package/dist/src/rules/utils/slug.js +35 -0
- package/dist/src/rules/utils.matter.d.ts +66 -0
- package/dist/src/rules/utils.matter.js +208 -0
- package/dist/src/rules/utils.slug.d.ts +22 -0
- package/dist/src/rules/utils.slug.js +35 -0
- package/dist/src/scrapper.d.ts +3 -2
- package/dist/src/scrapper.js +33 -37
- package/dist/src/stategraph/index.d.ts +8 -0
- package/dist/src/stategraph/index.js +21 -0
- package/dist/src/stategraph/stategraph.d.ts +91 -0
- package/dist/src/stategraph/stategraph.js +241 -0
- package/dist/src/stategraph/stategraph.storage.d.ts +41 -0
- package/dist/src/stategraph/stategraph.storage.js +166 -0
- package/dist/src/stategraph/types.d.ts +139 -0
- package/dist/src/stategraph/types.js +19 -0
- package/dist/src/types.d.ts +68 -39
- package/dist/src/types.js +53 -89
- package/dist/src/usecase.d.ts +4 -0
- package/dist/src/usecase.js +44 -0
- package/dist/src/utils.d.ts +12 -5
- package/dist/src/utils.js +30 -13
- 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;
|