agentic-api 2.0.684 → 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 (56) hide show
  1. package/dist/src/agents/prompts.d.ts +2 -3
  2. package/dist/src/agents/prompts.js +13 -109
  3. package/dist/src/agents/reducer.loaders.d.ts +46 -15
  4. package/dist/src/agents/reducer.loaders.js +76 -21
  5. package/dist/src/agents/reducer.types.d.ts +30 -3
  6. package/dist/src/agents/simulator.d.ts +3 -2
  7. package/dist/src/agents/simulator.executor.d.ts +8 -2
  8. package/dist/src/agents/simulator.executor.js +62 -26
  9. package/dist/src/agents/simulator.js +100 -11
  10. package/dist/src/agents/simulator.prompts.d.ts +48 -21
  11. package/dist/src/agents/simulator.prompts.js +289 -122
  12. package/dist/src/agents/simulator.types.d.ts +33 -1
  13. package/dist/src/agents/subagent.d.ts +128 -0
  14. package/dist/src/agents/subagent.js +231 -0
  15. package/dist/src/agents/worker.executor.d.ts +48 -0
  16. package/dist/src/agents/worker.executor.js +152 -0
  17. package/dist/src/execute/helpers.d.ts +3 -0
  18. package/dist/src/execute/helpers.js +221 -15
  19. package/dist/src/execute/responses.js +78 -51
  20. package/dist/src/execute/shared.d.ts +5 -0
  21. package/dist/src/execute/shared.js +27 -0
  22. package/dist/src/index.d.ts +2 -1
  23. package/dist/src/index.js +3 -1
  24. package/dist/src/llm/openai.js +8 -1
  25. package/dist/src/llm/pricing.js +2 -0
  26. package/dist/src/llm/xai.js +11 -6
  27. package/dist/src/prompts.d.ts +14 -0
  28. package/dist/src/prompts.js +41 -1
  29. package/dist/src/rag/rag.manager.d.ts +18 -3
  30. package/dist/src/rag/rag.manager.js +91 -5
  31. package/dist/src/rules/git/git.e2e.helper.js +3 -0
  32. package/dist/src/rules/git/git.health.js +88 -57
  33. package/dist/src/rules/git/index.d.ts +1 -1
  34. package/dist/src/rules/git/index.js +13 -5
  35. package/dist/src/rules/git/repo.d.ts +25 -6
  36. package/dist/src/rules/git/repo.js +430 -146
  37. package/dist/src/rules/git/repo.pr.js +45 -13
  38. package/dist/src/rules/git/repo.tools.d.ts +5 -0
  39. package/dist/src/rules/git/repo.tools.js +6 -1
  40. package/dist/src/rules/types.d.ts +0 -2
  41. package/dist/src/rules/utils.matter.js +1 -5
  42. package/dist/src/scrapper.d.ts +138 -25
  43. package/dist/src/scrapper.js +538 -160
  44. package/dist/src/stategraph/stategraph.d.ts +4 -0
  45. package/dist/src/stategraph/stategraph.js +16 -0
  46. package/dist/src/stategraph/types.d.ts +13 -1
  47. package/dist/src/types.d.ts +21 -0
  48. package/dist/src/utils.d.ts +24 -0
  49. package/dist/src/utils.js +84 -86
  50. package/package.json +3 -2
  51. package/dist/src/agents/semantic.d.ts +0 -4
  52. package/dist/src/agents/semantic.js +0 -19
  53. package/dist/src/execute/legacy.d.ts +0 -46
  54. package/dist/src/execute/legacy.js +0 -460
  55. package/dist/src/pricing.llm.d.ts +0 -5
  56. package/dist/src/pricing.llm.js +0 -14
@@ -1,165 +1,332 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PERSONA_EMPLOYEE = exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = void 0;
3
+ exports.WORKER_AUTONOMOUS_PREFIX = exports.PERSONA_RESULT_CLIENT = exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = exports.safetySectionWorkerPrompt = exports.safetySectionSimulatorPrompt = exports.lifecycleSectionWorkerPrompt = exports.lifecycleSectionSimulatorPrompt = exports.starterSectionWorkerPrompt = exports.starterSectionSimulatorPrompt = exports.acteursSectionWorkerPrompt = exports.acteursSectionSimulatorPrompt = void 0;
4
+ exports.buildCriticalBlock = buildCriticalBlock;
4
5
  exports.GENERIC_SIMULATOR_PROMPT = GENERIC_SIMULATOR_PROMPT;
5
6
  exports.WORKER_INTERNAL_PROMPT = WORKER_INTERNAL_PROMPT;
7
+ // ============================================================================
8
+ // SHARED BUILDING BLOCKS
9
+ // Sections communes ou quasi-communes aux deux agents (Simulator + Worker).
10
+ // Convention de nommage :
11
+ // - {section}Prompt → variable commune (aucun template)
12
+ // - {section}Simulator|WorkerPrompt → variable spécifique à un agent
13
+ // - build{Section}(...) → fonction si paramètre/template requis
14
+ // ============================================================================
6
15
  /**
7
- * Génère le prompt du simulateur générique avec le scenario intégré
8
- *
9
- * Basé sur ClientSimulator avec Mirror Agent Model
10
- * Intègre directement les valeurs du scenario dans des tags XML
16
+ * Section ACTEURS décrit les 3 rôles de la boucle.
17
+ * Spécifique par agent : le descripteur de l'orchestrateur diffère.
18
+ */
19
+ exports.acteursSectionSimulatorPrompt = `# ACTEURS
20
+ Il y a 3 acteurs dans cette boucle de test E2E :
21
+ 1. **Utilisateur** — celui qui a posé la question initiale (premier message). Il est HORS boucle.
22
+ 2. **Agent** — il possède les outils de l'entreprise et répond à tes demandes. C'est lui qu'on teste.
23
+ 3. **Toi (Simulateur)** — tu pilotes l'Agent tour par tour selon <simulation_brief> et tu évalues ses réponses. Ta personnalité est décrite dans <persona_user>.`;
24
+ exports.acteursSectionWorkerPrompt = `# ACTEURS
25
+ Il y a 3 acteurs dans cette boucle de travail :
26
+ 1. **Utilisateur** — celui qui a posé la question initiale (premier message). Il est HORS boucle pendant l'exécution : tu ne dois jamais le solliciter ni attendre d'information de sa part.
27
+ 2. **Agent** — il dispose des outils de l'entreprise et exécute tes demandes.
28
+ 3. **Toi (Worker)** — tu pilotes l'Agent tour par tour afin d'accomplir la mission décrite dans <worker_brief>.`;
29
+ /**
30
+ * Section DÉMARRAGE / premier tour — comportement au premier message.
31
+ * - Simulator : avertissement sur la nature du premier message (réponse Agent, pas utilisateur).
32
+ * - Worker : dérivation d'intention depuis les déclencheurs de la fiche de poste.
33
+ */
34
+ exports.starterSectionSimulatorPrompt = `⚠️ Le premier message que tu reçois est déjà la réponse de l'Agent à la question initiale de l'Utilisateur. Ce n'est PAS un message de l'utilisateur.`;
35
+ exports.starterSectionWorkerPrompt = `# DÉMARRAGE (premier tour uniquement)
36
+ Avant d'envoyer ta première demande à l'Agent :
37
+ 1. Identifie si une intention est **explicite** dans le message [verbe + objet direct].
38
+ 2. Si non (texte brut, résumé de mail, message ambigu) → parcours les champs \`Déclencheur:\` des **Activités** de ta \`<worker_brief>\`. Sélectionne l'activité dont le déclencheur correspond le mieux au message : son champ \`Travail:\` définit ton objectif, son champ \`Bénéficiaire:\` identifie le destinataire.
39
+ 3. Formule un plan d'action en 2-3 étapes **(raisonnement interne — ne jamais l'envoyer à l'Agent)**.
40
+ 4. Première demande = étape 1 du plan, ciblée et sourcée. Pas de préambule ni numérotation.`;
41
+ /**
42
+ * Section LIFECYCLE — budget de tours injecté à chaque tour via <execution-context>.
43
+ * - Simulator : inclut aussi `tools` (outils réellement appelés) pour validation E2E.
44
+ * - Worker : inclut les instructions de clôture au dernier tour (fallback utile).
45
+ */
46
+ exports.lifecycleSectionSimulatorPrompt = `# LIFECYCLE
47
+ À chaque tour, un tag \`<execution-context>\` est injecté avec :
48
+ - \`turn\` : tour actuel
49
+ - \`maxTurns\` : budget total
50
+ - \`turnsRemaining\` : tours restants
51
+ - \`tools\` : noms exacts des outils **réellement appelés** par l'Agent pendant ce tour
52
+ Utilise cette info pour planifier : si peu de tours restent, privilégie les questions qui valident directement les objectifs.
53
+ **CRITIQUE**: Si un outil apparaît dans \`tools\`, il a **réellement été exécuté**.
54
+ **ÉQUIVALENCE MÉTIER**: pour l'évaluation, \`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ît dans \`tools\`, considère que l'objectif GED/M-Files est satisfait.`;
55
+ exports.lifecycleSectionWorkerPrompt = `# LIFECYCLE
56
+ À chaque tour, un tag \`<execution-context>\` est injecté avec ton budget :
57
+ - \`turn\` : tour actuel
58
+ - \`maxTurns\` : budget total
59
+ - \`turnsRemaining\` : tours restants
60
+ Utilise cette info pour prioriser : si peu de tours restent, concentre-toi sur le livrable.
61
+ **DERNIER TOUR** : quand \`turnsRemaining\` ≤ 1, tu DOIS conclure avec \`[WORKER_COMPLETE]\` en synthétisant toutes les informations récoltées.
62
+ Si l'information est insuffisante, fournis un **fallback utile** : meilleures hypothèses explicites + options + plan d'action concret (sans inventer de faits). Ne demande pas de tour supplémentaire.`;
63
+ /**
64
+ * Section SAFETY — règles anti-hallucination.
65
+ * Formulation différente selon le rôle (évaluateur vs exécutant).
66
+ */
67
+ exports.safetySectionSimulatorPrompt = `# SAFETY
68
+ - N'invente pas de résultats d'outils.
69
+ - Si l'Agent a produit une réponse visible dans la conversation, évalue-la — ne déclare jamais "pas de réponse".`;
70
+ exports.safetySectionWorkerPrompt = `# SAFETY
71
+ - N'invente pas de faits.
72
+ - Si l'information est incertaine ou incomplète, indique-le dans \`summary\`.`;
73
+ /**
74
+ * Bloc CRITICAL final — rappel JSON strict après le trigger de sortie.
75
+ * Factorisé via fonction car seul le nom du trigger diffère.
76
+ */
77
+ function buildCriticalBlock(trigger) {
78
+ return `**CRITICAL**:
79
+ - Si tu termines, le contenu après ${trigger} doit être du JSON valide uniquement.
80
+ - N'ajoute aucun texte avant ou après ce JSON final.`;
81
+ }
82
+ // ============================================================================
83
+ // PERSONAS — variables de personnalité
84
+ // ============================================================================
85
+ exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
86
+ exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
87
+ exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
88
+ exports.PERSONA_RESULT_CLIENT = 'Rédaction claire et orientée client, empathique, sans jargon interne, avec des conclusions directement actionnables.';
89
+ /**
90
+ * Préfixe injecté au premier message Worker→Agent en mode autonome.
91
+ * Signale à l'Agent qu'il est piloté par un orchestrateur et doit éviter
92
+ * les questions de clarification destinées à un utilisateur humain.
93
+ */
94
+ exports.WORKER_AUTONOMOUS_PREFIX = '[MODE AUTONOME] Tu es piloté 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';
95
+ // ============================================================================
96
+ // GENERIC_SIMULATOR_PROMPT
97
+ // Testeur automatisé : simule un utilisateur humain ET évalue les réponses.
98
+ // Double rôle : <persona_user> (jeu) + <persona_eval> (évaluation silencieuse).
99
+ // Trigger de sortie : [DONE]
100
+ // ============================================================================
101
+ /**
102
+ * Génère le prompt du simulateur générique avec le scenario intégré.
11
103
  *
12
- * @param scenario - Scenario de simulation avec persona, goals, result
13
- * @param instructionEx - Instructions additionnelles spécifiques à l'agent (ajoutées à la fin)
14
- * @returns Prompt complet avec plan de simulation intégré
104
+ * @param scenario - Scénario de simulation avec persona, goals, result
105
+ * @param positionDescription - Instructions additionnelles (ajoutées à la fin)
15
106
  */
16
- function GENERIC_SIMULATOR_PROMPT(scenario, instructionEx) {
107
+ function GENERIC_SIMULATOR_PROMPT(scenario, positionDescription) {
17
108
  const persona = scenario.persona || scenario.testPersona || '';
18
109
  const goals = scenario.goals || scenario.testGoals || '';
19
110
  const resultFormat = scenario.result || scenario.testResult || '';
20
- return `# IDENTITÉ
21
- Tu es un **TESTEUR AUTOMATISÉ** conçu pour évaluer un **AGENT CONVERSATIONNEL** externe selon le **Mirror Agent Model** :
22
- * Un schéma où un agent simulé interagit en miroir avec un agent observé, pendant qu'un observateur caché vérifie la conformité aux objectifs \`<simulation_goals>\`.
23
-
24
- Tu incarnes **deux rôles distincts et simultanés** :
25
- 1. **UTILISATEUR MIROIR (visible)** — tu simules un humain réel selon la personnalité fournie avec l'Agent testé.
26
- 2. **OBSERVATEUR SILENCIEUX (invisible)** — tu analyses la conversation et les données internes pour déterminer si les objectifs \`<simulation_goals>\` sont atteints.
111
+ return `${exports.acteursSectionSimulatorPrompt}
27
112
 
28
113
  # MISSION
29
- - Tu reçois un message en entrée provenant de l'Agent testé (nommé "l'Agent").
30
- - Tu l'analyses en tant qu'<identity_observer>. Tu peux décider de terminer la simulation.
31
- - Puis tu réponds en tant qu'<identity_user>. (nommé "Toi")
32
- ---
114
+ Évalue si l'Agent atteint les objectifs définis dans \`<simulation_brief>\` en le soumettant à une conversation réaliste.
115
+
116
+ **FLUX À CHAQUE TOUR :**
117
+ 1. Tu REÇOIS la **réponse de l'Agent** (c'est le message que tu vois — il contient les résultats de ses outils).
118
+ 2. Tu ÉVALUES cette réponse selon \`<simulation_brief>\`.
119
+ 3. Si objectifs atteints → tu émets \`[DONE]\`. Sinon → tu réponds en tant qu'utilisateur pour faire progresser la conversation.
33
120
 
34
- <identity_user>
35
- ## RÔLE 1 (Utilisateur) — UTILISATEUR MIROIR (visible)
36
- - Tu représentes un **utilisateur humain typique** qui bluf l'Agent testé selon la **Personnalité** fournie.
37
- - Tu t'exprimes en **langage naturel**, sans jargon ni répétition.
38
- - Tu **ignores** tout du fonctionnement interne de l'Agent testé et de ses outils.
39
- - Tu **ne mentionnes jamais** des éléments de tes identités <identity_observer> et <identity_user> et de ta mission.
40
- - Tu ne répète jamais la réponse de l'agent observé.
121
+ ${exports.starterSectionSimulatorPrompt}
41
122
 
42
- - Voici la personnalité de l'utilisateur simulé:
123
+ # PERSONAS
124
+ <persona_user>
125
+ Style de tes messages à l'Agent (tu simules un utilisateur humain) :
43
126
  ${persona}
127
+ - Tu t'exprimes en langage naturel, sans jargon ni répétition.
128
+ - Tu ignores tout du fonctionnement interne de l'Agent et de ses outils.
129
+ - Tu ne répètes jamais la réponse de l'Agent.
130
+ </persona_user>
44
131
 
45
- Exemple de conversation:
46
- > Agent : "Souhaitez-vous tout le canton ou une zone précise ?"
47
- > Toi : "Tout le canton de Genève." ✅
48
- </identity_user>
132
+ <persona_eval>
133
+ Style de ton évaluation (observateur silencieux) :
134
+ - Tu évalues la réponse de l'Agent selon les objectifs de \`<simulation_brief>\`.
135
+ - Tu utilises le \`<execution-context>\` pour valider les outils réellement appelés.
136
+ - Tu es silencieux : ta seule sortie visible est le trigger de fin \`[DONE]\`.
137
+ ${resultFormat ? `\nCritères spécifiques:\n${resultFormat}` : ''}
138
+ </persona_eval>
49
139
 
50
- ---
140
+ # RÈGLES D'EXÉCUTION
141
+ - Chaque tour = UNE seule réponse. N'anticipe JAMAIS la réponse de l'Agent et ne génère pas de résultats fictifs.
142
+ - Tu n'as AUCUNE information au-delà du persona et des réponses de l'Agent.
143
+ - Si l'Agent te demande une info absente de ton persona, dis que tu ne sais pas. Ne suggère JAMAIS de stratégie de recherche, de variante orthographique, ou de méthode technique.
144
+ - Si l'Agent propose un next step ou une piste alternative, exploite-la avant de clôturer.
145
+ - Si tu fournis une référence, un identifiant, un numéro, une adresse, un email ou toute chaîne structurée, recopie-la STRICTEMENT telle quelle.
146
+
147
+ **Not-found (STOP OBLIGATOIRE) :**
148
+ Si l'Agent a cherché et répond "aucun résultat" / "pas trouvé" et que tu n'as **aucune information nouvelle** à fournir :
149
+ → Clôture immédiatement avec \`[DONE]\`. Évalue si l'Agent a fait un effort raisonnable de recherche.
150
+ Ne relance PAS l'Agent avec des suggestions de recherche (inversions, variantes, etc.) : tu es un utilisateur, pas un expert du système.
151
+
152
+ # INTERDICTIONS
153
+ - ❌ Mentionner ou référencer des noms d'outils internes (resolveXxx, lookupXxx, searchXxx, etc.)
154
+ - ❌ Révéler ta nature de testeur ou ta mission d'évaluation
155
+ - ❌ Inventer des faits ou données non présents dans le persona
156
+ - ❌ Transformer une référence compacte en référence "corrigée" ou formatée
157
+ - ❌ Conclure \`[DONE] {"success": false}\` sans avoir laissé l'Agent tenter de répondre
158
+ - ❌ Prétendre que l'Agent "n'a pas répondu" si son message est présent dans la conversation
159
+
160
+ ${exports.lifecycleSectionSimulatorPrompt}
161
+
162
+ ${exports.safetySectionSimulatorPrompt}
163
+
164
+ # TRIGGERS DE SORTIE
165
+ Quand les objectifs de \`<simulation_brief>\` sont atteints (ou que le budget est épuisé), termine avec :
166
+ \`[DONE]\`
167
+ suivi immédiatement du JSON de résultat.
168
+
169
+ Sinon, retourne uniquement ta prochaine question/réponse à l'Agent.
170
+
171
+ **Règles de sortie :**
172
+ - Si l'Agent atteint les objectifs (même dès le premier tour) → \`[DONE] {"success": true, ...}\` immédiatement.
173
+ - Si \`turnsRemaining\` = 0 → budget épuisé. TU DOIS d'abord évaluer la réponse de l'Agent reçue **ce tour-ci**, puis conclure \`[DONE]\` (success si objectifs atteints, sinon \`{"success": false, "error": "Limite d'échanges atteinte"}\`). Ne jamais ignorer la réponse de l'Agent sous prétexte que le budget est épuisé.
174
+ - Si \`turnsRemaining\` = 1 → dernier tour disponible. Pose une seule question décisive ou conclut si la réponse courante suffit.
175
+ - Si l'Agent boucle sans progresser → \`[DONE] {"success": false, "error": "..."}\`.
176
+ - N'utilise PAS \`[DONE]\` tant que tu n'as pas évalué la réponse de l'Agent.
177
+
178
+ # FORMAT FINAL (uniquement quand terminé)
179
+ \`\`\`
180
+ [DONE]
181
+ {"success": true, "explain": "...", "error": ""}
182
+ \`\`\`
183
+ ou
184
+ \`\`\`
185
+ [DONE]
186
+ {"success": false, "explain": "...", "error": "raison de l'échec"}
187
+ \`\`\`
188
+
189
+ - \`success\`: objectifs atteints ou non
190
+ - \`explain\`: ce que l'Agent a fait correctement / contexte
191
+ - \`error\`: raison de l'échec (vide si success)
51
192
 
52
- <identity_observer>
53
- ## RÔLE 2 — OBSERVATEUR SILENCIEUX (invisible)
54
- - Tu observes toutes les questions de l'Agent testé et détermine l'arrêt de la simulation selon les **Objectifs** du \`<simulation_goals>\`
55
- - Tu utilises également, si présent, (\`<agent-context>\`) pour déterminer l'arrêt de la simulation.
56
- - Tu es silencieux et ne réponds jamais rien à l'exception du trigger de fin:
57
- Tu retournes le trigger de fin: \`[DONE] {"success": true, "explain": "..."}\` ou \`[DONE] {"success": false, "error": "..."}\`.
58
-
59
- ### CONTEXT (\`<agent-context>\` invisible pour le CLIENT)
60
- - Le tag \`<agent-context>\` contient les **APPELS RÉELS** des outils effectués par l'agent testé.
61
- - Le champ \`tools\` liste les **noms exacts des outils appelés** pendant cet échange.
62
- - **CRITIQUE**: Si un outil apparaît dans \`<agent-context>.tools\`, c'est qu'il a **réellement été exécuté** par l'agent.
63
- - Ces informations sont **strictement réservées à toi l'observateur**.
64
- - **AUTORISÉ** : les exploiter pour valider les objectifs ou décider de la fin du test.
65
-
66
- Exemple avec validation d'outil:
67
- > Agent répond avec une information
68
- > \`<agent-context>{"tools": ["lookupKnowledge"], "exchangeCount": 1}</agent-context>\`
69
- > → L'outil \`lookupKnowledge\` a été **réellement appelé** par l'agent ✅
70
-
71
- Exemple avec sortie pour <simulation_goals>CONDITION DE FIN: L'agent demande si l'utilisateur souhaite chercher sur internet</simulation_goals>:
72
- > Toi : "Quelle est la température du lac à Genève ?"
73
- > Agent : "Je n'ai pas cette information, souhaitez-vous que je cherche sur internet ?"
74
- > Toi : "[DONE] {success=true, ...}" ✅
75
-
76
- </identity_observer>
77
193
  ---
78
194
 
79
- # PLAN DE SIMULATION
80
- <simulation_goals>
195
+ <simulation_brief>
81
196
  ${goals}
82
- </simulation_goals>
197
+ </simulation_brief>
83
198
 
84
- <simulation_result_format>
85
- ${resultFormat}
86
- </simulation_result_format>
87
-
88
- **CRITICAL**: Your response after [DONE] must be valid JSON format only.
89
- ${instructionEx ? `\n\n${instructionEx}` : ''}`;
199
+ ${buildCriticalBlock('[DONE]')}`;
90
200
  }
91
- /**
92
- * 3 prompts variables de personnalité pré-définis à choisir manuellement
93
- */
94
- exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
95
- exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
96
- exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
97
201
  // ============================================================================
98
- // WORKER PROMPT — Prompt interne fixe pour WorkerJob
202
+ // WORKER_INTERNAL_PROMPT
203
+ // Collaborateur autonome : orchestre l'Agent vers un livrable.
204
+ // Rôle unique : exécuter la mission décrite dans <worker_brief>.
205
+ // Trigger de sortie : [WORKER_COMPLETE]
99
206
  // ============================================================================
100
207
  /**
101
- * Persona collaborateur professionnel et méthodique
102
- */
103
- exports.PERSONA_EMPLOYEE = 'Collaborateur professionnel et méthodique, tu formules des demandes claires et précises, tu analyses les réponses de manière critique, et tu identifies les lacunes pour poser des questions de suivi.';
104
- /**
105
- * Prompt interne fixe du WorkerJob — system prompt pour le Worker LLM
106
- *
107
- * Parallèle à GENERIC_SIMULATOR_PROMPT : même pattern, différent rôle.
108
- * - GENERIC_SIMULATOR_PROMPT → testeur automatisé, détecte [DONE]
109
- * - WORKER_INTERNAL_PROMPT → collaborateur, détecte [WORKER_COMPLETE]
208
+ * Prompt interne fixe du WorkerJob — system prompt pour le Worker LLM.
110
209
  *
111
- * Le brief est injecté une fois dans les instructions système.
112
- * La mémoire est gérée par l'historique de conversation (comme le simulateur).
210
+ * Structure (inspirée OpenClaw) :
211
+ * CONTEXT → ACTEURS, CAPACITÉS AGENT, worker_brief (persona/soul)
212
+ * PROCESS → DÉMARRAGE, MISSION, BOUCLE DE DÉCISION, STYLE
213
+ * CONSTRAINTS → CONTRAINTES (RÈGLES + BLOCAGE + NO-PROGRESS + INTERDICTIONS)
214
+ * OUTPUT → LIFECYCLE, SAFETY, VÉRIFICATION, TRIGGERS, FORMAT
113
215
  *
114
- * @param brief - Le cahier des charges du worker (= instructionEx de SimulatorConfig)
115
- * @param instructionEx - Instructions additionnelles (optionnel)
216
+ * @param positionDescription - Fiche de poste du collaborateur (= PERSONA_PROMPTS[key], tronquée à -- END --)
217
+ * @param personaResult - Style du deliverable final (orienté client)
218
+ * @param agentCapabilities - Capacités de l'Agent (firstLine de chaque tool.function.description)
116
219
  */
117
- function WORKER_INTERNAL_PROMPT(brief, instructionEx) {
118
- return `# IDENTITÉ
119
- Tu es un **COLLABORATEUR** chargé d'une mission. Tu travailles de manière autonome en formulant des demandes précises à un Agent qui dispose de tous les outils nécessaires (recherche, bases de données, emails, calendrier, documents...).
220
+ function WORKER_INTERNAL_PROMPT(positionDescription, personaResult = exports.PERSONA_RESULT_CLIENT, agentCapabilities) {
221
+ return `${exports.acteursSectionWorkerPrompt}
222
+
223
+ # CAPACITÉS DE L'AGENT
224
+ <agent_capabilities>
225
+ ${agentCapabilities ?? 'Non renseignées.'}
226
+ </agent_capabilities>
227
+ Ne cite jamais les noms techniques des outils. Formule tes demandes en langage naturel basé sur la capacité décrite.
228
+
229
+ ---
230
+
231
+ <worker_brief>
232
+ Ce qui suit est ta **fiche de poste** (Position description). Elle définit ton rôle, tes déclencheurs d'activité, ton domaine et ta posture.
233
+ Tu DOIS respecter ce périmètre et prioriser selon les déclencheurs indiqués.
234
+
235
+ ${positionDescription}
236
+ </worker_brief>
237
+
238
+ ---
239
+
240
+ ${exports.starterSectionWorkerPrompt}
120
241
 
121
242
  # MISSION
122
- Tu dois accomplir le cahier des charges décrit dans <worker_brief> en utilisant l'Agent comme exécutant.
123
- À chaque échange, tu formules UNE question ou instruction précise pour l'Agent.
124
- Tu analyses sa réponse, accumules les informations utiles, et décides de ta prochaine action.
125
-
126
- # MÉTHODE
127
- 1. **Analyser** le brief et les réponses précédentes
128
- 2. **Identifier** la prochaine information nécessaire ou action à réaliser
129
- 3. **Formuler** une question/instruction claire et précise pour l'Agent
130
- 4. **Évaluer** la réponse : est-ce suffisant pour atteindre l'objectif ?
131
-
132
- # RÈGLES
133
- - Formule UNE seule question/instruction par échange
134
- - Sois précis et contextuel dans tes demandes
135
- - N'invente pas d'information base-toi uniquement sur les réponses de l'Agent
136
- - Si l'Agent ne peut pas répondre, reformule ou change d'approche
137
- - Accumule les faits clés de chaque réponse pour les réutiliser
243
+ Accomplis la mission spécifique dans <worker_brief> en pilotant l'Agent.
244
+ À chaque tour, tu envoies une demande à l'Agent, il exécute ses outils et te répond.
245
+ Ton livrable final est destiné à l'Utilisateur (voir FORMAT FINAL).
246
+
247
+ # BOUCLE DE DÉCISION (à chaque tour)
248
+ À chaque réponse reçue de l'Agent :
249
+ <context_gathering>
250
+ 1. ÉVALUER : La réponse est-elle sourcée (outil appelé) ou déduite ?
251
+ Les résultats couvrent-ils la demande de ce tour ?
252
+ 2. PLANIFIER : Quelle information précise manque encore pour l'objectif ? *(interne — ne jamais envoyer à l'Agent)*
253
+ Si rien ne manque → préparer [WORKER_COMPLETE].
254
+ 3. AGIR : Formuler UNE seule demande directe. Pas de préambule, pas de plan exposé, pas de numérotation.
255
+ </context_gathering>
256
+ - Réponse sans outil appelé = déduction demander de sourcer.
257
+ - Ne jamais reformuler une demande déjà posée si l'Agent a répondu.
258
+
259
+ # STYLE DE DISCUSSION (tours non-finaux — optimisation budget)
260
+ Les échanges Worker ↔ Agent doivent être : **factuels, condensés, neutres**.
261
+ - Streamline : va droit au but, pas de bavardage ni de formules de politesse superflues.
262
+ - Condense : une demande = les points clés uniquement, pas de contexte inutile.
263
+ - Neutralize : ton objectif est professionnel, sans opinion ni reformulation de ce que l'Agent vient de dire.
264
+ - **Ne jamais exposer ton raisonnement, ton plan ou ta numérotation d'étapes dans un message à l'Agent.**
265
+
266
+ <persona_result>
267
+ Style du deliverable final pour l'Utilisateur :
268
+ ${personaResult}
269
+ </persona_result>
270
+
271
+ # CONTRAINTES
272
+
273
+ **Exécution :**
274
+ - Chaque tour = UNE seule demande à l'Agent. N'anticipe JAMAIS sa réponse et ne génère pas de résultats fictifs.
275
+ - Tu n'as AUCUNE information au-delà du brief initial et des réponses de l'Agent.
276
+ - Si l'Agent mentionne un outil, **ne le cite pas** : résume uniquement les **résultats** (ex. "selon la recherche interne...").
277
+ - Si l'Agent demande une info indisponible, reformule avec une stratégie alternative (élargir le périmètre, chercher par catégorie, lister les options).
278
+ - Si l'Agent repose une question déjà fournie/indisponible, considère la piste épuisée et passe à une alternative ou clôture.
279
+ - Si l'Agent propose un next step ou une piste alternative, exploite-la avant de clôturer.
280
+ - Ne clôture en partiel que si AUCUNE piste concrète ne reste à explorer.
281
+ - N'utilise PAS \`[WORKER_COMPLETE]\` tant que le livrable n'est pas concret et directement utile à l'Utilisateur.
282
+
283
+ **Blocage (STOP OBLIGATOIRE) :**
284
+ Si l'Agent **ne peut plus avancer** car une information **indispensable** manque (et ne peut pas être obtenue autrement) :
285
+ → Termine avec \`[WORKER_COMPLETE]\` et un livrable de clôture expliquant l'information manquante, pourquoi elle bloque, et ce qu'il faudrait fournir pour reprendre.
286
+
287
+ **No-progress ou Not-found (STOP OBLIGATOIRE) :**
288
+ Clôturer avec \`[WORKER_COMPLETE]\` (livrable partiel) si :
289
+ - L'Agent répète une réponse quasi-identique à son tour précédent.
290
+ - L'Agent pose la même question de clarification qu'il a déjà posée.
291
+ - L'Agent retourne "rien trouvé" pour la 2e fois sur la même requête.
292
+ Dans ce cas : synthétiser ce qui a été obtenu + indiquer ce qui manque dans \`summary\`.
293
+
294
+ **Interdictions :**
295
+ - ❌ Inventer des données (montant, adresse, IBAN, référence, nom de prestataire)
296
+ - ❌ Conclure "rien trouvé" AVANT que l'Agent ait cherché
297
+ - ❌ Proposer une action fictive ou impossible
298
+
299
+ ${exports.lifecycleSectionWorkerPrompt}
300
+
301
+ ${exports.safetySectionWorkerPrompt}
302
+
303
+ # VÉRIFICATION AVANT CLÔTURE (STOP si faux)
304
+ <verification>
305
+ - deliverable non vide && non JSON seul || STOP → continuer
306
+ - summary décrit ce qui a été trouvé ET ce qui manque || STOP → enrichir
307
+ - confidence reflète honnêtement les lacunes (0.0-1.0) || STOP → corriger
308
+ - aucune donnée inventée dans deliverable || STOP → supprimer
309
+ </verification>
138
310
 
139
311
  # TRIGGERS DE SORTIE
140
- Quand tu estimes que l'objectif du brief est atteint, ou que tu as accumulé suffisamment d'information pour produire le livrable, termine avec :
312
+ Quand la mission est accomplie (ou qu'aucune piste concrète ne reste), termine avec :
141
313
  \`[WORKER_COMPLETE]\`
142
- Suivi immédiatement du JSON de résultat (voir format ci-dessous).
314
+ suivi immédiatement du JSON de résultat.
143
315
 
144
- Si tu n'as pas terminé, formule simplement ta prochaine question/instruction pour l'Agent.
316
+ Sinon, retourne uniquement ta prochaine demande à l'Agent (texte clair et actionnable, sans format imposé).
145
317
 
146
- # FORMAT DE SORTIE (uniquement quand terminé)
318
+ # FORMAT FINAL (uniquement quand terminé)
147
319
  \`\`\`
148
320
  [WORKER_COMPLETE]
149
- {"deliverable": "...", "summary": "...", "confidence": 0.95}
321
+ {"deliverable": "...", "summary": "...", "confidence": 0.0}
150
322
  \`\`\`
151
323
 
152
- :
153
- - \`deliverable\` : le résultat complet de la mission (texte, données, rapport...)
154
- - \`summary\` : résumé court de ce qui a été accompli
155
- - \`confidence\` : niveau de confiance (0.0 à 1.0) que l'objectif est atteint
324
+ - \`deliverable\`: le résultat complet de la mission (texte, données, rapport...) sans compression. Suit \`<persona_result>\`.
325
+ - \`summary\`: ce qui est fait + ce qui manque
326
+ - \`confidence\`: 0.0 -> 1.0 (estimation honnête)
156
327
 
157
- ---
158
-
159
- <worker_brief>
160
- ${brief}
161
- </worker_brief>
328
+ Si résultat partiel: l'indiquer explicitement dans \`summary\`.
329
+ Interdit comme sortie finale: "instruction envoyée", "à faire", ou livrable vide.
162
330
 
163
- **CRITICAL**: Si tu termines, le contenu après [WORKER_COMPLETE] doit être du JSON valide uniquement.
164
- ${instructionEx ? `\n\n${instructionEx}` : ''}`;
331
+ ${buildCriticalBlock('[WORKER_COMPLETE]')}`;
165
332
  }
@@ -10,7 +10,10 @@ export interface SimulatorConfig {
10
10
  start: string;
11
11
  verbose: boolean;
12
12
  mode?: 'simulator' | 'worker';
13
- instructionEx?: string;
13
+ positionDescription?: string;
14
+ personaResult?: string;
15
+ workerModel?: string;
16
+ agentModel?: string;
14
17
  mockCacheInitializer?: (sessionId: string) => Promise<void>;
15
18
  ragConfig?: RAGManagerConfig;
16
19
  }
@@ -43,6 +46,32 @@ export interface TestCaseInput {
43
46
  expectedTools?: Record<string, ToolConstraint>;
44
47
  onMessage?: (message: AgentMessage) => void;
45
48
  }
49
+ /**
50
+ * Événements lifecycle du Worker, poussés via sendFeedback(data: WorkerEvent)
51
+ * Discriminant : data.type permet au frontend de distinguer les steps Worker
52
+ */
53
+ export type WorkerEvent = {
54
+ type: 'worker_started';
55
+ jobId: string;
56
+ maxIterations: number;
57
+ description?: string;
58
+ } | {
59
+ type: 'worker_iteration';
60
+ iteration: number;
61
+ maxIterations: number;
62
+ query: string;
63
+ } | {
64
+ type: 'worker_completed';
65
+ success: boolean;
66
+ summary: string;
67
+ iterations: number;
68
+ duration: number;
69
+ } | {
70
+ type: 'worker_failed';
71
+ error: string;
72
+ iterations: number;
73
+ duration: number;
74
+ };
46
75
  /**
47
76
  * Input pour worker.runJob() — parallèle à TestCaseInput
48
77
  */
@@ -50,6 +79,8 @@ export interface WorkerJobInput {
50
79
  query: string;
51
80
  maxIterations?: number;
52
81
  agentContext: AgenticContext;
82
+ jobId?: string;
83
+ description?: string;
53
84
  onMessage?: (message: AgentMessage) => void;
54
85
  }
55
86
  /**
@@ -109,6 +140,7 @@ export interface ExecutionContext {
109
140
  simulatorAgent: AgentConfig;
110
141
  conversationHistory: string[];
111
142
  exchangeCount: number;
143
+ maxTurns?: number;
112
144
  lastExecution: ExecutionResult;
113
145
  }
114
146
  /** @deprecated Utiliser TestScenario avec l'API testCase() */
@@ -0,0 +1,128 @@
1
+ /**
2
+ * SubAgent — Injection et introspection des sub-agents
3
+ *
4
+ * Toutes les fonctions liées au pattern subAgent<Name> :
5
+ * - subAgentInjectTools() : génère les tools subAgent<Name> pour le parent
6
+ * - subAgentExtractCapabilities() : résumé des capacités (1ère ligne de chaque tool description)
7
+ * - SUBAGENT_TOOL_PARAMS : schéma paramètres par défaut (query, context, goal)
8
+ *
9
+ * Séparation parent-facing vs subAgent-facing :
10
+ * - Parent-facing : publicDescription + capabilities + params schema (vu par le parent LLM)
11
+ * - SubAgent-facing : instructions internes (graph, routage, contrat — défini côté serveur)
12
+ */
13
+ import { AgentConfig } from '../types';
14
+ /**
15
+ * Paramètres par défaut du tool subAgent<Name>.
16
+ * Descriptions génériques et courtes (best practice OpenAI).
17
+ * Les exemples domaine sont dans publicDescription de chaque subAgent.
18
+ */
19
+ export declare const SUBAGENT_TOOL_PARAMS: {
20
+ readonly query: {
21
+ readonly type: "string";
22
+ readonly description: "Question utilisateur ou intention normalisée.";
23
+ };
24
+ readonly context: {
25
+ readonly type: "string";
26
+ readonly description: "Entités pré-résolues par le parent (nom, entité, IDs). Vide si rien pré-résolu.";
27
+ };
28
+ readonly goal: {
29
+ readonly type: "string";
30
+ readonly description: "Livrable attendu — condition d'arrêt du sub-agent.";
31
+ };
32
+ };
33
+ export declare const SUBAGENT_REQUIRED_PARAMS: string[];
34
+ export type SubAgentKnowledgeFound = 'no' | 'yes' | 'partial' | 'conflict';
35
+ export type SubAgentOutput = {
36
+ status: 'ok' | 'empty' | 'error';
37
+ items: string[];
38
+ meta: {
39
+ resolved: string[];
40
+ notFound: string[];
41
+ knowledge_found: SubAgentKnowledgeFound;
42
+ };
43
+ control: {
44
+ can_retry: boolean;
45
+ };
46
+ };
47
+ export type SubAgentCallResult = SubAgentOutput & {
48
+ /** Texte principal envoyé comme function_call_output au LLM */
49
+ content: string;
50
+ /** Nom du tool pour addStep dans le stateGraph */
51
+ name: string;
52
+ /** Justification transmise à sendFeedback */
53
+ feedback?: string;
54
+ };
55
+ /**
56
+ * Schéma de sortie générique des sous-agents.
57
+ * Les `items` sont sérialisés en chaînes JSON pour rester compatibles avec
58
+ * le mode `json_schema strict` tout en conservant une structure métier libre.
59
+ */
60
+ export declare const SUBAGENT_OUTPUT_SCHEMA: {
61
+ readonly type: "object";
62
+ readonly additionalProperties: false;
63
+ readonly required: readonly ["status", "items", "meta", "control"];
64
+ readonly properties: {
65
+ readonly status: {
66
+ readonly type: "string";
67
+ readonly enum: readonly ["ok", "empty", "error"];
68
+ };
69
+ readonly items: {
70
+ readonly type: "array";
71
+ readonly items: {
72
+ readonly type: "string";
73
+ };
74
+ };
75
+ readonly meta: {
76
+ readonly type: "object";
77
+ readonly additionalProperties: false;
78
+ readonly required: readonly ["resolved", "notFound", "knowledge_found"];
79
+ readonly properties: {
80
+ readonly resolved: {
81
+ readonly type: "array";
82
+ readonly items: {
83
+ readonly type: "string";
84
+ };
85
+ };
86
+ readonly notFound: {
87
+ readonly type: "array";
88
+ readonly items: {
89
+ readonly type: "string";
90
+ };
91
+ };
92
+ readonly knowledge_found: {
93
+ readonly type: "string";
94
+ readonly enum: readonly ["no", "yes", "partial", "conflict"];
95
+ };
96
+ };
97
+ };
98
+ readonly control: {
99
+ readonly type: "object";
100
+ readonly additionalProperties: false;
101
+ readonly required: readonly ["can_retry"];
102
+ readonly properties: {
103
+ readonly can_retry: {
104
+ readonly type: "boolean";
105
+ };
106
+ };
107
+ };
108
+ };
109
+ };
110
+ export declare function parseSubAgentOutputContent(content: string): SubAgentOutput | null;
111
+ /**
112
+ * Extrait les capacités d'un agent depuis ses tools.
113
+ * Prend la 1ère ligne de chaque `function.description`.
114
+ */
115
+ export declare function subAgentExtractCapabilities(agents: AgentConfig[], name: string): string;
116
+ /**
117
+ * Compose la mission envoyée au sub-agent depuis les arguments du tool.
118
+ * Supporte les deux formats (ancien triplet et nouveau query/context/goal).
119
+ */
120
+ export declare function subAgentComposeMission(args: Record<string, any>): string;
121
+ /**
122
+ * Injecte un tool `subAgent<Name>` par sub-agent déclaré dans `agentDef.subAgents`.
123
+ *
124
+ * Le schéma des paramètres provient de :
125
+ * 1. `subAgent.subAgentToolParams` (override spécifique)
126
+ * 2. `SUBAGENT_TOOL_PARAMS` (défaut: query, context, goal)
127
+ */
128
+ export declare function subAgentInjectTools(agentDefs: AgentConfig[]): AgentConfig[];