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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/services/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE5F,OAAO,EAAE,UAAU,EAAmB,MAAM,qBAAqB,CAAC;AAGlE,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,MAAM,KAAK,GAA+B,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,QAAQ;QAAE,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3D,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEzE,sEAAsE;IACtE,uEAAuE;IACvE,wCAAwC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACvE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,oEAAoE;YACpE,KAAK,CAAC,GAAG,CAAC,GAAG,KAA+B,CAAC;QAC/C,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,KAAiC,EACjC,UAA6B;IAE7B,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACpG,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,uEAAuE;IACvE,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,QAAQ,GAAG,GAAG,CAAC;IAC1C,MAAM,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IAE9C,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,IAAI,IAA6B,CAAC;IAClC,8EAA8E;IAC9E,uEAAuE;IACvE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC5C,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,UAAU,GAA+B,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QACvG,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACzB,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,UAAU,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,gBAAgB,IAAI,WAAW,aAAa,IAAI,WAAW,EAAE,CAAC,CAAC;QACxG,uEAAuE;QACvE,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;YAAE,MAAM;IAChC,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAC,CAAC;IACjF,2EAA2E;IAC3E,8EAA8E;IAC9E,uDAAuD;IACvD,IAAI,aAAa,GAAG,WAAW,EAAE,CAAC;QAChC,UAAU,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,IAAI,eAAe,IAAI,CAAC,MAAM,eAAe,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/services/update-checker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/services/update-checker.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AA4BD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAyB7B;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { logger } from "./logger.js";
|
|
2
|
+
import { readBool } from "../config/env.js";
|
|
2
3
|
const NPM_REGISTRY_URL = "https://registry.npmjs.org";
|
|
3
4
|
const DEFAULT_TIMEOUT_MS = 3000;
|
|
4
5
|
function parseSemverCore(v) {
|
|
@@ -6,20 +7,27 @@ function parseSemverCore(v) {
|
|
|
6
7
|
const parts = core.split(".");
|
|
7
8
|
if (parts.length !== 3)
|
|
8
9
|
return null;
|
|
9
|
-
const
|
|
10
|
-
if (
|
|
10
|
+
const [major, minor, patch] = parts.map((p) => Number(p));
|
|
11
|
+
if (major === undefined || minor === undefined || patch === undefined)
|
|
11
12
|
return null;
|
|
12
|
-
|
|
13
|
+
if ([major, minor, patch].some((n) => !Number.isInteger(n) || n < 0))
|
|
14
|
+
return null;
|
|
15
|
+
return [major, minor, patch];
|
|
13
16
|
}
|
|
14
17
|
function isNewer(latest, current) {
|
|
15
18
|
const a = parseSemverCore(latest);
|
|
16
19
|
const b = parseSemverCore(current);
|
|
17
20
|
if (!a || !b)
|
|
18
21
|
return false;
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
const pairs = [
|
|
23
|
+
[a[0], b[0]],
|
|
24
|
+
[a[1], b[1]],
|
|
25
|
+
[a[2], b[2]],
|
|
26
|
+
];
|
|
27
|
+
for (const [x, y] of pairs) {
|
|
28
|
+
if (x > y)
|
|
21
29
|
return true;
|
|
22
|
-
if (
|
|
30
|
+
if (x < y)
|
|
23
31
|
return false;
|
|
24
32
|
}
|
|
25
33
|
return false;
|
|
@@ -54,8 +62,7 @@ export async function checkForUpdate(opts) {
|
|
|
54
62
|
}
|
|
55
63
|
}
|
|
56
64
|
export function isUpdateCheckDisabled() {
|
|
57
|
-
|
|
58
|
-
return raw === "1" || raw === "true" || raw === "yes";
|
|
65
|
+
return readBool("BOOND_DISABLE_UPDATE_CHECK", false);
|
|
59
66
|
}
|
|
60
67
|
export async function runUpdateNotification(opts) {
|
|
61
68
|
if (isUpdateCheckDisabled())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/services/update-checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/services/update-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface UploadFile {
|
|
2
|
+
data: Buffer;
|
|
3
|
+
filename: string;
|
|
4
|
+
contentType: string;
|
|
5
|
+
}
|
|
6
|
+
/** A refusal whose message is meant for the caller, not a crash. */
|
|
7
|
+
export declare class UploadRejectedError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
interface SniffedType {
|
|
11
|
+
contentType: string;
|
|
12
|
+
/** Extensions a file of this family may carry (lower case, with dot). */
|
|
13
|
+
extensions: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The document type of `data`, from its leading bytes. ZIP and OLE containers
|
|
17
|
+
* are ambiguous by content alone (a .docx and a .xlsx share a signature), so
|
|
18
|
+
* for those two families the extension picks the member — but only among
|
|
19
|
+
* formats of that container: a ZIP named `.pdf` is still refused.
|
|
20
|
+
*/
|
|
21
|
+
export declare function sniffDocumentType(data: Buffer, filename: string): SniffedType | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Read a local file for upload, enforcing the operator's policy: stdio
|
|
24
|
+
* transport, an allowed directory (after symlink resolution), a regular file,
|
|
25
|
+
* the size ceiling, and an accepted document format.
|
|
26
|
+
*/
|
|
27
|
+
export declare function readLocalUpload(filePath: string, env?: NodeJS.ProcessEnv): Promise<UploadFile>;
|
|
28
|
+
/** Decode base64 content passed inline, with an optional `data:` URI prefix. */
|
|
29
|
+
export declare function decodeInlineUpload(fileContent: string, fileName: string): UploadFile;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=upload-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-source.d.ts","sourceRoot":"","sources":["../../src/services/upload-source.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,oEAAoE;AACpE,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAqBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAmBzF;AA8CD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,UAAU,CAAC,CA2CjH;AAID,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAkBpF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File sources for `boond_documents_create` beyond `fileUrl`.
|
|
3
|
+
*
|
|
4
|
+
* Until this module, the only way to attach a document was a public https URL
|
|
5
|
+
* that BoondManager downloads itself, and the server never read a byte of file
|
|
6
|
+
* content. That posture stays the default: both sources below are bounded, and
|
|
7
|
+
* the one that touches the disk is **off unless the operator opts in**.
|
|
8
|
+
*
|
|
9
|
+
* - `filePath` (stdio only, opt-in): the server reads a local file, but only
|
|
10
|
+
* under a directory listed in `BOOND_MCP_UPLOAD_DIRS`. The check runs on the
|
|
11
|
+
* `realpath` of both sides, so `..` segments and symlinks pointing outside an
|
|
12
|
+
* allowed directory are refused. Over HTTP the server does not run on the
|
|
13
|
+
* user's machine, so a path would name a file on the *server* host — refused.
|
|
14
|
+
* - `fileContent` (base64, every transport, always on): no disk access at all,
|
|
15
|
+
* capped at {@link INLINE_UPLOAD_MAX_BYTES} because every byte is paid ~1.33×
|
|
16
|
+
* in the model's output tokens.
|
|
17
|
+
*
|
|
18
|
+
* Both sources are sniffed by magic bytes, not by extension, and must match a
|
|
19
|
+
* short allow-list of document formats: the declared name decides nothing.
|
|
20
|
+
*/
|
|
21
|
+
import { readFile, realpath, stat } from "node:fs/promises";
|
|
22
|
+
import { basename, extname, isAbsolute, sep } from "node:path";
|
|
23
|
+
import { readCsv, readPositiveInt } from "../config/env.js";
|
|
24
|
+
import { resolveTransport } from "../config/transport-kind.js";
|
|
25
|
+
import { DEFAULT_UPLOAD_MAX_BYTES, INLINE_UPLOAD_MAX_BYTES } from "../constants.js";
|
|
26
|
+
/** A refusal whose message is meant for the caller, not a crash. */
|
|
27
|
+
export class UploadRejectedError extends Error {
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "UploadRejectedError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const OOXML = {
|
|
34
|
+
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
35
|
+
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
36
|
+
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
37
|
+
".odt": "application/vnd.oasis.opendocument.text",
|
|
38
|
+
".ods": "application/vnd.oasis.opendocument.spreadsheet",
|
|
39
|
+
};
|
|
40
|
+
const LEGACY_OFFICE = {
|
|
41
|
+
".doc": "application/msword",
|
|
42
|
+
".xls": "application/vnd.ms-excel",
|
|
43
|
+
".ppt": "application/vnd.ms-powerpoint",
|
|
44
|
+
};
|
|
45
|
+
function startsWith(data, bytes, offset = 0) {
|
|
46
|
+
if (data.length < offset + bytes.length)
|
|
47
|
+
return false;
|
|
48
|
+
return bytes.every((b, i) => data[offset + i] === b);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The document type of `data`, from its leading bytes. ZIP and OLE containers
|
|
52
|
+
* are ambiguous by content alone (a .docx and a .xlsx share a signature), so
|
|
53
|
+
* for those two families the extension picks the member — but only among
|
|
54
|
+
* formats of that container: a ZIP named `.pdf` is still refused.
|
|
55
|
+
*/
|
|
56
|
+
export function sniffDocumentType(data, filename) {
|
|
57
|
+
const ext = extname(filename).toLowerCase();
|
|
58
|
+
if (startsWith(data, [0x25, 0x50, 0x44, 0x46, 0x2d]))
|
|
59
|
+
return { contentType: "application/pdf", extensions: [".pdf"] };
|
|
60
|
+
if (startsWith(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))
|
|
61
|
+
return { contentType: "image/png", extensions: [".png"] };
|
|
62
|
+
if (startsWith(data, [0xff, 0xd8, 0xff]))
|
|
63
|
+
return { contentType: "image/jpeg", extensions: [".jpg", ".jpeg"] };
|
|
64
|
+
if (startsWith(data, [0x47, 0x49, 0x46, 0x38]))
|
|
65
|
+
return { contentType: "image/gif", extensions: [".gif"] };
|
|
66
|
+
if (startsWith(data, [0x52, 0x49, 0x46, 0x46]) && startsWith(data, [0x57, 0x45, 0x42, 0x50], 8))
|
|
67
|
+
return { contentType: "image/webp", extensions: [".webp"] };
|
|
68
|
+
if (startsWith(data, [0x7b, 0x5c, 0x72, 0x74, 0x66]))
|
|
69
|
+
return { contentType: "application/rtf", extensions: [".rtf"] };
|
|
70
|
+
if (startsWith(data, [0x50, 0x4b, 0x03, 0x04])) {
|
|
71
|
+
const contentType = OOXML[ext];
|
|
72
|
+
return contentType ? { contentType, extensions: [ext] } : undefined;
|
|
73
|
+
}
|
|
74
|
+
if (startsWith(data, [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1])) {
|
|
75
|
+
const contentType = LEGACY_OFFICE[ext];
|
|
76
|
+
return contentType ? { contentType, extensions: [ext] } : undefined;
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
const ACCEPTED_FORMATS = "PDF, DOCX/XLSX/PPTX, ODT/ODS, DOC/XLS/PPT, RTF, PNG, JPEG, GIF, WebP";
|
|
81
|
+
function typeOrReject(data, filename) {
|
|
82
|
+
const sniffed = sniffDocumentType(data, filename);
|
|
83
|
+
if (!sniffed) {
|
|
84
|
+
throw new UploadRejectedError(`Format non accepté pour « ${filename} » : le contenu ne correspond à aucun format autorisé (${ACCEPTED_FORMATS}). ` +
|
|
85
|
+
"Le type est déterminé par les premiers octets du fichier, pas par son extension.");
|
|
86
|
+
}
|
|
87
|
+
if (!sniffed.extensions.includes(extname(filename).toLowerCase())) {
|
|
88
|
+
throw new UploadRejectedError(`Extension incohérente pour « ${filename} » : le contenu est de type ${sniffed.contentType} ` +
|
|
89
|
+
`(extension attendue : ${sniffed.extensions.join(" ou ")}).`);
|
|
90
|
+
}
|
|
91
|
+
return sniffed.contentType;
|
|
92
|
+
}
|
|
93
|
+
function mb(bytes) {
|
|
94
|
+
return (bytes / 1024 / 1024).toFixed(1);
|
|
95
|
+
}
|
|
96
|
+
/** The allowed upload directories, resolved to real paths. Missing ones are skipped. */
|
|
97
|
+
async function allowedDirs(env) {
|
|
98
|
+
const raw = readCsv("BOOND_MCP_UPLOAD_DIRS", env);
|
|
99
|
+
if (!raw)
|
|
100
|
+
return undefined;
|
|
101
|
+
const resolved = [];
|
|
102
|
+
for (const dir of raw) {
|
|
103
|
+
if (!isAbsolute(dir))
|
|
104
|
+
continue;
|
|
105
|
+
try {
|
|
106
|
+
resolved.push(await realpath(dir));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// A listed directory that does not exist allows nothing; not fatal.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return resolved;
|
|
113
|
+
}
|
|
114
|
+
function isInside(file, dir) {
|
|
115
|
+
const prefix = dir.endsWith(sep) ? dir : dir + sep;
|
|
116
|
+
return file.startsWith(prefix);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Read a local file for upload, enforcing the operator's policy: stdio
|
|
120
|
+
* transport, an allowed directory (after symlink resolution), a regular file,
|
|
121
|
+
* the size ceiling, and an accepted document format.
|
|
122
|
+
*/
|
|
123
|
+
export async function readLocalUpload(filePath, env = process.env) {
|
|
124
|
+
if (resolveTransport(env) === "http") {
|
|
125
|
+
throw new UploadRejectedError("`filePath` est indisponible en transport HTTP : le serveur ne tourne pas sur le poste de l'utilisateur. " +
|
|
126
|
+
"Utiliser `fileUrl`, ou `fileContent` (base64) pour un petit fichier.");
|
|
127
|
+
}
|
|
128
|
+
const dirs = await allowedDirs(env);
|
|
129
|
+
if (dirs === undefined) {
|
|
130
|
+
throw new UploadRejectedError("Téléversement de fichiers locaux désactivé. L'opérateur du serveur doit définir `BOOND_MCP_UPLOAD_DIRS` " +
|
|
131
|
+
"(répertoires autorisés, chemins absolus). En attendant : `fileUrl`, ou `fileContent` (base64) pour un petit fichier.");
|
|
132
|
+
}
|
|
133
|
+
if (!isAbsolute(filePath)) {
|
|
134
|
+
throw new UploadRejectedError(`\`filePath\` doit être un chemin absolu (reçu : « ${filePath} »).`);
|
|
135
|
+
}
|
|
136
|
+
let real;
|
|
137
|
+
try {
|
|
138
|
+
real = await realpath(filePath);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
throw new UploadRejectedError(`Fichier introuvable : « ${filePath} ».`);
|
|
142
|
+
}
|
|
143
|
+
if (!dirs.some((dir) => isInside(real, dir))) {
|
|
144
|
+
throw new UploadRejectedError(`« ${filePath} » est hors des répertoires autorisés par \`BOOND_MCP_UPLOAD_DIRS\` (liens symboliques résolus).`);
|
|
145
|
+
}
|
|
146
|
+
const info = await stat(real);
|
|
147
|
+
if (!info.isFile())
|
|
148
|
+
throw new UploadRejectedError(`« ${filePath} » n'est pas un fichier.`);
|
|
149
|
+
const maxBytes = readPositiveInt("BOOND_MCP_UPLOAD_MAX_BYTES", DEFAULT_UPLOAD_MAX_BYTES, env);
|
|
150
|
+
if (info.size > maxBytes) {
|
|
151
|
+
throw new UploadRejectedError(`Fichier trop volumineux : ${mb(info.size)} Mo (max ${mb(maxBytes)} Mo, \`BOOND_MCP_UPLOAD_MAX_BYTES\`).`);
|
|
152
|
+
}
|
|
153
|
+
const data = await readFile(real);
|
|
154
|
+
// The file may have grown between stat() and readFile().
|
|
155
|
+
if (data.length > maxBytes) {
|
|
156
|
+
throw new UploadRejectedError(`Fichier trop volumineux : ${mb(data.length)} Mo (max ${mb(maxBytes)} Mo).`);
|
|
157
|
+
}
|
|
158
|
+
const filename = basename(real);
|
|
159
|
+
return { data, filename, contentType: typeOrReject(data, filename) };
|
|
160
|
+
}
|
|
161
|
+
const BASE64 = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
162
|
+
/** Decode base64 content passed inline, with an optional `data:` URI prefix. */
|
|
163
|
+
export function decodeInlineUpload(fileContent, fileName) {
|
|
164
|
+
const filename = basename(fileName.replace(/\\/g, "/")).trim();
|
|
165
|
+
if (filename.length === 0 || filename === "." || filename === "..") {
|
|
166
|
+
throw new UploadRejectedError("`fileName` doit être un nom de fichier avec son extension (ex. « cv.pdf »).");
|
|
167
|
+
}
|
|
168
|
+
const payload = fileContent.replace(/^data:[^;,]*;base64,/, "").replace(/\s+/g, "");
|
|
169
|
+
if (payload.length === 0 || payload.length % 4 !== 0 || !BASE64.test(payload)) {
|
|
170
|
+
throw new UploadRejectedError("`fileContent` n'est pas du base64 valide.");
|
|
171
|
+
}
|
|
172
|
+
const decodedLength = (payload.length / 4) * 3 - (payload.endsWith("==") ? 2 : payload.endsWith("=") ? 1 : 0);
|
|
173
|
+
if (decodedLength > INLINE_UPLOAD_MAX_BYTES) {
|
|
174
|
+
throw new UploadRejectedError(`Contenu inline trop volumineux : ${mb(decodedLength)} Mo (max ${mb(INLINE_UPLOAD_MAX_BYTES)} Mo). ` +
|
|
175
|
+
"Pour un fichier plus gros : `filePath` (serveur local) ou `fileUrl`.");
|
|
176
|
+
}
|
|
177
|
+
const data = Buffer.from(payload, "base64");
|
|
178
|
+
return { data, filename, contentType: typeOrReject(data, filename) };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=upload-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-source.js","sourceRoot":"","sources":["../../src/services/upload-source.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/absences.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { JsonApiResponse } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Render `/absences-reports/default` down to what a caller needs before
|
|
5
|
+
* `boond_absences_create` (issue #257): the absence types — work-unit types
|
|
6
|
+
* on the included resource, same publication point as the CRA (#249), absent
|
|
7
|
+
* from `/application/dictionary` — plus the report's own scalar attributes
|
|
8
|
+
* (quotas, agency, term) without the raw payload.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatAbsenceDefaults(response: JsonApiResponse): string;
|
|
2
11
|
export declare function registerAbsenceTools(server: McpServer): void;
|
|
3
12
|
//# sourceMappingURL=absences.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"absences.d.ts","sourceRoot":"","sources":["../../src/tools/absences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"absences.d.ts","sourceRoot":"","sources":["../../src/tools/absences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmBnD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoCvE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsL5D"}
|
package/dist/tools/absences.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { toKeywordReferences } from "./linked-entity-filters.js";
|
|
2
|
+
import { AbsenceSearchSchema, AbsenceCreateSchema, AbsenceUpdateSchema, AbsenceDefaultSchema, IdSchema, } from "../schemas/index.js";
|
|
3
|
+
import { renderAttributeValue } from "../services/format/summary.js";
|
|
2
4
|
import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse } from "../services/boond-client.js";
|
|
3
5
|
import { buildJsonApiBody, registerDeleteTool } from "./crud-factory.js";
|
|
4
6
|
import { composeDescription, defaultDeleteDescription, defaultGetDescription } from "./description-builders.js";
|
|
@@ -9,15 +11,68 @@ function inclusiveDays(startDate, endDate) {
|
|
|
9
11
|
return 1;
|
|
10
12
|
return Math.floor((end.getTime() - start.getTime()) / 86_400_000) + 1;
|
|
11
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Render `/absences-reports/default` down to what a caller needs before
|
|
16
|
+
* `boond_absences_create` (issue #257): the absence types — work-unit types
|
|
17
|
+
* on the included resource, same publication point as the CRA (#249), absent
|
|
18
|
+
* from `/application/dictionary` — plus the report's own scalar attributes
|
|
19
|
+
* (quotas, agency, term) without the raw payload.
|
|
20
|
+
*/
|
|
21
|
+
export function formatAbsenceDefaults(response) {
|
|
22
|
+
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
23
|
+
if (!entity)
|
|
24
|
+
return "Aucune donnée par défaut retournée pour cette ressource.";
|
|
25
|
+
const attrs = entity.attributes ?? {};
|
|
26
|
+
const included = response.included ?? [];
|
|
27
|
+
const resourceRef = entity.relationships?.resource?.data;
|
|
28
|
+
const resource = included.find((i) => i.type === "resource" && i.id === resourceRef?.id) ??
|
|
29
|
+
included.find((i) => i.type === "resource");
|
|
30
|
+
const agency = included.find((i) => i.type === "agency");
|
|
31
|
+
const resourceAttrs = resource?.attributes ?? {};
|
|
32
|
+
const name = [resourceAttrs.firstName, resourceAttrs.lastName].filter(Boolean).join(" ");
|
|
33
|
+
const lines = [
|
|
34
|
+
`Demande d'absence — ressource #${resource?.id ?? resourceRef?.id ?? "?"}${name ? ` (${name})` : ""}${agency ? ` | agence #${agency.id}${agency.attributes?.name ? ` (${String(agency.attributes.name)})` : ""}` : ""}`,
|
|
35
|
+
];
|
|
36
|
+
const types = (resourceAttrs.workUnitTypesAllowed ?? []).filter((t) => t.activityType === undefined ||
|
|
37
|
+
/absence|conge|leave/i.test(String(t.activityType)) ||
|
|
38
|
+
t.activityType !== "production");
|
|
39
|
+
lines.push("", `Types d'absence autorisés (${types.length}) — utiliser \`reference\` comme \`workUnitTypeReference\` :`);
|
|
40
|
+
lines.push(...(types.length
|
|
41
|
+
? types.map((t) => ` reference=${t.reference} | ${t.name ?? ""}${t.activityType ? ` | ${t.activityType}` : ""}`)
|
|
42
|
+
: [" (aucun type publié pour cette ressource — vérifier l'agence)"]));
|
|
43
|
+
const scalars = Object.entries(attrs).filter(([, v]) => v !== null && typeof v !== "object");
|
|
44
|
+
if (scalars.length > 0) {
|
|
45
|
+
lines.push("", "Valeurs par défaut de la demande :");
|
|
46
|
+
lines.push(...scalars.map(([k, v]) => ` ${k}: ${renderAttributeValue(v)}`));
|
|
47
|
+
}
|
|
48
|
+
return lines.join("\n");
|
|
49
|
+
}
|
|
12
50
|
export function registerAbsenceTools(server) {
|
|
51
|
+
server.registerTool("boond_absences_default", {
|
|
52
|
+
title: "Référentiels d'une demande d'absence",
|
|
53
|
+
description: composeDescription({
|
|
54
|
+
purpose: "Renvoie les types d'absence autorisés pour une ressource (RTT, maladie, congés payés… avec leur code) et les valeurs par défaut d'une demande.",
|
|
55
|
+
when: "AVANT `boond_absences_create` — le code `workUnitTypeReference` n'est publié que par `GET /absences-reports/default` (ni dans `boond_application_dictionary`, ni sur l'agence).",
|
|
56
|
+
instead: "`boond_timesheets_default` pour les mêmes codes vus du CRA (production comprise) ; aucun autre outil ne donne les types d'absence.",
|
|
57
|
+
behaviour: [
|
|
58
|
+
"Lecture seule ; la réponse brute est réduite aux types (ressource incluse, `workUnitTypesAllowed`) et aux scalaires de la demande.",
|
|
59
|
+
],
|
|
60
|
+
returns: "texte : ressource, agence, types d'absence (reference | libellé | activityType), valeurs par défaut.",
|
|
61
|
+
}),
|
|
62
|
+
inputSchema: AbsenceDefaultSchema,
|
|
63
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
64
|
+
}, async (params) => {
|
|
65
|
+
const query = { resource: params.resourceId };
|
|
66
|
+
if (params.agencyId)
|
|
67
|
+
query.agency = params.agencyId;
|
|
68
|
+
const response = await apiRequest("/absences-reports/default", "GET", undefined, query);
|
|
69
|
+
return { content: [{ type: "text", text: formatAbsenceDefaults(response) }] };
|
|
70
|
+
});
|
|
13
71
|
server.registerTool("boond_absences_search", {
|
|
14
72
|
title: "Rechercher des demandes d'absence",
|
|
15
|
-
description: `Recherche des demandes d'absence dans BoondManager.
|
|
73
|
+
description: `Recherche des demandes d'absence dans BoondManager, par période (\`startMonth\` / \`endMonth\` en YYYY-MM, requis), ressource, état de validation (\`validationStates\`) et périmètre (\`perimeter*\`).
|
|
16
74
|
|
|
17
|
-
|
|
18
|
-
- keywords (string, optional): Termes de recherche. resourceId est converti en COMP<id>.
|
|
19
|
-
- startMonth, endMonth (string, optional): Periode au format YYYY-MM.
|
|
20
|
-
- page, pageSize: Pagination
|
|
75
|
+
\`resourceId\` est converti en référence \`keywords\` COMP<id> : l'API n'a pas de paramètre dédié.
|
|
21
76
|
|
|
22
77
|
Returns: Liste des demandes d'absence correspondantes.`,
|
|
23
78
|
inputSchema: AbsenceSearchSchema,
|
|
@@ -28,13 +83,7 @@ Returns: Liste des demandes d'absence correspondantes.`,
|
|
|
28
83
|
openWorldHint: true,
|
|
29
84
|
},
|
|
30
85
|
}, async (params) => {
|
|
31
|
-
const
|
|
32
|
-
const tokens = [];
|
|
33
|
-
if (keywords)
|
|
34
|
-
tokens.push(keywords);
|
|
35
|
-
if (resourceId)
|
|
36
|
-
tokens.push(`COMP${resourceId}`);
|
|
37
|
-
const query = buildSearchQuery(tokens.length > 0 ? { ...rest, keywords: tokens.join(" ") } : rest);
|
|
86
|
+
const query = buildSearchQuery(toKeywordReferences(params));
|
|
38
87
|
const response = await apiRequest("/absences-reports", "GET", undefined, query);
|
|
39
88
|
return {
|
|
40
89
|
content: [{ type: "text", text: formatListResponse(response, "absence", params.fields) }],
|
|
@@ -67,7 +116,7 @@ Returns: Liste des demandes d'absence correspondantes.`,
|
|
|
67
116
|
instead: "`boond_absences_update` pour modifier une demande déjà déposée.",
|
|
68
117
|
behaviour: [
|
|
69
118
|
"Le détail est porté par `absencesPeriods` ; si le tableau est omis, une période unique est déduite de `startDate`/`endDate`.",
|
|
70
|
-
"`state` est
|
|
119
|
+
"Pas de `state` : sur `/absences-reports` l'état est une chaîne du workflow de validation (`waitingForValidation`, `validated`…) que seul le workflow déplace — la demande part en attente de validation, elle n'est pas validée par cet appel (suivi via `boond_validations_search`).",
|
|
71
120
|
"Écriture non idempotente — l'API ne déduplique pas deux demandes sur les mêmes dates.",
|
|
72
121
|
],
|
|
73
122
|
returns: "confirmation et fiche de la demande créée.",
|
|
@@ -80,7 +129,7 @@ Returns: Liste des demandes d'absence correspondantes.`,
|
|
|
80
129
|
openWorldHint: false,
|
|
81
130
|
},
|
|
82
131
|
}, async (params) => {
|
|
83
|
-
const { resourceId, typeOf, startDate, endDate, duration, workUnitTypeReference, absencesPeriods,
|
|
132
|
+
const { resourceId, typeOf, startDate, endDate, duration, workUnitTypeReference, absencesPeriods, note } = params;
|
|
84
133
|
const periods = absencesPeriods ?? [
|
|
85
134
|
{
|
|
86
135
|
startDate,
|
|
@@ -92,12 +141,8 @@ Returns: Liste des demandes d'absence correspondantes.`,
|
|
|
92
141
|
];
|
|
93
142
|
const body = buildJsonApiBody("absencesreport", {
|
|
94
143
|
...(note ? { informationComments: note } : {}),
|
|
95
|
-
...(state !== undefined ? { state } : {}),
|
|
96
144
|
absencesPeriods: periods,
|
|
97
|
-
});
|
|
98
|
-
body.data.relationships = {
|
|
99
|
-
resource: { data: { id: resourceId, type: "resource" } },
|
|
100
|
-
};
|
|
145
|
+
}, undefined, { resource: { id: resourceId, type: "resource" } });
|
|
101
146
|
const response = await apiRequest("/absences-reports", "POST", body);
|
|
102
147
|
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
103
148
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"absences.js","sourceRoot":"","sources":["../../src/tools/absences.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"absences.js","sourceRoot":"","sources":["../../src/tools/absences.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/tools/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/tools/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuCzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuN3D"}
|
package/dist/tools/actions.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toKeywordReferences } from "./linked-entity-filters.js";
|
|
1
2
|
import { ActionSearchSchema, ActionCreateSchema, ActionUpdateSchema, IdSchema } from "../schemas/index.js";
|
|
2
3
|
import { apiRequest, apiSearch, buildSearchQuery, formatListResponse, formatDetailResponse, } from "../services/boond-client.js";
|
|
3
4
|
import { progressReporterFrom } from "../services/progress.js";
|
|
@@ -32,12 +33,9 @@ export function registerActionTools(server) {
|
|
|
32
33
|
// Search actions
|
|
33
34
|
server.registerTool("boond_actions_search", {
|
|
34
35
|
title: "Rechercher des actions",
|
|
35
|
-
description: `Recherche des actions (appels, emails, RDV, notes) dans BoondManager
|
|
36
|
+
description: `Recherche des actions (appels, emails, RDV, notes) dans BoondManager par entité rattachée (candidat, ressource, contact, société, opportunité, projet), type (\`actionTypes\`), période (\`period\` + dates ou \`periodDynamic\`) et périmètre (\`perimeter*\`).
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
- keywords (string, optional): Termes de recherche
|
|
39
|
-
- candidateId, resourceId, contactId, companyId (string, optional): Filtrer par entité liée
|
|
40
|
-
- page, pageSize: Pagination
|
|
38
|
+
Les filtres \`candidateId\` / \`resourceId\` / \`contactId\` / \`companyId\` sont convertis en références \`keywords\` (CAND<id> / COMP<id> / CCON<id> / CSOC<id>) : l'API n'a pas de paramètre dédié.
|
|
41
39
|
|
|
42
40
|
Returns: Liste des actions correspondantes.`,
|
|
43
41
|
inputSchema: ActionSearchSchema,
|
|
@@ -48,7 +46,7 @@ Returns: Liste des actions correspondantes.`,
|
|
|
48
46
|
openWorldHint: true,
|
|
49
47
|
},
|
|
50
48
|
}, async (params, extra) => {
|
|
51
|
-
const query = buildSearchQuery(params);
|
|
49
|
+
const query = buildSearchQuery(toKeywordReferences(params));
|
|
52
50
|
// apiSearch chunks the request to respect BoondManager's 100-result cap
|
|
53
51
|
// on /actions (heavy objects → memory overflow above 100).
|
|
54
52
|
const response = await apiSearch("/actions", query, progressReporterFrom(extra));
|
|
@@ -81,13 +79,7 @@ Returns: Liste des actions correspondantes.`,
|
|
|
81
79
|
title: "Créer une action",
|
|
82
80
|
description: buildActionCreateDescription(`Crée une nouvelle action (appel, email, RDV, note) dans BoondManager, rattachée à un contact, candidat, ressource, opportunité ou projet (relation dependsOn, obligatoire).
|
|
83
81
|
|
|
84
|
-
|
|
85
|
-
- typeOf (number, requis): ID numérique du type d'action (dictionnaire setting.action.*, via boond_application_dictionary)
|
|
86
|
-
- title, text (string, optional): Titre et contenu de l'action
|
|
87
|
-
- startDate, endDate (string, optional): Dates ISO avec timezone (ex: 2026-06-05T10:00:00+0200)
|
|
88
|
-
- contactId | candidateId | resourceId | opportunityId | projectId (string, un requis): Entité de rattachement
|
|
89
|
-
- companyId (string, optional): Société, uniquement en complément d'un contactId
|
|
90
|
-
- positioningId (string, optional): Positionnement à lier — requis par l'API pour les types d'action liés aux positionnements (ex. RQ)
|
|
82
|
+
Exactement une entité de rattachement parmi \`contactId\` / \`candidateId\` / \`resourceId\` / \`opportunityId\` / \`projectId\` est requise (422 sinon) ; \`companyId\` n'est accepté qu'en complément d'un \`contactId\`, et \`positioningId\` est exigé par l'API pour les types d'action liés aux positionnements (ex. RQ).
|
|
91
83
|
|
|
92
84
|
Returns: L'action créée avec son ID.`),
|
|
93
85
|
inputSchema: ActionCreateSchema,
|
|
@@ -109,7 +101,7 @@ Returns: L'action créée avec son ID.`),
|
|
|
109
101
|
{ id: opportunityId, type: "opportunity" },
|
|
110
102
|
{ id: projectId, type: "project" },
|
|
111
103
|
];
|
|
112
|
-
const dependsOn = dependsOnCandidates.
|
|
104
|
+
const dependsOn = dependsOnCandidates.flatMap((c) => (c.id ? [{ id: c.id, type: c.type }] : [])).at(0);
|
|
113
105
|
if (!dependsOn) {
|
|
114
106
|
return {
|
|
115
107
|
isError: true,
|
|
@@ -143,12 +135,11 @@ Returns: L'action créée avec son ID.`),
|
|
|
143
135
|
}
|
|
144
136
|
attrs.typeOf = resolved;
|
|
145
137
|
}
|
|
146
|
-
const body = buildJsonApiBody("action", attrs);
|
|
147
138
|
const relationships = {
|
|
148
|
-
dependsOn: {
|
|
139
|
+
dependsOn: { id: dependsOn.id, type: dependsOn.type },
|
|
149
140
|
};
|
|
150
141
|
if (companyId && dependsOn.type === "contact") {
|
|
151
|
-
relationships.company = {
|
|
142
|
+
relationships.company = { id: companyId, type: "company" };
|
|
152
143
|
}
|
|
153
144
|
// Some action types (those bound to positionings in the Boond setup, e.g.
|
|
154
145
|
// "RQ"-style interviews) are rejected with a 422 "1002 - Wrong or missing
|
|
@@ -156,9 +147,9 @@ Returns: L'action créée avec son ID.`),
|
|
|
156
147
|
// relationship is sent. The official bodyPost.json schema does not
|
|
157
148
|
// document it, but the API enforces it for those types.
|
|
158
149
|
if (positioningId) {
|
|
159
|
-
relationships.positioning = {
|
|
150
|
+
relationships.positioning = { id: positioningId, type: "positioning" };
|
|
160
151
|
}
|
|
161
|
-
body
|
|
152
|
+
const body = buildJsonApiBody("action", attrs, undefined, relationships);
|
|
162
153
|
const response = await apiRequest("/actions", "POST", body);
|
|
163
154
|
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
164
155
|
return {
|
|
@@ -175,14 +166,7 @@ Returns: L'action créée avec son ID.`),
|
|
|
175
166
|
title: "Modifier une action",
|
|
176
167
|
description: `Met à jour une action existante dans BoondManager (PUT partiel, seuls les champs fournis sont modifiés).
|
|
177
168
|
|
|
178
|
-
⚠️ Aucune relation n'est envoyée : le rattachement (dependsOn), le positionnement et la synchronisation calendrier (event Outlook/Teams, invités) sont préservés. Idéal pour ajouter un compte-rendu sans casser l'agenda — contrairement à delete + recreate qui supprime l'événement.
|
|
179
|
-
|
|
180
|
-
Args:
|
|
181
|
-
- id (string, requis): ID de l'action à modifier
|
|
182
|
-
- typeOf (number, optional): Nouveau type (ID numérique du dictionnaire setting.action.*)
|
|
183
|
-
- title (string, optional): Nouveau titre
|
|
184
|
-
- text (string, optional): Nouveau contenu / notes (remplace l'existant, pas d'ajout)
|
|
185
|
-
- startDate, endDate (string, optional): Dates ISO avec timezone (ex: 2026-06-05T10:00:00+0200)
|
|
169
|
+
⚠️ Aucune relation n'est envoyée : le rattachement (dependsOn), le positionnement et la synchronisation calendrier (event Outlook/Teams, invités) sont préservés. Idéal pour ajouter un compte-rendu sans casser l'agenda — contrairement à delete + recreate qui supprime l'événement. \`text\` remplace le contenu existant (pas d'ajout).
|
|
186
170
|
|
|
187
171
|
Returns: L'action mise à jour.`,
|
|
188
172
|
inputSchema: ActionUpdateSchema,
|