agentic-api 2.0.646 → 2.0.885

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 (59) hide show
  1. package/dist/src/agents/prompts.d.ts +2 -3
  2. package/dist/src/agents/prompts.js +21 -118
  3. package/dist/src/agents/reducer.loaders.d.ts +103 -1
  4. package/dist/src/agents/reducer.loaders.js +164 -2
  5. package/dist/src/agents/reducer.types.d.ts +34 -3
  6. package/dist/src/agents/simulator.d.ts +32 -2
  7. package/dist/src/agents/simulator.executor.d.ts +15 -5
  8. package/dist/src/agents/simulator.executor.js +134 -67
  9. package/dist/src/agents/simulator.js +251 -8
  10. package/dist/src/agents/simulator.prompts.d.ts +55 -10
  11. package/dist/src/agents/simulator.prompts.js +305 -61
  12. package/dist/src/agents/simulator.types.d.ts +62 -1
  13. package/dist/src/agents/simulator.types.js +5 -0
  14. package/dist/src/agents/subagent.d.ts +128 -0
  15. package/dist/src/agents/subagent.js +231 -0
  16. package/dist/src/agents/worker.executor.d.ts +48 -0
  17. package/dist/src/agents/worker.executor.js +152 -0
  18. package/dist/src/execute/helpers.d.ts +3 -0
  19. package/dist/src/execute/helpers.js +222 -16
  20. package/dist/src/execute/responses.js +81 -55
  21. package/dist/src/execute/shared.d.ts +5 -0
  22. package/dist/src/execute/shared.js +27 -0
  23. package/dist/src/index.d.ts +2 -1
  24. package/dist/src/index.js +3 -1
  25. package/dist/src/llm/openai.js +8 -1
  26. package/dist/src/llm/pricing.js +2 -0
  27. package/dist/src/llm/xai.js +11 -6
  28. package/dist/src/prompts.d.ts +14 -0
  29. package/dist/src/prompts.js +41 -1
  30. package/dist/src/rag/rag.manager.d.ts +18 -3
  31. package/dist/src/rag/rag.manager.js +114 -12
  32. package/dist/src/rag/types.d.ts +3 -1
  33. package/dist/src/rules/git/git.e2e.helper.js +51 -4
  34. package/dist/src/rules/git/git.health.js +89 -56
  35. package/dist/src/rules/git/index.d.ts +2 -2
  36. package/dist/src/rules/git/index.js +22 -5
  37. package/dist/src/rules/git/repo.d.ts +64 -6
  38. package/dist/src/rules/git/repo.js +572 -141
  39. package/dist/src/rules/git/repo.pr.d.ts +11 -18
  40. package/dist/src/rules/git/repo.pr.js +82 -94
  41. package/dist/src/rules/git/repo.tools.d.ts +5 -0
  42. package/dist/src/rules/git/repo.tools.js +6 -1
  43. package/dist/src/rules/types.d.ts +0 -2
  44. package/dist/src/rules/utils.matter.js +1 -5
  45. package/dist/src/scrapper.d.ts +138 -25
  46. package/dist/src/scrapper.js +538 -160
  47. package/dist/src/stategraph/stategraph.d.ts +6 -2
  48. package/dist/src/stategraph/stategraph.js +21 -6
  49. package/dist/src/stategraph/types.d.ts +14 -6
  50. package/dist/src/types.d.ts +22 -0
  51. package/dist/src/utils.d.ts +24 -0
  52. package/dist/src/utils.js +84 -86
  53. package/package.json +3 -2
  54. package/dist/src/agents/semantic.d.ts +0 -4
  55. package/dist/src/agents/semantic.js +0 -19
  56. package/dist/src/execute/legacy.d.ts +0 -46
  57. package/dist/src/execute/legacy.js +0 -460
  58. package/dist/src/pricing.llm.d.ts +0 -5
  59. package/dist/src/pricing.llm.js +0 -14
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AgentSimulator = void 0;
4
4
  const simulator_executor_1 = require("./simulator.executor");
5
+ const execute_1 = require("../execute");
5
6
  class AgentSimulator {
6
7
  constructor(config) {
7
8
  this.config = config;
@@ -59,6 +60,195 @@ class AgentSimulator {
59
60
  });
60
61
  }
61
62
  // ============================================================================
63
+ // WORKER API : runJob(input) — exécution de mission autonome
64
+ // ============================================================================
65
+ /**
66
+ * Exécuter un WorkerJob — boucle Worker LLM ↔ Agent LLM
67
+ *
68
+ * Parallèle à testCase() mais pour des missions de production :
69
+ * - Le Worker LLM formule des questions pour l'Agent
70
+ * - L'Agent répond avec ses tools (RAG, DB, emails, calendar...)
71
+ * - Le Worker LLM évalue et continue ou termine avec [WORKER_COMPLETE]
72
+ *
73
+ * @param input - Paramètres du job (query, maxIterations, agentContext)
74
+ * @returns WorkerResult
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const worker = new AgentSimulator({
79
+ * agents: [...], start: 'PR-knowledge', verbose: false,
80
+ * mode: 'worker',
81
+ * positionDescription: 'Consulter tous les mails du jour et résumer les actions'
82
+ * });
83
+ *
84
+ * const result = await worker.runJob({
85
+ * query: 'Commence par lister les mails du jour',
86
+ * maxIterations: 10,
87
+ * agentContext: realContext
88
+ * });
89
+ * ```
90
+ */
91
+ async runJob(input) {
92
+ const startTime = Date.now();
93
+ const maxIterations = input.maxIterations ?? 10;
94
+ const stdout = input.agentContext?.stdout || execute_1.DummyWritable;
95
+ const emptyUsage = { prompt: 0, completion: 0, total: 0, cost: 0 };
96
+ //
97
+ // Helper : émettre un WorkerEvent via sendFeedback
98
+ const emitWorkerEvent = (description, data) => {
99
+ (0, execute_1.sendFeedback)({
100
+ agent: 'worker',
101
+ stdout,
102
+ description,
103
+ usage: context.lastExecution?.usage || emptyUsage,
104
+ state: input.jobId || '',
105
+ data
106
+ });
107
+ };
108
+ //
109
+ // Initialiser les contextes avec le contexte réel de l'agent
110
+ const context = await this.executor.initializeContexts({ goals: '', persona: '', result: '' }, input.agentContext);
111
+ context.maxTurns = maxIterations;
112
+ const allMessages = [];
113
+ let exchangeCounter = 0;
114
+ //
115
+ // Événement : worker_started
116
+ emitWorkerEvent(input.description || 'Worker démarré', { type: 'worker_started', jobId: input.jobId || '', maxIterations, description: input.description });
117
+ try {
118
+ let currentUserQuery = input.query;
119
+ //
120
+ // Stocker le message initial
121
+ const initialMsg = { content: currentUserQuery, role: 'user' };
122
+ allMessages.push(initialMsg);
123
+ if (input.onMessage) {
124
+ input.onMessage(initialMsg);
125
+ }
126
+ //
127
+ // Boucle Worker — maxIterations échanges (parallèle à executeSimulation)
128
+ while (exchangeCounter < maxIterations) {
129
+ //
130
+ // Événement : worker_iteration (avant appel Agent)
131
+ emitWorkerEvent(currentUserQuery.substring(0, 120), { type: 'worker_iteration', iteration: exchangeCounter + 1, maxIterations, query: currentUserQuery.substring(0, 200) });
132
+ //
133
+ // Agent répond à la question
134
+ const agentResponse = await this.executor.executeAgent(context, currentUserQuery);
135
+ const agentMsg = { content: agentResponse, role: 'assistant' };
136
+ allMessages.push(agentMsg);
137
+ if (input.onMessage) {
138
+ input.onMessage(agentMsg);
139
+ }
140
+ exchangeCounter++;
141
+ //
142
+ // Worker LLM évalue la réponse de l'Agent
143
+ const workerResponse = await this.executor.executeSimulator(context, agentResponse);
144
+ //
145
+ // Vérifier [WORKER_COMPLETE]
146
+ if (this.isWorkerComplete(workerResponse)) {
147
+ const parsed = this.parseWorkerResult(workerResponse);
148
+ if (this.isWorkerCompletionValid(parsed)) {
149
+ this.lastExecution = context.lastExecution;
150
+ const duration = Date.now() - startTime;
151
+ emitWorkerEvent(parsed.summary || 'Worker terminé', { type: 'worker_completed', success: true, summary: parsed.summary, iterations: exchangeCounter, duration });
152
+ return {
153
+ success: true,
154
+ deliverable: parsed.deliverable,
155
+ summary: parsed.summary,
156
+ confidence: parsed.confidence,
157
+ iterations: exchangeCounter,
158
+ maxIterations,
159
+ duration,
160
+ execution: context.lastExecution,
161
+ messages: allMessages
162
+ };
163
+ }
164
+ this.lastExecution = context.lastExecution;
165
+ const duration = Date.now() - startTime;
166
+ emitWorkerEvent('Clôture invalide', { type: 'worker_failed', error: 'deliverable must be concrete and non-empty', iterations: exchangeCounter, duration });
167
+ return {
168
+ success: false,
169
+ deliverable: '',
170
+ summary: 'Invalid [WORKER_COMPLETE] payload',
171
+ confidence: 0,
172
+ iterations: exchangeCounter,
173
+ maxIterations,
174
+ duration,
175
+ execution: context.lastExecution,
176
+ messages: allMessages,
177
+ error: 'Worker completion rejected: deliverable must be concrete and non-empty'
178
+ };
179
+ }
180
+ //
181
+ // Pas terminé — extraire la prochaine question pour l'Agent
182
+ currentUserQuery = this.extractConversationalPart(workerResponse);
183
+ if (currentUserQuery) {
184
+ const workerMsg = { content: currentUserQuery, role: 'user' };
185
+ allMessages.push(workerMsg);
186
+ if (input.onMessage) {
187
+ input.onMessage(workerMsg);
188
+ }
189
+ }
190
+ }
191
+ //
192
+ // Budget épuisé — forcer une conclusion avant de déclarer timeout
193
+ // On demande au Worker LLM de synthétiser tout ce qui a été collecté
194
+ const forceConcludeMsg = `[BUDGET ÉPUISÉ — dernier tour obligatoire]\nTu as utilisé ${exchangeCounter}/${maxIterations} tours. Produis maintenant ton [WORKER_COMPLETE] final en synthétisant toutes les informations récoltées.`;
195
+ const forceResponse = await this.executor.executeSimulator(context, forceConcludeMsg);
196
+ if (this.isWorkerComplete(forceResponse)) {
197
+ const parsed = this.parseWorkerResult(forceResponse);
198
+ if (this.isWorkerCompletionValid(parsed)) {
199
+ this.lastExecution = context.lastExecution;
200
+ const duration = Date.now() - startTime;
201
+ emitWorkerEvent(parsed.summary || 'Worker terminé (budget épuisé)', { type: 'worker_completed', success: true, summary: parsed.summary, iterations: exchangeCounter, duration });
202
+ return {
203
+ success: true,
204
+ deliverable: parsed.deliverable,
205
+ summary: parsed.summary,
206
+ confidence: parsed.confidence,
207
+ iterations: exchangeCounter,
208
+ maxIterations,
209
+ duration,
210
+ execution: context.lastExecution,
211
+ messages: allMessages
212
+ };
213
+ }
214
+ }
215
+ //
216
+ // Timeout réel — le Worker n'a pas pu conclure
217
+ this.lastExecution = context.lastExecution;
218
+ const duration = Date.now() - startTime;
219
+ emitWorkerEvent(`Limite atteinte (${maxIterations} itérations)`, { type: 'worker_failed', error: 'Max iterations reached', iterations: exchangeCounter, duration });
220
+ return {
221
+ success: false,
222
+ deliverable: '',
223
+ summary: `Max iterations reached (${maxIterations})`,
224
+ confidence: 0,
225
+ iterations: exchangeCounter,
226
+ maxIterations,
227
+ duration,
228
+ execution: context.lastExecution,
229
+ messages: allMessages,
230
+ error: 'Max iterations reached without [WORKER_COMPLETE]'
231
+ };
232
+ }
233
+ catch (error) {
234
+ this.lastExecution = context.lastExecution;
235
+ const duration = Date.now() - startTime;
236
+ emitWorkerEvent(`Erreur: ${(error.message || error).substring(0, 80)}`, { type: 'worker_failed', error: error.message || String(error), iterations: exchangeCounter, duration });
237
+ return {
238
+ success: false,
239
+ deliverable: '',
240
+ summary: '',
241
+ confidence: 0,
242
+ iterations: exchangeCounter,
243
+ maxIterations,
244
+ duration,
245
+ execution: context.lastExecution,
246
+ messages: allMessages,
247
+ error: `Erreur d'exécution: ${error.message || error}`
248
+ };
249
+ }
250
+ }
251
+ // ============================================================================
62
252
  // ANCIENNE API : executeSimulation(options) - deprecated
63
253
  // ============================================================================
64
254
  /**
@@ -81,6 +271,7 @@ class AgentSimulator {
81
271
  async executeSimulation(options) {
82
272
  // ✅ Initialiser les contextes avec le scenario complet
83
273
  const context = await this.executor.initializeContexts(options.scenario);
274
+ context.maxTurns = options.maxExchanges;
84
275
  const allMessages = [];
85
276
  let lastAgentMessage = '';
86
277
  let exchangeCounter = 0; // Compteur d'échanges (user+assistant)
@@ -118,12 +309,18 @@ class AgentSimulator {
118
309
  const parsed = this.parseSimulationResult(simulatorResult, expectedFormat, context);
119
310
  this.lastExecution = context.lastExecution;
120
311
  // Validation des tools si expectedTool est fourni
121
- if (options.expectedTool) {
312
+ if (options.expectedTool && Object.keys(options.expectedTool).length > 0) {
122
313
  const validation = this.validateExpectedTools(options.expectedTool);
314
+ //
315
+ // Toujours définir toolValidation pour inspection par les tests
316
+ parsed.toolValidation = validation;
123
317
  if (!validation.passed) {
124
318
  parsed.success = false;
125
- parsed.error = validation.errors.join('; ');
126
- parsed.toolValidation = validation;
319
+ //
320
+ // Préserver l'erreur LLM si présente, ajouter l'erreur de validation
321
+ const llmError = parsed.error || '';
322
+ const toolError = validation.errors.join('; ');
323
+ parsed.error = llmError ? `${llmError} | Tool validation: ${toolError}` : toolError;
127
324
  }
128
325
  }
129
326
  // Ajouter l'historique des messages au résultat
@@ -149,12 +346,16 @@ class AgentSimulator {
149
346
  const timeout = await this.generateTimeoutReport(context, expectedFormat);
150
347
  this.lastExecution = context.lastExecution;
151
348
  // Validation des tools même en cas de timeout
152
- if (options.expectedTool) {
349
+ if (options.expectedTool && Object.keys(options.expectedTool).length > 0) {
153
350
  const validation = this.validateExpectedTools(options.expectedTool);
351
+ //
352
+ // Toujours définir toolValidation pour inspection par les tests
353
+ timeout.toolValidation = validation;
154
354
  if (!validation.passed) {
155
355
  timeout.success = false;
156
- timeout.error = validation.errors.join('; ');
157
- timeout.toolValidation = validation;
356
+ const llmError = timeout.error || '';
357
+ const toolError = validation.errors.join('; ');
358
+ timeout.error = llmError ? `${llmError} | Tool validation: ${toolError}` : toolError;
158
359
  }
159
360
  }
160
361
  return { ...timeout, exchangeCount: exchangeCounter, messages: allMessages }; // Utiliser notre compteur
@@ -173,7 +374,7 @@ class AgentSimulator {
173
374
  }
174
375
  /**
175
376
  * Compter les occurrences d'une action dans le dernier ExecutionResult
176
- * @param name Nom exact de l'action (ex: 'lookupMfilesIntervenant', 'lookupKnowledge', 'sendInternalEmail')
377
+ * @param name Nom exact de l'action (ex: 'resolveLocataire', 'lookupKnowledge', 'sendInternalEmail')
177
378
  * @returns { firstPos, count, total } où:
178
379
  * - firstPos: index de la première occurrence (ou -1 si absente)
179
380
  * - count: nombre d'occurrences de cette action
@@ -222,6 +423,48 @@ class AgentSimulator {
222
423
  isSimulationComplete(response) {
223
424
  return response.includes('[DONE]') || response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]');
224
425
  }
426
+ isWorkerComplete(response) {
427
+ return response.includes('[WORKER_COMPLETE]');
428
+ }
429
+ isWorkerCompletionValid(parsed) {
430
+ const deliverable = (parsed.deliverable || '').trim();
431
+ const summary = (parsed.summary || '').trim();
432
+ if (!deliverable) {
433
+ return false;
434
+ }
435
+ // Rejeter les fausses clôtures qui ne sont qu'une enveloppe JSON sérialisée en texte.
436
+ const isWrappedJsonEnvelope = deliverable.startsWith('{')
437
+ && /"deliverable"\s*:/.test(deliverable)
438
+ && /"summary"\s*:/.test(deliverable);
439
+ if (isWrappedJsonEnvelope) {
440
+ return false;
441
+ }
442
+ // Rejeter les clôtures déclaratives sans résultat concret.
443
+ if (/^instruction envoy[ée]e?/i.test(summary)) {
444
+ return false;
445
+ }
446
+ return true;
447
+ }
448
+ parseWorkerResult(response) {
449
+ const match = response.match(/\[WORKER_COMPLETE\]\s*\n?([\s\S]*)/);
450
+ if (match) {
451
+ const content = match[1].trim();
452
+ try {
453
+ const parsed = JSON.parse(content);
454
+ return {
455
+ deliverable: parsed.deliverable || content,
456
+ summary: parsed.summary || '',
457
+ confidence: parsed.confidence ?? 0.5
458
+ };
459
+ }
460
+ catch {
461
+ //
462
+ // Fallback : contenu brut comme deliverable
463
+ return { deliverable: content, summary: '', confidence: 0.5 };
464
+ }
465
+ }
466
+ return { deliverable: '', summary: '', confidence: 0 };
467
+ }
225
468
  parseSimulationResult(response, expectedFormat, context) {
226
469
  // Le simulateur produit directement le résultat et rapport
227
470
  // Parsing pour détecter la fin et extraire le contenu JSON
@@ -286,7 +529,7 @@ class AgentSimulator {
286
529
  extractConversationalPart(response) {
287
530
  // Extraire la partie conversationnelle avant les tags d'évaluation ou d'observation
288
531
  // Filtrer tous les tags système : [DONE], [OBSERVATEUR SILENCIEUX], [À NOTER], etc.
289
- const tagIndex = response.search(/\[(DONE|SIMULATION_COMPLETE|TERMINE|BUG_|OBSERVATEUR|À NOTER|NOTE|ANALYSE)/i);
532
+ const tagIndex = response.search(/\[(DONE|SIMULATION_COMPLETE|TERMINE|WORKER_COMPLETE|BUG_|OBSERVATEUR|À NOTER|NOTE|ANALYSE)/i);
290
533
  if (tagIndex !== -1) {
291
534
  return response.substring(0, tagIndex).trim();
292
535
  }
@@ -1,18 +1,63 @@
1
1
  import { SimulationScenario } from "./simulator.types";
2
2
  /**
3
- * Génère le prompt du simulateur générique avec le scenario intégré
4
- *
5
- * Basé sur ClientSimulator avec Mirror Agent Model
6
- * Intègre directement les valeurs du scenario dans des tags XML
7
- *
8
- * @param scenario - Scenario de simulation avec persona, goals, result
9
- * @param instructionEx - Instructions additionnelles spécifiques à l'agent (ajoutées à la fin)
10
- * @returns Prompt complet avec plan de simulation intégré
3
+ * Section ACTEURS décrit les 3 rôles de la boucle.
4
+ * Spécifique par agent : le descripteur de l'orchestrateur diffère.
11
5
  */
12
- export declare function GENERIC_SIMULATOR_PROMPT(scenario: SimulationScenario, instructionEx?: string): string;
6
+ export declare const acteursSectionSimulatorPrompt = "# ACTEURS\nIl y a 3 acteurs dans cette boucle de test E2E :\n1. **Utilisateur** \u2014 celui qui a pos\u00E9 la question initiale (premier message). Il est HORS boucle.\n2. **Agent** \u2014 il poss\u00E8de les outils de l'entreprise et r\u00E9pond \u00E0 tes demandes. C'est lui qu'on teste.\n3. **Toi (Simulateur)** \u2014 tu pilotes l'Agent tour par tour selon <simulation_brief> et tu \u00E9values ses r\u00E9ponses. Ta personnalit\u00E9 est d\u00E9crite dans <persona_user>.";
7
+ export declare const acteursSectionWorkerPrompt = "# ACTEURS\nIl y a 3 acteurs dans cette boucle de travail :\n1. **Utilisateur** \u2014 celui qui a pos\u00E9 la question initiale (premier message). Il est HORS boucle pendant l'ex\u00E9cution : tu ne dois jamais le solliciter ni attendre d'information de sa part.\n2. **Agent** \u2014 il dispose des outils de l'entreprise et ex\u00E9cute tes demandes.\n3. **Toi (Worker)** \u2014 tu pilotes l'Agent tour par tour afin d'accomplir la mission d\u00E9crite dans <worker_brief>.";
13
8
  /**
14
- * 3 prompts variables de personnalité pré-définis à choisir manuellement
9
+ * Section DÉMARRAGE / premier tour comportement au premier message.
10
+ * - Simulator : avertissement sur la nature du premier message (réponse Agent, pas utilisateur).
11
+ * - Worker : dérivation d'intention depuis les déclencheurs de la fiche de poste.
15
12
  */
13
+ export declare const starterSectionSimulatorPrompt = "\u26A0\uFE0F Le premier message que tu re\u00E7ois est d\u00E9j\u00E0 la r\u00E9ponse de l'Agent \u00E0 la question initiale de l'Utilisateur. Ce n'est PAS un message de l'utilisateur.";
14
+ export declare const starterSectionWorkerPrompt = "# D\u00C9MARRAGE (premier tour uniquement)\nAvant d'envoyer ta premi\u00E8re demande \u00E0 l'Agent :\n1. Identifie si une intention est **explicite** dans le message [verbe + objet direct].\n2. Si non (texte brut, r\u00E9sum\u00E9 de mail, message ambigu) \u2192 parcours les champs `D\u00E9clencheur:` des **Activit\u00E9s** de ta `<worker_brief>`. S\u00E9lectionne l'activit\u00E9 dont le d\u00E9clencheur correspond le mieux au message : son champ `Travail:` d\u00E9finit ton objectif, son champ `B\u00E9n\u00E9ficiaire:` identifie le destinataire.\n3. Formule un plan d'action en 2-3 \u00E9tapes **(raisonnement interne \u2014 ne jamais l'envoyer \u00E0 l'Agent)**.\n4. Premi\u00E8re demande = \u00E9tape 1 du plan, cibl\u00E9e et sourc\u00E9e. Pas de pr\u00E9ambule ni num\u00E9rotation.";
15
+ /**
16
+ * Section LIFECYCLE — budget de tours injecté à chaque tour via <execution-context>.
17
+ * - Simulator : inclut aussi `tools` (outils réellement appelés) pour validation E2E.
18
+ * - Worker : inclut les instructions de clôture au dernier tour (fallback utile).
19
+ */
20
+ export declare const lifecycleSectionSimulatorPrompt = "# LIFECYCLE\n\u00C0 chaque tour, un tag `<execution-context>` est inject\u00E9 avec :\n- `turn` : tour actuel\n- `maxTurns` : budget total\n- `turnsRemaining` : tours restants\n- `tools` : noms exacts des outils **r\u00E9ellement appel\u00E9s** par l'Agent pendant ce tour\nUtilise cette info pour planifier : si peu de tours restent, privil\u00E9gie les questions qui valident directement les objectifs.\n**CRITIQUE**: Si un outil appara\u00EEt dans `tools`, il a **r\u00E9ellement \u00E9t\u00E9 ex\u00E9cut\u00E9**.\n**\u00C9QUIVALENCE M\u00C9TIER**: pour l'\u00E9valuation, `M-Files` = `GED` = outils `resolve*` / `lookupMfiles*`. Si l'objectif demande d'utiliser le GED ou M-Files et qu'un outil `resolve*` ou `lookupMfiles*` appara\u00EEt dans `tools`, consid\u00E8re que l'objectif GED/M-Files est satisfait.";
21
+ export declare const lifecycleSectionWorkerPrompt = "# LIFECYCLE\n\u00C0 chaque tour, un tag `<execution-context>` est inject\u00E9 avec ton budget :\n- `turn` : tour actuel\n- `maxTurns` : budget total\n- `turnsRemaining` : tours restants\nUtilise cette info pour prioriser : si peu de tours restent, concentre-toi sur le livrable.\n**DERNIER TOUR** : quand `turnsRemaining` \u2264 1, tu DOIS conclure avec `[WORKER_COMPLETE]` en synth\u00E9tisant toutes les informations r\u00E9colt\u00E9es.\nSi l'information est insuffisante, fournis un **fallback utile** : meilleures hypoth\u00E8ses explicites + options + plan d'action concret (sans inventer de faits). Ne demande pas de tour suppl\u00E9mentaire.";
22
+ /**
23
+ * Section SAFETY — règles anti-hallucination.
24
+ * Formulation différente selon le rôle (évaluateur vs exécutant).
25
+ */
26
+ export declare const safetySectionSimulatorPrompt = "# SAFETY\n- N'invente pas de r\u00E9sultats d'outils.\n- Si l'Agent a produit une r\u00E9ponse visible dans la conversation, \u00E9value-la \u2014 ne d\u00E9clare jamais \"pas de r\u00E9ponse\".";
27
+ export declare const safetySectionWorkerPrompt = "# SAFETY\n- N'invente pas de faits.\n- Si l'information est incertaine ou incompl\u00E8te, indique-le dans `summary`.";
28
+ /**
29
+ * Bloc CRITICAL final — rappel JSON strict après le trigger de sortie.
30
+ * Factorisé via fonction car seul le nom du trigger diffère.
31
+ */
32
+ export declare function buildCriticalBlock(trigger: string): string;
16
33
  export declare const PERSONA_PATIENT = "Utilisateur patient et poli qui prend le temps d'expliquer sa situation";
17
34
  export declare const PERSONA_PRESSE = "Utilisateur press\u00E9 qui veut une solution rapide, r\u00E9pond bri\u00E8vement";
18
35
  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";
36
+ export declare const PERSONA_RESULT_CLIENT = "R\u00E9daction claire et orient\u00E9e client, empathique, sans jargon interne, avec des conclusions directement actionnables.";
37
+ /**
38
+ * Préfixe injecté au premier message Worker→Agent en mode autonome.
39
+ * Signale à l'Agent qu'il est piloté par un orchestrateur et doit éviter
40
+ * les questions de clarification destinées à un utilisateur humain.
41
+ */
42
+ export declare const WORKER_AUTONOMOUS_PREFIX = "[MODE AUTONOME] Tu es pilot\u00E9 par un orchestrateur. Ne pose pas de question de clarification, va droit au but, pas de bavardage ni de formules de politesse superflues.\n\n";
43
+ /**
44
+ * Génère le prompt du simulateur générique avec le scenario intégré.
45
+ *
46
+ * @param scenario - Scénario de simulation avec persona, goals, result
47
+ * @param positionDescription - Instructions additionnelles (ajoutées à la fin)
48
+ */
49
+ export declare function GENERIC_SIMULATOR_PROMPT(scenario: SimulationScenario, positionDescription?: string): string;
50
+ /**
51
+ * Prompt interne fixe du WorkerJob — system prompt pour le Worker LLM.
52
+ *
53
+ * Structure (inspirée OpenClaw) :
54
+ * CONTEXT → ACTEURS, CAPACITÉS AGENT, worker_brief (persona/soul)
55
+ * PROCESS → DÉMARRAGE, MISSION, BOUCLE DE DÉCISION, STYLE
56
+ * CONSTRAINTS → CONTRAINTES (RÈGLES + BLOCAGE + NO-PROGRESS + INTERDICTIONS)
57
+ * OUTPUT → LIFECYCLE, SAFETY, VÉRIFICATION, TRIGGERS, FORMAT
58
+ *
59
+ * @param positionDescription - Fiche de poste du collaborateur (= PERSONA_PROMPTS[key], tronquée à -- END --)
60
+ * @param personaResult - Style du deliverable final (orienté client)
61
+ * @param agentCapabilities - Capacités de l'Agent (firstLine de chaque tool.function.description)
62
+ */
63
+ export declare function WORKER_INTERNAL_PROMPT(positionDescription: string, personaResult?: string, agentCapabilities?: string): string;