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/flags.js
CHANGED
|
@@ -1,12 +1,127 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AttachedFlagSchema, AttachedFlagsListSchema, FlagCreateSchema } from "../schemas/index.js";
|
|
3
|
+
import { apiRequest, formatListResponse } from "../services/boond-client.js";
|
|
4
|
+
import { buildJsonApiBody, registerCreateTool, registerGetTool, registerSearchTool } from "./crud-factory.js";
|
|
5
|
+
import { composeDescription } from "./description-builders.js";
|
|
2
6
|
const OPTS = {
|
|
3
7
|
entityName: "drapeau",
|
|
4
8
|
entityNamePlural: "drapeaux",
|
|
5
9
|
apiPath: "/flags",
|
|
6
10
|
prefix: "boond_flags",
|
|
7
11
|
};
|
|
12
|
+
/** API collection of each entity `attachedFlags.raml` covers. */
|
|
13
|
+
const ENTITY_PATH = {
|
|
14
|
+
candidate: "/candidates",
|
|
15
|
+
resource: "/resources",
|
|
16
|
+
contact: "/contacts",
|
|
17
|
+
company: "/companies",
|
|
18
|
+
opportunity: "/opportunities",
|
|
19
|
+
project: "/projects",
|
|
20
|
+
order: "/orders",
|
|
21
|
+
product: "/products",
|
|
22
|
+
purchase: "/purchases",
|
|
23
|
+
action: "/actions",
|
|
24
|
+
positioning: "/positionings",
|
|
25
|
+
invoice: "/invoices",
|
|
26
|
+
};
|
|
27
|
+
const AttachOutputSchema = z.object({
|
|
28
|
+
entity: z.string(),
|
|
29
|
+
id: z.string(),
|
|
30
|
+
flagId: z.string(),
|
|
31
|
+
attached: z.boolean(),
|
|
32
|
+
});
|
|
33
|
+
/** `/flags` payload (issue #254): `name` + optional `mainManager` relationship (`models.flag`). */
|
|
34
|
+
export function buildFlagBody(params) {
|
|
35
|
+
const { mainManagerId, ...attrs } = params;
|
|
36
|
+
return buildJsonApiBody("flag", attrs, undefined, {
|
|
37
|
+
mainManager: mainManagerId ? { id: String(mainManagerId), type: "resource" } : undefined,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** `POST /attached-flags` payload: the flag and the flagged record, both as relationships (`dependsOn` is the polymorphic pattern of `models.task`). */
|
|
41
|
+
export function buildAttachedFlagBody(params) {
|
|
42
|
+
return buildJsonApiBody("attachedflag", {}, undefined, {
|
|
43
|
+
flag: { id: params.flagId, type: "flag" },
|
|
44
|
+
dependsOn: { id: params.id, type: params.entity },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
8
47
|
export function registerFlagTools(server) {
|
|
9
48
|
registerSearchTool(server, OPTS);
|
|
10
49
|
registerGetTool(server, OPTS, { withTab: false });
|
|
50
|
+
// Issue #254: writes. `POST /flags` and `POST|DELETE /attached-flags` are
|
|
51
|
+
// documented in the RAML (flags/search.raml, attachedFlags/search.raml);
|
|
52
|
+
// the POST bodies are not, and neither was exercised (production tenant).
|
|
53
|
+
registerCreateTool(server, OPTS, FlagCreateSchema, buildFlagBody, {
|
|
54
|
+
title: "Créer un drapeau",
|
|
55
|
+
description: composeDescription({
|
|
56
|
+
purpose: "Crée un drapeau (tag) réutilisable — « vivier Java Q4 », « à rappeler », « VIP ».",
|
|
57
|
+
when: "avant `boond_flags_attach` quand aucun drapeau existant ne convient (`boond_flags_search` d'abord).",
|
|
58
|
+
instead: "`boond_flags_attach` pour poser un drapeau existant sur un enregistrement.",
|
|
59
|
+
behaviour: [
|
|
60
|
+
"Écriture non idempotente : deux appels créent deux drapeaux homonymes.",
|
|
61
|
+
"Corps déduit de `models.flag` (`name`, `mainManager`) — non éprouvé sur un tenant de test.",
|
|
62
|
+
],
|
|
63
|
+
returns: "confirmation et ID du drapeau (`structuredContent.id`).",
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
server.registerTool("boond_flags_attached", {
|
|
67
|
+
title: "Drapeaux posés sur un enregistrement",
|
|
68
|
+
description: composeDescription({
|
|
69
|
+
purpose: "Liste les drapeaux (tags) posés sur un candidat, une ressource, un contact, une société, une opportunité, un projet, une commande, un produit, un achat, une action, un positionnement ou une facture.",
|
|
70
|
+
when: "pour savoir comment un enregistrement est tagué avant d'ajouter ou retirer un drapeau.",
|
|
71
|
+
instead: "`boond_flags_search` pour le catalogue des drapeaux existants (pas leurs rattachements).",
|
|
72
|
+
returns: "une ligne par drapeau posé (`GET /{entité}/{id}/attached-flags`). Lecture seule.",
|
|
73
|
+
}),
|
|
74
|
+
inputSchema: AttachedFlagsListSchema,
|
|
75
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
76
|
+
}, async (params) => {
|
|
77
|
+
const { entity, id } = params;
|
|
78
|
+
const response = await apiRequest(`${ENTITY_PATH[entity]}/${id}/attached-flags`);
|
|
79
|
+
return { content: [{ type: "text", text: formatListResponse(response, "drapeau posé") }] };
|
|
80
|
+
});
|
|
81
|
+
server.registerTool("boond_flags_attach", {
|
|
82
|
+
title: "Poser un drapeau sur un enregistrement",
|
|
83
|
+
description: composeDescription({
|
|
84
|
+
purpose: "Pose un drapeau existant sur un enregistrement (tagging) — `POST /attached-flags`.",
|
|
85
|
+
when: "pour marquer un lot de fiches après un tri (« ces 12 candidats → vivier Java Q4 ») : un appel par fiche.",
|
|
86
|
+
instead: "`boond_flags_create` si le drapeau n'existe pas encore ; `boond_flags_detach` pour le retirer.",
|
|
87
|
+
behaviour: [
|
|
88
|
+
"Corps JSON:API `{ relationships: { flag, dependsOn } }` déduit du modèle — la RAML ne documente que la route ; non éprouvé sur un tenant de test.",
|
|
89
|
+
"Idempotent côté intention : reposer un drapeau déjà présent ne doit rien changer.",
|
|
90
|
+
],
|
|
91
|
+
returns: "`{ entity, id, flagId, attached: true }`.",
|
|
92
|
+
}),
|
|
93
|
+
inputSchema: AttachedFlagSchema,
|
|
94
|
+
outputSchema: AttachOutputSchema,
|
|
95
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
96
|
+
}, async (params) => {
|
|
97
|
+
const p = params;
|
|
98
|
+
await apiRequest("/attached-flags", "POST", buildAttachedFlagBody(p));
|
|
99
|
+
return {
|
|
100
|
+
content: [{ type: "text", text: `✅ Drapeau #${p.flagId} posé sur ${p.entity} #${p.id}.` }],
|
|
101
|
+
structuredContent: { entity: p.entity, id: p.id, flagId: p.flagId, attached: true },
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
server.registerTool("boond_flags_detach", {
|
|
105
|
+
title: "Retirer un drapeau d'un enregistrement",
|
|
106
|
+
description: composeDescription({
|
|
107
|
+
purpose: "Retire un drapeau d'un enregistrement — `DELETE /attached-flags?flag=&<entité>=` (route et paramètres documentés dans la RAML).",
|
|
108
|
+
when: "pour dé-taguer une fiche ; réversible par `boond_flags_attach`, le drapeau lui-même n'est pas supprimé.",
|
|
109
|
+
instead: "aucun outil ne supprime un drapeau du catalogue : un drapeau se retire fiche par fiche.",
|
|
110
|
+
behaviour: [
|
|
111
|
+
"Idempotent : retirer un drapeau absent n'échoue pas côté intention (l'erreur API éventuelle est remontée telle quelle).",
|
|
112
|
+
],
|
|
113
|
+
returns: "`{ entity, id, flagId, attached: false }`.",
|
|
114
|
+
}),
|
|
115
|
+
inputSchema: AttachedFlagSchema,
|
|
116
|
+
outputSchema: AttachOutputSchema,
|
|
117
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
118
|
+
}, async (params) => {
|
|
119
|
+
const p = params;
|
|
120
|
+
await apiRequest("/attached-flags", "DELETE", undefined, { flag: p.flagId, [p.entity]: p.id });
|
|
121
|
+
return {
|
|
122
|
+
content: [{ type: "text", text: `✅ Drapeau #${p.flagId} retiré de ${p.entity} #${p.id}.` }],
|
|
123
|
+
structuredContent: { entity: p.entity, id: p.id, flagId: p.flagId, attached: false },
|
|
124
|
+
};
|
|
125
|
+
});
|
|
11
126
|
}
|
|
12
127
|
//# sourceMappingURL=flags.js.map
|
package/dist/tools/flags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/** `/forms` payload (issue #256): `template` (required), polymorphic `dependsOn`, `validator` / `recipient` (`models.form`). */
|
|
3
|
+
export declare function buildFormBody(params: Record<string, unknown>): unknown;
|
|
4
|
+
export declare function registerFormTools(server: McpServer): void;
|
|
5
|
+
//# sourceMappingURL=forms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/tools/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,gIAAgI;AAChI,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAatE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoDzD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { FormCreateSchema, FormDefaultSchema } from "../schemas/index.js";
|
|
2
|
+
import { apiRequest, formatDetailResponse } from "../services/boond-client.js";
|
|
3
|
+
import { buildJsonApiBody, registerCreateTool, registerGetTool } from "./crud-factory.js";
|
|
4
|
+
import { composeDescription } from "./description-builders.js";
|
|
5
|
+
const OPTS = { entityName: "formulaire", entityNamePlural: "formulaires", apiPath: "/forms", prefix: "boond_forms" };
|
|
6
|
+
/** `/forms` payload (issue #256): `template` (required), polymorphic `dependsOn`, `validator` / `recipient` (`models.form`). */
|
|
7
|
+
export function buildFormBody(params) {
|
|
8
|
+
const { templateId, resourceId, candidateId, validatorId, recipientId, ...attrs } = params;
|
|
9
|
+
const dependsOn = resourceId
|
|
10
|
+
? { id: String(resourceId), type: "resource" }
|
|
11
|
+
: candidateId
|
|
12
|
+
? { id: String(candidateId), type: "candidate" }
|
|
13
|
+
: undefined;
|
|
14
|
+
return buildJsonApiBody("form", attrs, undefined, {
|
|
15
|
+
template: { id: String(templateId), type: "formtemplate" },
|
|
16
|
+
dependsOn,
|
|
17
|
+
validator: validatorId ? { id: String(validatorId), type: "resource" } : undefined,
|
|
18
|
+
recipient: recipientId ? { id: String(recipientId), type: "resource" } : undefined,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function registerFormTools(server) {
|
|
22
|
+
server.registerTool("boond_forms_default", {
|
|
23
|
+
title: "Référentiels d'un formulaire",
|
|
24
|
+
description: composeDescription({
|
|
25
|
+
purpose: "Renvoie un formulaire vide pré-rempli pour un modèle et une entité (questions du modèle, validateur et destinataire par défaut).",
|
|
26
|
+
when: "AVANT `boond_forms_create`, pour connaître les questions et les dates que le modèle attend.",
|
|
27
|
+
instead: "`boond_forms_get` pour un formulaire déjà créé.",
|
|
28
|
+
behaviour: ["Lecture seule (`GET /forms/default?template=&resource=`) ; la réponse est rendue telle quelle."],
|
|
29
|
+
returns: "JSON du formulaire vide (questions incluses).",
|
|
30
|
+
}),
|
|
31
|
+
inputSchema: FormDefaultSchema,
|
|
32
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
33
|
+
}, async (params) => {
|
|
34
|
+
const response = await apiRequest("/forms/default", "GET", undefined, {
|
|
35
|
+
template: params.templateId,
|
|
36
|
+
resource: params.resourceId,
|
|
37
|
+
});
|
|
38
|
+
return { content: [{ type: "text", text: formatDetailResponse(response) }] };
|
|
39
|
+
});
|
|
40
|
+
registerGetTool(server, OPTS, {
|
|
41
|
+
withTab: false,
|
|
42
|
+
title: "Détails d'un formulaire",
|
|
43
|
+
description: composeDescription({
|
|
44
|
+
purpose: "Récupère un formulaire (entretien annuel, bilan de fin de mission, évaluation) par son ID : questions, réponses, état, validateur.",
|
|
45
|
+
when: "après `boond_forms_create`, ou depuis l'ID lu dans les relations d'une ressource / d'un candidat.",
|
|
46
|
+
instead: "il n'existe pas de liste des formulaires côté API (`GET /forms` n'est pas documenté) ; `boond_tasks_get` avec `entity: \"form\"` pour ses tâches.",
|
|
47
|
+
returns: "JSON du formulaire (attributs + relations). Lecture seule.",
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
registerCreateTool(server, OPTS, FormCreateSchema, buildFormBody, {
|
|
51
|
+
title: "Créer un formulaire",
|
|
52
|
+
description: composeDescription({
|
|
53
|
+
purpose: "Instancie un formulaire à partir d'un modèle (entretien annuel, bilan de fin de mission, évaluation) pour une ressource ou un candidat.",
|
|
54
|
+
when: "pour lancer une campagne d'évaluation ou un bilan, formulaire par formulaire.",
|
|
55
|
+
instead: "`boond_forms_default` d'abord, pour les questions et les dates attendues par le modèle.",
|
|
56
|
+
behaviour: [
|
|
57
|
+
"Corps déduit de `models.form` (`template`, `dependsOn`, `validator`, `recipient`, `validateDate`, `remindDate`) — non éprouvé sur un tenant de test ; exactement une entité visée parmi `resourceId` / `candidateId`.",
|
|
58
|
+
"Écriture non idempotente.",
|
|
59
|
+
],
|
|
60
|
+
returns: "confirmation et ID du formulaire (`structuredContent.id`).",
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=forms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/tools/forms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/** `/groupments` payload (issue #256): `project` relationship (create), `deliveryIds` → `deliveries`, `note` → `informationComments` (`models.groupment`). */
|
|
3
|
+
export declare function buildGroupmentBody(params: Record<string, unknown>): unknown;
|
|
4
|
+
export declare function registerGroupmentTools(server: McpServer): void;
|
|
5
|
+
//# sourceMappingURL=groupments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupments.d.ts","sourceRoot":"","sources":["../../src/tools/groupments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,8JAA8J;AAC9J,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAe3E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuD9D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { GroupmentCreateSchema, GroupmentDefaultSchema, GroupmentUpdateSchema } from "../schemas/index.js";
|
|
2
|
+
import { apiRequest, formatDetailResponse } from "../services/boond-client.js";
|
|
3
|
+
import { buildJsonApiBody, registerCreateTool, registerGetTool, registerUpdateTool } from "./crud-factory.js";
|
|
4
|
+
import { composeDescription } from "./description-builders.js";
|
|
5
|
+
const OPTS = {
|
|
6
|
+
entityName: "regroupement de prestations",
|
|
7
|
+
entityNamePlural: "regroupements de prestations",
|
|
8
|
+
apiPath: "/groupments",
|
|
9
|
+
prefix: "boond_groupments",
|
|
10
|
+
};
|
|
11
|
+
/** `/groupments` payload (issue #256): `project` relationship (create), `deliveryIds` → `deliveries`, `note` → `informationComments` (`models.groupment`). */
|
|
12
|
+
export function buildGroupmentBody(params) {
|
|
13
|
+
const { id, projectId, deliveryIds, note, ...attrs } = params;
|
|
14
|
+
const body = buildJsonApiBody("groupment", { ...attrs, ...(note !== undefined ? { informationComments: note } : {}) }, typeof id === "string" ? id : undefined, { project: projectId ? { id: String(projectId), type: "project" } : undefined });
|
|
15
|
+
if (Array.isArray(deliveryIds) && deliveryIds.length > 0) {
|
|
16
|
+
body.data.relationships = {
|
|
17
|
+
...(body.data.relationships ?? {}),
|
|
18
|
+
deliveries: { data: deliveryIds.map((d) => ({ id: String(d), type: "delivery" })) },
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return body;
|
|
22
|
+
}
|
|
23
|
+
export function registerGroupmentTools(server) {
|
|
24
|
+
server.registerTool("boond_groupments_default", {
|
|
25
|
+
title: "Référentiels d'un regroupement de prestations",
|
|
26
|
+
description: composeDescription({
|
|
27
|
+
purpose: "Renvoie un regroupement vide pré-rempli pour un projet : prestations regroupables, prix et coûts par défaut.",
|
|
28
|
+
when: "AVANT `boond_groupments_create`.",
|
|
29
|
+
instead: "`boond_projects_deliveries_groupments` pour les prestations et regroupements déjà en place sur le projet.",
|
|
30
|
+
behaviour: ["Lecture seule (`GET /groupments/default?project=`) ; la réponse est rendue telle quelle."],
|
|
31
|
+
returns: "JSON du regroupement vide, prestations incluses.",
|
|
32
|
+
}),
|
|
33
|
+
inputSchema: GroupmentDefaultSchema,
|
|
34
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
35
|
+
}, async (params) => {
|
|
36
|
+
const response = await apiRequest("/groupments/default", "GET", undefined, { project: params.projectId });
|
|
37
|
+
return { content: [{ type: "text", text: formatDetailResponse(response) }] };
|
|
38
|
+
});
|
|
39
|
+
registerGetTool(server, OPTS, {
|
|
40
|
+
withTab: false,
|
|
41
|
+
title: "Détails d'un regroupement de prestations",
|
|
42
|
+
description: composeDescription({
|
|
43
|
+
purpose: "Récupère un regroupement de prestations (facturation multi-prestations) par son ID.",
|
|
44
|
+
when: "depuis l'ID lu dans `boond_projects_deliveries_groupments`.",
|
|
45
|
+
instead: "`boond_projects_deliveries_groupments` pour la liste des regroupements d'un projet — il n'y a pas de liste globale.",
|
|
46
|
+
returns: "JSON du regroupement (attributs + relations `project`, `deliveries`). Lecture seule.",
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
registerCreateTool(server, OPTS, GroupmentCreateSchema, buildGroupmentBody, {
|
|
50
|
+
title: "Créer un regroupement de prestations",
|
|
51
|
+
description: composeDescription({
|
|
52
|
+
purpose: "Regroupe plusieurs prestations d'un projet sous un même prix et une même période, pour les facturer ensemble.",
|
|
53
|
+
when: "pour la facturation multi-prestations (forfait sur plusieurs consultants, lot).",
|
|
54
|
+
instead: "`boond_groupments_default` d'abord ; `boond_groupments_update` pour ajuster un regroupement existant.",
|
|
55
|
+
behaviour: [
|
|
56
|
+
"Corps déduit de `models.groupment` (`title`, dates, prix / coûts journaliers, relations `project` / `deliveries`) — non éprouvé sur un tenant de test.",
|
|
57
|
+
"Écriture non idempotente.",
|
|
58
|
+
],
|
|
59
|
+
returns: "confirmation et ID du regroupement (`structuredContent.id`).",
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
// PUT /groupments/{id} — no information.raml, base resource like /deliveries/{id} (#252).
|
|
63
|
+
registerUpdateTool(server, OPTS, GroupmentUpdateSchema, buildGroupmentBody, {
|
|
64
|
+
method: "PUT",
|
|
65
|
+
title: "Modifier un regroupement de prestations",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=groupments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupments.js","sourceRoot":"","sources":["../../src/tools/groupments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/** `/inactivities` payload (issue #256): `resource` (required) / `contract` relationships, `note` → `informationComments` (`models.inactivity`). */
|
|
3
|
+
export declare function buildInactivityBody(params: Record<string, unknown>): unknown;
|
|
4
|
+
export declare function registerInactivityTools(server: McpServer): void;
|
|
5
|
+
//# sourceMappingURL=inactivities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inactivities.d.ts","sourceRoot":"","sources":["../../src/tools/inactivities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,oJAAoJ;AACpJ,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAW5E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkD/D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { InactivityCreateSchema, InactivityDefaultSchema } from "../schemas/index.js";
|
|
2
|
+
import { apiRequest, formatDetailResponse } from "../services/boond-client.js";
|
|
3
|
+
import { buildJsonApiBody, registerCreateTool, registerGetTool } from "./crud-factory.js";
|
|
4
|
+
import { composeDescription } from "./description-builders.js";
|
|
5
|
+
const OPTS = {
|
|
6
|
+
entityName: "période d'inactivité",
|
|
7
|
+
entityNamePlural: "périodes d'inactivité",
|
|
8
|
+
apiPath: "/inactivities",
|
|
9
|
+
prefix: "boond_inactivities",
|
|
10
|
+
};
|
|
11
|
+
/** `/inactivities` payload (issue #256): `resource` (required) / `contract` relationships, `note` → `informationComments` (`models.inactivity`). */
|
|
12
|
+
export function buildInactivityBody(params) {
|
|
13
|
+
const { resourceId, contractId, note, ...attrs } = params;
|
|
14
|
+
return buildJsonApiBody("inactivity", { ...attrs, ...(note !== undefined ? { informationComments: note } : {}) }, undefined, {
|
|
15
|
+
resource: { id: String(resourceId), type: "resource" },
|
|
16
|
+
contract: contractId ? { id: String(contractId), type: "contract" } : undefined,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function registerInactivityTools(server) {
|
|
20
|
+
server.registerTool("boond_inactivities_default", {
|
|
21
|
+
title: "Référentiels d'une période d'inactivité",
|
|
22
|
+
description: composeDescription({
|
|
23
|
+
purpose: "Renvoie les valeurs par défaut d'une période d'inactivité (intercontrat, formation, congé sans solde…) pour une ressource : types d'inactivité, coût journalier retenu, contrat en cours.",
|
|
24
|
+
when: "AVANT `boond_inactivities_create` — le type d'inactivité n'est publié que là.",
|
|
25
|
+
instead: "`boond_resources_get` pour la fiche de la ressource ; `boond_reporting_resources` pour le taux d'occupation agrégé.",
|
|
26
|
+
behaviour: ["Lecture seule (`GET /inactivities/default?resource=`) ; la réponse est rendue telle quelle."],
|
|
27
|
+
returns: "JSON de l'inactivité vide pré-remplie, avec les types inclus.",
|
|
28
|
+
}),
|
|
29
|
+
inputSchema: InactivityDefaultSchema,
|
|
30
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
31
|
+
}, async (params) => {
|
|
32
|
+
const response = await apiRequest("/inactivities/default", "GET", undefined, { resource: params.resourceId });
|
|
33
|
+
return { content: [{ type: "text", text: formatDetailResponse(response) }] };
|
|
34
|
+
});
|
|
35
|
+
registerGetTool(server, OPTS, {
|
|
36
|
+
withTab: false,
|
|
37
|
+
title: "Détails d'une période d'inactivité",
|
|
38
|
+
description: composeDescription({
|
|
39
|
+
purpose: "Récupère une période d'inactivité (intercontrat, formation…) par son ID.",
|
|
40
|
+
when: "après `boond_inactivities_create`, ou depuis l'ID lu dans les relations d'une ressource.",
|
|
41
|
+
instead: "il n'existe pas de liste des inactivités côté API (`GET /inactivities` n'est pas documenté) : `boond_reporting_resources` donne l'occupation, `boond_resources_get` la fiche.",
|
|
42
|
+
returns: "JSON de la période (attributs + relations). Lecture seule.",
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
registerCreateTool(server, OPTS, InactivityCreateSchema, buildInactivityBody, {
|
|
46
|
+
title: "Créer une période d'inactivité",
|
|
47
|
+
description: composeDescription({
|
|
48
|
+
purpose: "Déclare une période d'inactivité (intercontrat, formation interne, congé sans solde…) pour une ressource, entre deux prestations.",
|
|
49
|
+
when: "quand une ressource sort de mission sans relais immédiat — c'est ce qui rend le taux d'occupation et le coût de l'intercontrat justes.",
|
|
50
|
+
instead: "`boond_absences_create` pour une absence (congés, maladie) ; `boond_deliveries_create` pour une nouvelle prestation.",
|
|
51
|
+
behaviour: [
|
|
52
|
+
"Corps déduit de `models.inactivity` (`title`, `startDate`, `endDate`, `inactivityType`, coûts, relations `resource` / `contract`) — non éprouvé sur un tenant de test.",
|
|
53
|
+
"Écriture non idempotente.",
|
|
54
|
+
],
|
|
55
|
+
returns: "confirmation et ID de la période (`structuredContent.id`).",
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=inactivities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inactivities.js","sourceRoot":"","sources":["../../src/tools/inactivities.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -34,6 +34,10 @@ export { registerValidationTools } from "./validations.js";
|
|
|
34
34
|
export { registerPoleTools } from "./poles.js";
|
|
35
35
|
export { registerReportingTools } from "./reporting.js";
|
|
36
36
|
export { registerPlanningAbsenceTools } from "./planning-absences.js";
|
|
37
|
+
export { registerInactivityTools } from "./inactivities.js";
|
|
38
|
+
export { registerFormTools } from "./forms.js";
|
|
39
|
+
export { registerGroupmentTools } from "./groupments.js";
|
|
40
|
+
export { registerAlertTools } from "./alerts.js";
|
|
37
41
|
export { registerDocumentTools } from "./documents.js";
|
|
38
42
|
export { registerWorkflowTools } from "./workflows.js";
|
|
39
43
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -34,6 +34,10 @@ export { registerValidationTools } from "./validations.js";
|
|
|
34
34
|
export { registerPoleTools } from "./poles.js";
|
|
35
35
|
export { registerReportingTools } from "./reporting.js";
|
|
36
36
|
export { registerPlanningAbsenceTools } from "./planning-absences.js";
|
|
37
|
+
export { registerInactivityTools } from "./inactivities.js";
|
|
38
|
+
export { registerFormTools } from "./forms.js";
|
|
39
|
+
export { registerGroupmentTools } from "./groupments.js";
|
|
40
|
+
export { registerAlertTools } from "./alerts.js";
|
|
37
41
|
export { registerDocumentTools } from "./documents.js";
|
|
38
42
|
export { registerWorkflowTools } from "./workflows.js";
|
|
39
43
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuFzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqD5D"}
|
package/dist/tools/invoices.js
CHANGED
|
@@ -1,13 +1,35 @@
|
|
|
1
|
+
import { toKeywordReferences } from "./linked-entity-filters.js";
|
|
1
2
|
import { InvoiceSearchSchema, InvoiceCreateSchema, InvoiceUpdateSchema } from "../schemas/index.js";
|
|
2
3
|
import { apiRequest, buildSearchQuery, formatListResponse } from "../services/boond-client.js";
|
|
3
4
|
import { buildJsonApiBody, buildListStructured, SearchOutputSchema, registerGetTool, registerCreateTool, registerUpdateTool, registerDeleteTool, } from "./crud-factory.js";
|
|
4
5
|
import { defaultDeleteDescription } from "./description-builders.js";
|
|
6
|
+
import { registerTabTools } from "./tab-tools.js";
|
|
5
7
|
const OPTS = {
|
|
6
8
|
entityName: "facture",
|
|
7
9
|
entityNamePlural: "factures",
|
|
8
10
|
apiPath: "/invoices",
|
|
9
11
|
prefix: "boond_invoices",
|
|
10
12
|
};
|
|
13
|
+
// `ENTITY_TABS.invoices` — verified live on 2026-09-26 (issue #258).
|
|
14
|
+
const INVOICE_TABS = [
|
|
15
|
+
{
|
|
16
|
+
name: "information",
|
|
17
|
+
tab: "information",
|
|
18
|
+
title: "Informations complètes d'une facture",
|
|
19
|
+
subject: "les informations complètes",
|
|
20
|
+
content: "lignes facturées, coordonnées de facturation et bancaires, échéance, état d'envoi, commande et projet liés",
|
|
21
|
+
returns: "Fiche complète de la facture (relations société, contact, commande, projet, prestation incluses).",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "actions",
|
|
25
|
+
tab: "actions",
|
|
26
|
+
title: "Actions liées à une facture",
|
|
27
|
+
subject: "les actions",
|
|
28
|
+
content: "envois, relances, notes",
|
|
29
|
+
returns: "Liste des actions rattachées à la facture, la plus récente en premier.",
|
|
30
|
+
behaviour: ["Un envoi de facture par e-mail apparaît ici comme une action, avec ses destinataires dans `text`."],
|
|
31
|
+
},
|
|
32
|
+
];
|
|
11
33
|
/** Maps convenience inputs and simple amount fields to the Boond JSON:API body. */
|
|
12
34
|
function buildInvoiceBody(params) {
|
|
13
35
|
const { id, orderId, companyId, projectId, ...rest } = params;
|
|
@@ -48,7 +70,9 @@ export function registerInvoiceTools(server) {
|
|
|
48
70
|
// search does not model.
|
|
49
71
|
server.registerTool("boond_invoices_search", {
|
|
50
72
|
title: "Rechercher des factures",
|
|
51
|
-
description: `Liste et recherche les factures client, par société, projet, état ou
|
|
73
|
+
description: `Liste et recherche les factures client, par société, projet, état (\`states\`), période (\`period\` + dates, ou \`periodDynamic\`), périmètre (\`perimeter*\`) ou avoir / facture (\`creditNote\`).
|
|
74
|
+
|
|
75
|
+
\`companyId\` / \`projectId\` sont convertis en références \`keywords\` (\`CSOC<id>\`, \`PRJ<id>\`) — l'API n'a pas de paramètre dédié et ignorerait un \`companyId\` brut.
|
|
52
76
|
|
|
53
77
|
Returns : page de résumés (référence, date, montants HT/TTC, état). Lecture seule.`,
|
|
54
78
|
inputSchema: InvoiceSearchSchema,
|
|
@@ -60,7 +84,7 @@ Returns : page de résumés (référence, date, montants HT/TTC, état). Lecture
|
|
|
60
84
|
openWorldHint: true,
|
|
61
85
|
},
|
|
62
86
|
}, async (params) => {
|
|
63
|
-
const query = buildSearchQuery(params);
|
|
87
|
+
const query = buildSearchQuery(toKeywordReferences(params));
|
|
64
88
|
if (params.startDate)
|
|
65
89
|
query["startDate"] = params.startDate;
|
|
66
90
|
if (params.endDate)
|
|
@@ -88,5 +112,6 @@ Returns : page de résumés (référence, date, montants HT/TTC, état). Lecture
|
|
|
88
112
|
prefix: "boond_invoices",
|
|
89
113
|
}),
|
|
90
114
|
});
|
|
115
|
+
registerTabTools(server, OPTS, INVOICE_TABS);
|
|
91
116
|
}
|
|
92
117
|
//# sourceMappingURL=invoices.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoices.js","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"invoices.js","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linked-entity filters → `keywords` references (issue #247).
|
|
3
|
+
*
|
|
4
|
+
* BoondManager's list endpoints have **no** `companyId` / `projectId` /
|
|
5
|
+
* `resourceId` query parameters. A related entity is selected through a
|
|
6
|
+
* prefixed reference inside `keywords` — `CSOC<id>` (company), `PRJ<id>`
|
|
7
|
+
* (project), `COMP<id>` (resource), `CAND<id>` (candidate), `CCON<id>`
|
|
8
|
+
* (contact), `AO<id>` (opportunity), `ACH<id>` (purchase), `BDC<id>` (order),
|
|
9
|
+
* `FACT<id>` (invoice), `MIS<id>` (delivery), `PROD<id>` (product),
|
|
10
|
+
* `CTR<id>` (contract) — documented per endpoint in the RAML and verified
|
|
11
|
+
* against the live API on 2026-09-25: `GET /invoices?companyId=6221` returned
|
|
12
|
+
* the whole table (29 893 rows, same as with no filter at all), while
|
|
13
|
+
* `keywords=CSOC6221` returned 2. An unknown query parameter is ignored
|
|
14
|
+
* silently, so a tool that forwarded `companyId` verbatim answered "the
|
|
15
|
+
* invoices of X" with *every* invoice, presented as filtered.
|
|
16
|
+
*
|
|
17
|
+
* The search schemas keep the `*Id` fields — they are what a model reaches
|
|
18
|
+
* for — and every search handler runs its params through `toKeywordReferences`
|
|
19
|
+
* before building the query, so the conversion cannot be forgotten per domain.
|
|
20
|
+
* Not every endpoint honours every prefix (the RAML lists them); a prefix an
|
|
21
|
+
* endpoint does not know simply matches nothing, which is still a visible
|
|
22
|
+
* "0 results", never a silently unfiltered page.
|
|
23
|
+
*/
|
|
24
|
+
export declare const KEYWORD_PREFIX_BY_FILTER: {
|
|
25
|
+
readonly candidateId: "CAND";
|
|
26
|
+
readonly resourceId: "COMP";
|
|
27
|
+
readonly contactId: "CCON";
|
|
28
|
+
readonly companyId: "CSOC";
|
|
29
|
+
readonly projectId: "PRJ";
|
|
30
|
+
readonly opportunityId: "AO";
|
|
31
|
+
readonly purchaseId: "ACH";
|
|
32
|
+
readonly orderId: "BDC";
|
|
33
|
+
readonly invoiceId: "FACT";
|
|
34
|
+
readonly deliveryId: "MIS";
|
|
35
|
+
readonly productId: "PROD";
|
|
36
|
+
readonly contractId: "CTR";
|
|
37
|
+
};
|
|
38
|
+
export type LinkedEntityFilter = keyof typeof KEYWORD_PREFIX_BY_FILTER;
|
|
39
|
+
/**
|
|
40
|
+
* Move every linked-entity `*Id` filter present in `params` into `keywords`
|
|
41
|
+
* as `<PREFIX><id>` (appended after the caller's own keywords, space
|
|
42
|
+
* separated) and drop the `*Id` keys. Keys that are absent or `undefined` are
|
|
43
|
+
* left alone; other keys pass through untouched.
|
|
44
|
+
*/
|
|
45
|
+
export declare function toKeywordReferences<T extends Record<string, unknown>>(params: T): Omit<T, LinkedEntityFilter> & {
|
|
46
|
+
keywords?: string;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=linked-entity-filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-entity-filters.d.ts","sourceRoot":"","sources":["../../src/tools/linked-entity-filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;CAa3B,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,wBAAwB,CAAC;AAIvE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAcrD"}
|