agentic-api 1.0.6 → 2.0.31

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 +336 -76
  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,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgentExecutor = void 0;
4
+ const types_1 = require("../types");
5
+ const stategraph_1 = require("../stategraph");
6
+ const execute_1 = require("../execute");
7
+ const simulator_prompts_1 = require("./simulator.prompts");
8
+ class AgentExecutor {
9
+ constructor(config) {
10
+ this.config = config;
11
+ // Construire les instructions complètes du simulateur
12
+ const fullInstructions = simulator_prompts_1.GENERIC_SIMULATOR_PROMPT +
13
+ (config.instructionEx ? `\n\n${config.instructionEx}` : '') +
14
+ '\n\n**CRITICAL**: Your response after [SIMULATION_COMPLETE] must be valid JSON format only.';
15
+ // Agent simulateur simple pour éviter les dépendances complexes du ClientSimulator
16
+ this.simulatorAgent = {
17
+ name: "simple-simulator",
18
+ model: (0, execute_1.modelConfig)("MEDIUM-fast"), // JSON sera forcé via les instructions du prompt
19
+ publicDescription: "Simulateur simple pour tests - TOUJOURS retourner JSON valide",
20
+ instructions: fullInstructions,
21
+ tools: [],
22
+ downstreamAgents: []
23
+ };
24
+ }
25
+ /**
26
+ * Initialiser les contextes agent et simulateur
27
+ */
28
+ async initializeContexts() {
29
+ const sessionId = `simulation-${Date.now()}`;
30
+ const agentContext = {
31
+ user: { id: `test-user`, role: 'user', uid: `test-${sessionId}` },
32
+ credential: { test: true, sessionId: `agent-${sessionId}` },
33
+ verbose: this.config.verbose,
34
+ session: { id: `agent-${sessionId}`, data: {}, messages: [] }
35
+ };
36
+ const simulatorContext = {
37
+ user: { id: `simulator-user`, role: 'user', uid: `sim-${sessionId}` },
38
+ credential: { test: true, sessionId: `sim-${sessionId}` },
39
+ verbose: this.config.verbose,
40
+ session: { id: `sim-${sessionId}`, data: {}, messages: [] }
41
+ };
42
+ return {
43
+ agentContext,
44
+ simulatorContext,
45
+ conversationHistory: [],
46
+ exchangeCount: 0,
47
+ lastExecution: {
48
+ runId: '',
49
+ startQuery: '',
50
+ actions: [],
51
+ lastMessage: '',
52
+ usage: { prompt: 0, completion: 0, total: 0, cost: 0 },
53
+ moreThinkin: false,
54
+ }
55
+ };
56
+ }
57
+ /**
58
+ * ✅ Exécuter l'agent testé et retourner sa réponse (extraction de agent-vs-agent.ts)
59
+ */
60
+ async executeAgent(context, query) {
61
+ // Logique extraite de AgentVsAgentTester.executeAgentWithContext()
62
+ const execResult = await (0, execute_1.executeAgentSet)(this.config.agents, context.agentContext, {
63
+ query,
64
+ home: this.config.start,
65
+ stdout: { write: () => { }, end: () => { }, writableEnded: false },
66
+ verbose: this.config.verbose,
67
+ debug: false
68
+ });
69
+ if (context.lastExecution) {
70
+ context.lastExecution = (0, types_1.executionResultMerge)(context.lastExecution, execResult);
71
+ }
72
+ else {
73
+ context.lastExecution = execResult;
74
+ }
75
+ context.exchangeCount++;
76
+ // ✅ Extraire et retourner le dernier message de l'agent (logique de getLastPRSolverMessage)
77
+ return this.getLastAgentMessage(context.agentContext);
78
+ }
79
+ /**
80
+ * ✅ Exécuter le simulateur et retourner sa réponse (extraction de client-simulator.ts)
81
+ */
82
+ async executeSimulator(context, query) {
83
+ // Utiliser le simulateur dynamique avec instructions étendues
84
+ // console.log('DEBUG: Exécution du simulateur avec query:\n', query);
85
+ await (0, execute_1.executeAgentSet)([this.simulatorAgent], context.simulatorContext, {
86
+ query,
87
+ home: 'simple-simulator',
88
+ stdout: { write: () => { }, end: () => { }, writableEnded: false },
89
+ verbose: false,
90
+ debug: false
91
+ });
92
+ const response = this.getLastAssistantMessage(context.simulatorContext);
93
+ context.conversationHistory.push(`Simulator: ${response}`);
94
+ return response;
95
+ }
96
+ /**
97
+ * ✅ Récupérer le dernier message de l'agent testé (extraction de agent-vs-agent.ts ligne 168-191)
98
+ */
99
+ getLastAgentMessage(agentContext) {
100
+ const stateGraph = (0, stategraph_1.sessionStateGraphGet)(agentContext);
101
+ const messages = stateGraph.discussions[0].messages;
102
+ if (!messages || !messages.length) {
103
+ return '[Aucun message trouvé]';
104
+ }
105
+ // Filtrer pour récupérer le dernier message assistant (agent testé)
106
+ const assistantMessages = messages.filter(msg => msg.role === 'assistant');
107
+ if (assistantMessages.length === 0)
108
+ return '[Aucun message trouvé]';
109
+ const rawMessage = assistantMessages[assistantMessages.length - 1].content;
110
+ let isTerminated = '';
111
+ if (rawMessage.includes('<step>[5_cloture]</step>')) {
112
+ isTerminated = ' <step>[5_cloture]</step>';
113
+ }
114
+ // Nettoyer le message des éléments de debug
115
+ const cleanMessage = rawMessage
116
+ .replace(/<step>.*?<\/step>/mg, '') // Supprimer les balises <step>
117
+ .trim();
118
+ return cleanMessage + isTerminated;
119
+ }
120
+ /**
121
+ * ✅ Récupérer le dernier message du simulateur (extraction de client-simulator.ts)
122
+ */
123
+ getLastAssistantMessage(simulatorContext) {
124
+ const stateGraph = (0, stategraph_1.sessionStateGraphGet)(simulatorContext);
125
+ const messages = stateGraph.discussions[0].messages;
126
+ if (!messages || messages.length === 0) {
127
+ return '';
128
+ }
129
+ return messages[messages.length - 1].content;
130
+ }
131
+ }
132
+ exports.AgentExecutor = AgentExecutor;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgentSimulator = void 0;
4
+ const simulator_executor_1 = require("./simulator.executor");
5
+ const simulator_prompts_1 = require("./simulator.prompts");
6
+ class AgentSimulator {
7
+ constructor(config) {
8
+ this.config = config;
9
+ this.executor = new simulator_executor_1.AgentExecutor(config);
10
+ }
11
+ /**
12
+ * Exécuter la simulation complète
13
+ *
14
+ * Format de la query passée à l'agent testé :
15
+ * - Message initial : réponse du simulateur après analyse du scenario
16
+ * - Messages suivants : réponse conversationnelle du simulateur (sans tags d'évaluation)
17
+ *
18
+ * Format de la query passée au simulateur :
19
+ * - Message initial : buildSimulatorQuery(scenario) - format structuré avec SIMULATION SCENARIO
20
+ * - Messages suivants : réponse de l'agent testé (pour évaluation et réaction)
21
+ */
22
+ async executeSimulation(options) {
23
+ const context = await this.executor.initializeContexts();
24
+ try {
25
+ // Construire la query formatée avec buildSimulatorQuery()
26
+ // Les instructions supplémentaires sont déjà intégrées dans le constructeur de l'executor
27
+ const scenarioQuery = (0, simulator_prompts_1.buildSimulatorQuery)(options.scenario);
28
+ // Générer le message initial du simulateur avec le scénario
29
+ let currentUserQuery = await this.executor.executeSimulator(context, scenarioQuery);
30
+ // Callback pour message initial du simulateur
31
+ if (options.onMessage) {
32
+ options.onMessage({ content: currentUserQuery, role: 'user' });
33
+ }
34
+ // Boucle de conversation
35
+ for (let i = 0; i < options.maxExchanges; i++) {
36
+ // Agent testé répond et retourne sa réponse
37
+ const agentResponse = await this.executor.executeAgent(context, currentUserQuery);
38
+ // Callback pour réponse de l'agent
39
+ if (options.onMessage) {
40
+ options.onMessage({ content: agentResponse, role: 'assistant' });
41
+ }
42
+ // Simulateur évalue et répond
43
+ const simulatorResult = await this.executor.executeSimulator(context, agentResponse);
44
+ // Vérifier si terminé
45
+ if (this.isSimulationComplete(simulatorResult)) {
46
+ const parsed = this.parseSimulationResult(simulatorResult, options.scenario.testResult, context);
47
+ this.lastExecution = context.lastExecution;
48
+ return {
49
+ ...parsed,
50
+ execution: context.lastExecution,
51
+ exchangeCount: context.exchangeCount
52
+ };
53
+ }
54
+ currentUserQuery = this.extractConversationalPart(simulatorResult);
55
+ // Callback pour réponse du simulateur (si pas terminé)
56
+ if (options.onMessage && currentUserQuery) {
57
+ options.onMessage({ content: currentUserQuery, role: 'user' });
58
+ }
59
+ }
60
+ // Timeout - générer rapport final
61
+ const timeout = await this.generateTimeoutReport(context, options.scenario.testResult);
62
+ this.lastExecution = context.lastExecution;
63
+ return { ...timeout, exchangeCount: context.exchangeCount };
64
+ }
65
+ catch (error) {
66
+ this.lastExecution = context.lastExecution;
67
+ return {
68
+ success: false,
69
+ message: '',
70
+ error: `Erreur d'exécution: ${error.message || error}`,
71
+ execution: context.lastExecution,
72
+ exchangeCount: context.exchangeCount
73
+ };
74
+ }
75
+ }
76
+ /**
77
+ * Compter les occurrences d'une action dans le dernier ExecutionResult
78
+ * @param name Nom exact de l'action (ex: 'lookupMfilesIntervenant', 'lookupKnowledge', 'sendInternalEmail')
79
+ * @returns { firstPos, count, total } où:
80
+ * - firstPos: index de la première occurrence (ou -1 si absente)
81
+ * - count: nombre d'occurrences de cette action
82
+ * - total: nombre total d'actions du même type (fonction vs transfert)
83
+ */
84
+ executionActionCount(name) {
85
+ const execution = this.lastExecution;
86
+ const actions = execution?.actions || [];
87
+ const firstPos = actions.findIndex((a) => (a.action === name));
88
+ const count = actions.filter((a) => a.action === name).length;
89
+ // Déterminer le type par convention de nommage
90
+ const isTransfer = name === 'transfert';
91
+ const total = actions.filter((a) => {
92
+ if (isTransfer) {
93
+ return a.action === name;
94
+ }
95
+ else {
96
+ return a.action !== 'transfert';
97
+ }
98
+ }).length;
99
+ return { firstPos, count, total };
100
+ }
101
+ /**
102
+ * Fonction d'affichage pour les tests - n'altère pas la structure originale
103
+ * Crée une version simplifiée pour l'affichage avec juste les noms des actions
104
+ */
105
+ printSimulationResult(result) {
106
+ const summary = {
107
+ success: result.success,
108
+ message: result.message,
109
+ error: result.error,
110
+ exchangeCount: result.exchangeCount,
111
+ runId: result.execution?.runId,
112
+ startQuery: result.execution?.startQuery,
113
+ actions: result.execution?.actions?.map((elem) => elem.action) || [],
114
+ lastMessage: result.execution?.lastMessage,
115
+ usage: result.execution?.usage,
116
+ moreThinkin: result.execution?.moreThinkin
117
+ };
118
+ const execution = {
119
+ ...result.execution,
120
+ actions: result.execution?.actions?.map((elem) => elem.action) || []
121
+ };
122
+ return { summary, execution };
123
+ }
124
+ isSimulationComplete(response) {
125
+ return response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]');
126
+ }
127
+ parseSimulationResult(response, expectedFormat, context) {
128
+ // Le simulateur produit directement le résultat et rapport
129
+ // Parsing pour détecter la fin et extraire le contenu JSON
130
+ // Détecter [SIMULATION_COMPLETE] ou [TERMINE]
131
+ if (response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]')) {
132
+ // Extraire le contenu après le tag
133
+ const match = response.match(/\[SIMULATION_COMPLETE\]\s*\n?([\s\S]*)/);
134
+ if (match) {
135
+ const resultContent = match[1].trim();
136
+ // Essayer de parser comme JSON d'abord
137
+ try {
138
+ const jsonResult = JSON.parse(resultContent);
139
+ return {
140
+ success: jsonResult.success === undefined ? true : jsonResult.success, // true par défaut, utilise la valeur JSON si présente
141
+ message: jsonResult.description || resultContent,
142
+ error: jsonResult.error || '',
143
+ execution: context.lastExecution,
144
+ exchangeCount: context.exchangeCount
145
+ };
146
+ }
147
+ catch (jsonError) {
148
+ // Fallback : parsing manuel pour format "success:boolean, error:string, description:string"
149
+ const successMatch = resultContent.match(/success:\s*(true|false)/);
150
+ const errorMatch = resultContent.match(/error:\s*([^\n,]*)/);
151
+ // Description en dernier car elle peut être multiligne
152
+ let description = resultContent.trim();
153
+ if (successMatch || errorMatch) {
154
+ const descMatch = resultContent.match(/description:\s*([\s\S]*?)$/);
155
+ description = descMatch ? descMatch[1].trim() : description;
156
+ }
157
+ return {
158
+ success: successMatch ? successMatch[1] === 'true' : true,
159
+ message: description,
160
+ error: errorMatch ? errorMatch[1].trim() : '',
161
+ execution: context.lastExecution,
162
+ exchangeCount: context.exchangeCount
163
+ };
164
+ }
165
+ }
166
+ // Fallback si parsing échoue
167
+ return {
168
+ success: true,
169
+ message: response,
170
+ error: '',
171
+ execution: context.lastExecution,
172
+ exchangeCount: context.exchangeCount
173
+ };
174
+ }
175
+ // Si pas de tag de fin détecté
176
+ return {
177
+ success: false,
178
+ message: response,
179
+ error: 'Simulation non terminée',
180
+ execution: context.lastExecution,
181
+ exchangeCount: context.exchangeCount
182
+ };
183
+ }
184
+ extractConversationalPart(response) {
185
+ // Extraire la partie conversationnelle avant les tags d'évaluation
186
+ const tagIndex = response.search(/\[(SIMULATION_COMPLETE|TERMINE|BUG_)/);
187
+ return tagIndex !== -1 ? response.substring(0, tagIndex).trim() : response;
188
+ }
189
+ /**
190
+ * Générer le rapport final en cas de timeout
191
+ */
192
+ async generateTimeoutReport(context, expectedFormat) {
193
+ const reportQuery = `
194
+ La simulation a atteint la limite d'échanges sans conclusion.
195
+ Génère maintenant ton rapport final au format:
196
+ [SIMULATION_COMPLETE]
197
+ success: false
198
+ error: Limite d'échanges atteinte
199
+ description: Simulation interrompue - timeout
200
+ `;
201
+ const finalResult = await this.executor.executeSimulator(context, reportQuery);
202
+ return this.parseSimulationResult(finalResult, expectedFormat, context);
203
+ }
204
+ }
205
+ exports.AgentSimulator = AgentSimulator;
@@ -0,0 +1,16 @@
1
+ import { SimulationScenario } from "./simulator.types";
2
+ /**
3
+ * Prompt de simulateur générique basé sur ClientSimulator
4
+ * COPIÉ et ADAPTÉ depuis agentInstructionModules.ClientSimulator
5
+ */
6
+ export declare const GENERIC_SIMULATOR_PROMPT = "\n## R\u00D4LE - SIMULATEUR VALIDATEUR\nTu es un **DOUBLE AGENT** qui joue 2 r\u00F4les simultan\u00E9s :\n1. **Utilisateur r\u00E9el** qui teste un agent conversationnel\n2. **SIMULATEUR: Validateur actif** qui surveille en temps r\u00E9el les performances\n\n# \uD83D\uDEA8 R\u00C8GLE PRIORITAIRE ABSOLUE - VALIDATION ERREURS FATALES\n\n## SURVEILLANCE PERMANENTE \u00C0 CHAQUE MESSAGE\n- **CHAQUE MESSAGE** de l'agent test\u00E9 doit \u00EAtre inspect\u00E9 IMM\u00C9DIATEMENT\n- **D\u00C8S qu'un candidat \u00E0 **l'erreur fatale** appara\u00EEt \u2192 LE GARDER EN MEMOIRE JUSQU'AU \"follow_up\" OU \"cloture\" de la discussion.\n- **D\u00C8S que la discussion est dans l'\u00E9tat \"follow_up\" OU \"cloture\" SI l'erreur fatale en m\u00E9moire N'A PAS \u00C9T\u00C9 CORRIG\u00C9E, TU DOIS arr\u00EAter la simulation avec [SIMULATION_COMPLETE] {\"success\": false, \"error\": \"Erreur fatale d\u00E9tect\u00E9e: [d\u00E9tail pr\u00E9cis]\"}\n- **Format obligatoire d'arr\u00EAt** : [SIMULATION_COMPLETE] avec success:false\n- **Pas d'exception** : m\u00EAme si l'agent atteint les objectifs, une erreur fatale = \u00C9CHEC\n- **D\u00C8S qu'une erreur fatale appara\u00EEt** \u2192 ARR\u00CAT IMM\u00C9DIAT DE LA SIMULATION\n\n## R\u00C8GLES D'ANALYSE INTELLIGENTE ET CONTEXTUELLE\n- D\u00E9tection SEMANTIQUE uniquement avec TOL\u00C9RANCE pour les formules standards professionnelles.\n- **DISTINGUER** entre promesses de l'Agent et demande de l'utilisateur.\n\n## PROCESSUS D'INSPECTION OBLIGATOIRE\n\u00C0 CHAQUE message de l'agent, tu DOIS :\n\n### \u00C9TAPE 1 : INSPECTION ERREURS FATALES (PRIORIT\u00C9 1)\nSi \"erreurs fatales\" sp\u00E9cifi\u00E9es dans le sc\u00E9nario :\n\u2192 Examiner le message de l'agent pour ces termes/comportements interdits\n\u2192 Si d\u00E9tect\u00E9es : STOP IMM\u00C9DIAT avec [SIMULATION_COMPLETE] {\"success\": false, \"error\": \"Erreur fatale d\u00E9tect\u00E9e: [d\u00E9tail pr\u00E9cis]\"}\n\n### \u00C9TAPE 2 : COMPORTEMENT UTILISATEUR (PRIORIT\u00C9 2)\n\u2192 Si aucune erreur fatale : continuer la conversation selon persona + objectifs\n\u2192 Si conditions de fin atteintes : [SIMULATION_COMPLETE] avec rapport selon format\n\n# MISSION UTILISATEUR (seulement si aucune erreur fatale d\u00E9tect\u00E9e)\n1. **Recr\u00E9er une conversation r\u00E9elle** bas\u00E9e sur les instructions de simulation\n2. **Communiquer comme un vrai utilisateur** va \u00E0 l'essentiel sans bavardage\n3. **Agir selon la personnalit\u00E9 d\u00E9finie** dans le sc\u00E9nario de test\n4. **Tester la capacit\u00E9 de l'agent** \u00E0 atteindre les objectifs d\u00E9finis\n5. **\u00C9mettre** [SIMULATION_COMPLETE] quand les conditions de fin sont remplies\n\n# R\u00C8GLES DE COMMUNICATION\n- **CONCISION ABSOLUE** : R\u00E9ponses courtes et naturelles comme un vrai utilisateur\n- **\u00C9viter les r\u00E9p\u00E9titions** : Ne pas r\u00E9p\u00E9ter ce que l'agent vient de dire\n- **Confirmer simplement** : \"Oui\", \"D'accord\", \"Tr\u00E8s bien\", \"Entendu\"\n- **Pas de r\u00E9capitulatifs** : Un utilisateur ne r\u00E9sume pas, il r\u00E9pond \u00E0 la question pos\u00E9e\n- **Personnalit\u00E9 authentique** : adopter la persona d\u00E9finie\n- **Pas de m\u00E9ta** : jamais mentionner \"test\", \"simulation\", \"objectifs\", \"\u00E9valuation\"\n\n# FORMAT INPUT ATTENDU\nTu recevras toujours un INPUT structur\u00E9. Les erreurs fatales (si sp\u00E9cifi\u00E9es) sont EN HAUT et PRIORITAIRES.\n\n## PROCESSUS DE LECTURE OBLIGATOIRE :\n1. **LIRE D'ABORD** les erreurs fatales (si pr\u00E9sentes) et les m\u00E9moriser\n2. **ADOPTER** la personnalit\u00E9 indiqu\u00E9e\n3. **V\u00C9RIFIER** les objectifs tout en surveillant activement les erreurs\n4. **TERMINER** selon les conditions OU d\u00E8s qu'une erreur fatale appara\u00EEt\n\n# GUIDE POUR VARIABLES DE TEST\n- **testStart** : Premi\u00E8re phrase/question du client pour commencer la simulation\n- **testGoals** : Objectifs que l'agent doit atteindre (ce qui constitue un succ\u00E8s)\n- **testEnd** : Conditions sp\u00E9cifiques qui marquent la fin r\u00E9ussie de la simulation\n- **testPersona** : Personnalit\u00E9 \u00E0 adopter (patient, press\u00E9, \u00E9nerv\u00E9, etc.)\n- **testError** : Termes/comportements interdits qui causent un \u00E9chec imm\u00E9diat (erreurs fatales)\n- **testResult** : Format JSON attendu pour le rapport final de simulation\n\n# \u00C9VALUATION FINALE\n**TOUJOURS retourner un JSON strict valide** selon le format demand\u00E9 dans le sc\u00E9nario\n";
7
+ /**
8
+ * 3 prompts variables de personnalité pré-définis à choisir manuellement
9
+ */
10
+ export declare const PERSONA_PATIENT = "Utilisateur patient et poli qui prend le temps d'expliquer sa situation";
11
+ export declare const PERSONA_PRESSE = "Utilisateur press\u00E9 qui veut une solution rapide, r\u00E9pond bri\u00E8vement";
12
+ export declare const PERSONA_ENERVE = "Utilisateur \u00E9nerv\u00E9 et frustr\u00E9, c'est son 3\u00E8me appel pour le m\u00EAme probl\u00E8me, ton direct et impatient";
13
+ /**
14
+ * Construire la query formatée selon le format SimulationScenario
15
+ */
16
+ export declare const buildSimulatorQuery: (scenario: SimulationScenario) => string;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildSimulatorQuery = exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = exports.GENERIC_SIMULATOR_PROMPT = void 0;
4
+ /**
5
+ * Prompt de simulateur générique basé sur ClientSimulator
6
+ * COPIÉ et ADAPTÉ depuis agentInstructionModules.ClientSimulator
7
+ */
8
+ exports.GENERIC_SIMULATOR_PROMPT = `
9
+ ## RÔLE - SIMULATEUR VALIDATEUR
10
+ Tu es un **DOUBLE AGENT** qui joue 2 rôles simultanés :
11
+ 1. **Utilisateur réel** qui teste un agent conversationnel
12
+ 2. **SIMULATEUR: Validateur actif** qui surveille en temps réel les performances
13
+
14
+ # 🚨 RÈGLE PRIORITAIRE ABSOLUE - VALIDATION ERREURS FATALES
15
+
16
+ ## SURVEILLANCE PERMANENTE À CHAQUE MESSAGE
17
+ - **CHAQUE MESSAGE** de l'agent testé doit être inspecté IMMÉDIATEMENT
18
+ - **DÈS qu'un candidat à **l'erreur fatale** apparaît → LE GARDER EN MEMOIRE JUSQU'AU "follow_up" OU "cloture" de la discussion.
19
+ - **DÈS que la discussion est dans l'état "follow_up" OU "cloture" SI l'erreur fatale en mémoire N'A PAS ÉTÉ CORRIGÉE, TU DOIS arrêter la simulation avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail précis]"}
20
+ - **Format obligatoire d'arrêt** : [SIMULATION_COMPLETE] avec success:false
21
+ - **Pas d'exception** : même si l'agent atteint les objectifs, une erreur fatale = ÉCHEC
22
+ - **DÈS qu'une erreur fatale apparaît** → ARRÊT IMMÉDIAT DE LA SIMULATION
23
+
24
+ ## RÈGLES D'ANALYSE INTELLIGENTE ET CONTEXTUELLE
25
+ - Détection SEMANTIQUE uniquement avec TOLÉRANCE pour les formules standards professionnelles.
26
+ - **DISTINGUER** entre promesses de l'Agent et demande de l'utilisateur.
27
+
28
+ ## PROCESSUS D'INSPECTION OBLIGATOIRE
29
+ À CHAQUE message de l'agent, tu DOIS :
30
+
31
+ ### ÉTAPE 1 : INSPECTION ERREURS FATALES (PRIORITÉ 1)
32
+ Si "erreurs fatales" spécifiées dans le scénario :
33
+ → Examiner le message de l'agent pour ces termes/comportements interdits
34
+ → Si détectées : STOP IMMÉDIAT avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail précis]"}
35
+
36
+ ### ÉTAPE 2 : COMPORTEMENT UTILISATEUR (PRIORITÉ 2)
37
+ → Si aucune erreur fatale : continuer la conversation selon persona + objectifs
38
+ → Si conditions de fin atteintes : [SIMULATION_COMPLETE] avec rapport selon format
39
+
40
+ # MISSION UTILISATEUR (seulement si aucune erreur fatale détectée)
41
+ 1. **Recréer une conversation réelle** basée sur les instructions de simulation
42
+ 2. **Communiquer comme un vrai utilisateur** va à l'essentiel sans bavardage
43
+ 3. **Agir selon la personnalité définie** dans le scénario de test
44
+ 4. **Tester la capacité de l'agent** à atteindre les objectifs définis
45
+ 5. **Émettre** [SIMULATION_COMPLETE] quand les conditions de fin sont remplies
46
+
47
+ # RÈGLES DE COMMUNICATION
48
+ - **CONCISION ABSOLUE** : Réponses courtes et naturelles comme un vrai utilisateur
49
+ - **Éviter les répétitions** : Ne pas répéter ce que l'agent vient de dire
50
+ - **Confirmer simplement** : "Oui", "D'accord", "Très bien", "Entendu"
51
+ - **Pas de récapitulatifs** : Un utilisateur ne résume pas, il répond à la question posée
52
+ - **Personnalité authentique** : adopter la persona définie
53
+ - **Pas de méta** : jamais mentionner "test", "simulation", "objectifs", "évaluation"
54
+
55
+ # FORMAT INPUT ATTENDU
56
+ Tu recevras toujours un INPUT structuré. Les erreurs fatales (si spécifiées) sont EN HAUT et PRIORITAIRES.
57
+
58
+ ## PROCESSUS DE LECTURE OBLIGATOIRE :
59
+ 1. **LIRE D'ABORD** les erreurs fatales (si présentes) et les mémoriser
60
+ 2. **ADOPTER** la personnalité indiquée
61
+ 3. **VÉRIFIER** les objectifs tout en surveillant activement les erreurs
62
+ 4. **TERMINER** selon les conditions OU dès qu'une erreur fatale apparaît
63
+
64
+ # GUIDE POUR VARIABLES DE TEST
65
+ - **testStart** : Première phrase/question du client pour commencer la simulation
66
+ - **testGoals** : Objectifs que l'agent doit atteindre (ce qui constitue un succès)
67
+ - **testEnd** : Conditions spécifiques qui marquent la fin réussie de la simulation
68
+ - **testPersona** : Personnalité à adopter (patient, pressé, énervé, etc.)
69
+ - **testError** : Termes/comportements interdits qui causent un échec immédiat (erreurs fatales)
70
+ - **testResult** : Format JSON attendu pour le rapport final de simulation
71
+
72
+ # ÉVALUATION FINALE
73
+ **TOUJOURS retourner un JSON strict valide** selon le format demandé dans le scénario
74
+ `;
75
+ /**
76
+ * 3 prompts variables de personnalité pré-définis à choisir manuellement
77
+ */
78
+ exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
79
+ exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
80
+ exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
81
+ /**
82
+ * Construire la query formatée selon le format SimulationScenario
83
+ */
84
+ const buildSimulatorQuery = (scenario) => {
85
+ // 🔧 CORRECTION: Mettre les erreurs fatales EN PREMIER et bien visibles
86
+ const errorSection = scenario.testError
87
+ ? `
88
+ - ERREURS FATALES ET SURVEILLANCE OBLIGATOIRE:
89
+ ⚠️ PROCESSUS : Inspecter UNIQUEMENT les messages de l'agent (l'agent est l'utilisateur du simulateur)
90
+ ⚠️ QUAND : À chaque fois que l'agent m'envoie une réponse, vérifier ces erreurs dans son message
91
+ ⚠️ SI DÉTECTÉES : ARRÊT IMMÉDIAT avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail]"}
92
+ ⚠️ EXCEPTION : Ne pas inspecter ce prompt initial, seulement les réponses de l'agent
93
+ **${scenario.testError}**
94
+ ` : '';
95
+ return `# INSTRUCTIONS DE SIMULATION (PRIVÉES - NE PAS TRANSMETTRE À L'AGENT)
96
+ - Votre personnalité: ${scenario.testPersona}
97
+ - Objectifs à atteindre: ${scenario.testGoals}
98
+ - Critères de fin: ${scenario.testEnd}
99
+ - Format du rapport: ${scenario.testResult}
100
+ ${errorSection}
101
+
102
+ # 🚀 ACTION REQUISE : DÉMARRER LA CONVERSATION
103
+ Vous êtes le SIMULATEUR CLIENT. Envoyez à l'agent UNIQUEMENT le message ci-dessous (sans ces instructions).
104
+
105
+ # MESSAGE À ENVOYER À L'AGENT :
106
+ ${scenario.testQuery}`;
107
+ };
108
+ exports.buildSimulatorQuery = buildSimulatorQuery;
@@ -0,0 +1,42 @@
1
+ import { AgentMessage } from "../stategraph";
2
+ import { AgentConfig, AgenticContext, ExecutionResult } from "../types";
3
+ export interface SimulatorConfig {
4
+ agents: AgentConfig[];
5
+ start: string;
6
+ verbose: boolean;
7
+ instructionEx?: string;
8
+ }
9
+ export interface SimulationScenario {
10
+ testGoals: string;
11
+ testEnd: string;
12
+ testPersona: string;
13
+ testQuery: string;
14
+ testResult: string;
15
+ testError?: string;
16
+ }
17
+ export interface SimulationOptions {
18
+ scenario: SimulationScenario;
19
+ maxExchanges: number;
20
+ onMessage?: (message: AgentMessage) => void;
21
+ }
22
+ export interface SimulationResult {
23
+ success: boolean;
24
+ message: string;
25
+ error: string;
26
+ execution: ExecutionResult;
27
+ exchangeCount: number;
28
+ }
29
+ export interface ExecutionContext {
30
+ agentContext: AgenticContext;
31
+ simulatorContext: AgenticContext;
32
+ conversationHistory: string[];
33
+ exchangeCount: number;
34
+ lastExecution: ExecutionResult;
35
+ }
36
+ export interface TestScenario {
37
+ ticketId: string;
38
+ ticketMarkdown: string;
39
+ clientType: 'locataire' | 'proprietaire';
40
+ ton?: 'patient' | 'presse' | 'enerve';
41
+ variant?: any;
42
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,20 @@
1
+ import { SimulationScenario } from './simulator.types';
2
+ import { PERSONA_PATIENT, PERSONA_PRESSE, PERSONA_ENERVE } from './simulator.prompts';
3
+ /**
4
+ * Charger un ticket depuis le filesystem (comme agent-vs-agent.ts)
5
+ */
6
+ export declare function loadScenario(ticketPath: string): {
7
+ ticketMarkdown: string;
8
+ ticketId: string;
9
+ };
10
+ /**
11
+ * Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
12
+ * Permet de surcharger tous les champs avec custom (testGoals, testEnd, testPersona, testQuery, testResult, testError)
13
+ */
14
+ export declare function buildScenarioFromTicket(ticketPath: string, clientType: 'locataire' | 'proprietaire', persona?: string, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
15
+ custom?: Partial<SimulationScenario>): SimulationScenario;
16
+ /**
17
+ * Construire SimulationScenario générique directement
18
+ */
19
+ export declare function buildGenericScenario(scenario: SimulationScenario): SimulationScenario;
20
+ export { PERSONA_PATIENT, PERSONA_PRESSE, PERSONA_ENERVE };
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = void 0;
37
+ exports.loadScenario = loadScenario;
38
+ exports.buildScenarioFromTicket = buildScenarioFromTicket;
39
+ exports.buildGenericScenario = buildGenericScenario;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const simulator_prompts_1 = require("./simulator.prompts");
43
+ Object.defineProperty(exports, "PERSONA_PATIENT", { enumerable: true, get: function () { return simulator_prompts_1.PERSONA_PATIENT; } });
44
+ Object.defineProperty(exports, "PERSONA_PRESSE", { enumerable: true, get: function () { return simulator_prompts_1.PERSONA_PRESSE; } });
45
+ Object.defineProperty(exports, "PERSONA_ENERVE", { enumerable: true, get: function () { return simulator_prompts_1.PERSONA_ENERVE; } });
46
+ /**
47
+ * Charger un ticket depuis le filesystem (comme agent-vs-agent.ts)
48
+ */
49
+ function loadScenario(ticketPath) {
50
+ const ticketMarkdown = fs.readFileSync(ticketPath, 'utf8');
51
+ const ticketId = path.basename(ticketPath).split('-')[0];
52
+ return { ticketMarkdown, ticketId };
53
+ }
54
+ /**
55
+ * Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
56
+ * Permet de surcharger tous les champs avec custom (testGoals, testEnd, testPersona, testQuery, testResult, testError)
57
+ */
58
+ function buildScenarioFromTicket(ticketPath, clientType, persona = simulator_prompts_1.PERSONA_PATIENT, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
59
+ custom // Surcharge optionnelle de tous les champs
60
+ ) {
61
+ const { ticketMarkdown, ticketId } = loadScenario(ticketPath);
62
+ // Scenario par défaut complet
63
+ const defaultScenario = {
64
+ testGoals: `Valider les Objectifs de PRSolver pour ticket ${ticketId}`,
65
+ testEnd: 'Agent termine avec salutations (état 5_cloture)',
66
+ testPersona: persona,
67
+ testQuery: `Je suis le client (demandeur '${clientType}') du ticket en ANNEXE. Démarre la conversation exactement comme décrit dans l'ANNEXE.
68
+ ## ANNEXE - Ticket ${ticketId}
69
+ \`\`\`
70
+ ${ticketMarkdown}
71
+ \`\`\`
72
+ `,
73
+ testResult: 'done:boolean, error:string, description:string'
74
+ };
75
+ // Merger avec custom
76
+ return { ...defaultScenario, ...custom };
77
+ }
78
+ /**
79
+ * Construire SimulationScenario générique directement
80
+ */
81
+ function buildGenericScenario(scenario) {
82
+ return {
83
+ ...scenario,
84
+ // Assurer le format par défaut si pas spécifié
85
+ testResult: scenario.testResult || 'done:boolean, error:string, description:string'
86
+ };
87
+ }
@@ -1,15 +1,21 @@
1
- import { AgentConfig, AgenticContext, AgenticMemory, AgentModel, Feedback } from "./types";
1
+ import { AgentConfig, AgenticContext, AgentModel, ExecuteAgentResult, Feedback, ExecutionResult } from "./types";
2
2
  import { Writable } from "stream";
3
+ import { AgentStateGraph } from "./stategraph";
3
4
  export declare function modelConfig(model: string, custom?: any): AgentModel;
4
5
  export declare function sendFeedback(params: Feedback): void;
5
6
  export interface ReadCompletionsStreamOptions {
6
- memory: AgenticMemory;
7
+ stateGraph: AgentStateGraph;
8
+ discussion: any;
9
+ agentConfig: AgentConfig;
10
+ agents: AgentConfig[];
11
+ agentName: string;
7
12
  stdout: Writable;
8
13
  session: AgenticContext;
9
14
  final: any;
10
- enrichWithMemory?: (role?: string) => Promise<string>;
15
+ verbose?: boolean;
16
+ enrichWithMemory?: (role: string, agent: AgentConfig, context: AgenticContext) => Promise<string>;
11
17
  }
12
- export declare function readCompletionsStream(params: ReadCompletionsStreamOptions): Promise<boolean | undefined>;
18
+ export declare function readCompletionsStream(params: ReadCompletionsStreamOptions): Promise<ExecutionResult>;
13
19
  /**
14
20
  * Parameters for executing an agent set
15
21
  * @interface ExecuteAgentSetParams
@@ -21,7 +27,7 @@ export declare function readCompletionsStream(params: ReadCompletionsStreamOptio
21
27
  * @property {number} [maxSteps] - Maximum number of steps to execute
22
28
  */
23
29
  export interface ExecuteAgentSetParams {
24
- enrichWithMemory?: (role?: string) => Promise<string>;
30
+ enrichWithMemory?: (role: string, agent: AgentConfig, context: AgenticContext) => Promise<string>;
25
31
  query: string;
26
32
  home?: string;
27
33
  stdout: Writable;
@@ -39,4 +45,5 @@ export interface ExecuteAgentSetParams {
39
45
  * @param {ExecuteAgentSetParams} params - Execution parameters
40
46
  * @returns {Promise<void>}
41
47
  */
42
- export declare function executeAgentSet(agentSet: AgentConfig[], session: AgenticContext, params: ExecuteAgentSetParams): Promise<void>;
48
+ export declare function executeAgentSet(agentSet: AgentConfig[], context: AgenticContext, params: ExecuteAgentSetParams): Promise<ExecutionResult>;
49
+ export declare function executeAgent(agentSet: AgentConfig[], params: ExecuteAgentSetParams): Promise<ExecuteAgentResult>;