boondmanager-mcp-server 2.4.0 → 2.6.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.
Files changed (40) hide show
  1. package/README.md +24 -4
  2. package/dist/config/dictionary-overrides.d.ts +57 -0
  3. package/dist/config/dictionary-overrides.d.ts.map +1 -0
  4. package/dist/config/dictionary-overrides.js +193 -0
  5. package/dist/config/dictionary-overrides.js.map +1 -0
  6. package/dist/resources/index.d.ts.map +1 -1
  7. package/dist/resources/index.js +25 -0
  8. package/dist/resources/index.js.map +1 -1
  9. package/dist/schemas/index.d.ts +209 -22
  10. package/dist/schemas/index.d.ts.map +1 -1
  11. package/dist/schemas/index.js +241 -58
  12. package/dist/schemas/index.js.map +1 -1
  13. package/dist/services/boond-client.d.ts +7 -0
  14. package/dist/services/boond-client.d.ts.map +1 -1
  15. package/dist/services/boond-client.js +22 -0
  16. package/dist/services/boond-client.js.map +1 -1
  17. package/dist/tools/actions.d.ts.map +1 -1
  18. package/dist/tools/actions.js +59 -3
  19. package/dist/tools/actions.js.map +1 -1
  20. package/dist/tools/candidates.js +2 -2
  21. package/dist/tools/candidates.js.map +1 -1
  22. package/dist/tools/companies.js +2 -2
  23. package/dist/tools/companies.js.map +1 -1
  24. package/dist/tools/contacts.js +2 -2
  25. package/dist/tools/contacts.js.map +1 -1
  26. package/dist/tools/opportunities.d.ts.map +1 -1
  27. package/dist/tools/opportunities.js +3 -3
  28. package/dist/tools/opportunities.js.map +1 -1
  29. package/dist/tools/positionings.d.ts.map +1 -1
  30. package/dist/tools/positionings.js +75 -5
  31. package/dist/tools/positionings.js.map +1 -1
  32. package/dist/tools/projects.js +2 -2
  33. package/dist/tools/projects.js.map +1 -1
  34. package/dist/tools/reporting.d.ts.map +1 -1
  35. package/dist/tools/reporting.js +20 -13
  36. package/dist/tools/reporting.js.map +1 -1
  37. package/dist/tools/resources.js +2 -2
  38. package/dist/tools/resources.js.map +1 -1
  39. package/manifest.json +10 -3
  40. package/package.json +2 -2
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  Serveur MCP (Model Context Protocol) pour l'API BoondManager, permettant a Claude (Desktop, Cowork, Code) de rechercher, consulter, creer et modifier des enregistrements dans votre instance BoondManager.
15
15
 
16
- **158 outils** couvrant **36 domaines** de l'API BoondManager. Voir [TOOLS.md](./TOOLS.md) pour le catalogue auto-généré (outils + prompts + ressources).
16
+ **175 outils** couvrant **38 domaines** de l'API BoondManager. Voir [TOOLS.md](./TOOLS.md) pour le catalogue auto-généré (outils + prompts + ressources).
17
17
 
18
18
  ## Domaines couverts
19
19
 
@@ -22,7 +22,7 @@ Serveur MCP (Model Context Protocol) pour l'API BoondManager, permettant a Claud
22
22
  | Domaine | Outils | Operations |
23
23
  |---------|--------|------------|
24
24
  | **Candidats** | 10 | CRUD + information, technical-data, administrative, actions, positionings |
25
- | **Ressources** | 15 | CRUD + information, technical-data, administrative, advantages, actions, positionings, projects, times-reports, expenses-reports, absences-reports |
25
+ | **Ressources** | 20 | CRUD + information, technical-data (+ update), administrative, advantages, actions, positionings, projects, times-reports, expenses-reports, absences-reports, timesheets, references (create/update/delete) |
26
26
  | **Contacts** | 11 | CRUD + information, actions, opportunities, projects, orders, invoices |
27
27
  | **Societes** | 14 | CRUD + information, contacts, actions, opportunities, projects, orders, invoices, purchases, provider-invoices |
28
28
  | **Opportunites** | 10 | CRUD + information, actions, positionings, projects, simulation |
@@ -90,6 +90,7 @@ Serveur MCP (Model Context Protocol) pour l'API BoondManager, permettant a Claud
90
90
  | **Logs d'audit** | 2 | search, get |
91
91
  | **Notifications** | 2 | search, get |
92
92
  | **Fils de discussion** | 2 | search, get |
93
+ | **Documents / CV** | 3 | get (telechargement), create (upload par URL + parsing CV), delete |
93
94
  | **Application** | 2 | dictionnaire, utilisateur courant |
94
95
 
95
96
  ### Detail des onglets par entite
@@ -444,6 +445,25 @@ comptabilité), et/ou bloquer les écritures et suppressions.
444
445
 
445
446
  Guide complet, règles de résolution et exemples : [docs/access-control.md](docs/access-control.md).
446
447
 
448
+ ### Libellés personnalisés du dictionnaire
449
+
450
+ Si votre instance BoondManager utilise des libellés de dictionnaire
451
+ personnalisés (ex. types d'action ou états en anglais), vous pouvez déclarer
452
+ le mapping libellé→ID via `BOOND_DICTIONARY_OVERRIDES` (JSON inline ou chemin
453
+ vers un fichier JSON) :
454
+
455
+ ```bash
456
+ export BOOND_DICTIONARY_OVERRIDES='{"action":{"contact":{"Call":61,"Email":63}},"state":{"candidate":{"Interviewed":2}}}'
457
+ ```
458
+
459
+ Le serveur accepte alors ces libellés pour le `typeOf` de
460
+ `boond_actions_create` et les champs `state` des créations/modifications, les
461
+ résout automatiquement en IDs numériques, et enrichit les descriptions des
462
+ outils avec les libellés disponibles. Sans cette variable, le comportement est
463
+ strictement inchangé.
464
+
465
+ Format complet, entités supportées et limites : [docs/dictionary-overrides.md](docs/dictionary-overrides.md).
466
+
447
467
  ## Transports
448
468
 
449
469
  Le serveur supporte deux transports MCP, selectionnables via la variable d'environnement `MCP_TRANSPORT`.
@@ -634,7 +654,7 @@ boondmanager-mcp-server/
634
654
  │ ├── index.ts # Barrel export de tous les domaines
635
655
  │ ├── crud-factory.ts # Factory generique CRUD (DRY)
636
656
  │ ├── candidates.ts # 10 outils (CRUD + 5 onglets)
637
- │ ├── resources.ts # 15 outils (CRUD + 10 onglets)
657
+ │ ├── resources.ts # 20 outils (CRUD + 10 onglets + references/timesheets)
638
658
  │ ├── contacts.ts # 11 outils (CRUD + 6 onglets)
639
659
  │ ├── companies.ts # 14 outils (CRUD + 9 onglets)
640
660
  │ ├── opportunities.ts # 10 outils (CRUD + 5 onglets)
@@ -700,7 +720,7 @@ npm run build
700
720
  npm start
701
721
 
702
722
  # Tests
703
- npm test # 255 tests
723
+ npm test # 645 tests
704
724
  npm run test:coverage # Avec couverture
705
725
 
706
726
  # Qualite
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Dictionary overrides: let operators whose BoondManager instance uses
3
+ * customised dictionary labels (e.g. English action types or states) declare
4
+ * a label→id mapping, so the model can pass human labels instead of opaque
5
+ * numeric dictionary ids.
6
+ *
7
+ * Env var (optional):
8
+ * - `BOOND_DICTIONARY_OVERRIDES` Either inline JSON (the value starts with
9
+ * `{`) or a path to a UTF-8 JSON file. Expected shape:
10
+ *
11
+ * {
12
+ * "action": { "contact": { "Call": 61, "Email": 63 }, "candidate": { ... } },
13
+ * "state": { "candidate": { "Interviewed": 2 }, "opportunity": { ... } }
14
+ * }
15
+ *
16
+ * Both sections are optional. Unknown entity keys are warned-and-ignored.
17
+ * Any hard error (unreadable file, invalid JSON, invalid structure) is logged
18
+ * as a warning and the overrides are simply disabled: the server ALWAYS
19
+ * starts (fail-open, same philosophy as services/update-checker.ts).
20
+ *
21
+ * This is a pure input-side convenience: it never translates API responses.
22
+ */
23
+ /** Entities that can carry an action `typeOf` (see `setting.action.*`). */
24
+ export declare const ACTION_ENTITIES: readonly ["contact", "candidate", "resource", "opportunity", "project"];
25
+ /** Entities that carry a `state` attribute (see `setting.state.*`). */
26
+ export declare const STATE_ENTITIES: readonly ["candidate", "resource", "contact", "company", "opportunity", "project", "positioning", "quotation", "product", "invoice", "order", "absence"];
27
+ export type OverrideSection = "action" | "state";
28
+ /** Custom label → numeric dictionary id. */
29
+ export type LabelMap = Record<string, number>;
30
+ export interface DictionaryOverrides {
31
+ action: Partial<Record<string, LabelMap>>;
32
+ state: Partial<Record<string, LabelMap>>;
33
+ }
34
+ /**
35
+ * Load and validate the overrides from the environment. Resilient: any error
36
+ * is logged as a warning and `null` is returned — the server always starts.
37
+ */
38
+ export declare function loadDictionaryOverrides(env?: NodeJS.ProcessEnv): DictionaryOverrides | null;
39
+ export declare function getDictionaryOverrides(): DictionaryOverrides | null;
40
+ /** Reset the singleton (tests only). */
41
+ export declare function resetDictionaryOverridesForTests(): void;
42
+ /**
43
+ * Resolve a custom label to its numeric dictionary id. Matching is
44
+ * case-insensitive and ignores leading/trailing whitespace.
45
+ */
46
+ export declare function resolveLabel(section: OverrideSection, entity: string, label: string): number | undefined;
47
+ /** Labels declared for a section/entity (original casing), or [] if none. */
48
+ export declare function availableLabels(section: OverrideSection, entity: string): string[];
49
+ /** Compact "Label=id, Label=id" summary for a section/entity, or null if none. */
50
+ export declare function formatOverridesSummary(section: OverrideSection, entity: string): string | null;
51
+ /**
52
+ * Append the accepted custom labels to a schema/tool description. Returns the
53
+ * base string unchanged (byte-for-byte) when no override is configured for
54
+ * this section/entity.
55
+ */
56
+ export declare function appendOverridesToDescription(base: string, section: OverrideSection, entity: string): string;
57
+ //# sourceMappingURL=dictionary-overrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary-overrides.d.ts","sourceRoot":"","sources":["../../src/config/dictionary-overrides.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,eAAe,yEAA0E,CAAC;AAEvG,uEAAuE;AACvE,eAAO,MAAM,cAAc,0JAajB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjD,4CAA4C;AAC5C,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CAC1C;AA8CD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,mBAAmB,GAAG,IAAI,CAuDxG;AASD,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,IAAI,CAMnE;AAED,wCAAwC;AACxC,wBAAgB,gCAAgC,IAAI,IAAI,CAGvD;AAaD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQxG;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAGlF;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9F;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3G"}
@@ -0,0 +1,193 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { z } from "zod";
3
+ import { logger } from "../services/logger.js";
4
+ /**
5
+ * Dictionary overrides: let operators whose BoondManager instance uses
6
+ * customised dictionary labels (e.g. English action types or states) declare
7
+ * a label→id mapping, so the model can pass human labels instead of opaque
8
+ * numeric dictionary ids.
9
+ *
10
+ * Env var (optional):
11
+ * - `BOOND_DICTIONARY_OVERRIDES` Either inline JSON (the value starts with
12
+ * `{`) or a path to a UTF-8 JSON file. Expected shape:
13
+ *
14
+ * {
15
+ * "action": { "contact": { "Call": 61, "Email": 63 }, "candidate": { ... } },
16
+ * "state": { "candidate": { "Interviewed": 2 }, "opportunity": { ... } }
17
+ * }
18
+ *
19
+ * Both sections are optional. Unknown entity keys are warned-and-ignored.
20
+ * Any hard error (unreadable file, invalid JSON, invalid structure) is logged
21
+ * as a warning and the overrides are simply disabled: the server ALWAYS
22
+ * starts (fail-open, same philosophy as services/update-checker.ts).
23
+ *
24
+ * This is a pure input-side convenience: it never translates API responses.
25
+ */
26
+ /** Entities that can carry an action `typeOf` (see `setting.action.*`). */
27
+ export const ACTION_ENTITIES = ["contact", "candidate", "resource", "opportunity", "project"];
28
+ /** Entities that carry a `state` attribute (see `setting.state.*`). */
29
+ export const STATE_ENTITIES = [
30
+ "candidate",
31
+ "resource",
32
+ "contact",
33
+ "company",
34
+ "opportunity",
35
+ "project",
36
+ "positioning",
37
+ "quotation",
38
+ "product",
39
+ "invoice",
40
+ "order",
41
+ "absence",
42
+ ];
43
+ // Values must be numeric dictionary ids (>= 0).
44
+ const LabelMapSchema = z.record(z.string().min(1), z.number().int().min(0));
45
+ // Top-level shape. `.strict()` so a typo like "actions" fails loudly (warn +
46
+ // disabled) instead of being silently dropped.
47
+ const OverridesFileSchema = z
48
+ .object({
49
+ action: z.record(z.string(), LabelMapSchema).optional(),
50
+ state: z.record(z.string(), LabelMapSchema).optional(),
51
+ })
52
+ .strict();
53
+ // --- Env parsing helper (mirroring config/access-policy.ts) ---
54
+ function readEnv(env, key) {
55
+ const raw = env[key];
56
+ if (raw === undefined)
57
+ return undefined;
58
+ // Ignore unresolved placeholders like "${SOMETHING}" (same guard as http.ts).
59
+ if (raw.startsWith("${"))
60
+ return undefined;
61
+ if (raw.trim().length === 0)
62
+ return undefined;
63
+ return raw;
64
+ }
65
+ /** Keep only known entity keys; warn-and-ignore the rest (never fatal). */
66
+ function filterKnownEntities(section, raw, known, log) {
67
+ const out = {};
68
+ for (const [entity, labels] of Object.entries(raw)) {
69
+ if (known.includes(entity)) {
70
+ if (Object.keys(labels).length > 0)
71
+ out[entity] = labels;
72
+ }
73
+ else {
74
+ log.warn({ section, entity, known: [...known] }, `BOOND_DICTIONARY_OVERRIDES: unknown ${section} entity "${entity}" ignored`);
75
+ }
76
+ }
77
+ return out;
78
+ }
79
+ /**
80
+ * Load and validate the overrides from the environment. Resilient: any error
81
+ * is logged as a warning and `null` is returned — the server always starts.
82
+ */
83
+ export function loadDictionaryOverrides(env = process.env) {
84
+ const log = logger.child({ component: "dictionary-overrides" });
85
+ const raw = readEnv(env, "BOOND_DICTIONARY_OVERRIDES");
86
+ if (raw === undefined)
87
+ return null;
88
+ // Inline JSON if the value starts with "{", otherwise a file path.
89
+ let text = raw;
90
+ const trimmed = raw.trim();
91
+ if (!trimmed.startsWith("{")) {
92
+ try {
93
+ text = readFileSync(trimmed, "utf-8");
94
+ }
95
+ catch (err) {
96
+ log.warn({ path: trimmed, err: err instanceof Error ? err.message : String(err) }, "BOOND_DICTIONARY_OVERRIDES: cannot read overrides file; custom labels disabled");
97
+ return null;
98
+ }
99
+ }
100
+ let parsed;
101
+ try {
102
+ parsed = JSON.parse(text);
103
+ }
104
+ catch (err) {
105
+ log.warn({ err: err instanceof Error ? err.message : String(err) }, "BOOND_DICTIONARY_OVERRIDES: invalid JSON; custom labels disabled");
106
+ return null;
107
+ }
108
+ const result = OverridesFileSchema.safeParse(parsed);
109
+ if (!result.success) {
110
+ log.warn({ issues: result.error.issues }, "BOOND_DICTIONARY_OVERRIDES: invalid structure; custom labels disabled");
111
+ return null;
112
+ }
113
+ const overrides = {
114
+ action: filterKnownEntities("action", result.data.action ?? {}, ACTION_ENTITIES, log),
115
+ state: filterKnownEntities("state", result.data.state ?? {}, STATE_ENTITIES, log),
116
+ };
117
+ if (Object.keys(overrides.action).length === 0 && Object.keys(overrides.state).length === 0) {
118
+ log.warn("BOOND_DICTIONARY_OVERRIDES: no usable entry after validation; custom labels disabled");
119
+ return null;
120
+ }
121
+ log.info({
122
+ actionEntities: Object.keys(overrides.action),
123
+ stateEntities: Object.keys(overrides.state),
124
+ }, "Dictionary overrides active: custom labels will be resolved to numeric ids");
125
+ return overrides;
126
+ }
127
+ // --- Lazy singleton over process.env ---
128
+ // Loaded on first use (NOT at import time) so tests can set the env var after
129
+ // importing modules that depend on this one.
130
+ let cached = null;
131
+ let loaded = false;
132
+ export function getDictionaryOverrides() {
133
+ if (!loaded) {
134
+ cached = loadDictionaryOverrides(process.env);
135
+ loaded = true;
136
+ }
137
+ return cached;
138
+ }
139
+ /** Reset the singleton (tests only). */
140
+ export function resetDictionaryOverridesForTests() {
141
+ cached = null;
142
+ loaded = false;
143
+ }
144
+ // --- Resolution helpers ---
145
+ function normalizeLabel(label) {
146
+ return label.trim().toLowerCase();
147
+ }
148
+ function labelMapFor(section, entity) {
149
+ const overrides = getDictionaryOverrides();
150
+ return overrides?.[section][entity];
151
+ }
152
+ /**
153
+ * Resolve a custom label to its numeric dictionary id. Matching is
154
+ * case-insensitive and ignores leading/trailing whitespace.
155
+ */
156
+ export function resolveLabel(section, entity, label) {
157
+ const map = labelMapFor(section, entity);
158
+ if (!map)
159
+ return undefined;
160
+ const wanted = normalizeLabel(label);
161
+ for (const [key, id] of Object.entries(map)) {
162
+ if (normalizeLabel(key) === wanted)
163
+ return id;
164
+ }
165
+ return undefined;
166
+ }
167
+ /** Labels declared for a section/entity (original casing), or [] if none. */
168
+ export function availableLabels(section, entity) {
169
+ const map = labelMapFor(section, entity);
170
+ return map ? Object.keys(map) : [];
171
+ }
172
+ /** Compact "Label=id, Label=id" summary for a section/entity, or null if none. */
173
+ export function formatOverridesSummary(section, entity) {
174
+ const map = labelMapFor(section, entity);
175
+ if (!map)
176
+ return null;
177
+ const entries = Object.entries(map);
178
+ if (entries.length === 0)
179
+ return null;
180
+ return entries.map(([label, id]) => `${label}=${id}`).join(", ");
181
+ }
182
+ /**
183
+ * Append the accepted custom labels to a schema/tool description. Returns the
184
+ * base string unchanged (byte-for-byte) when no override is configured for
185
+ * this section/entity.
186
+ */
187
+ export function appendOverridesToDescription(base, section, entity) {
188
+ const summary = formatOverridesSummary(section, entity);
189
+ if (summary === null)
190
+ return base;
191
+ return `${base}\nLibellés personnalisés acceptés (résolus automatiquement) : ${summary}`;
192
+ }
193
+ //# sourceMappingURL=dictionary-overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary-overrides.js","sourceRoot":"","sources":["../../src/config/dictionary-overrides.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwKzE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB;;;;GAOhC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2D5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2KzE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB;;;;GAQhC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuF5D"}
@@ -1,5 +1,6 @@
1
1
  import { apiRequest } from "../services/boond-client.js";
2
2
  import { getDictionary, resolveDictionaryPath } from "../services/dictionary.js";
3
+ import { getDictionaryOverrides } from "../config/dictionary-overrides.js";
3
4
  /**
4
5
  * Curated dictionaries surfaced as static MCP resources. Slugs follow the
5
6
  * historical "kind/entity" naming for backward compatibility with client URIs;
@@ -129,6 +130,8 @@ const DICTIONARIES = [
129
130
  const DICTIONARY_URI_PREFIX = "boond://dictionary/";
130
131
  /** URI of the cached identity resource. */
131
132
  const CURRENT_USER_URI = "boond://application/current-user";
133
+ /** URI of the static dictionary-overrides resource (no API call behind it). */
134
+ const OVERRIDES_URI = "boond://dictionary/overrides";
132
135
  function buildResourceUri(slug) {
133
136
  return `${DICTIONARY_URI_PREFIX}${slug}`;
134
137
  }
@@ -139,6 +142,7 @@ export const REGISTERED_RESOURCES = [
139
142
  uri: buildResourceUri(d.slug),
140
143
  title: d.title,
141
144
  })),
145
+ { name: "dictionary/overrides", uri: OVERRIDES_URI, title: "Libellés personnalisés (overrides)" },
142
146
  { name: "application/current-user", uri: CURRENT_USER_URI, title: "Utilisateur courant" },
143
147
  ];
144
148
  export function registerAllResources(server) {
@@ -167,6 +171,27 @@ export function registerAllResources(server) {
167
171
  };
168
172
  });
169
173
  }
174
+ // Static resource: the label→id overrides configured by the operator via
175
+ // BOOND_DICTIONARY_OVERRIDES (see docs/dictionary-overrides.md). No API call:
176
+ // the body reflects exactly what the server resolved at startup, so the
177
+ // model (and the user) can check which custom labels are usable.
178
+ server.registerResource("dictionary/overrides", OVERRIDES_URI, {
179
+ title: "Libellés personnalisés (overrides)",
180
+ description: "Mapping libellé→ID configuré via BOOND_DICTIONARY_OVERRIDES (types d'action et états). " +
181
+ 'Renvoie { "configured": false } si aucun override n\'est configuré.',
182
+ mimeType: "application/json",
183
+ }, () => {
184
+ const overrides = getDictionaryOverrides();
185
+ return Promise.resolve({
186
+ contents: [
187
+ {
188
+ uri: OVERRIDES_URI,
189
+ mimeType: "application/json",
190
+ text: JSON.stringify(overrides ?? { configured: false }, null, 2),
191
+ },
192
+ ],
193
+ });
194
+ });
170
195
  // The current-user resource is a convenience for prompts/tools that need
171
196
  // the caller's userId without first issuing a tool call. The body is the
172
197
  // full /application/current-user payload.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AA+BjF;;;;;;;;GAQG;AACH,MAAM,YAAY,GAAsB;IACtC,yEAAyE;IACzE;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,kDAAkD;KAChE;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,iCAAiC;KAC/C;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,gCAAgC;KAC9C;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,gCAAgC;KAC9C;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,+CAA+C;KAC7D;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,uCAAuC;KACrD;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,uCAAuC;KACrD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,wCAAwC;KACtD;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,uCAAuC;KACrD;IACD,0EAA0E;IAC1E;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,4DAA4D;KAC1E;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,mBAAmB;KACjC;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,+CAA+C;KAC7D;IACD,uBAAuB;IACvB;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,oGAAoG;KAClH;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,4DAA4D;KAC1E;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,uDAAuD;KACrE;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,4CAA4C;KAC1D;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,iCAAiC;KAC/C;IACD,iBAAiB;IACjB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,wCAAwC,EAAE;IAC5G,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,+BAA+B,EAAE;IAChH;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,gDAAgD;KAC9D;CACF,CAAC;AAEF,2DAA2D;AAC3D,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AACpD,2CAA2C;AAC3C,MAAM,gBAAgB,GAAG,kCAAkC,CAAC;AAE5D,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,GAAG,qBAAqB,GAAG,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE;QAC5B,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7B,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC;IACH,EAAE,IAAI,EAAE,0BAA0B,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,EAAE;CAC1F,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,gBAAgB,CACrB,cAAc,IAAI,CAAC,IAAI,EAAE,EACzB,GAAG,EACH;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,kBAAkB;SAC7B,EACD,KAAK,IAAI,EAAE;YACT,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,IAAI,GACR,IAAI,KAAK,SAAS;gBAChB,CAAC,CAAC;oBACE,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,mGAAmG;iBAC7H;gBACH,CAAC,CAAC,IAAI,CAAC;YACX,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;qBACpC;iBACF;aACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,yEAAyE;IACzE,0CAA0C;IAC1C,MAAM,CAAC,gBAAgB,CACrB,0BAA0B,EAC1B,gBAAgB,EAChB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,8FAA8F;YAC9F,2EAA2E;QAC7E,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAC/D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,gBAAgB;oBACrB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}