boondmanager-mcp-server 2.16.0 → 2.18.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 +57 -4
- 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/config/transport-kind.d.ts +8 -0
- package/dist/config/transport-kind.d.ts.map +1 -0
- package/dist/config/transport-kind.js +13 -0
- package/dist/config/transport-kind.js.map +1 -0
- package/dist/constants.d.ts +20 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +32 -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 +32 -20
- 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 +1045 -163
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +979 -330
- 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 +23 -0
- package/dist/services/format/summary.d.ts.map +1 -0
- package/dist/services/format/summary.js +194 -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 +85 -0
- package/dist/services/http/transport.d.ts.map +1 -0
- package/dist/services/http/transport.js +283 -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/services/upload-source.d.ts +31 -0
- package/dist/services/upload-source.d.ts.map +1 -0
- package/dist/services/upload-source.js +180 -0
- package/dist/services/upload-source.js.map +1 -0
- 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/candidates.d.ts +7 -0
- package/dist/tools/candidates.d.ts.map +1 -1
- package/dist/tools/candidates.js +96 -1
- package/dist/tools/candidates.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 +45 -17
- 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 +47 -4
- package/dist/tools/description-builders.js.map +1 -1
- package/dist/tools/documents.d.ts.map +1 -1
- package/dist/tools/documents.js +113 -27
- 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/usage-guidance.d.ts.map +1 -1
- package/dist/tools/usage-guidance.js +12 -3
- package/dist/tools/usage-guidance.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 +2 -2
- package/package.json +6 -5
package/dist/tools/deliveries.js
CHANGED
|
@@ -1,28 +1,42 @@
|
|
|
1
|
-
import { DeliverySearchSchema,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
quantity
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
})
|
|
22
|
-
|
|
1
|
+
import { DeliveryCreateSchema, DeliverySearchSchema, DeliveryUpdateSchema } from "../schemas/index.js";
|
|
2
|
+
import { buildJsonApiBody, registerCreateTool, registerDeleteTool, registerGetTool, registerSearchTool, registerUpdateTool, } from "./crud-factory.js";
|
|
3
|
+
import { composeDescription } from "./description-builders.js";
|
|
4
|
+
const OPTS = {
|
|
5
|
+
entityName: "livraison (CRA)",
|
|
6
|
+
entityNamePlural: "livraisons",
|
|
7
|
+
apiPath: "/deliveries",
|
|
8
|
+
prefix: "boond_deliveries",
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* `/deliveries` payload: the tool's convenience names (`quantity`, `unitPrice`,
|
|
12
|
+
* `note`) map onto the API attributes, and the two mandatory ids become the
|
|
13
|
+
* `project` / `dependsOn` relationships.
|
|
14
|
+
*/
|
|
15
|
+
function deliveryAttributes(params) {
|
|
16
|
+
const { quantity, unitPrice, note, ...attrs } = params;
|
|
17
|
+
return {
|
|
18
|
+
...attrs,
|
|
19
|
+
...(quantity !== undefined ? { numberOfDaysInvoicedOrQuantity: quantity } : {}),
|
|
20
|
+
...(unitPrice !== undefined ? { averageDailyPriceExcludingTax: unitPrice } : {}),
|
|
21
|
+
...(unitPrice !== undefined ? { forceAverageDailyPriceExcludingTax: true } : {}),
|
|
22
|
+
...(note ? { informationComments: note } : {}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function buildDeliveryBody(params) {
|
|
26
|
+
const { projectId, resourceId, ...rest } = params;
|
|
27
|
+
return buildJsonApiBody("delivery", deliveryAttributes(rest), undefined, {
|
|
28
|
+
project: { id: String(projectId), type: "project" },
|
|
29
|
+
dependsOn: { id: String(resourceId), type: "resource" },
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** PUT /deliveries/{id}: attributes only — the project / resource attachment is never moved by an update (issue #252). */
|
|
33
|
+
export function buildDeliveryUpdateBody(params) {
|
|
34
|
+
const { id, ...rest } = params;
|
|
35
|
+
return buildJsonApiBody("delivery", deliveryAttributes(rest), String(id));
|
|
36
|
+
}
|
|
23
37
|
export function registerDeliveryTools(server) {
|
|
24
|
-
server
|
|
25
|
-
title: "
|
|
38
|
+
registerCreateTool(server, OPTS, DeliveryCreateSchema, buildDeliveryBody, {
|
|
39
|
+
title: "Créer une prestation/livraison",
|
|
26
40
|
description: composeDescription({
|
|
27
41
|
purpose: "Crée une prestation (livraison) rattachée à un projet et à une ressource.",
|
|
28
42
|
when: "pour ouvrir la ligne de mission qui rendra la ressource facturable sur ce projet.",
|
|
@@ -32,83 +46,25 @@ export function registerDeliveryTools(server) {
|
|
|
32
46
|
"L'ID de prestation retourné est celui qu'exigent les lignes de note de frais (`boond_expenses_create`).",
|
|
33
47
|
"Écriture non idempotente.",
|
|
34
48
|
],
|
|
35
|
-
returns: "confirmation et fiche de la prestation créée.",
|
|
49
|
+
returns: "confirmation et fiche de la prestation créée, avec son ID dans `structuredContent.id`.",
|
|
36
50
|
}),
|
|
37
|
-
inputSchema: DeliveryCreateSchema,
|
|
38
|
-
annotations: {
|
|
39
|
-
readOnlyHint: false,
|
|
40
|
-
destructiveHint: false,
|
|
41
|
-
idempotentHint: false,
|
|
42
|
-
openWorldHint: false,
|
|
43
|
-
},
|
|
44
|
-
}, async (params) => {
|
|
45
|
-
const { projectId, resourceId, quantity, unitPrice, note, ...attrs } = params;
|
|
46
|
-
const apiAttrs = {
|
|
47
|
-
...attrs,
|
|
48
|
-
...(quantity !== undefined ? { numberOfDaysInvoicedOrQuantity: quantity } : {}),
|
|
49
|
-
...(unitPrice !== undefined ? { averageDailyPriceExcludingTax: unitPrice } : {}),
|
|
50
|
-
...(unitPrice !== undefined ? { forceAverageDailyPriceExcludingTax: true } : {}),
|
|
51
|
-
...(note ? { informationComments: note } : {}),
|
|
52
|
-
};
|
|
53
|
-
const body = buildJsonApiBody("delivery", apiAttrs);
|
|
54
|
-
body.data.relationships = {
|
|
55
|
-
project: { data: { id: projectId, type: "project" } },
|
|
56
|
-
dependsOn: { data: { id: resourceId, type: "resource" } },
|
|
57
|
-
};
|
|
58
|
-
const response = await apiRequest("/deliveries", "POST", body);
|
|
59
|
-
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
60
|
-
return {
|
|
61
|
-
content: [
|
|
62
|
-
{
|
|
63
|
-
type: "text",
|
|
64
|
-
text: `Prestation/livraison creee avec succes.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
};
|
|
68
51
|
});
|
|
69
|
-
|
|
52
|
+
// The list lives on `/deliveries-groupments`, the detail on `/deliveries/{id}`.
|
|
53
|
+
registerSearchTool(server, { ...OPTS, apiPath: "/deliveries-groupments" }, {
|
|
54
|
+
schema: DeliverySearchSchema,
|
|
70
55
|
title: "Rechercher des livraisons / CRA",
|
|
71
|
-
description: `Recherche des
|
|
56
|
+
description: `Recherche des prestations / livraisons dans BoondManager par projet, société, ressource, état (\`deliveryStates\`, \`projectStates\`), période (\`period: "running"\` + dates pour les prestations en cours) et périmètre (\`perimeter*\`).
|
|
72
57
|
|
|
73
|
-
|
|
74
|
-
- keywords (string, optional): Termes de recherche
|
|
75
|
-
- projectId, companyId (string, optional): Filtrer par entite liee
|
|
76
|
-
- startDate, endDate (string, optional): Periode (YYYY-MM-DD)
|
|
77
|
-
- page, pageSize: Pagination
|
|
58
|
+
\`projectId\` / \`companyId\` sont convertis en références \`keywords\` (PRJ<id> / CSOC<id>) : l'API n'a pas de paramètre dédié.
|
|
78
59
|
|
|
79
60
|
Returns: Liste des livraisons correspondantes.`,
|
|
80
|
-
inputSchema: DeliverySearchSchema,
|
|
81
|
-
annotations: {
|
|
82
|
-
readOnlyHint: true,
|
|
83
|
-
destructiveHint: false,
|
|
84
|
-
idempotentHint: true,
|
|
85
|
-
openWorldHint: true,
|
|
86
|
-
},
|
|
87
|
-
}, async (params, extra) => {
|
|
88
|
-
const query = buildSearchQuery(params);
|
|
89
|
-
const response = await apiSearch("/deliveries-groupments", query, progressReporterFrom(extra));
|
|
90
|
-
return {
|
|
91
|
-
content: [{ type: "text", text: formatListResponse(response, "livraison", params.fields) }],
|
|
92
|
-
};
|
|
93
61
|
});
|
|
94
|
-
server
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}),
|
|
100
|
-
inputSchema: IdSchema,
|
|
101
|
-
annotations: {
|
|
102
|
-
readOnlyHint: true,
|
|
103
|
-
destructiveHint: false,
|
|
104
|
-
idempotentHint: true,
|
|
105
|
-
openWorldHint: false,
|
|
106
|
-
},
|
|
107
|
-
}, async (params) => {
|
|
108
|
-
const response = await apiRequest(`/deliveries/${params.id}`);
|
|
109
|
-
return {
|
|
110
|
-
content: [{ type: "text", text: formatDetailResponse(response) }],
|
|
111
|
-
};
|
|
62
|
+
registerGetTool(server, OPTS, { withTab: false, title: "Détails d'une livraison / CRA" });
|
|
63
|
+
// Issue #252: extend a delivery (endDate), change a daily rate, close it.
|
|
64
|
+
registerUpdateTool(server, OPTS, DeliveryUpdateSchema, buildDeliveryUpdateBody, {
|
|
65
|
+
method: "PUT",
|
|
66
|
+
title: "Modifier une prestation/livraison",
|
|
112
67
|
});
|
|
68
|
+
registerDeleteTool(server, OPTS, { title: "Supprimer une prestation/livraison" });
|
|
113
69
|
}
|
|
114
70
|
//# sourceMappingURL=deliveries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliveries.js","sourceRoot":"","sources":["../../src/tools/deliveries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"deliveries.js","sourceRoot":"","sources":["../../src/tools/deliveries.ts"],"names":[],"mappings":"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"}
|
|
@@ -107,7 +107,6 @@ export interface EntityWording {
|
|
|
107
107
|
* wording by having already mentioned `pageSize`.
|
|
108
108
|
*/
|
|
109
109
|
export declare function defaultSearchDescription(opts: EntityWording): string;
|
|
110
|
-
/** Default detail description; `withTab` mirrors `registerGetTool`. */
|
|
111
110
|
export declare function defaultGetDescription(opts: EntityWording & {
|
|
112
111
|
withTab: boolean;
|
|
113
112
|
}): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"description-builders.d.ts","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAgBpE;AAID;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAEuC,CAAC;AAE1E;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,QAE+C,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"description-builders.d.ts","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAgBpE;AAID;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAEuC,CAAC;AAE1E;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,QAE+C,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,QAE2D,CAAC;AAI1F,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAOpE;AA8CD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAiBxF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAWpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAYpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAYpE;AAID,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAS/D"}
|
|
@@ -57,7 +57,7 @@ export const PAGINATION_INERT_DISCLOSURE = "Pagination sans effet : cette route
|
|
|
57
57
|
* *never sent*, and *silently ignored*.
|
|
58
58
|
*/
|
|
59
59
|
export const FIELDS_DISCLOSURE = "`fields` : projection côté MCP, jamais transmise à l'API — remplace le résumé par les seuls " +
|
|
60
|
-
"attributs listés (noms inconnus ignorés). À utiliser sur les grosses pages.";
|
|
60
|
+
"attributs/relations listés (noms inconnus ignorés). À utiliser sur les grosses pages.";
|
|
61
61
|
/**
|
|
62
62
|
* Default search description for a reference/admin domain: no endpoint-specific
|
|
63
63
|
* filter vocabulary, so the value it adds over the schema is the pointer to the
|
|
@@ -80,6 +80,47 @@ export function defaultSearchDescription(opts) {
|
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
/** Default detail description; `withTab` mirrors `registerGetTool`. */
|
|
83
|
+
/** The six entities `boond_find` resolves (issue #262); the hint is only true for them. */
|
|
84
|
+
const FIND_PREFIXES = new Set([
|
|
85
|
+
"boond_candidates",
|
|
86
|
+
"boond_resources",
|
|
87
|
+
"boond_contacts",
|
|
88
|
+
"boond_companies",
|
|
89
|
+
"boond_opportunities",
|
|
90
|
+
"boond_projects",
|
|
91
|
+
]);
|
|
92
|
+
function findHint(prefix) {
|
|
93
|
+
return FIND_PREFIXES.has(prefix) ? ", ou `boond_find` pour résoudre un nom / un e-mail en ID" : "";
|
|
94
|
+
}
|
|
95
|
+
/** Entities `boond_rights_get` covers (issue #257) — `GET /{entity}/{id}/rights` exists for them. */
|
|
96
|
+
const RIGHTS_PREFIXES = new Set([
|
|
97
|
+
"boond_candidates",
|
|
98
|
+
"boond_resources",
|
|
99
|
+
"boond_contacts",
|
|
100
|
+
"boond_companies",
|
|
101
|
+
"boond_opportunities",
|
|
102
|
+
"boond_projects",
|
|
103
|
+
"boond_actions",
|
|
104
|
+
"boond_positionings",
|
|
105
|
+
"boond_invoices",
|
|
106
|
+
"boond_orders",
|
|
107
|
+
"boond_deliveries",
|
|
108
|
+
"boond_purchases",
|
|
109
|
+
"boond_payments",
|
|
110
|
+
"boond_provider_invoices",
|
|
111
|
+
"boond_products",
|
|
112
|
+
"boond_contracts",
|
|
113
|
+
"boond_advantages",
|
|
114
|
+
"boond_timesheets",
|
|
115
|
+
"boond_expenses",
|
|
116
|
+
"boond_absences",
|
|
117
|
+
"boond_agencies",
|
|
118
|
+
]);
|
|
119
|
+
function rightsHint(prefix) {
|
|
120
|
+
return RIGHTS_PREFIXES.has(prefix)
|
|
121
|
+
? ["`boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité)."]
|
|
122
|
+
: [];
|
|
123
|
+
}
|
|
83
124
|
export function defaultGetDescription(opts) {
|
|
84
125
|
const behaviour = [
|
|
85
126
|
`Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de \`${opts.prefix}_search\`, jamais d'une supposition.`,
|
|
@@ -91,7 +132,7 @@ export function defaultGetDescription(opts) {
|
|
|
91
132
|
return composeDescription({
|
|
92
133
|
purpose: `Récupère la fiche complète d'un(e) ${opts.entityName} par son ID numérique.`,
|
|
93
134
|
when: `après un \`${opts.prefix}_search\`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste.`,
|
|
94
|
-
instead: `\`${opts.prefix}_search\` si l'ID n'est pas connu (cet outil n'accepte pas de nom).`,
|
|
135
|
+
instead: `\`${opts.prefix}_search\` si l'ID n'est pas connu (cet outil n'accepte pas de nom)${findHint(opts.prefix)}.`,
|
|
95
136
|
behaviour,
|
|
96
137
|
returns: `JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.`,
|
|
97
138
|
});
|
|
@@ -112,10 +153,11 @@ export function defaultUpdateDescription(opts) {
|
|
|
112
153
|
return composeDescription({
|
|
113
154
|
purpose: `Met à jour un(e) ${opts.entityName} existant(e), identifié(e) par son ID.`,
|
|
114
155
|
when: `pour modifier quelques champs d'un enregistrement déjà en base.`,
|
|
115
|
-
instead: `\`${opts.prefix}_create\` si l'enregistrement n'existe pas encore.`,
|
|
156
|
+
instead: `\`${opts.prefix}_create\` si l'enregistrement n'existe pas encore${findHint(opts.prefix)}.`,
|
|
116
157
|
behaviour: [
|
|
117
158
|
"Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place.",
|
|
118
159
|
"Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés.",
|
|
160
|
+
...rightsHint(opts.prefix),
|
|
119
161
|
],
|
|
120
162
|
returns: `confirmation et fiche mise à jour.`,
|
|
121
163
|
});
|
|
@@ -126,6 +168,7 @@ export function defaultDeleteDescription(opts) {
|
|
|
126
168
|
when: `uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec \`${opts.prefix}_get\`.`,
|
|
127
169
|
instead: `\`${opts.prefix}_update\` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle.`,
|
|
128
170
|
behaviour: [
|
|
171
|
+
...rightsHint(opts.prefix),
|
|
129
172
|
"⚠️ Irréversible, sans corbeille côté API.",
|
|
130
173
|
"Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement.",
|
|
131
174
|
],
|
|
@@ -145,7 +188,7 @@ export function tabDescription(spec) {
|
|
|
145
188
|
purpose: `Récupère ${scope} d'un(e) ${spec.entityName}, par son ID.`,
|
|
146
189
|
when: `pour ne charger que cette section, sans le reste de la fiche.`,
|
|
147
190
|
instead: `\`${spec.prefix}_get\` pour la fiche de base, ou \`${spec.prefix}_search\` si l'ID est inconnu.`,
|
|
148
|
-
behaviour: spec.behaviour,
|
|
191
|
+
...(spec.behaviour !== undefined ? { behaviour: spec.behaviour } : {}),
|
|
149
192
|
returns: `${spec.returns} Lecture seule.`,
|
|
150
193
|
});
|
|
151
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"description-builders.js","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAoDpF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,MAAM,GAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1D,IAAI,IAAI,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1F,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjF,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,+BAA+B,aAAa,YAAY,iBAAiB,KAAK;IAC9E,cAAc,eAAe,0CAA0C,CAAC;AAE1E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GACtC,0EAA0E;IAC1E,qFAAqF,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAC5B,8FAA8F;IAC9F,
|
|
1
|
+
{"version":3,"file":"description-builders.js","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAoDpF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,MAAM,GAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1D,IAAI,IAAI,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1F,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjF,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,+BAA+B,aAAa,YAAY,iBAAiB,KAAK;IAC9E,cAAc,eAAe,0CAA0C,CAAC;AAE1E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GACtC,0EAA0E;IAC1E,qFAAqF,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAC5B,8FAA8F;IAC9F,uFAAuF,CAAC;AAa1F;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAmB;IAC1D,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,0BAA0B,IAAI,CAAC,gBAAgB,gDAAgD;QACxG,IAAI,EAAE,+BAA+B,IAAI,CAAC,UAAU,8CAA8C,IAAI,CAAC,gBAAgB,gBAAgB;QACvI,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,wFAAwF,IAAI,CAAC,UAAU,GAAG;QACnI,OAAO,EAAE,6HAA6H;KACvI,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,2FAA2F;AAC3F,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,qBAAqB;IACrB,gBAAgB;CACjB,CAAC,CAAC;AACH,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,0DAA0D,CAAC,CAAC,CAAC,EAAE,CAAC;AACrG,CAAC;AAED,qGAAqG;AACrG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,qBAAqB;IACrB,gBAAgB;IAChB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,yBAAyB;IACzB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;CACjB,CAAC,CAAC;AACH,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QAChC,CAAC,CAAC,CAAC,yGAAyG,CAAC;QAC7G,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAA0C;IAC9E,MAAM,SAAS,GAAa;QAC1B,mFAAmF,IAAI,CAAC,MAAM,sCAAsC;KACrI,CAAC;IACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,SAAS,CAAC,OAAO,CACf,iGAAiG;YAC/F,8EAA8E,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,sCAAsC,IAAI,CAAC,UAAU,wBAAwB;QACtF,IAAI,EAAE,cAAc,IAAI,CAAC,MAAM,uFAAuF;QACtH,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,qEAAqE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;QACtH,SAAS;QACT,OAAO,EAAE,oFAAoF;KAC9F,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAmB;IAC1D,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,cAAc,IAAI,CAAC,UAAU,qBAAqB;QAC3D,IAAI,EAAE,sBAAsB,IAAI,CAAC,UAAU,iBAAiB;QAC5D,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,4DAA4D,IAAI,CAAC,MAAM,0DAA0D;QAC1J,SAAS,EAAE;YACT,oHAAoH;YACpH,qJAAqJ;SACtJ;QACD,OAAO,EAAE,2HAA2H;KACrI,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAmB;IAC1D,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,oBAAoB,IAAI,CAAC,UAAU,wCAAwC;QACpF,IAAI,EAAE,iEAAiE;QACvE,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,oDAAoD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;QACrG,SAAS,EAAE;YACT,iGAAiG;YACjG,gFAAgF;YAChF,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;SAC3B;QACD,OAAO,EAAE,oCAAoC;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAmB;IAC1D,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,iCAAiC,IAAI,CAAC,UAAU,mBAAmB;QAC5E,IAAI,EAAE,yFAAyF,IAAI,CAAC,MAAM,SAAS;QACnH,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,+HAA+H;QACxJ,SAAS,EAAE;YACT,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,2CAA2C;YAC3C,6NAA6N;SAC9N;QACD,OAAO,EAAE,sGAAsG;KAChH,CAAC,CAAC;AACL,CAAC;AAeD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAwB;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAChF,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,YAAY,KAAK,YAAY,IAAI,CAAC,UAAU,eAAe;QACpE,IAAI,EAAE,+DAA+D;QACrE,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,sCAAsC,IAAI,CAAC,MAAM,gCAAgC;QAC1G,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,iBAAiB;KAC1C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwN7D"}
|
package/dist/tools/documents.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
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, INLINE_UPLOAD_MAX_BYTES } from "../constants.js";
|
|
5
|
+
import { decodeInlineUpload, readLocalUpload, UploadRejectedError } from "../services/upload-source.js";
|
|
5
6
|
import { registerDeleteTool, MutationOutputSchema } from "./crud-factory.js";
|
|
7
|
+
import { extractDocxText, extractPdfText, isDocxMime, isImageMime, isPdfMime } from "../services/document-text.js";
|
|
6
8
|
/** Mime types rendered as plain text instead of a base64 blob. */
|
|
7
9
|
function isTextMime(mime) {
|
|
8
10
|
return mime.startsWith("text/") || /[+/](json|xml)$|^application\/(json|xml|csv)$/.test(mime);
|
|
@@ -11,15 +13,15 @@ export function registerDocumentTools(server) {
|
|
|
11
13
|
// Download a document (CV, justificatif, contrat...)
|
|
12
14
|
server.registerTool("boond_documents_get", {
|
|
13
15
|
title: "Télécharger un document",
|
|
14
|
-
description: `Télécharge
|
|
16
|
+
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
17
|
|
|
16
18
|
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
19
|
|
|
18
|
-
|
|
20
|
+
\`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
21
|
|
|
20
|
-
Returns :
|
|
22
|
+
Returns : texte extrait, contenu \`image\`, ou ressource embarquée (\`blob\` base64) selon le format et le mode.
|
|
21
23
|
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:
|
|
24
|
+
inputSchema: DocumentGetSchema,
|
|
23
25
|
annotations: {
|
|
24
26
|
readOnlyHint: true,
|
|
25
27
|
destructiveHint: false,
|
|
@@ -28,21 +30,35 @@ Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accuei
|
|
|
28
30
|
},
|
|
29
31
|
}, async (params, extra) => {
|
|
30
32
|
// 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
|
-
|
|
33
|
+
// response announces a Content-Length (see readDownloadBody). The size
|
|
34
|
+
// cap is enforced *during* the download (#235): an announced size over
|
|
35
|
+
// the cap is refused before the body is read, an unannounced one is cut
|
|
36
|
+
// the moment it crosses it — never buffered whole and then refused.
|
|
37
|
+
let doc;
|
|
38
|
+
try {
|
|
39
|
+
doc = await apiDownload(`/documents/${params.id}`, progressReporterFrom(extra), {
|
|
40
|
+
maxBytes: MAX_DOCUMENT_BYTES,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
if (!(err instanceof DownloadTooLargeError))
|
|
45
|
+
throw err;
|
|
46
|
+
const mb = (n) => (n / 1024 / 1024).toFixed(1);
|
|
47
|
+
const size = err.announced ? `${mb(err.bytes)} Mo` : `plus de ${mb(err.bytes)} Mo`;
|
|
36
48
|
return {
|
|
37
49
|
isError: true,
|
|
38
50
|
content: [
|
|
39
51
|
{
|
|
40
52
|
type: "text",
|
|
41
|
-
text: `❌ Document #${params.id}
|
|
53
|
+
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
54
|
},
|
|
43
55
|
],
|
|
44
56
|
};
|
|
45
57
|
}
|
|
58
|
+
const uri = `boond://documents/${params.id}`;
|
|
59
|
+
const name = doc.filename ?? `document-${params.id}`;
|
|
60
|
+
const sizeKb = (doc.data.length / 1024).toFixed(0);
|
|
61
|
+
const header = `Document #${params.id} — ${name} (${doc.contentType}, ${sizeKb} Ko)`;
|
|
46
62
|
if (isTextMime(doc.contentType)) {
|
|
47
63
|
let text = doc.data.toString("utf8");
|
|
48
64
|
if (text.length > CHARACTER_LIMIT) {
|
|
@@ -54,29 +70,69 @@ Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accuei
|
|
|
54
70
|
],
|
|
55
71
|
};
|
|
56
72
|
}
|
|
57
|
-
|
|
73
|
+
const raw = (note) => ({
|
|
58
74
|
content: [
|
|
59
75
|
{
|
|
60
76
|
type: "text",
|
|
61
|
-
text:
|
|
77
|
+
text: `${header}, contenu joint en ressource embarquée.${note ? `\n${note}` : ""}`,
|
|
62
78
|
},
|
|
63
79
|
{
|
|
64
80
|
type: "resource",
|
|
65
|
-
resource: {
|
|
66
|
-
uri,
|
|
67
|
-
mimeType: doc.contentType,
|
|
68
|
-
blob: doc.data.toString("base64"),
|
|
69
|
-
},
|
|
81
|
+
resource: { uri, mimeType: doc.contentType, blob: doc.data.toString("base64") },
|
|
70
82
|
},
|
|
71
83
|
],
|
|
72
|
-
};
|
|
84
|
+
});
|
|
85
|
+
if (params.mode === "raw")
|
|
86
|
+
return raw();
|
|
87
|
+
// Issue #263 — an image is handed to the model as `image` content, the
|
|
88
|
+
// only shape hosts reliably pass to its vision input; a blob is opaque.
|
|
89
|
+
if (isImageMime(doc.contentType)) {
|
|
90
|
+
if (doc.data.length > MAX_IMAGE_BYTES) {
|
|
91
|
+
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.`);
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
content: [
|
|
95
|
+
{ type: "text", text: `${header} — image jointe.` },
|
|
96
|
+
{ type: "image", data: doc.data.toString("base64"), mimeType: doc.contentType },
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Issue #263 — a 5 MiB PDF is ~6.6 MB of base64 for a few KB of text.
|
|
101
|
+
if (isPdfMime(doc.contentType) || isDocxMime(doc.contentType, doc.filename, doc.data)) {
|
|
102
|
+
let extracted;
|
|
103
|
+
try {
|
|
104
|
+
extracted = isPdfMime(doc.contentType) ? await extractPdfText(doc.data) : extractDocxText(doc.data);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const why = error instanceof Error ? error.message : String(error);
|
|
108
|
+
return raw(`⚠️ Extraction du texte impossible (${why}) : fichier renvoyé tel quel.`);
|
|
109
|
+
}
|
|
110
|
+
const truncated = extracted.text.length > CHARACTER_LIMIT;
|
|
111
|
+
const text = truncated ? extracted.text.substring(0, CHARACTER_LIMIT) : extracted.text;
|
|
112
|
+
const pages = extracted.pages !== undefined ? `, ${extracted.pages} page(s)` : "";
|
|
113
|
+
const cut = truncated
|
|
114
|
+
? `\n\n[Texte tronqué à ${CHARACTER_LIMIT} caractères sur ${extracted.text.length} — \`mode: "raw"\` pour le fichier complet.]`
|
|
115
|
+
: "";
|
|
116
|
+
return {
|
|
117
|
+
content: [
|
|
118
|
+
{
|
|
119
|
+
type: "text",
|
|
120
|
+
text: `Document #${params.id} — ${name} (${doc.contentType}, ${sizeKb} Ko${pages}) — texte extrait :\n\n${text}${cut}`,
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return raw();
|
|
73
126
|
});
|
|
74
|
-
// Upload a document by URL
|
|
127
|
+
// Upload a document: by URL, by local path (opt-in, stdio) or inline base64
|
|
75
128
|
server.registerTool("boond_documents_create", {
|
|
76
129
|
title: "Téléverser un document",
|
|
77
|
-
description: `Attache un document à une entité BoondManager
|
|
130
|
+
description: `Attache un document à une entité BoondManager. Exactement une source par appel :
|
|
131
|
+
- \`fileUrl\` : URL https que BoondManager télécharge lui-même (aucun octet ne transite par le serveur MCP) ;
|
|
132
|
+
- \`filePath\` : chemin absolu d'un fichier local, lu par le serveur MCP — transport stdio uniquement, et seulement sous un répertoire listé dans \`BOOND_MCP_UPLOAD_DIRS\` (désactivé par défaut) ;
|
|
133
|
+
- \`fileContent\` (base64) + \`fileName\` : petit fichier passé inline, ${Math.round(INLINE_UPLOAD_MAX_BYTES / 1024 / 1024)} Mo max.
|
|
78
134
|
|
|
79
|
-
Cas d'usage typiques :
|
|
135
|
+
Le format est vérifié sur les premiers octets du fichier (PDF, Office, ODF, RTF, images), pas sur l'extension. \`fileContent\` suppose que l'appelant détient déjà les octets exacts : un modèle ne peut pas retranscrire de façon fiable une pièce jointe de conversation en base64 — préférer \`filePath\`. Cas d'usage typiques : CV d'un candidat (parentType=candidateResume, parsing=true pour l'analyse IA Boond), justificatif de note de frais (expensesReport), bon de commande, contrat...
|
|
80
136
|
|
|
81
137
|
Returns: Métadonnées du document créé (ID).`,
|
|
82
138
|
inputSchema: DocumentCreateSchema,
|
|
@@ -88,25 +144,55 @@ Returns: Métadonnées du document créé (ID).`,
|
|
|
88
144
|
openWorldHint: false,
|
|
89
145
|
},
|
|
90
146
|
}, async (params) => {
|
|
147
|
+
const reject = (text) => ({ isError: true, content: [{ type: "text", text: `❌ ${text}` }] });
|
|
148
|
+
const sources = [params.fileUrl, params.filePath, params.fileContent].filter((v) => v !== undefined).length;
|
|
149
|
+
if (sources !== 1) {
|
|
150
|
+
return reject(`Exactement une source de fichier est attendue (reçu : ${sources}). Fournir \`fileUrl\`, ou \`filePath\`, ` +
|
|
151
|
+
"ou `fileContent` + `fileName`.");
|
|
152
|
+
}
|
|
153
|
+
if (params.fileContent !== undefined && params.fileName === undefined) {
|
|
154
|
+
return reject("`fileName` (avec extension, ex. « cv.pdf ») est requis avec `fileContent`.");
|
|
155
|
+
}
|
|
156
|
+
if (params.fileContent === undefined && params.fileName !== undefined) {
|
|
157
|
+
return reject("`fileName` ne s'utilise qu'avec `fileContent`.");
|
|
158
|
+
}
|
|
159
|
+
let file;
|
|
160
|
+
try {
|
|
161
|
+
if (params.filePath !== undefined)
|
|
162
|
+
file = await readLocalUpload(params.filePath);
|
|
163
|
+
else if (params.fileContent !== undefined && params.fileName !== undefined)
|
|
164
|
+
file = decodeInlineUpload(params.fileContent, params.fileName);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error instanceof UploadRejectedError)
|
|
168
|
+
return reject(error.message);
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
91
171
|
const fields = {
|
|
92
172
|
parentType: params.parentType,
|
|
93
173
|
parentId: String(params.parentId),
|
|
94
|
-
fileUrl: params.fileUrl,
|
|
95
174
|
};
|
|
175
|
+
if (params.fileUrl !== undefined)
|
|
176
|
+
fields.fileUrl = params.fileUrl;
|
|
96
177
|
if (params.parsing !== undefined)
|
|
97
178
|
fields.parsing = String(params.parsing);
|
|
98
|
-
const response =
|
|
179
|
+
const response = file === undefined
|
|
180
|
+
? await apiUploadForm("/documents", fields)
|
|
181
|
+
: await apiUploadForm("/documents", fields, file);
|
|
99
182
|
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
100
183
|
const structured = {};
|
|
101
184
|
if (entity?.id !== undefined)
|
|
102
185
|
structured.id = String(entity.id);
|
|
103
186
|
if (entity?.type !== undefined)
|
|
104
187
|
structured.type = String(entity.type);
|
|
188
|
+
const sent = file === undefined
|
|
189
|
+
? ""
|
|
190
|
+
: `\nFichier: ${file.filename} (${file.contentType}, ${(file.data.length / 1024).toFixed(0)} Ko)`;
|
|
105
191
|
return {
|
|
106
192
|
content: [
|
|
107
193
|
{
|
|
108
194
|
type: "text",
|
|
109
|
-
text: `✅ Document créé avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
|
|
195
|
+
text: `✅ Document créé avec succès.\nID: ${entity?.id}${sent}\n\n${formatDetailResponse(response)}`,
|
|
110
196
|
},
|
|
111
197
|
],
|
|
112
198
|
structuredContent: structured,
|
|
@@ -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":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACtH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAChH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGnH,kEAAkE;AAClE,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,qDAAqD;IACrD,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE;;;;+EAI4D,eAAe,0HAA0H,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,4SAA4S,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAC;;;8IAG3c;QACxI,WAAW,EAAE,iBAAiB;QAC9B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAwB,EAAE,KAAc,EAAE,EAAE;QACjD,qEAAqE;QACrE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,oEAAoE;QACpE,IAAI,GAAG,CAAC;QACR,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,WAAW,CAAC,cAAc,MAAM,CAAC,EAAE,EAAE,EAAE,oBAAoB,CAAC,KAAK,CAAC,EAAE;gBAC9E,QAAQ,EAAE,kBAAkB;aAC7B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,qBAAqB,CAAC;gBAAE,MAAM,GAAG,CAAC;YACvD,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACnF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,eAAe,MAAM,CAAC,EAAE,+CAA+C,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAC,8EAA8E;qBACrN;iBACF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,qBAAqB,MAAM,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,YAAY,MAAM,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,aAAa,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,GAAG,CAAC,WAAW,KAAK,MAAM,MAAM,CAAC;QAErF,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBAClC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,0BAA0B,CAAC;YACzE,CAAC;YACD,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,GAAG,CAAC,WAAW,QAAQ,IAAI,EAAE,EAAE;iBACpG;aACF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC;YAC9B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,GAAG,MAAM,0CAA0C,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;iBACnF;gBACD;oBACE,IAAI,EAAE,UAAmB;oBACzB,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;iBAChF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,GAAG,EAAE,CAAC;QAExC,uEAAuE;QACvE,wEAAwE;QACxE,IAAI,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBACtC,OAAO,GAAG,CACR,eAAe,MAAM,oBAAoB,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,yEAAyE,CAC5J,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,EAAE;oBAC5D,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE;iBACzF;aACF,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,IAAI,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtF,IAAI,SAAwB,CAAC;YAC7B,IAAI,CAAC;gBACH,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,GAAG,CAAC,sCAAsC,GAAG,+BAA+B,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;YAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;YACvF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,MAAM,GAAG,GAAG,SAAS;gBACnB,CAAC,CAAC,wBAAwB,eAAe,mBAAmB,SAAS,CAAC,IAAI,CAAC,MAAM,8CAA8C;gBAC/H,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,aAAa,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,GAAG,CAAC,WAAW,KAAK,MAAM,MAAM,KAAK,0BAA0B,IAAI,GAAG,GAAG,EAAE;qBACvH;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,EAAE,CAAC;IACf,CAAC,CACF,CAAC;IAEF,4EAA4E;IAC5E,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE;;;0EAGuD,IAAI,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAAC;;;;4CAI/E;QACtC,WAAW,EAAE,oBAAoB;QACjC,YAAY,EAAE,oBAAoB;QAClC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAA2B,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAE9G,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAC5G,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,MAAM,CACX,yDAAyD,OAAO,2CAA2C;gBACzG,gCAAgC,CACnC,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACtE,OAAO,MAAM,CAAC,4EAA4E,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACtE,OAAO,MAAM,CAAC,gDAAgD,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAA4B,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;gBAAE,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;iBAC5E,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;gBACxE,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB;gBAAE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAA2B;YACrC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;SAClC,CAAC;QACF,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClE,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,QAAQ,GACZ,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,MAAM,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC;YAC3C,CAAC,CAAC,MAAM,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/E,MAAM,UAAU,GAAmC,EAAE,CAAC;QACtD,IAAI,MAAM,EAAE,EAAE,KAAK,SAAS;YAAE,UAAU,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,IAAI,GACR,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,cAAc,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACtG,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,qCAAqC,MAAM,EAAE,EAAE,GAAG,IAAI,OAAO,oBAAoB,CAAC,QAAQ,CAAC,EAAE;iBACpG;aACF;YACD,iBAAiB,EAAE,UAAU;SAC9B,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,+EAA+E;IAC/E,kBAAkB,CAChB,MAAM,EACN,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAC3G;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE;;;;+GAI4F;KAC1G,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -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: {
|