boondmanager-mcp-server 1.5.3 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -120,7 +120,9 @@ Pour les dictionnaires hors de cette liste curee, l'outil `boond_application_dic
120
120
 
121
121
  ## Prompts pre-orchestres
122
122
 
123
- En plus des outils, le serveur expose des **prompts MCP** (templates pre-cables) qui orchestrent les bons appels d'outils dans le bon ordre pour les workflows recurrents. Visibles dans les clients qui supportent les prompts (slash command ou menu).
123
+ En plus des outils, le serveur expose des **prompts MCP** (templates pre-cables) qui orchestrent les bons appels d'outils dans le bon ordre pour les workflows recurrents. Visibles dans les clients qui supportent les prompts (Claude Desktop, **Cowork**, Claude Code, MCP Inspector...) sous forme de slash-commands ou de menu.
124
+
125
+ ### Workflows transverses
124
126
 
125
127
  | Prompt | Usage |
126
128
  |--------|-------|
@@ -131,6 +133,62 @@ En plus des outils, le serveur expose des **prompts MCP** (templates pre-cables)
131
133
  | `fiche_consultant` | Vue 360 d'une ressource : info + technique + positionnements + absences + CRA recents. |
132
134
  | `recap_hebdo` | Recap hebdomadaire : pipeline qui a bouge, equipe absente, projets actifs, actions a mener. |
133
135
 
136
+ ### Ressources, competences & CV
137
+
138
+ | Prompt | Usage |
139
+ |--------|-------|
140
+ | `staffing_disponible` | Consultants internes disponibles sur une fenetre donnee (filtre optionnel par competences libres et perimetre), tries par dispo croissante avec top 3 prioritaires. |
141
+ | `fin_de_mission` | Anticipation des fins de mission sous N jours (defaut 60). Marque en **urgent** les fins <= 15j sans relais identifie. |
142
+ | `cartographie_competences` | Cartographie des competences d'un perimetre (equipe / agence) : top N, competences rares (bus-factor), saturees, manquantes vs opportunites ouvertes. |
143
+ | `cvs_a_mettre_a_jour` | Audit fraicheur des CV / dossiers techniques (seuil d'obsolescence configurable). Priorise les ressources bientot sur le marche. |
144
+ | `recherche_profil_competences` | Recherche multi-source (ressources internes + candidats) par mix de competences libres, sans opportunite requise. Classe par adequation /10. |
145
+
146
+ ### Comment invoquer un prompt
147
+
148
+ Les prompts MCP sont des **modeles de message utilisateur** : tu les invoques toi-meme, le LLM execute ensuite le runbook qu'ils contiennent. Aucun filtre BoondManager a connaitre — tout est embarque cote serveur.
149
+
150
+ **Claude Desktop / Cowork / MCP Inspector** : tape `/` dans la barre de saisie, choisis le prompt dans la liste, remplis les arguments dans le formulaire qui s'affiche, valide.
151
+
152
+ **Claude Code** : pareil, `/` puis selection ; les arguments sont demandes inline.
153
+
154
+ **Fallback (clients sans UI dediee aux prompts)** : cite le prompt par son nom dans une demande libre, le client va recuperer la definition via le protocole MCP. Exemple : *"lance le runbook `staffing_disponible` entre le 1er juin et le 1er septembre 2026, competences Java Spring AWS"*.
155
+
156
+ Exemples d'invocation des prompts ressources / competences / CV :
157
+
158
+ ```
159
+ /staffing_disponible
160
+ start_date = 2026-06-01
161
+ end_date = 2026-09-01
162
+ competences = Java Spring AWS Kubernetes
163
+ manager_id = (vide -> mon equipe)
164
+ ```
165
+
166
+ ```
167
+ /fin_de_mission
168
+ horizon_jours = 30
169
+ ```
170
+
171
+ ```
172
+ /cartographie_competences
173
+ agency_id = 7
174
+ top_n = 15
175
+ ```
176
+
177
+ ```
178
+ /cvs_a_mettre_a_jour
179
+ seuil_mois = 6
180
+ ```
181
+
182
+ ```
183
+ /recherche_profil_competences
184
+ competences = .NET Azure DevOps
185
+ experience_min = 5 ans
186
+ dispo_avant = 2026-07-15
187
+ inclure_candidats = oui
188
+ ```
189
+
190
+ > Apres modification de la config Claude (`claude_desktop_config.json` etc.), **redemarrer le client** : la liste des prompts MCP n'est pas hot-reloadee.
191
+
134
192
  ## Prerequis
135
193
 
136
194
  - Node.js >= 20
@@ -298,6 +356,17 @@ Ou utiliser le transport HTTP (voir section [Transports](#transports)) pour un d
298
356
 
299
357
  ## Configuration
300
358
 
359
+ ### Logs
360
+
361
+ Le serveur utilise [pino](https://getpino.io/) pour des logs structures JSON (agrégateurs, observabilité).
362
+
363
+ | Variable | Défaut | Description |
364
+ |----------|--------|-------------|
365
+ | `LOG_LEVEL` | `info` | Niveau de log : `trace`, `debug`, `info`, `warn`, `error`, `fatal` |
366
+ | `LOG_FORMAT` | (auto) | `json` pour JSON pur, sinon pino-pretty en dev |
367
+
368
+ En production (`NODE_ENV=production`), les logs sont en JSON par défaut. En dev, le format pretty (colorisé) est actif sauf si `LOG_FORMAT=json`. Chaque requête HTTP reçoit un `corrId` (8 hex) pour tracer la requête dans les logs.
369
+
301
370
  ### Authentification
302
371
 
303
372
  **Option 1 : Token API JWT (recommande)**
@@ -319,6 +388,39 @@ export BOOND_BASE_URL="https://votre-instance.boondmanager.com/api"
319
388
 
320
389
  Par defaut, l'URL est `https://ui.boondmanager.com/api`.
321
390
 
391
+ ### Delai d'expiration HTTP
392
+
393
+ Chaque requete vers l'API BoondManager expire au bout de **30 secondes** par defaut. Pour les tenants lents ou des rapports volumineux, augmenter via :
394
+
395
+ ```bash
396
+ export BOOND_HTTP_TIMEOUT_MS=60000 # 60 s
397
+ ```
398
+
399
+ Si une requete depasse le delai, le serveur renvoie une erreur explicite mentionnant `BOOND_HTTP_TIMEOUT_MS` plutot que de rester bloque indefiniment.
400
+
401
+ ### Tentatives en cas d'echec transitoire
402
+
403
+ Le client HTTP retente automatiquement les erreurs **transitoires** avec un backoff exponentiel + jitter :
404
+
405
+ - **GET** : retry sur `5xx`, `429`, erreurs reseau (`ECONNRESET`, etc.) et timeouts (GET etant idempotent).
406
+ - **POST / PUT / PATCH / DELETE** : retry **uniquement sur `429`** afin d'eviter de dupliquer une ecriture cote serveur. Les `5xx` et erreurs reseau remontent immediatement.
407
+ - L'en-tete `Retry-After` (en secondes ou en HTTP-date) est honore et plafonne a `BOOND_HTTP_RETRY_MAX_MS`.
408
+
409
+ | Variable | Defaut | Description |
410
+ |----------|--------|-------------|
411
+ | `BOOND_HTTP_MAX_RETRIES` | `2` | Nombre maximal de tentatives supplementaires (3 essais au total). `0` desactive entierement les retries. |
412
+ | `BOOND_HTTP_RETRY_BASE_MS` | `200` | Delai de base utilise pour le backoff exponentiel (`base * 2^attempt`, avec jitter). |
413
+ | `BOOND_HTTP_RETRY_MAX_MS` | `5000` | Plafond du delai entre deux tentatives. |
414
+
415
+ ### Limitation de debit (rate limiting)
416
+
417
+ Pour eviter qu'une boucle d'outils emballee n'inonde l'API (et n'enchaine les `429`), le client applique un **token bucket** local. Defauts : **10 req/s** soutenu, **rafale 20** — invisible en usage interactif normal. Les retentatives consomment aussi un jeton.
418
+
419
+ | Variable | Defaut | Description |
420
+ |----------|--------|-------------|
421
+ | `BOOND_HTTP_RATE_LIMIT_RPS` | `10` | Debit soutenu (requetes/seconde). `0` desactive completement. |
422
+ | `BOOND_HTTP_RATE_LIMIT_BURST` | `20` | Capacite du bucket = taille maximale de rafale immediate. |
423
+
322
424
  ## Transports
323
425
 
324
426
  Le serveur supporte deux transports MCP, selectionnables via la variable d'environnement `MCP_TRANSPORT`.
@@ -357,6 +459,8 @@ npx boondmanager-mcp-server
357
459
  | `MCP_HTTP_STATEFUL` | `false` | `true` pour activer le mode stateful (session `Mcp-Session-Id`) |
358
460
  | `MCP_HTTP_BEARER_TOKEN` | _(vide)_ | Si defini, le serveur exige `Authorization: Bearer <token>` |
359
461
  | `MCP_HTTP_JSON_RESPONSE` | `false` | `true` pour forcer des reponses JSON (sans SSE) |
462
+ | `MCP_HTTP_SESSION_TTL_MS` | `1800000` (30 min) | En mode stateful, duree d'inactivite au-dela de laquelle une session est fermee. |
463
+ | `MCP_HTTP_SESSION_SWEEP_INTERVAL_MS` | `300000` (5 min) | Frequence de balayage des sessions inactives. |
360
464
 
361
465
  **Stateless (defaut)** : chaque requete HTTP POST est independante, idealement adapte a un gateway qui multiplexe plusieurs serveurs MCP. Aucune session n'est conservee cote serveur.
362
466
 
@@ -2,6 +2,13 @@ export declare const DEFAULT_BASE_URL = "https://ui.boondmanager.com/api";
2
2
  export declare const CHARACTER_LIMIT = 50000;
3
3
  export declare const DEFAULT_PAGE_SIZE = 30;
4
4
  export declare const MAX_PAGE_SIZE = 500;
5
+ export declare const MAX_SEARCH_PAGE = 100;
6
+ export declare const DEFAULT_HTTP_TIMEOUT_MS = 30000;
7
+ export declare const DEFAULT_HTTP_MAX_RETRIES = 2;
8
+ export declare const DEFAULT_HTTP_RETRY_BASE_MS = 200;
9
+ export declare const DEFAULT_HTTP_RETRY_MAX_MS = 5000;
10
+ export declare const DEFAULT_HTTP_RATE_LIMIT_RPS = 10;
11
+ export declare const DEFAULT_HTTP_RATE_LIMIT_BURST = 20;
5
12
  export declare const API_PATHS: {
6
13
  readonly candidates: "/candidates";
7
14
  readonly resources: "/resources";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,oCAAoC,CAAC;AAClE,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,aAAa,MAAM,CAAC;AAGjC,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CZ,CAAC;AAGX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,oCAAoC,CAAC;AAClE,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,aAAa,MAAM,CAAC;AAKjC,eAAO,MAAM,eAAe,MAAM,CAAC;AAKnC,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAK9C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAM/C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAGhD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CZ,CAAC;AAGX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC"}
package/dist/constants.js CHANGED
@@ -3,6 +3,26 @@ export const DEFAULT_BASE_URL = "https://ui.boondmanager.com/api";
3
3
  export const CHARACTER_LIMIT = 50000;
4
4
  export const DEFAULT_PAGE_SIZE = 30;
5
5
  export const MAX_PAGE_SIZE = 500;
6
+ // Cap the page number on search tools (openWorldHint) to prevent runaway
7
+ // iterations. At 500 results/page, page 100 = 50k records — well beyond
8
+ // typical interactive exploration. The model can refine filters instead.
9
+ export const MAX_SEARCH_PAGE = 100;
10
+ // HTTP client defaults
11
+ // Timeout applied to every BoondManager API request. Overridable via
12
+ // BOOND_HTTP_TIMEOUT_MS to handle slow tenants or long reporting queries.
13
+ export const DEFAULT_HTTP_TIMEOUT_MS = 30_000;
14
+ // Retry policy for transient failures. Override via BOOND_HTTP_MAX_RETRIES,
15
+ // BOOND_HTTP_RETRY_BASE_MS, BOOND_HTTP_RETRY_MAX_MS. Set MAX_RETRIES to 0 to
16
+ // disable retries entirely.
17
+ export const DEFAULT_HTTP_MAX_RETRIES = 2;
18
+ export const DEFAULT_HTTP_RETRY_BASE_MS = 200;
19
+ export const DEFAULT_HTTP_RETRY_MAX_MS = 5_000;
20
+ // Client-side rate limit (token bucket). Modest defaults: invisible during
21
+ // interactive use, but cap pathological loops before BoondManager 429s us.
22
+ // Override via BOOND_HTTP_RATE_LIMIT_RPS / BOOND_HTTP_RATE_LIMIT_BURST.
23
+ // Set RPS to 0 to disable rate limiting entirely.
24
+ export const DEFAULT_HTTP_RATE_LIMIT_RPS = 10;
25
+ export const DEFAULT_HTTP_RATE_LIMIT_BURST = 20;
6
26
  // API paths
7
27
  export const API_PATHS = {
8
28
  candidates: "/candidates",
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AAEjC,YAAY;AACZ,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,aAAa;IACzB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,YAAY;IACvB,aAAa,EAAE,gBAAgB;IAC/B,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,aAAa;IACzB,oBAAoB,EAAE,wBAAwB;IAC9C,QAAQ,EAAE,WAAW;IACrB,eAAe,EAAE,mBAAmB;IACpC,QAAQ,EAAE,WAAW;IACrB,eAAe,EAAE,mBAAmB;IACpC,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,aAAa;IACzB,WAAW,EAAE,cAAc;IAC3B,YAAY,EAAE,gBAAgB;IAC9B,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,gBAAgB,EAAE,oBAAoB;IACtC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,aAAa,EAAE,iBAAiB;IAChC,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,OAAO;IACb,aAAa,EAAE,gBAAgB;IAC/B,OAAO,EAAE,UAAU;IACnB,SAAS,EAAE,YAAY;IACvB,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,cAAc;IAC3B,KAAK,EAAE,QAAQ;IACf,gBAAgB,EAAE,oBAAoB;IACtC,kBAAkB,EAAE,sBAAsB;IAC1C,iBAAiB,EAAE,qBAAqB;IACxC,kBAAkB,EAAE,sBAAsB;IAC1C,kBAAkB,EAAE,sBAAsB;IAC1C,wBAAwB,EAAE,6BAA6B;CAC/C,CAAC;AAEX,kEAAkE;AAClE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,UAAU,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,CAAU;IACnG,SAAS,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,CAAU;IACrL,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAU;IAChG,SAAS,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,CAAU;IAC/I,aAAa,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,CAAU;IAC5F,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAU;IAC3H,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,gBAAgB,CAAU;IAC/D,MAAM,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAU;CAC/C,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8NzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAY1D;AAED,wFAAwF;AACxF,eAAO,MAAM,kBAAkB;;;;;GAK5B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+fzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAY1D;AAED,wFAAwF;AACxF,eAAO,MAAM,kBAAkB;;;;;GAK5B,CAAC"}
@@ -15,19 +15,23 @@ import { z } from "zod";
15
15
  * follow-up questions.
16
16
  */
17
17
  const userMessage = (text) => ({
18
- messages: [
19
- { role: "user", content: { type: "text", text } },
20
- ],
18
+ messages: [{ role: "user", content: { type: "text", text } }],
21
19
  });
22
20
  const PROMPTS = [
23
21
  {
24
22
  name: "synthese_equipe",
25
23
  title: "Synthèse d'une équipe",
26
- description: "Produit un état d'équipe : qui est sur quoi, qui est absent, qui est disponible. "
27
- + "Si manager_id est omis, utilise l'utilisateur courant comme manager.",
24
+ description: "Produit un état d'équipe : qui est sur quoi, qui est absent, qui est disponible. " +
25
+ "Si manager_id est omis, utilise l'utilisateur courant comme manager.",
28
26
  argsSchema: {
29
- manager_id: z.string().optional().describe("ID du manager (ressource Boond). Si absent, l'outil `boond_application_current_user` doit être appelé pour le récupérer."),
30
- periode: z.string().optional().describe("Période d'analyse libre (ex: 'cette semaine', 'avril 2026'). Défaut: mois en cours."),
27
+ manager_id: z
28
+ .string()
29
+ .optional()
30
+ .describe("ID du manager (ressource Boond). Si absent, l'outil `boond_application_current_user` doit être appelé pour le récupérer."),
31
+ periode: z
32
+ .string()
33
+ .optional()
34
+ .describe("Période d'analyse libre (ex: 'cette semaine', 'avril 2026'). Défaut: mois en cours."),
31
35
  },
32
36
  build: ({ manager_id, periode }) => {
33
37
  const periodeText = periode || "le mois en cours";
@@ -53,12 +57,15 @@ const PROMPTS = [
53
57
  {
54
58
  name: "pipeline_commercial",
55
59
  title: "Pipeline commercial sur une période",
56
- description: "Analyse les opportunités commerciales avec closing prévu dans la période donnée : "
57
- + "répartition par état, CA pondéré, top opportunités.",
60
+ description: "Analyse les opportunités commerciales avec closing prévu dans la période donnée : " +
61
+ "répartition par état, CA pondéré, top opportunités.",
58
62
  argsSchema: {
59
63
  date_debut: z.string().describe("Début de période (YYYY-MM-DD)."),
60
64
  date_fin: z.string().describe("Fin de période (YYYY-MM-DD)."),
61
- manager_id: z.string().optional().describe("ID du commercial. Si absent, scope = équipe de l'utilisateur courant via `perimeterDynamic: ['data']`."),
65
+ manager_id: z
66
+ .string()
67
+ .optional()
68
+ .describe("ID du commercial. Si absent, scope = équipe de l'utilisateur courant via `perimeterDynamic: ['data']`."),
62
69
  },
63
70
  build: ({ date_debut, date_fin, manager_id }) => {
64
71
  const scopeFilter = manager_id
@@ -88,8 +95,8 @@ const PROMPTS = [
88
95
  {
89
96
  name: "factures_a_relancer",
90
97
  title: "Factures impayées à relancer",
91
- description: "Liste les factures impayées avec date d'échéance dépassée, regroupées par société. "
92
- + "Optionnellement filtrable sur une société spécifique.",
98
+ description: "Liste les factures impayées avec date d'échéance dépassée, regroupées par société. " +
99
+ "Optionnellement filtrable sur une société spécifique.",
93
100
  argsSchema: {
94
101
  society_id: z.string().optional().describe("ID d'une société pour cibler la relance."),
95
102
  },
@@ -99,7 +106,9 @@ const PROMPTS = [
99
106
  "",
100
107
  "Étapes :",
101
108
  "1. Appeler `boond_invoices_search` :",
102
- society_id ? ` - \`companyId: "${society_id}"\`` : " - sans filtre société (toutes les factures du périmètre courant)",
109
+ society_id
110
+ ? ` - \`companyId: "${society_id}"\``
111
+ : " - sans filtre société (toutes les factures du périmètre courant)",
103
112
  " - `pageSize: 100`",
104
113
  "2. Récupérer le dictionnaire `setting.state.invoice` via `boond_application_dictionary` pour identifier les états « payée » / « partiellement payée » / etc.",
105
114
  "3. Filtrer côté agent : ne conserver que les factures dont l'état n'est PAS « payée » ET dont la `dueDate` est strictement antérieure à aujourd'hui.",
@@ -124,11 +133,11 @@ const PROMPTS = [
124
133
  `1. Récupérer le détail de l'opportunité : \`boond_opportunities_get(id="${opportunity_id}")\` puis l'onglet \`information\` pour les attributs détaillés.`,
125
134
  "2. Extraire les critères : `tools`, `expertiseAreas`, `activityAreas`, `places` (mobilité), `durations`, `startDate`/`endDate`.",
126
135
  "3. Appeler `boond_candidates_search` avec :",
127
- " - les `tools` extraits (logique OU par défaut ; si l'opportunité est très exigeante, repasser avec `[\"#AND#\", ...]` pour exiger toutes les compétences)",
136
+ ' - les `tools` extraits (logique OU par défaut ; si l\'opportunité est très exigeante, repasser avec `["#AND#", ...]` pour exiger toutes les compétences)',
128
137
  " - `expertiseAreas` correspondants",
129
138
  " - `mobilityAreas` matchant le lieu",
130
139
  " - `candidateStates` actifs uniquement (consulter `setting.state.candidate` via `boond_application_dictionary`)",
131
- " - `period: \"available\"` + `startDate`/`endDate` calés sur la mission, pour ne garder que les candidats disponibles",
140
+ ' - `period: "available"` + `startDate`/`endDate` calés sur la mission, pour ne garder que les candidats disponibles',
132
141
  " - `pageSize: 50`",
133
142
  "4. Pour les top 20 candidats retournés, récupérer `boond_candidates_technical_data` pour vérifier l'adéquation fine.",
134
143
  "5. Restituer un classement : nom | titre | dispo | note d'adéquation (sur 10) avec justification 1 ligne.",
@@ -159,12 +168,269 @@ const PROMPTS = [
159
168
  ].join("\n");
160
169
  },
161
170
  },
171
+ {
172
+ name: "staffing_disponible",
173
+ title: "Consultants disponibles pour un staffing",
174
+ description: "Identifie les ressources internes disponibles pour un staffing sur une fenêtre donnée, " +
175
+ "avec filtres optionnels par compétences (texte libre) et périmètre. " +
176
+ "Trie par date de disponibilité croissante et propose les profils prioritaires à activer.",
177
+ argsSchema: {
178
+ start_date: z.string().describe("Début de fenêtre de staffing (YYYY-MM-DD)."),
179
+ end_date: z.string().describe("Fin de fenêtre de staffing (YYYY-MM-DD)."),
180
+ competences: z
181
+ .string()
182
+ .optional()
183
+ .describe("Compétences recherchées en texte libre (ex: 'Java Spring AWS'). Le modèle les mappera vers `tools` via le dictionnaire."),
184
+ manager_id: z
185
+ .string()
186
+ .optional()
187
+ .describe("ID d'un manager pour restreindre à son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
188
+ },
189
+ build: ({ start_date, end_date, competences, manager_id }) => {
190
+ const scope = manager_id
191
+ ? `\`perimeterManagers: [${manager_id}]\``
192
+ : "`perimeterDynamic: ['managers']` (mon équipe / mes N-1)";
193
+ const skillsStep = competences
194
+ ? `1. Mapper les compétences « ${competences} » vers leurs IDs : \`boond_application_dictionary\` avec \`setting.tool\` (et éventuellement \`setting.expertiseArea\`).`
195
+ : "1. Pas de filtre compétences fourni — passer directement à l'étape 2.";
196
+ const toolsLine = competences
197
+ ? " - `tools: [...]` issus de l'étape 1 (logique OU ; pour exiger toutes les compétences, mettre `'#AND#'` en 1er élément)"
198
+ : "";
199
+ return [
200
+ `Identifie les ressources internes disponibles pour un staffing entre ${start_date} et ${end_date}.`,
201
+ "",
202
+ `Périmètre : ${scope}.`,
203
+ "",
204
+ "Étapes :",
205
+ skillsStep,
206
+ "2. Appeler `boond_resources_search` avec :",
207
+ ` - \`period: "available"\`, \`startDate: "${start_date}"\`, \`endDate: "${end_date}"\``,
208
+ ` - ${scope}`,
209
+ toolsLine,
210
+ " - `resourceStates: [...]` filtrés sur les états « actif » uniquement (consulter `setting.state.resource` via `boond_application_dictionary`)",
211
+ ' - `pageSize: 50`, `sort: "availability"`, `order: "asc"`',
212
+ "3. Pour les 15 premières ressources retournées (en parallèle) :",
213
+ " - `boond_resources_positionings` — vérifier qu'aucun positionnement actif ne couvre déjà la fenêtre",
214
+ " - `boond_resources_technical_data` — confirmer compétences clés et niveau d'expérience",
215
+ "4. Restituer un tableau trié par date de disponibilité : ressource | titre | dispo le | compétences matchées | mobilité | manager | TJM cible.",
216
+ "5. Conclure par les 3 profils prioritaires à activer + un signal si la pénurie est forte (< 5 résultats — suggérer d'élargir la fenêtre ou les compétences).",
217
+ ]
218
+ .filter(Boolean)
219
+ .join("\n");
220
+ },
221
+ },
222
+ {
223
+ name: "fin_de_mission",
224
+ title: "Anticipation des fins de mission",
225
+ description: "Liste les ressources dont la mission se termine dans les prochains jours, " +
226
+ "pour anticiper le repositionnement. Met en évidence les fins imminentes sans relais identifié.",
227
+ argsSchema: {
228
+ horizon_jours: z
229
+ .string()
230
+ .optional()
231
+ .describe("Nombre de jours à anticiper (défaut: 60). Ex: '30' pour ne voir que les fins très proches."),
232
+ manager_id: z
233
+ .string()
234
+ .optional()
235
+ .describe("ID d'un manager pour restreindre à son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
236
+ },
237
+ build: ({ horizon_jours, manager_id }) => {
238
+ const horizon = horizon_jours || "60";
239
+ const scope = manager_id ? `\`perimeterManagers: [${manager_id}]\`` : "`perimeterDynamic: ['managers']`";
240
+ return [
241
+ `Liste les ressources dont la mission se termine dans les ${horizon} prochains jours.`,
242
+ "",
243
+ `Périmètre : ${scope}.`,
244
+ "",
245
+ "Étapes :",
246
+ `1. Calculer la fenêtre : aujourd'hui (D) → D + ${horizon} jours (D+H). Conserver ces deux dates au format YYYY-MM-DD.`,
247
+ "2. Appeler `boond_resources_search` avec :",
248
+ ' - `period: "available"`, `startDate: D`, `endDate: D+H`',
249
+ ` - ${scope}`,
250
+ " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource`)",
251
+ ' - `pageSize: 100`, `sort: "availability"`, `order: "asc"`',
252
+ " → Cela retourne les ressources qui (re)deviennent disponibles dans la fenêtre — proxy direct pour « fin de mission ».",
253
+ "3. Pour chaque ressource, en parallèle :",
254
+ " - `boond_resources_positionings` — récupérer le positionnement courant (projet + société + date de fin) et détecter d'éventuels positionnements de relais déjà actés",
255
+ " - `boond_resources_projects` — historique projet récent pour contexte",
256
+ "4. Restituer un tableau trié par date de fin croissante : ressource | projet courant | société cliente | date de fin | jours restants | manager | relais déjà identifié (oui/non).",
257
+ "5. Mettre en évidence en haut du tableau :",
258
+ " - **Urgent** : fin dans <= 15 jours sans relais identifié",
259
+ " - **À surveiller** : fin entre 15 et 30 jours sans relais",
260
+ "6. Conclure par 3-5 actions concrètes : relances commerciales, repositionnements internes, etc.",
261
+ ].join("\n");
262
+ },
263
+ },
264
+ {
265
+ name: "cartographie_competences",
266
+ title: "Cartographie des compétences d'un périmètre",
267
+ description: "Produit une cartographie des compétences techniques d'un périmètre (équipe, agence, …) : " +
268
+ "top compétences, compétences rares (risque bus-factor) et compétences manquantes vs opportunités ouvertes.",
269
+ argsSchema: {
270
+ manager_id: z
271
+ .string()
272
+ .optional()
273
+ .describe("ID d'un manager pour cibler son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
274
+ agency_id: z
275
+ .string()
276
+ .optional()
277
+ .describe("ID d'agence pour cartographier toute une agence (alternatif à `manager_id`)."),
278
+ top_n: z.string().optional().describe("Nombre de compétences à mettre en avant dans le top (défaut: 20)."),
279
+ },
280
+ build: ({ manager_id, agency_id, top_n }) => {
281
+ const top = top_n || "20";
282
+ const scope = agency_id
283
+ ? `\`perimeterAgencies: [${agency_id}]\``
284
+ : manager_id
285
+ ? `\`perimeterManagers: [${manager_id}]\``
286
+ : "`perimeterDynamic: ['managers']`";
287
+ return [
288
+ "Cartographie les compétences techniques du périmètre.",
289
+ "",
290
+ `Périmètre : ${scope}.`,
291
+ "",
292
+ "Étapes :",
293
+ "1. Lister les ressources actives via `boond_resources_search` :",
294
+ ` - ${scope}`,
295
+ " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource` via `boond_application_dictionary`)",
296
+ " - `pageSize: 100` (paginer si > 100)",
297
+ "2. Récupérer le dictionnaire `setting.tool` (et `setting.expertiseArea`, `setting.languageSpoken`) via `boond_application_dictionary` pour traduire les IDs en libellés.",
298
+ "3. Pour chaque ressource (par batchs parallèles), appeler `boond_resources_technical_data` et extraire `tools`, `expertiseAreas`, `languages`, `experiences`.",
299
+ "4. Agréger côté agent :",
300
+ ` - **Top ${top}** : compétences les plus représentées (nb de ressources)`,
301
+ " - **Rares** : compétences possédées par 1 ou 2 personnes (risque bus-factor)",
302
+ " - **Saturées** : compétences possédées par > 70% de l'équipe (potentielle banalisation)",
303
+ "5. Croiser avec les opportunités ouvertes via `boond_opportunities_search` (`opportunityStates` actifs, `perimeterDynamic`/`perimeterAgencies` cohérents) et leurs `tools` :",
304
+ " - **Manquantes** : compétences demandées sur les opportunités mais absentes du périmètre — alerte recrutement / formation",
305
+ "6. Restituer en 4 sections :",
306
+ ` - Top ${top} compétences (tableau : compétence | nb ressources | exemples de noms)`,
307
+ " - Compétences rares (avec porteurs nominatifs et nombre d'opportunités demandant cette compétence)",
308
+ " - Compétences saturées",
309
+ " - Compétences manquantes vs opportunités (recommandations recrutement / formation)",
310
+ ].join("\n");
311
+ },
312
+ },
313
+ {
314
+ name: "cvs_a_mettre_a_jour",
315
+ title: "Audit fraîcheur des CV / dossiers techniques",
316
+ description: "Identifie les ressources dont le CV ou le dossier technique est obsolète, incomplet, ou manquant. " +
317
+ "Priorise celles bientôt sur le marché (en intercontrat ou disponibles à court terme).",
318
+ argsSchema: {
319
+ seuil_mois: z
320
+ .string()
321
+ .optional()
322
+ .describe("Un dossier technique non touché depuis plus de N mois est considéré obsolète (défaut: 12)."),
323
+ manager_id: z
324
+ .string()
325
+ .optional()
326
+ .describe("ID d'un manager pour cibler son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
327
+ },
328
+ build: ({ seuil_mois, manager_id }) => {
329
+ const seuil = seuil_mois || "12";
330
+ const scope = manager_id ? `\`perimeterManagers: [${manager_id}]\`` : "`perimeterDynamic: ['managers']`";
331
+ return [
332
+ `Identifie les CV / dossiers techniques à rafraîchir (seuil d'obsolescence : ${seuil} mois).`,
333
+ "",
334
+ `Périmètre : ${scope}.`,
335
+ "",
336
+ "Étapes :",
337
+ "1. Lister les ressources actives via `boond_resources_search` :",
338
+ ` - ${scope}`,
339
+ " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource`)",
340
+ " - `pageSize: 100` (paginer si nécessaire)",
341
+ "2. Pour chaque ressource (par batchs parallèles), appeler `boond_resources_technical_data` et lire :",
342
+ " - `updateDate` du dossier technique",
343
+ " - présence et longueur du CV (`resume`)",
344
+ " - nombre de compétences déclarées (`tools`)",
345
+ " - nombre d'expériences renseignées",
346
+ "3. Filtrer côté agent : ne conserver que les ressources dont au moins UN critère est défaillant —",
347
+ ` - \`updateDate\` antérieure de plus de ${seuil} mois, OU`,
348
+ " - CV manquant / vide, OU",
349
+ " - moins de 3 compétences (`tools`) déclarées, OU",
350
+ " - aucune expérience renseignée.",
351
+ '4. Croiser avec la disponibilité pour prioriser : `boond_resources_search` avec `period: "available"` + fenêtre des 3 prochains mois, et marquer les ressources concernées comme **prioritaires**.',
352
+ "5. Restituer un tableau de relance trié par priorité décroissante : ressource | manager | dernière maj DT | jours d'ancienneté | trous (CV manquant / 0 compétences / 0 expérience) | bientôt dispo (oui/non).",
353
+ "6. Conclure par les 5 ressources à relancer en premier (avec template de message court à envoyer au manager).",
354
+ ].join("\n");
355
+ },
356
+ },
357
+ {
358
+ name: "recherche_profil_competences",
359
+ title: "Recherche multi-source d'un profil par compétences",
360
+ description: "Recherche un profil correspondant à un mix de compétences libres, en croisant ressources internes " +
361
+ "et candidats. Sortie classée par adéquation. Utile en amont d'un staffing ou d'une opportunité non encore qualifiée.",
362
+ argsSchema: {
363
+ competences: z
364
+ .string()
365
+ .describe("Compétences recherchées en texte libre (ex: 'Java Spring AWS Kubernetes', '.NET Azure DevOps')."),
366
+ experience_min: z
367
+ .string()
368
+ .optional()
369
+ .describe("Niveau d'expérience minimum en texte libre (ex: '5 ans', 'senior'). Le modèle le mappera vers `experiences` via le dictionnaire."),
370
+ dispo_avant: z
371
+ .string()
372
+ .optional()
373
+ .describe("Disponibilité requise au plus tard à cette date (YYYY-MM-DD). Si fourni, applique `period: 'available'` + `endDate`."),
374
+ inclure_candidats: z
375
+ .string()
376
+ .optional()
377
+ .describe("'oui' (défaut) pour inclure aussi les candidats actifs ; 'non' pour ne chercher que dans les ressources internes."),
378
+ manager_id: z
379
+ .string()
380
+ .optional()
381
+ .describe("ID d'un manager pour restreindre le scope ressources internes. Sinon scope ouvert (toute l'organisation accessible)."),
382
+ },
383
+ build: ({ competences, experience_min, dispo_avant, inclure_candidats, manager_id }) => {
384
+ const includeCandidates = (inclure_candidats || "oui").toLowerCase() !== "non";
385
+ const scope = manager_id
386
+ ? `\`perimeterManagers: [${manager_id}]\``
387
+ : "(pas de filtre périmètre — recherche sur l'ensemble accessible à l'utilisateur)";
388
+ const dispoLine = dispo_avant
389
+ ? ` - \`period: "available"\`, \`endDate: "${dispo_avant}"\` (disponible au plus tard à cette date)`
390
+ : "";
391
+ const expStep = experience_min
392
+ ? `2bis. Mapper l'expérience minimum « ${experience_min} » vers les IDs \`experiences\` via \`boond_application_dictionary\` avec \`setting.experience\`.`
393
+ : "";
394
+ return [
395
+ `Recherche un profil correspondant aux compétences : « ${competences} ».`,
396
+ "",
397
+ `Scope ressources internes : ${scope}.`,
398
+ `Inclure les candidats actifs : ${includeCandidates ? "oui" : "non"}.`,
399
+ "",
400
+ "Étapes :",
401
+ "1. Mapper les compétences libres vers leurs IDs :",
402
+ " - `boond_application_dictionary` avec `setting.tool` pour les outils / technos",
403
+ " - `boond_application_dictionary` avec `setting.expertiseArea` pour les domaines d'expertise",
404
+ "2. Identifier les compétences indispensables (toutes requises) vs souhaitables, à partir du libellé du besoin.",
405
+ expStep,
406
+ "3. Recherche dans les ressources internes via `boond_resources_search` :",
407
+ ' - `tools: [...]` (si plusieurs compétences indispensables, préfixer par `"#AND#"` pour exiger toutes ; sinon laisser en OU)',
408
+ " - `expertiseAreas: [...]` éventuellement",
409
+ experience_min ? " - `experiences: [...]` issus de l'étape 2bis" : "",
410
+ dispoLine,
411
+ manager_id ? ` - ${scope}` : "",
412
+ " - `resourceStates` actifs uniquement (consulter `setting.state.resource`)",
413
+ " - `pageSize: 30`",
414
+ includeCandidates
415
+ ? "4. En parallèle, recherche dans les candidats via `boond_candidates_search` avec les mêmes filtres + `candidateStates` actifs (consulter `setting.state.candidate`)."
416
+ : "4. (Skip — recherche limitée aux ressources internes.)",
417
+ "5. Pour les top 10 résultats combinés, récupérer `technical_data` (`boond_resources_technical_data` ou `boond_candidates_technical_data`) pour vérifier l'adéquation fine.",
418
+ "6. Restituer un classement unique : type (Ressource interne / Candidat) | nom | titre | compétences matchées | expérience | dispo | localisation/mobilité | note d'adéquation /10 (1 ligne de justification).",
419
+ "7. Si moins de 5 résultats : suggérer un assouplissement (retirer une compétence secondaire, élargir le périmètre géographique, accepter un junior, sous-traitance).",
420
+ ]
421
+ .filter(Boolean)
422
+ .join("\n");
423
+ },
424
+ },
162
425
  {
163
426
  name: "recap_hebdo",
164
427
  title: "Récap hebdomadaire (moi + mon équipe)",
165
428
  description: "Compile en une vue ce qui s'est passé / va se passer cette semaine pour moi et mon équipe : opportunités, projets, absences, CRA.",
166
429
  argsSchema: {
167
- semaine: z.string().optional().describe("Semaine ciblée (ex: 'cette semaine', 'la semaine prochaine'). Défaut: cette semaine."),
430
+ semaine: z
431
+ .string()
432
+ .optional()
433
+ .describe("Semaine ciblée (ex: 'cette semaine', 'la semaine prochaine'). Défaut: cette semaine."),
168
434
  },
169
435
  build: ({ semaine }) => {
170
436
  const semaineText = semaine || "cette semaine";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,EAAE;KACpE;CACF,CAAC,CAAC;AAUH,MAAM,OAAO,GAAuB;IAClC;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,mFAAmF;cACjF,sEAAsE;QAC1E,UAAU,EAAE;YACV,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACxC,0HAA0H,CAC3H;YACD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACrC,qFAAqF,CACtF;SACF;QACD,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;YACjC,MAAM,WAAW,GAAG,OAAO,IAAI,kBAAkB,CAAC;YAClD,MAAM,WAAW,GAAG,UAAU;gBAC5B,CAAC,CAAC,6BAA6B,UAAU,GAAG;gBAC5C,CAAC,CAAC,4HAA4H,CAAC;YACjI,OAAO;gBACL,yCAAyC,WAAW,GAAG;gBACvD,EAAE;gBACF,WAAW;gBACX,EAAE;gBACF,UAAU;gBACV,kQAAkQ;gBAClQ,8DAA8D;gBAC9D,+DAA+D;gBAC/D,qEAAqE;gBACrE,gFAAgF;gBAChF,qHAAqH;gBACrH,iHAAiH;aAClH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IAED;QACE,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EACT,oFAAoF;cAClF,qDAAqD;QACzD,UAAU,EAAE;YACV,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACjE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YAC7D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACxC,wGAAwG,CACzG;SACF;QACD,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;YAC9C,MAAM,WAAW,GAAG,UAAU;gBAC5B,CAAC,CAAC,yBAAyB,UAAU,KAAK;gBAC1C,CAAC,CAAC,iDAAiD,CAAC;YACtD,OAAO;gBACL,sDAAsD,UAAU,OAAO,QAAQ,GAAG;gBAClF,EAAE;gBACF,eAAe,WAAW,GAAG;gBAC7B,EAAE;gBACF,UAAU;gBACV,gDAAgD;gBAChD,gCAAgC;gBAChC,sBAAsB,UAAU,oBAAoB,QAAQ,KAAK;gBACjE,QAAQ,WAAW,EAAE;gBACrB,sBAAsB;gBACtB,kDAAkD;gBAClD,8IAA8I;gBAC9I,gBAAgB;gBAChB,4CAA4C;gBAC5C,iEAAiE;gBACjE,mEAAmE;gBACnE,+GAA+G;aAChH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IAED;QACE,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,qFAAqF;cACnF,uDAAuD;QAC3D,UAAU,EAAE;YACV,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;SACvF;QACD,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;YACxB,OAAO;gBACL,4EAA4E;gBAC5E,EAAE;gBACF,UAAU;gBACV,sCAAsC;gBACtC,UAAU,CAAC,CAAC,CAAC,sBAAsB,UAAU,KAAK,CAAC,CAAC,CAAC,qEAAqE;gBAC1H,sBAAsB;gBACtB,8JAA8J;gBAC9J,sJAAsJ;gBACtJ,sIAAsI;gBACtI,qLAAqL;gBACrL,wCAAwC;aACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IAED;QACE,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,2CAA2C;QAClD,WAAW,EACT,yGAAyG;QAC3G,UAAU,EAAE;YACV,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACvE;QACD,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;YAC5B,OAAO;gBACL,sDAAsD,cAAc,GAAG;gBACvE,EAAE;gBACF,UAAU;gBACV,2EAA2E,cAAc,kEAAkE;gBAC3J,iIAAiI;gBACjI,6CAA6C;gBAC7C,8JAA8J;gBAC9J,sCAAsC;gBACtC,uCAAuC;gBACvC,mHAAmH;gBACnH,yHAAyH;gBACzH,qBAAqB;gBACrB,sHAAsH;gBACtH,2GAA2G;aAC5G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IAED;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EACT,4FAA4F;QAC9F,UAAU,EAAE;YACV,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;SACxD;QACD,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;YACzB,OAAO;gBACL,6CAA6C,WAAW,GAAG;gBAC3D,EAAE;gBACF,mDAAmD;gBACnD,wCAAwC,WAAW,kCAAkC;gBACrF,2CAA2C,WAAW,6CAA6C;gBACnG,2CAA2C,WAAW,uDAAuD;gBAC7G,yCAAyC,WAAW,8CAA8C;gBAClG,qCAAqC,WAAW,gCAAgC;gBAChF,6CAA6C,WAAW,6CAA6C;gBACrG,0CAA0C,WAAW,gCAAgC;gBACrF,EAAE;gBACF,wRAAwR;aACzR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IAED;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EACT,mIAAmI;QACrI,UAAU,EAAE;YACV,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACrC,sFAAsF,CACvF;SACF;QACD,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,MAAM,WAAW,GAAG,OAAO,IAAI,eAAe,CAAC;YAC/C,OAAO;gBACL,0BAA0B,WAAW,GAAG;gBACxC,EAAE;gBACF,UAAU;gBACV,4DAA4D;gBAC5D,mBAAmB;gBACnB,wJAAwJ;gBACxJ,8FAA8F;gBAC9F,+FAA+F;gBAC/F,oIAAoI;gBACpI,iIAAiI;gBACjI,8BAA8B;gBAC9B,mFAAmF;gBACnF,wEAAwE;gBACxE,0FAA0F;gBAC1F,2FAA2F;aAC5F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,cAAc,CACnB,CAAC,CAAC,IAAI,EACN;YACE,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAuC,CAAC,CAAC,CACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,WAAW,EAAE,CAAC,CAAC,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;CACnC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}