boondmanager-mcp-server 2.15.2 → 2.17.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/LICENSE +1 -1
- package/NOTICE +16 -2
- package/README.md +60 -15
- package/dist/config/access-policy.d.ts.map +1 -1
- package/dist/config/access-policy.js +6 -18
- package/dist/config/access-policy.js.map +1 -1
- package/dist/config/dictionary-overrides.d.ts.map +1 -1
- package/dist/config/dictionary-overrides.js +2 -12
- package/dist/config/dictionary-overrides.js.map +1 -1
- package/dist/config/env.d.ts +63 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +116 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/profiles.d.ts +22 -8
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js +48 -4
- package/dist/config/profiles.js.map +1 -1
- package/dist/constants.d.ts +13 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +25 -1
- package/dist/constants.js.map +1 -1
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +6 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.js +33 -15
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +6 -6
- package/dist/instructions.js.map +1 -1
- package/dist/prompts/index.d.ts +19 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +495 -25
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/periods.d.ts +45 -0
- package/dist/prompts/periods.d.ts.map +1 -0
- package/dist/prompts/periods.js +154 -0
- package/dist/prompts/periods.js.map +1 -0
- package/dist/resources/index.d.ts +14 -0
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +285 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/templates.d.ts +1 -1
- package/dist/resources/templates.d.ts.map +1 -1
- package/dist/resources/templates.js +2 -0
- package/dist/resources/templates.js.map +1 -1
- package/dist/schema-dialect.js.map +1 -1
- package/dist/schemas/filter-aliases.d.ts +1 -1
- package/dist/schemas/filter-aliases.d.ts.map +1 -1
- package/dist/schemas/filter-aliases.js +101 -2
- package/dist/schemas/filter-aliases.js.map +1 -1
- package/dist/schemas/index.d.ts +987 -161
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +853 -323
- package/dist/schemas/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -3
- package/dist/server.js.map +1 -1
- package/dist/services/boond-client.d.ts +29 -213
- package/dist/services/boond-client.d.ts.map +1 -1
- package/dist/services/boond-client.js +29 -1168
- package/dist/services/boond-client.js.map +1 -1
- package/dist/services/dictionary.d.ts +27 -3
- package/dist/services/dictionary.d.ts.map +1 -1
- package/dist/services/dictionary.js +60 -23
- package/dist/services/dictionary.js.map +1 -1
- package/dist/services/document-text.d.ts +32 -0
- package/dist/services/document-text.d.ts.map +1 -0
- package/dist/services/document-text.js +120 -0
- package/dist/services/document-text.js.map +1 -0
- package/dist/services/format/detail.d.ts +16 -0
- package/dist/services/format/detail.d.ts.map +1 -0
- package/dist/services/format/detail.js +36 -0
- package/dist/services/format/detail.js.map +1 -0
- package/dist/services/format/html.d.ts +19 -0
- package/dist/services/format/html.d.ts.map +1 -0
- package/dist/services/format/html.js +87 -0
- package/dist/services/format/html.js.map +1 -0
- package/dist/services/format/list.d.ts +3 -0
- package/dist/services/format/list.d.ts.map +1 -0
- package/dist/services/format/list.js +44 -0
- package/dist/services/format/list.js.map +1 -0
- package/dist/services/format/summary.d.ts +16 -0
- package/dist/services/format/summary.d.ts.map +1 -0
- package/dist/services/format/summary.js +172 -0
- package/dist/services/format/summary.js.map +1 -0
- package/dist/services/format/tab.d.ts +9 -0
- package/dist/services/format/tab.d.ts.map +1 -0
- package/dist/services/format/tab.js +32 -0
- package/dist/services/format/tab.js.map +1 -0
- package/dist/services/http/auth.d.ts +44 -0
- package/dist/services/http/auth.d.ts.map +1 -0
- package/dist/services/http/auth.js +146 -0
- package/dist/services/http/auth.js.map +1 -0
- package/dist/services/http/download.d.ts +60 -0
- package/dist/services/http/download.d.ts.map +1 -0
- package/dist/services/http/download.js +160 -0
- package/dist/services/http/download.js.map +1 -0
- package/dist/services/http/errors.d.ts +45 -0
- package/dist/services/http/errors.d.ts.map +1 -0
- package/dist/services/http/errors.js +188 -0
- package/dist/services/http/errors.js.map +1 -0
- package/dist/services/http/rate-limit.d.ts +40 -0
- package/dist/services/http/rate-limit.d.ts.map +1 -0
- package/dist/services/http/rate-limit.js +92 -0
- package/dist/services/http/rate-limit.js.map +1 -0
- package/dist/services/http/retry.d.ts +46 -0
- package/dist/services/http/retry.d.ts.map +1 -0
- package/dist/services/http/retry.js +101 -0
- package/dist/services/http/retry.js.map +1 -0
- package/dist/services/http/transport.d.ts +73 -0
- package/dist/services/http/transport.d.ts.map +1 -0
- package/dist/services/http/transport.js +272 -0
- package/dist/services/http/transport.js.map +1 -0
- package/dist/services/logger.d.ts +53 -2
- package/dist/services/logger.d.ts.map +1 -1
- package/dist/services/logger.js +82 -21
- package/dist/services/logger.js.map +1 -1
- package/dist/services/oauth.d.ts +12 -0
- package/dist/services/oauth.d.ts.map +1 -1
- package/dist/services/oauth.js +21 -8
- package/dist/services/oauth.js.map +1 -1
- package/dist/services/rate-limiter.d.ts +9 -2
- package/dist/services/rate-limiter.d.ts.map +1 -1
- package/dist/services/rate-limiter.js +18 -6
- package/dist/services/rate-limiter.js.map +1 -1
- package/dist/services/request-context.d.ts +47 -0
- package/dist/services/request-context.d.ts.map +1 -0
- package/dist/services/request-context.js +112 -0
- package/dist/services/request-context.js.map +1 -0
- package/dist/services/search.d.ts +26 -0
- package/dist/services/search.d.ts.map +1 -0
- package/dist/services/search.js +98 -0
- package/dist/services/search.js.map +1 -0
- package/dist/services/update-checker.d.ts.map +1 -1
- package/dist/services/update-checker.js +15 -8
- package/dist/services/update-checker.js.map +1 -1
- package/dist/tools/absences.d.ts +9 -0
- package/dist/tools/absences.d.ts.map +1 -1
- package/dist/tools/absences.js +65 -20
- package/dist/tools/absences.js.map +1 -1
- package/dist/tools/actions.d.ts.map +1 -1
- package/dist/tools/actions.js +11 -27
- package/dist/tools/actions.js.map +1 -1
- package/dist/tools/advantages.d.ts +2 -0
- package/dist/tools/advantages.d.ts.map +1 -1
- package/dist/tools/advantages.js +66 -13
- package/dist/tools/advantages.js.map +1 -1
- package/dist/tools/alerts.d.ts +18 -0
- package/dist/tools/alerts.d.ts.map +1 -0
- package/dist/tools/alerts.js +82 -0
- package/dist/tools/alerts.js.map +1 -0
- package/dist/tools/application.d.ts +2 -1
- package/dist/tools/application.d.ts.map +1 -1
- package/dist/tools/application.js +9 -3
- package/dist/tools/application.js.map +1 -1
- package/dist/tools/contacts.d.ts.map +1 -1
- package/dist/tools/contacts.js +3 -7
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/contracts.d.ts +22 -0
- package/dist/tools/contracts.d.ts.map +1 -1
- package/dist/tools/contracts.js +185 -52
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/crud-factory.d.ts +33 -2
- package/dist/tools/crud-factory.d.ts.map +1 -1
- package/dist/tools/crud-factory.js +42 -15
- package/dist/tools/crud-factory.js.map +1 -1
- package/dist/tools/deliveries.d.ts +3 -0
- package/dist/tools/deliveries.d.ts.map +1 -1
- package/dist/tools/deliveries.js +50 -94
- package/dist/tools/deliveries.js.map +1 -1
- package/dist/tools/description-builders.d.ts +0 -1
- package/dist/tools/description-builders.d.ts.map +1 -1
- package/dist/tools/description-builders.js +46 -3
- package/dist/tools/description-builders.js.map +1 -1
- package/dist/tools/documents.d.ts.map +1 -1
- package/dist/tools/documents.js +73 -21
- package/dist/tools/documents.js.map +1 -1
- package/dist/tools/expenses.d.ts.map +1 -1
- package/dist/tools/expenses.js +2 -11
- package/dist/tools/expenses.js.map +1 -1
- package/dist/tools/find.d.ts +61 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +221 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/flags.d.ts +5 -0
- package/dist/tools/flags.d.ts.map +1 -1
- package/dist/tools/flags.js +116 -1
- package/dist/tools/flags.js.map +1 -1
- package/dist/tools/forms.d.ts +5 -0
- package/dist/tools/forms.d.ts.map +1 -0
- package/dist/tools/forms.js +64 -0
- package/dist/tools/forms.js.map +1 -0
- package/dist/tools/groupments.d.ts +5 -0
- package/dist/tools/groupments.d.ts.map +1 -0
- package/dist/tools/groupments.js +68 -0
- package/dist/tools/groupments.js.map +1 -0
- package/dist/tools/inactivities.d.ts +5 -0
- package/dist/tools/inactivities.d.ts.map +1 -0
- package/dist/tools/inactivities.js +59 -0
- package/dist/tools/inactivities.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/invoices.d.ts.map +1 -1
- package/dist/tools/invoices.js +27 -2
- package/dist/tools/invoices.js.map +1 -1
- package/dist/tools/linked-entity-filters.d.ts +48 -0
- package/dist/tools/linked-entity-filters.d.ts.map +1 -0
- package/dist/tools/linked-entity-filters.js +64 -0
- package/dist/tools/linked-entity-filters.js.map +1 -0
- package/dist/tools/notifications.d.ts.map +1 -1
- package/dist/tools/notifications.js +0 -5
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/orders.d.ts.map +1 -1
- package/dist/tools/orders.js +33 -4
- package/dist/tools/orders.js.map +1 -1
- package/dist/tools/parameter-disclosure.js.map +1 -1
- package/dist/tools/payments.d.ts +3 -0
- package/dist/tools/payments.d.ts.map +1 -1
- package/dist/tools/payments.js +43 -109
- package/dist/tools/payments.js.map +1 -1
- package/dist/tools/positionings.d.ts.map +1 -1
- package/dist/tools/positionings.js +9 -39
- package/dist/tools/positionings.js.map +1 -1
- package/dist/tools/projects.d.ts.map +1 -1
- package/dist/tools/projects.js +5 -12
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/provider-invoices.d.ts +2 -0
- package/dist/tools/provider-invoices.d.ts.map +1 -1
- package/dist/tools/provider-invoices.js +30 -111
- package/dist/tools/provider-invoices.js.map +1 -1
- package/dist/tools/purchases.d.ts +2 -0
- package/dist/tools/purchases.d.ts.map +1 -1
- package/dist/tools/purchases.js +50 -104
- package/dist/tools/purchases.js.map +1 -1
- package/dist/tools/registration-decorators.d.ts +28 -0
- package/dist/tools/registration-decorators.d.ts.map +1 -1
- package/dist/tools/registration-decorators.js +107 -0
- package/dist/tools/registration-decorators.js.map +1 -1
- package/dist/tools/resources.d.ts.map +1 -1
- package/dist/tools/resources.js +27 -5
- package/dist/tools/resources.js.map +1 -1
- package/dist/tools/rights.d.ts +101 -0
- package/dist/tools/rights.d.ts.map +1 -0
- package/dist/tools/rights.js +75 -0
- package/dist/tools/rights.js.map +1 -0
- package/dist/tools/tab-tools.js +3 -3
- package/dist/tools/tab-tools.js.map +1 -1
- package/dist/tools/timesheets.d.ts +29 -0
- package/dist/tools/timesheets.d.ts.map +1 -1
- package/dist/tools/timesheets.js +196 -126
- package/dist/tools/timesheets.js.map +1 -1
- package/dist/tools/todolists.d.ts +2 -0
- package/dist/tools/todolists.d.ts.map +1 -1
- package/dist/tools/todolists.js +64 -1
- package/dist/tools/todolists.js.map +1 -1
- package/dist/tools/validations.d.ts +9 -0
- package/dist/tools/validations.d.ts.map +1 -1
- package/dist/tools/validations.js +86 -9
- package/dist/tools/validations.js.map +1 -1
- package/dist/tools/workflows.js +1 -1
- package/dist/tools/workflows.js.map +1 -1
- package/dist/transports/http.d.ts +116 -0
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +422 -92
- package/dist/transports/http.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/manifest.json +7 -7
- package/package.json +14 -10
package/dist/tools/documents.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { apiDownload, apiUploadForm, formatDetailResponse } from "../services/boond-client.js";
|
|
1
|
+
import { apiDownload, apiUploadForm, formatDetailResponse, DownloadTooLargeError } from "../services/boond-client.js";
|
|
2
2
|
import { progressReporterFrom } from "../services/progress.js";
|
|
3
|
-
import {
|
|
4
|
-
import { MAX_DOCUMENT_BYTES, CHARACTER_LIMIT } from "../constants.js";
|
|
3
|
+
import { DocumentGetSchema, DocumentCreateSchema } from "../schemas/index.js";
|
|
4
|
+
import { MAX_DOCUMENT_BYTES, MAX_IMAGE_BYTES, CHARACTER_LIMIT } from "../constants.js";
|
|
5
5
|
import { registerDeleteTool, MutationOutputSchema } from "./crud-factory.js";
|
|
6
|
+
import { extractDocxText, extractPdfText, isDocxMime, isImageMime, isPdfMime } from "../services/document-text.js";
|
|
6
7
|
/** Mime types rendered as plain text instead of a base64 blob. */
|
|
7
8
|
function isTextMime(mime) {
|
|
8
9
|
return mime.startsWith("text/") || /[+/](json|xml)$|^application\/(json|xml|csv)$/.test(mime);
|
|
@@ -11,15 +12,15 @@ export function registerDocumentTools(server) {
|
|
|
11
12
|
// Download a document (CV, justificatif, contrat...)
|
|
12
13
|
server.registerTool("boond_documents_get", {
|
|
13
14
|
title: "Télécharger un document",
|
|
14
|
-
description: `Télécharge
|
|
15
|
+
description: `Télécharge un document BoondManager (CV de candidat/ressource, justificatif, contrat, facture...) par son ID, et le rend lisible : texte extrait pour un PDF ou un DOCX, contenu \`image\` (visible par le modèle) pour une image, texte brut pour un fichier texte.
|
|
15
16
|
|
|
16
17
|
Où trouver les IDs de documents : dans les onglets des entités — ex. boond_candidates_information expose les relations 'resumes' (CV) et 'files' (dossier administratif). ⚠️ Reprendre l'ID **tel quel**, suffixe compris (ex. '123_resume') : un ID tronqué à sa partie numérique ne désigne aucun document.
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
\`mode: "text"\` (défaut) : PDF / DOCX → texte extrait côté serveur (borné à ${CHARACTER_LIMIT} caractères, taille et nombre de pages d'origine indiqués) ; image PNG / JPEG / GIF / WebP → contenu \`image\` jusqu'à ${Math.round(MAX_IMAGE_BYTES / 1024 / 1024)} Mo. Un PDF scanné ou chiffré, dont rien ne s'extrait, est renvoyé tel quel avec un avertissement. \`mode: "raw"\` : le fichier tel quel en ressource embarquée (base64) — coûteux en contexte, à réserver aux cas où les octets sont nécessaires (transfert, format non géré). Taille max téléchargée : ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo.
|
|
19
20
|
|
|
20
|
-
Returns :
|
|
21
|
+
Returns : texte extrait, contenu \`image\`, ou ressource embarquée (\`blob\` base64) selon le format et le mode.
|
|
21
22
|
Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accueil BoondManager, que l'API sert en HTTP 200 à la place d'un 404.`,
|
|
22
|
-
inputSchema:
|
|
23
|
+
inputSchema: DocumentGetSchema,
|
|
23
24
|
annotations: {
|
|
24
25
|
readOnlyHint: true,
|
|
25
26
|
destructiveHint: false,
|
|
@@ -28,21 +29,35 @@ Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accuei
|
|
|
28
29
|
},
|
|
29
30
|
}, async (params, extra) => {
|
|
30
31
|
// Byte-level progress, but only when the client asked for it and the
|
|
31
|
-
// response announces a Content-Length (see readDownloadBody).
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
// response announces a Content-Length (see readDownloadBody). The size
|
|
33
|
+
// cap is enforced *during* the download (#235): an announced size over
|
|
34
|
+
// the cap is refused before the body is read, an unannounced one is cut
|
|
35
|
+
// the moment it crosses it — never buffered whole and then refused.
|
|
36
|
+
let doc;
|
|
37
|
+
try {
|
|
38
|
+
doc = await apiDownload(`/documents/${params.id}`, progressReporterFrom(extra), {
|
|
39
|
+
maxBytes: MAX_DOCUMENT_BYTES,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (!(err instanceof DownloadTooLargeError))
|
|
44
|
+
throw err;
|
|
45
|
+
const mb = (n) => (n / 1024 / 1024).toFixed(1);
|
|
46
|
+
const size = err.announced ? `${mb(err.bytes)} Mo` : `plus de ${mb(err.bytes)} Mo`;
|
|
36
47
|
return {
|
|
37
48
|
isError: true,
|
|
38
49
|
content: [
|
|
39
50
|
{
|
|
40
51
|
type: "text",
|
|
41
|
-
text: `❌ Document #${params.id}
|
|
52
|
+
text: `❌ Document #${params.id} trop volumineux pour être retourné inline: ${size} (max ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo). Le téléchargement a été interrompu sans charger le fichier en mémoire.`,
|
|
42
53
|
},
|
|
43
54
|
],
|
|
44
55
|
};
|
|
45
56
|
}
|
|
57
|
+
const uri = `boond://documents/${params.id}`;
|
|
58
|
+
const name = doc.filename ?? `document-${params.id}`;
|
|
59
|
+
const sizeKb = (doc.data.length / 1024).toFixed(0);
|
|
60
|
+
const header = `Document #${params.id} — ${name} (${doc.contentType}, ${sizeKb} Ko)`;
|
|
46
61
|
if (isTextMime(doc.contentType)) {
|
|
47
62
|
let text = doc.data.toString("utf8");
|
|
48
63
|
if (text.length > CHARACTER_LIMIT) {
|
|
@@ -54,22 +69,59 @@ Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accuei
|
|
|
54
69
|
],
|
|
55
70
|
};
|
|
56
71
|
}
|
|
57
|
-
|
|
72
|
+
const raw = (note) => ({
|
|
58
73
|
content: [
|
|
59
74
|
{
|
|
60
75
|
type: "text",
|
|
61
|
-
text:
|
|
76
|
+
text: `${header}, contenu joint en ressource embarquée.${note ? `\n${note}` : ""}`,
|
|
62
77
|
},
|
|
63
78
|
{
|
|
64
79
|
type: "resource",
|
|
65
|
-
resource: {
|
|
66
|
-
uri,
|
|
67
|
-
mimeType: doc.contentType,
|
|
68
|
-
blob: doc.data.toString("base64"),
|
|
69
|
-
},
|
|
80
|
+
resource: { uri, mimeType: doc.contentType, blob: doc.data.toString("base64") },
|
|
70
81
|
},
|
|
71
82
|
],
|
|
72
|
-
};
|
|
83
|
+
});
|
|
84
|
+
if (params.mode === "raw")
|
|
85
|
+
return raw();
|
|
86
|
+
// Issue #263 — an image is handed to the model as `image` content, the
|
|
87
|
+
// only shape hosts reliably pass to its vision input; a blob is opaque.
|
|
88
|
+
if (isImageMime(doc.contentType)) {
|
|
89
|
+
if (doc.data.length > MAX_IMAGE_BYTES) {
|
|
90
|
+
return raw(`⚠️ Image de ${sizeKb} Ko, au-delà des ${Math.round(MAX_IMAGE_BYTES / 1024 / 1024)} Mo affichables en contenu \`image\` : renvoyée en ressource embarquée.`);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
content: [
|
|
94
|
+
{ type: "text", text: `${header} — image jointe.` },
|
|
95
|
+
{ type: "image", data: doc.data.toString("base64"), mimeType: doc.contentType },
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Issue #263 — a 5 MiB PDF is ~6.6 MB of base64 for a few KB of text.
|
|
100
|
+
if (isPdfMime(doc.contentType) || isDocxMime(doc.contentType, doc.filename, doc.data)) {
|
|
101
|
+
let extracted;
|
|
102
|
+
try {
|
|
103
|
+
extracted = isPdfMime(doc.contentType) ? await extractPdfText(doc.data) : extractDocxText(doc.data);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
const why = error instanceof Error ? error.message : String(error);
|
|
107
|
+
return raw(`⚠️ Extraction du texte impossible (${why}) : fichier renvoyé tel quel.`);
|
|
108
|
+
}
|
|
109
|
+
const truncated = extracted.text.length > CHARACTER_LIMIT;
|
|
110
|
+
const text = truncated ? extracted.text.substring(0, CHARACTER_LIMIT) : extracted.text;
|
|
111
|
+
const pages = extracted.pages !== undefined ? `, ${extracted.pages} page(s)` : "";
|
|
112
|
+
const cut = truncated
|
|
113
|
+
? `\n\n[Texte tronqué à ${CHARACTER_LIMIT} caractères sur ${extracted.text.length} — \`mode: "raw"\` pour le fichier complet.]`
|
|
114
|
+
: "";
|
|
115
|
+
return {
|
|
116
|
+
content: [
|
|
117
|
+
{
|
|
118
|
+
type: "text",
|
|
119
|
+
text: `Document #${params.id} — ${name} (${doc.contentType}, ${sizeKb} Ko${pages}) — texte extrait :\n\n${text}${cut}`,
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return raw();
|
|
73
125
|
});
|
|
74
126
|
// Upload a document by URL
|
|
75
127
|
server.registerTool("boond_documents_create", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expenses.d.ts","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"expenses.d.ts","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8D5D"}
|
package/dist/tools/expenses.js
CHANGED
|
@@ -63,7 +63,7 @@ function buildExpenseBody(params) {
|
|
|
63
63
|
* two ids a line cannot omit.
|
|
64
64
|
*/
|
|
65
65
|
function formatExpenseDefaults(response) {
|
|
66
|
-
const entity =
|
|
66
|
+
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
67
67
|
if (!entity)
|
|
68
68
|
return "Aucune donnée par défaut retournée pour cette ressource / ce mois.";
|
|
69
69
|
const attrs = entity.attributes ?? {};
|
|
@@ -128,11 +128,7 @@ export function registerExpenseTools(server) {
|
|
|
128
128
|
schema: ExpenseSearchSchema,
|
|
129
129
|
description: `Recherche des notes de frais dans BoondManager avec filtres par ressource, projet et période.
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
- keywords (string, optional): Termes de recherche
|
|
133
|
-
- resourceId, projectId (string, optional): Filtrer par entité liée
|
|
134
|
-
- startDate, endDate (string, optional): Période (YYYY-MM-DD)
|
|
135
|
-
- page, pageSize: Pagination
|
|
131
|
+
\`resourceId\` / \`projectId\` sont convertis en références \`keywords\` (COMP<id> / PRJ<id>) : l'API n'a pas de paramètre dédié.
|
|
136
132
|
|
|
137
133
|
Returns: Liste des notes de frais correspondantes.`,
|
|
138
134
|
});
|
|
@@ -143,11 +139,6 @@ Returns: Liste des notes de frais correspondantes.`,
|
|
|
143
139
|
|
|
144
140
|
À appeler AVANT \`boond_expenses_create\` : les types de frais sont définis **par agence** et ne figurent pas dans \`boond_application_dictionary\`. Les ids \`projectId\` et \`deliveryId\` sont obligatoires sur chaque ligne et l'API refuse un couple qu'elle ne juge pas imputable sur ce mois.
|
|
145
141
|
|
|
146
|
-
Args:
|
|
147
|
-
- resourceId (string): ID de la ressource
|
|
148
|
-
- term (string): Mois ciblé (YYYY-MM)
|
|
149
|
-
- agencyId (string, optional): Forcer l'agence
|
|
150
|
-
|
|
151
142
|
Returns: Les références à recopier dans \`boond_expenses_create\`.`,
|
|
152
143
|
inputSchema: ExpenseDefaultSchema,
|
|
153
144
|
annotations: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expenses.js","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,mFAAmF;AACnF,MAAM,WAAW,GAAG;IAClB,UAAU,EAAE,eAAe;IAC3B,gBAAgB,EAAE,gBAAgB;IAClC,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AACF,MAAM,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAErE;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,IAAsB;IAC9C,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAC/E,MAAM,GAAG,GAA4B;QACnC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC9E,WAAW,EAAE,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE;QAC5F,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;QAC1B,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;QAC5B,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,IAAI,EAAE;KAC/B,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,MAA+B;IACvD,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,6BAA6B,EAAE,cAAc,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IACrG,MAAM,UAAU,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAC;IACzD,IAAI,6BAA6B,KAAK,SAAS,EAAE,CAAC;QAChD,UAAU,CAAC,oBAAoB,GAAG,EAAE,SAAS,EAAE,6BAA6B,EAAE,CAAC;IACjF,CAAC;IACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,UAAU,CAAC,cAAc,GAAI,cAAqC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,gBAAgB,CAAC,gBAAgB,EAAE,UAAU,EAAE,EAAwB,EAAE;QAC9E,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;QAC/E,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC,CAAC;AACL,CAAC;AASD;;;;;;;;;;;;GAYG;AACH,SAAS,qBAAqB,CAAC,QAAyB;IACtD,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"expenses.js","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { type AccessPolicy } from "../config/access-policy.js";
|
|
4
|
+
import type { JsonApiResource } from "../types.js";
|
|
5
|
+
/**
|
|
6
|
+
* `boond_find` — name (or e-mail) → id, in one call (issue #262).
|
|
7
|
+
*
|
|
8
|
+
* Every other tool takes numeric ids, and until now only the prompts resolved
|
|
9
|
+
* a label: "mets à jour la fiche de Jean Dupont" cost the model a search with
|
|
10
|
+
* the right `keywordsType`, a choice among homonyms, then the `_get`. This
|
|
11
|
+
* tool owns that sequence: it picks the field to search per entity (`fullName`
|
|
12
|
+
* with the `NOM#PRENOM` form the API expects — tried in both orders, since a
|
|
13
|
+
* user types "Jean Dupont" as often as "Dupont Jean" —, `emails`, `name`), and
|
|
14
|
+
* it **refuses to choose** among several exact matches: an ambiguous name
|
|
15
|
+
* comes back as `isError` with the list, never as a silent first-row pick.
|
|
16
|
+
*/
|
|
17
|
+
declare const ENTITY_DOMAIN: {
|
|
18
|
+
readonly candidate: "candidates";
|
|
19
|
+
readonly resource: "resources";
|
|
20
|
+
readonly contact: "contacts";
|
|
21
|
+
readonly company: "companies";
|
|
22
|
+
readonly opportunity: "opportunities";
|
|
23
|
+
readonly project: "projects";
|
|
24
|
+
};
|
|
25
|
+
export type FindEntity = keyof typeof ENTITY_DOMAIN;
|
|
26
|
+
export declare const FindOutputSchema: z.ZodObject<{
|
|
27
|
+
entity: z.ZodString;
|
|
28
|
+
query: z.ZodString;
|
|
29
|
+
count: z.ZodNumber;
|
|
30
|
+
match: z.ZodOptional<z.ZodObject<{
|
|
31
|
+
id: z.ZodString;
|
|
32
|
+
label: z.ZodString;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
ambiguous: z.ZodOptional<z.ZodBoolean>;
|
|
35
|
+
items: z.ZodArray<z.ZodObject<{
|
|
36
|
+
id: z.ZodString;
|
|
37
|
+
label: z.ZodString;
|
|
38
|
+
detail: z.ZodOptional<z.ZodString>;
|
|
39
|
+
exact: z.ZodBoolean;
|
|
40
|
+
}, z.core.$strip>>;
|
|
41
|
+
}, z.core.$strip>;
|
|
42
|
+
/** The search calls to try, in order; the first one that returns a row wins. */
|
|
43
|
+
export declare function searchAttempts(entity: FindEntity, query: string, email?: string): Array<Record<string, unknown>>;
|
|
44
|
+
export interface FoundItem {
|
|
45
|
+
id: string;
|
|
46
|
+
label: string;
|
|
47
|
+
detail?: string;
|
|
48
|
+
exact: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** Human label + disambiguation detail for one search row. */
|
|
51
|
+
export declare function describeRow(entity: FindEntity, row: JsonApiResource): {
|
|
52
|
+
label: string;
|
|
53
|
+
detail?: string;
|
|
54
|
+
};
|
|
55
|
+
/** Exact = same label ignoring case / accents / spacing; for people, both word orders count; for e-mail lookups, the e-mail itself. */
|
|
56
|
+
export declare function isExactMatch(entity: FindEntity, row: JsonApiResource, item: {
|
|
57
|
+
label: string;
|
|
58
|
+
}, query: string, email?: string): boolean;
|
|
59
|
+
export declare function registerFindTool(server: McpServer, policy?: AccessPolicy): void;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=find.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;;;;;;;;;;GAWG;AAEH,QAAA,MAAM,aAAa;;;;;;;CAO4B,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,aAAa,CAAC;AAiBpD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;iBAiB3B,CAAC;AAUH,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAuBhH;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA2BxG;AAED,uIAAuI;AACvI,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAaT;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAqG/E"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { apiSearch, buildSearchQuery } from "../services/boond-client.js";
|
|
3
|
+
import { formatEntitySummary } from "../services/format/summary.js";
|
|
4
|
+
import { progressReporterFrom } from "../services/progress.js";
|
|
5
|
+
import { isDomainAllowed } from "../config/access-policy.js";
|
|
6
|
+
import { composeDescription } from "./description-builders.js";
|
|
7
|
+
/**
|
|
8
|
+
* `boond_find` — name (or e-mail) → id, in one call (issue #262).
|
|
9
|
+
*
|
|
10
|
+
* Every other tool takes numeric ids, and until now only the prompts resolved
|
|
11
|
+
* a label: "mets à jour la fiche de Jean Dupont" cost the model a search with
|
|
12
|
+
* the right `keywordsType`, a choice among homonyms, then the `_get`. This
|
|
13
|
+
* tool owns that sequence: it picks the field to search per entity (`fullName`
|
|
14
|
+
* with the `NOM#PRENOM` form the API expects — tried in both orders, since a
|
|
15
|
+
* user types "Jean Dupont" as often as "Dupont Jean" —, `emails`, `name`), and
|
|
16
|
+
* it **refuses to choose** among several exact matches: an ambiguous name
|
|
17
|
+
* comes back as `isError` with the list, never as a silent first-row pick.
|
|
18
|
+
*/
|
|
19
|
+
const ENTITY_DOMAIN = {
|
|
20
|
+
candidate: "candidates",
|
|
21
|
+
resource: "resources",
|
|
22
|
+
contact: "contacts",
|
|
23
|
+
company: "companies",
|
|
24
|
+
opportunity: "opportunities",
|
|
25
|
+
project: "projects",
|
|
26
|
+
};
|
|
27
|
+
const ALL_ENTITIES = Object.keys(ENTITY_DOMAIN);
|
|
28
|
+
const API_PATH = {
|
|
29
|
+
candidate: "/candidates",
|
|
30
|
+
resource: "/resources",
|
|
31
|
+
contact: "/contacts",
|
|
32
|
+
company: "/companies",
|
|
33
|
+
opportunity: "/opportunities",
|
|
34
|
+
project: "/projects",
|
|
35
|
+
};
|
|
36
|
+
const PEOPLE = new Set(["candidate", "resource", "contact"]);
|
|
37
|
+
/** Bounded: a resolver is a keystroke-cheap lookup, not a listing. */
|
|
38
|
+
const FIND_PAGE_SIZE = 10;
|
|
39
|
+
export const FindOutputSchema = z.object({
|
|
40
|
+
entity: z.string(),
|
|
41
|
+
query: z.string(),
|
|
42
|
+
count: z.number().describe("Nombre de candidats renvoyés par la recherche (≤ 10)"),
|
|
43
|
+
match: z
|
|
44
|
+
.object({ id: z.string(), label: z.string() })
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Présent quand exactement un résultat porte le libellé demandé : l'ID à utiliser."),
|
|
47
|
+
ambiguous: z.boolean().optional().describe("true quand plusieurs résultats portent exactement le libellé demandé"),
|
|
48
|
+
items: z.array(z.object({
|
|
49
|
+
id: z.string(),
|
|
50
|
+
label: z.string(),
|
|
51
|
+
detail: z.string().optional().describe("Élément de désambiguïsation (titre, e-mail, ville, référence, état)"),
|
|
52
|
+
exact: z.boolean().describe("Le libellé correspond exactement à la requête"),
|
|
53
|
+
})),
|
|
54
|
+
});
|
|
55
|
+
function normalize(text) {
|
|
56
|
+
return text.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/\s+/g, " ").trim();
|
|
57
|
+
}
|
|
58
|
+
function str(value) {
|
|
59
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
60
|
+
}
|
|
61
|
+
/** The search calls to try, in order; the first one that returns a row wins. */
|
|
62
|
+
export function searchAttempts(entity, query, email) {
|
|
63
|
+
const q = query.trim();
|
|
64
|
+
if (email) {
|
|
65
|
+
return PEOPLE.has(entity) || entity === "company"
|
|
66
|
+
? [{ keywords: email, keywordsType: "emails" }]
|
|
67
|
+
: [{ keywords: email }];
|
|
68
|
+
}
|
|
69
|
+
if (PEOPLE.has(entity)) {
|
|
70
|
+
const words = q.split(/\s+/);
|
|
71
|
+
if (words.length >= 2) {
|
|
72
|
+
const [first, ...rest] = words;
|
|
73
|
+
const last = rest.join(" ");
|
|
74
|
+
// The API's `fullName` form is `NOM#PRENOM`; "Jean Dupont" and "Dupont Jean" are both common.
|
|
75
|
+
return [
|
|
76
|
+
{ keywords: `${last}#${first ?? ""}`, keywordsType: "fullName" },
|
|
77
|
+
{ keywords: `${first ?? ""}#${last}`, keywordsType: "fullName" },
|
|
78
|
+
{ keywords: q },
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
return [{ keywords: q, keywordsType: "lastName" }, { keywords: q }];
|
|
82
|
+
}
|
|
83
|
+
if (entity === "company")
|
|
84
|
+
return [{ keywords: q, keywordsType: "name" }, { keywords: q }];
|
|
85
|
+
return [{ keywords: q }];
|
|
86
|
+
}
|
|
87
|
+
/** Human label + disambiguation detail for one search row. */
|
|
88
|
+
export function describeRow(entity, row) {
|
|
89
|
+
const a = row.attributes ?? {};
|
|
90
|
+
if (PEOPLE.has(entity)) {
|
|
91
|
+
const label = [str(a.firstName), str(a.lastName)].filter(Boolean).join(" ") || formatEntitySummary(row);
|
|
92
|
+
const detail = [str(a.title), str(a.email1), str(a.town) ?? str(a.city)].filter(Boolean).join(" · ");
|
|
93
|
+
return detail ? { label, detail } : { label };
|
|
94
|
+
}
|
|
95
|
+
if (entity === "company") {
|
|
96
|
+
const label = str(a.name) ?? formatEntitySummary(row);
|
|
97
|
+
const detail = [
|
|
98
|
+
str(a.town) ?? str(a.city),
|
|
99
|
+
str(a.email1),
|
|
100
|
+
a.state !== undefined ? `état ${String(a.state)}` : undefined,
|
|
101
|
+
]
|
|
102
|
+
.filter(Boolean)
|
|
103
|
+
.join(" · ");
|
|
104
|
+
return detail ? { label, detail } : { label };
|
|
105
|
+
}
|
|
106
|
+
// opportunity / project: title first, reference as the disambiguator.
|
|
107
|
+
const label = str(a.title) ?? str(a.reference) ?? formatEntitySummary(row);
|
|
108
|
+
const detail = [
|
|
109
|
+
str(a.reference) !== label ? str(a.reference) : undefined,
|
|
110
|
+
a.state !== undefined ? `état ${String(a.state)}` : undefined,
|
|
111
|
+
]
|
|
112
|
+
.filter(Boolean)
|
|
113
|
+
.join(" · ");
|
|
114
|
+
return detail ? { label, detail } : { label };
|
|
115
|
+
}
|
|
116
|
+
/** Exact = same label ignoring case / accents / spacing; for people, both word orders count; for e-mail lookups, the e-mail itself. */
|
|
117
|
+
export function isExactMatch(entity, row, item, query, email) {
|
|
118
|
+
const a = row.attributes ?? {};
|
|
119
|
+
if (email) {
|
|
120
|
+
const emails = [a.email1, a.email2, a.email3].map((v) => (typeof v === "string" ? v.toLowerCase().trim() : ""));
|
|
121
|
+
return emails.includes(email.toLowerCase().trim());
|
|
122
|
+
}
|
|
123
|
+
const want = normalize(query);
|
|
124
|
+
if (normalize(item.label) === want)
|
|
125
|
+
return true;
|
|
126
|
+
if (PEOPLE.has(entity)) {
|
|
127
|
+
const reversed = [str(a.lastName), str(a.firstName)].filter(Boolean).join(" ");
|
|
128
|
+
return normalize(reversed) === want;
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
export function registerFindTool(server, policy) {
|
|
133
|
+
const entities = ALL_ENTITIES.filter((e) => !policy || isDomainAllowed(policy, ENTITY_DOMAIN[e]));
|
|
134
|
+
if (entities.length === 0)
|
|
135
|
+
return;
|
|
136
|
+
const [firstEntity, ...otherEntities] = entities;
|
|
137
|
+
if (firstEntity === undefined)
|
|
138
|
+
return;
|
|
139
|
+
const FindSchema = z
|
|
140
|
+
.object({
|
|
141
|
+
entity: z.enum([firstEntity, ...otherEntities]).describe("Type d'entité à résoudre."),
|
|
142
|
+
query: z
|
|
143
|
+
.string()
|
|
144
|
+
.min(1)
|
|
145
|
+
.describe("Libellé : « Prénom Nom » ou « Nom Prénom » (personnes), raison sociale (société), intitulé (opportunité, projet)."),
|
|
146
|
+
email: z
|
|
147
|
+
.string()
|
|
148
|
+
.email()
|
|
149
|
+
.optional()
|
|
150
|
+
.describe("Recherche par e-mail à la place du libellé (personnes et sociétés) — plus sûr qu'un nom."),
|
|
151
|
+
})
|
|
152
|
+
.strict();
|
|
153
|
+
server.registerTool("boond_find", {
|
|
154
|
+
title: "Résoudre un nom ou un e-mail en ID",
|
|
155
|
+
description: composeDescription({
|
|
156
|
+
purpose: "Résout un libellé (« Jean Dupont », « ACME », un intitulé de projet) ou un e-mail en ID BoondManager, pour un candidat, une ressource, un contact, une société, une opportunité ou un projet.",
|
|
157
|
+
when: "dès qu'une demande nomme une entité sans donner son ID — avant un `_get`, un `_update`, un onglet ou un filtre `perimeterManagers` / `companyId`.",
|
|
158
|
+
instead: "le `*_search` du domaine quand il faut une liste filtrée (états, périmètre, pagination) plutôt qu'une résolution.",
|
|
159
|
+
behaviour: [
|
|
160
|
+
"Choisit le champ à interroger : `fullName` (essayé dans les deux ordres, l'API attend `NOM#PRENOM`) puis texte libre pour les personnes, `name` pour les sociétés, `emails` quand `email` est fourni ; au plus 10 résultats.",
|
|
161
|
+
"Ne tranche jamais entre homonymes : plusieurs correspondances exactes → `isError` avec la liste (ID + détail) à soumettre à l'utilisateur ; une seule → `structuredContent.match.id`.",
|
|
162
|
+
"Aucune correspondance exacte mais des résultats proches → la liste est renvoyée sans `match` : confirmer avec l'utilisateur avant d'utiliser un ID.",
|
|
163
|
+
],
|
|
164
|
+
returns: "`{ entity, query, count, match?, ambiguous?, items[{ id, label, detail?, exact }] }` et le même contenu en texte. Lecture seule.",
|
|
165
|
+
}),
|
|
166
|
+
inputSchema: FindSchema,
|
|
167
|
+
outputSchema: FindOutputSchema,
|
|
168
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
169
|
+
}, async (params, extra) => {
|
|
170
|
+
const { entity, query, email } = params;
|
|
171
|
+
const report = progressReporterFrom(extra);
|
|
172
|
+
let rows = [];
|
|
173
|
+
for (const attempt of searchAttempts(entity, query, email)) {
|
|
174
|
+
const response = await apiSearch(API_PATH[entity], buildSearchQuery({ ...attempt, pageSize: FIND_PAGE_SIZE }), report);
|
|
175
|
+
rows = Array.isArray(response.data) ? response.data : response.data ? [response.data] : [];
|
|
176
|
+
if (rows.length > 0)
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
const items = rows.map((row) => {
|
|
180
|
+
const described = describeRow(entity, row);
|
|
181
|
+
return { id: row.id, ...described, exact: isExactMatch(entity, row, described, query, email) };
|
|
182
|
+
});
|
|
183
|
+
const exact = items.filter((i) => i.exact);
|
|
184
|
+
const structured = {
|
|
185
|
+
entity,
|
|
186
|
+
query: email ?? query,
|
|
187
|
+
count: items.length,
|
|
188
|
+
items,
|
|
189
|
+
...(exact.length === 1 && exact[0] ? { match: { id: exact[0].id, label: exact[0].label } } : {}),
|
|
190
|
+
...(exact.length > 1 ? { ambiguous: true } : {}),
|
|
191
|
+
};
|
|
192
|
+
const lines = items.map((i) => `- #${i.id} ${i.label}${i.detail ? ` (${i.detail})` : ""}${i.exact ? " ✓" : ""}`);
|
|
193
|
+
const what = email ?? query;
|
|
194
|
+
if (items.length === 0) {
|
|
195
|
+
return {
|
|
196
|
+
content: [{ type: "text", text: `Aucun(e) ${entity} trouvé(e) pour « ${what} ».` }],
|
|
197
|
+
structuredContent: structured,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
if (exact.length > 1) {
|
|
201
|
+
return {
|
|
202
|
+
isError: true,
|
|
203
|
+
content: [
|
|
204
|
+
{
|
|
205
|
+
type: "text",
|
|
206
|
+
text: `Ambigu : ${exact.length} ${entity}(s) portent exactement « ${what} ». Demander à l'utilisateur lequel :\n${lines.join("\n")}`,
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
structuredContent: structured,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const head = exact.length === 1 && exact[0]
|
|
213
|
+
? `${entity} « ${what} » → ID ${exact[0].id} (${exact[0].label}).`
|
|
214
|
+
: `Aucune correspondance exacte pour « ${what} » — ${items.length} résultat(s) proche(s), à confirmer :`;
|
|
215
|
+
return {
|
|
216
|
+
content: [{ type: "text", text: `${head}\n${lines.join("\n")}` }],
|
|
217
|
+
structuredContent: structured,
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=find.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAqB,MAAM,4BAA4B,CAAC;AAGhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;GAWG;AAEH,MAAM,aAAa,GAAG;IACpB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,eAAe;IAC5B,OAAO,EAAE,UAAU;CAC0B,CAAC;AAGhD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAiB,CAAC;AAEhE,MAAM,QAAQ,GAA+B;IAC3C,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,YAAY;IACrB,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAa,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzE,sEAAsE;AACtE,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IAClF,KAAK,EAAE,CAAC;SACL,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;SAC7C,QAAQ,EAAE;SACV,QAAQ,CAAC,kFAAkF,CAAC;IAC/F,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;IAClH,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;QAC7G,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;KAC7E,CAAC,CACH;CACF,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/F,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,MAAkB,EAAE,KAAa,EAAE,KAAc;IAC9E,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,SAAS;YAC/C,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;YAC/C,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,8FAA8F;YAC9F,OAAO;gBACL,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE;gBAChE,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE;gBAChE,EAAE,QAAQ,EAAE,CAAC,EAAE;aAChB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1F,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AASD,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,MAAkB,EAAE,GAAoB;IAClE,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACxG,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrG,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG;YACb,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1B,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YACb,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;SAC9D;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IACD,sEAAsE;IACtE,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KAC9D;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,uIAAuI;AACvI,MAAM,UAAU,YAAY,CAC1B,MAAkB,EAClB,GAAoB,EACpB,IAAuB,EACvB,KAAa,EACb,KAAc;IAEd,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;IAC/B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChH,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/E,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAqB;IACvE,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,MAAM,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,GAAG,QAAQ,CAAC;IACjD,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO;IAEtC,MAAM,UAAU,GAAG,CAAC;SACjB,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACrF,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CACP,mHAAmH,CACpH;QACH,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,KAAK,EAAE;aACP,QAAQ,EAAE;aACV,QAAQ,CAAC,0FAA0F,CAAC;KACxG,CAAC;SACD,MAAM,EAAE,CAAC;IAEZ,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EAAE,kBAAkB,CAAC;YAC9B,OAAO,EACL,+LAA+L;YACjM,IAAI,EAAE,mJAAmJ;YACzJ,OAAO,EACL,mHAAmH;YACrH,SAAS,EAAE;gBACT,8NAA8N;gBAC9N,uLAAuL;gBACvL,qJAAqJ;aACtJ;YACD,OAAO,EACL,kIAAkI;SACrI,CAAC;QACF,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACxG,EACD,KAAK,EAAE,MAAM,EAAE,KAAc,EAAE,EAAE;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAA+D,CAAC;QACjG,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,GAAsB,EAAE,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,QAAQ,CAAC,MAAM,CAAC,EAChB,gBAAgB,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAC1D,MAAM,CACP,CAAC;YACF,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM;QAC7B,CAAC;QACD,MAAM,KAAK,GAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QACjG,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAqC;YACnD,MAAM;YACN,KAAK,EAAE,KAAK,IAAI,KAAK;YACrB,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,KAAK;YACL,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjH,MAAM,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,MAAM,qBAAqB,IAAI,KAAK,EAAE,CAAC;gBAC5F,iBAAiB,EAAE,UAAU;aAC9B,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,YAAY,KAAK,CAAC,MAAM,IAAI,MAAM,4BAA4B,IAAI,0CAA0C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACrI;iBACF;gBACD,iBAAiB,EAAE,UAAU;aAC9B,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,GAAG,MAAM,MAAM,IAAI,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;YAClE,CAAC,CAAC,uCAAuC,IAAI,QAAQ,KAAK,CAAC,MAAM,uCAAuC,CAAC;QAC7G,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAC1E,iBAAiB,EAAE,UAAU;SAC9B,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/flags.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { AttachedFlagInput } from "../schemas/index.js";
|
|
3
|
+
/** `/flags` payload (issue #254): `name` + optional `mainManager` relationship (`models.flag`). */
|
|
4
|
+
export declare function buildFlagBody(params: Record<string, unknown>): unknown;
|
|
5
|
+
/** `POST /attached-flags` payload: the flag and the flagged record, both as relationships (`dependsOn` is the polymorphic pattern of `models.task`). */
|
|
6
|
+
export declare function buildAttachedFlagBody(params: AttachedFlagInput): unknown;
|
|
2
7
|
export declare function registerFlagTools(server: McpServer): void;
|
|
3
8
|
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAmCjF,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAKtE;AAED,wJAAwJ;AACxJ,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAKxE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiGzD"}
|