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.
Files changed (272) hide show
  1. package/LICENSE +1 -1
  2. package/NOTICE +16 -2
  3. package/README.md +60 -15
  4. package/dist/config/access-policy.d.ts.map +1 -1
  5. package/dist/config/access-policy.js +6 -18
  6. package/dist/config/access-policy.js.map +1 -1
  7. package/dist/config/dictionary-overrides.d.ts.map +1 -1
  8. package/dist/config/dictionary-overrides.js +2 -12
  9. package/dist/config/dictionary-overrides.js.map +1 -1
  10. package/dist/config/env.d.ts +63 -0
  11. package/dist/config/env.d.ts.map +1 -0
  12. package/dist/config/env.js +116 -0
  13. package/dist/config/env.js.map +1 -0
  14. package/dist/config/profiles.d.ts +22 -8
  15. package/dist/config/profiles.d.ts.map +1 -1
  16. package/dist/config/profiles.js +48 -4
  17. package/dist/config/profiles.js.map +1 -1
  18. package/dist/constants.d.ts +13 -2
  19. package/dist/constants.d.ts.map +1 -1
  20. package/dist/constants.js +25 -1
  21. package/dist/constants.js.map +1 -1
  22. package/dist/icons.d.ts.map +1 -1
  23. package/dist/icons.js +6 -1
  24. package/dist/icons.js.map +1 -1
  25. package/dist/index.js +33 -15
  26. package/dist/index.js.map +1 -1
  27. package/dist/instructions.d.ts +1 -1
  28. package/dist/instructions.d.ts.map +1 -1
  29. package/dist/instructions.js +6 -6
  30. package/dist/instructions.js.map +1 -1
  31. package/dist/prompts/index.d.ts +19 -1
  32. package/dist/prompts/index.d.ts.map +1 -1
  33. package/dist/prompts/index.js +495 -25
  34. package/dist/prompts/index.js.map +1 -1
  35. package/dist/prompts/periods.d.ts +45 -0
  36. package/dist/prompts/periods.d.ts.map +1 -0
  37. package/dist/prompts/periods.js +154 -0
  38. package/dist/prompts/periods.js.map +1 -0
  39. package/dist/resources/index.d.ts +14 -0
  40. package/dist/resources/index.d.ts.map +1 -1
  41. package/dist/resources/index.js +285 -0
  42. package/dist/resources/index.js.map +1 -1
  43. package/dist/resources/templates.d.ts +1 -1
  44. package/dist/resources/templates.d.ts.map +1 -1
  45. package/dist/resources/templates.js +2 -0
  46. package/dist/resources/templates.js.map +1 -1
  47. package/dist/schema-dialect.js.map +1 -1
  48. package/dist/schemas/filter-aliases.d.ts +1 -1
  49. package/dist/schemas/filter-aliases.d.ts.map +1 -1
  50. package/dist/schemas/filter-aliases.js +101 -2
  51. package/dist/schemas/filter-aliases.js.map +1 -1
  52. package/dist/schemas/index.d.ts +987 -161
  53. package/dist/schemas/index.d.ts.map +1 -1
  54. package/dist/schemas/index.js +853 -323
  55. package/dist/schemas/index.js.map +1 -1
  56. package/dist/server.d.ts.map +1 -1
  57. package/dist/server.js +10 -3
  58. package/dist/server.js.map +1 -1
  59. package/dist/services/boond-client.d.ts +29 -213
  60. package/dist/services/boond-client.d.ts.map +1 -1
  61. package/dist/services/boond-client.js +29 -1168
  62. package/dist/services/boond-client.js.map +1 -1
  63. package/dist/services/dictionary.d.ts +27 -3
  64. package/dist/services/dictionary.d.ts.map +1 -1
  65. package/dist/services/dictionary.js +60 -23
  66. package/dist/services/dictionary.js.map +1 -1
  67. package/dist/services/document-text.d.ts +32 -0
  68. package/dist/services/document-text.d.ts.map +1 -0
  69. package/dist/services/document-text.js +120 -0
  70. package/dist/services/document-text.js.map +1 -0
  71. package/dist/services/format/detail.d.ts +16 -0
  72. package/dist/services/format/detail.d.ts.map +1 -0
  73. package/dist/services/format/detail.js +36 -0
  74. package/dist/services/format/detail.js.map +1 -0
  75. package/dist/services/format/html.d.ts +19 -0
  76. package/dist/services/format/html.d.ts.map +1 -0
  77. package/dist/services/format/html.js +87 -0
  78. package/dist/services/format/html.js.map +1 -0
  79. package/dist/services/format/list.d.ts +3 -0
  80. package/dist/services/format/list.d.ts.map +1 -0
  81. package/dist/services/format/list.js +44 -0
  82. package/dist/services/format/list.js.map +1 -0
  83. package/dist/services/format/summary.d.ts +16 -0
  84. package/dist/services/format/summary.d.ts.map +1 -0
  85. package/dist/services/format/summary.js +172 -0
  86. package/dist/services/format/summary.js.map +1 -0
  87. package/dist/services/format/tab.d.ts +9 -0
  88. package/dist/services/format/tab.d.ts.map +1 -0
  89. package/dist/services/format/tab.js +32 -0
  90. package/dist/services/format/tab.js.map +1 -0
  91. package/dist/services/http/auth.d.ts +44 -0
  92. package/dist/services/http/auth.d.ts.map +1 -0
  93. package/dist/services/http/auth.js +146 -0
  94. package/dist/services/http/auth.js.map +1 -0
  95. package/dist/services/http/download.d.ts +60 -0
  96. package/dist/services/http/download.d.ts.map +1 -0
  97. package/dist/services/http/download.js +160 -0
  98. package/dist/services/http/download.js.map +1 -0
  99. package/dist/services/http/errors.d.ts +45 -0
  100. package/dist/services/http/errors.d.ts.map +1 -0
  101. package/dist/services/http/errors.js +188 -0
  102. package/dist/services/http/errors.js.map +1 -0
  103. package/dist/services/http/rate-limit.d.ts +40 -0
  104. package/dist/services/http/rate-limit.d.ts.map +1 -0
  105. package/dist/services/http/rate-limit.js +92 -0
  106. package/dist/services/http/rate-limit.js.map +1 -0
  107. package/dist/services/http/retry.d.ts +46 -0
  108. package/dist/services/http/retry.d.ts.map +1 -0
  109. package/dist/services/http/retry.js +101 -0
  110. package/dist/services/http/retry.js.map +1 -0
  111. package/dist/services/http/transport.d.ts +73 -0
  112. package/dist/services/http/transport.d.ts.map +1 -0
  113. package/dist/services/http/transport.js +272 -0
  114. package/dist/services/http/transport.js.map +1 -0
  115. package/dist/services/logger.d.ts +53 -2
  116. package/dist/services/logger.d.ts.map +1 -1
  117. package/dist/services/logger.js +82 -21
  118. package/dist/services/logger.js.map +1 -1
  119. package/dist/services/oauth.d.ts +12 -0
  120. package/dist/services/oauth.d.ts.map +1 -1
  121. package/dist/services/oauth.js +21 -8
  122. package/dist/services/oauth.js.map +1 -1
  123. package/dist/services/rate-limiter.d.ts +9 -2
  124. package/dist/services/rate-limiter.d.ts.map +1 -1
  125. package/dist/services/rate-limiter.js +18 -6
  126. package/dist/services/rate-limiter.js.map +1 -1
  127. package/dist/services/request-context.d.ts +47 -0
  128. package/dist/services/request-context.d.ts.map +1 -0
  129. package/dist/services/request-context.js +112 -0
  130. package/dist/services/request-context.js.map +1 -0
  131. package/dist/services/search.d.ts +26 -0
  132. package/dist/services/search.d.ts.map +1 -0
  133. package/dist/services/search.js +98 -0
  134. package/dist/services/search.js.map +1 -0
  135. package/dist/services/update-checker.d.ts.map +1 -1
  136. package/dist/services/update-checker.js +15 -8
  137. package/dist/services/update-checker.js.map +1 -1
  138. package/dist/tools/absences.d.ts +9 -0
  139. package/dist/tools/absences.d.ts.map +1 -1
  140. package/dist/tools/absences.js +65 -20
  141. package/dist/tools/absences.js.map +1 -1
  142. package/dist/tools/actions.d.ts.map +1 -1
  143. package/dist/tools/actions.js +11 -27
  144. package/dist/tools/actions.js.map +1 -1
  145. package/dist/tools/advantages.d.ts +2 -0
  146. package/dist/tools/advantages.d.ts.map +1 -1
  147. package/dist/tools/advantages.js +66 -13
  148. package/dist/tools/advantages.js.map +1 -1
  149. package/dist/tools/alerts.d.ts +18 -0
  150. package/dist/tools/alerts.d.ts.map +1 -0
  151. package/dist/tools/alerts.js +82 -0
  152. package/dist/tools/alerts.js.map +1 -0
  153. package/dist/tools/application.d.ts +2 -1
  154. package/dist/tools/application.d.ts.map +1 -1
  155. package/dist/tools/application.js +9 -3
  156. package/dist/tools/application.js.map +1 -1
  157. package/dist/tools/contacts.d.ts.map +1 -1
  158. package/dist/tools/contacts.js +3 -7
  159. package/dist/tools/contacts.js.map +1 -1
  160. package/dist/tools/contracts.d.ts +22 -0
  161. package/dist/tools/contracts.d.ts.map +1 -1
  162. package/dist/tools/contracts.js +185 -52
  163. package/dist/tools/contracts.js.map +1 -1
  164. package/dist/tools/crud-factory.d.ts +33 -2
  165. package/dist/tools/crud-factory.d.ts.map +1 -1
  166. package/dist/tools/crud-factory.js +42 -15
  167. package/dist/tools/crud-factory.js.map +1 -1
  168. package/dist/tools/deliveries.d.ts +3 -0
  169. package/dist/tools/deliveries.d.ts.map +1 -1
  170. package/dist/tools/deliveries.js +50 -94
  171. package/dist/tools/deliveries.js.map +1 -1
  172. package/dist/tools/description-builders.d.ts +0 -1
  173. package/dist/tools/description-builders.d.ts.map +1 -1
  174. package/dist/tools/description-builders.js +46 -3
  175. package/dist/tools/description-builders.js.map +1 -1
  176. package/dist/tools/documents.d.ts.map +1 -1
  177. package/dist/tools/documents.js +73 -21
  178. package/dist/tools/documents.js.map +1 -1
  179. package/dist/tools/expenses.d.ts.map +1 -1
  180. package/dist/tools/expenses.js +2 -11
  181. package/dist/tools/expenses.js.map +1 -1
  182. package/dist/tools/find.d.ts +61 -0
  183. package/dist/tools/find.d.ts.map +1 -0
  184. package/dist/tools/find.js +221 -0
  185. package/dist/tools/find.js.map +1 -0
  186. package/dist/tools/flags.d.ts +5 -0
  187. package/dist/tools/flags.d.ts.map +1 -1
  188. package/dist/tools/flags.js +116 -1
  189. package/dist/tools/flags.js.map +1 -1
  190. package/dist/tools/forms.d.ts +5 -0
  191. package/dist/tools/forms.d.ts.map +1 -0
  192. package/dist/tools/forms.js +64 -0
  193. package/dist/tools/forms.js.map +1 -0
  194. package/dist/tools/groupments.d.ts +5 -0
  195. package/dist/tools/groupments.d.ts.map +1 -0
  196. package/dist/tools/groupments.js +68 -0
  197. package/dist/tools/groupments.js.map +1 -0
  198. package/dist/tools/inactivities.d.ts +5 -0
  199. package/dist/tools/inactivities.d.ts.map +1 -0
  200. package/dist/tools/inactivities.js +59 -0
  201. package/dist/tools/inactivities.js.map +1 -0
  202. package/dist/tools/index.d.ts +4 -0
  203. package/dist/tools/index.d.ts.map +1 -1
  204. package/dist/tools/index.js +4 -0
  205. package/dist/tools/index.js.map +1 -1
  206. package/dist/tools/invoices.d.ts.map +1 -1
  207. package/dist/tools/invoices.js +27 -2
  208. package/dist/tools/invoices.js.map +1 -1
  209. package/dist/tools/linked-entity-filters.d.ts +48 -0
  210. package/dist/tools/linked-entity-filters.d.ts.map +1 -0
  211. package/dist/tools/linked-entity-filters.js +64 -0
  212. package/dist/tools/linked-entity-filters.js.map +1 -0
  213. package/dist/tools/notifications.d.ts.map +1 -1
  214. package/dist/tools/notifications.js +0 -5
  215. package/dist/tools/notifications.js.map +1 -1
  216. package/dist/tools/orders.d.ts.map +1 -1
  217. package/dist/tools/orders.js +33 -4
  218. package/dist/tools/orders.js.map +1 -1
  219. package/dist/tools/parameter-disclosure.js.map +1 -1
  220. package/dist/tools/payments.d.ts +3 -0
  221. package/dist/tools/payments.d.ts.map +1 -1
  222. package/dist/tools/payments.js +43 -109
  223. package/dist/tools/payments.js.map +1 -1
  224. package/dist/tools/positionings.d.ts.map +1 -1
  225. package/dist/tools/positionings.js +9 -39
  226. package/dist/tools/positionings.js.map +1 -1
  227. package/dist/tools/projects.d.ts.map +1 -1
  228. package/dist/tools/projects.js +5 -12
  229. package/dist/tools/projects.js.map +1 -1
  230. package/dist/tools/provider-invoices.d.ts +2 -0
  231. package/dist/tools/provider-invoices.d.ts.map +1 -1
  232. package/dist/tools/provider-invoices.js +30 -111
  233. package/dist/tools/provider-invoices.js.map +1 -1
  234. package/dist/tools/purchases.d.ts +2 -0
  235. package/dist/tools/purchases.d.ts.map +1 -1
  236. package/dist/tools/purchases.js +50 -104
  237. package/dist/tools/purchases.js.map +1 -1
  238. package/dist/tools/registration-decorators.d.ts +28 -0
  239. package/dist/tools/registration-decorators.d.ts.map +1 -1
  240. package/dist/tools/registration-decorators.js +107 -0
  241. package/dist/tools/registration-decorators.js.map +1 -1
  242. package/dist/tools/resources.d.ts.map +1 -1
  243. package/dist/tools/resources.js +27 -5
  244. package/dist/tools/resources.js.map +1 -1
  245. package/dist/tools/rights.d.ts +101 -0
  246. package/dist/tools/rights.d.ts.map +1 -0
  247. package/dist/tools/rights.js +75 -0
  248. package/dist/tools/rights.js.map +1 -0
  249. package/dist/tools/tab-tools.js +3 -3
  250. package/dist/tools/tab-tools.js.map +1 -1
  251. package/dist/tools/timesheets.d.ts +29 -0
  252. package/dist/tools/timesheets.d.ts.map +1 -1
  253. package/dist/tools/timesheets.js +196 -126
  254. package/dist/tools/timesheets.js.map +1 -1
  255. package/dist/tools/todolists.d.ts +2 -0
  256. package/dist/tools/todolists.d.ts.map +1 -1
  257. package/dist/tools/todolists.js +64 -1
  258. package/dist/tools/todolists.js.map +1 -1
  259. package/dist/tools/validations.d.ts +9 -0
  260. package/dist/tools/validations.d.ts.map +1 -1
  261. package/dist/tools/validations.js +86 -9
  262. package/dist/tools/validations.js.map +1 -1
  263. package/dist/tools/workflows.js +1 -1
  264. package/dist/tools/workflows.js.map +1 -1
  265. package/dist/transports/http.d.ts +116 -0
  266. package/dist/transports/http.d.ts.map +1 -1
  267. package/dist/transports/http.js +422 -92
  268. package/dist/transports/http.js.map +1 -1
  269. package/dist/types.d.ts +3 -3
  270. package/dist/types.d.ts.map +1 -1
  271. package/manifest.json +7 -7
  272. package/package.json +14 -10
@@ -1,215 +1,31 @@
1
- import type { BoondAuthProvider, JsonApiResource, JsonApiResponse, SearchParams } from "../types.js";
2
- import type { ProgressReporter } from "./progress.js";
3
1
  /**
4
- * Auth provider for the HTTP transport: reads the Bearer token from the
5
- * per-request AsyncLocalStorage populated by the transport layer and
6
- * forwards it verbatim to BoondManager as `Authorization: Bearer …`.
7
- *
8
- * Errors out clearly if called outside a request context — which would
9
- * indicate that the transport layer forgot to wrap the request in
10
- * `oauthContext.run(...)`.
11
- */
12
- export declare const oauthContextAuth: BoondAuthProvider;
13
- /**
14
- * Build the BoondManager HS256 JWT. By default the payload is exactly
15
- * `{ userToken, clientToken }` (BoondManager's documented scheme). When
16
- * `expiresInSeconds` is provided, standard `iat`/`exp` claims are added so the
17
- * generated token is no longer replayable forever if it leaks — this requires
18
- * regenerating the token per request (see `jwtAuth`). Opt-in because not every
19
- * BoondManager deployment is known to honour `exp`.
20
- */
21
- export declare function buildJwt(userToken: string, clientToken: string, clientKey: string, options?: {
22
- expiresInSeconds?: number;
23
- nowSeconds?: number;
24
- }): string;
25
- export declare const JWT_HEADER_NAME = "X-Jwt-Client-Boondmanager";
26
- export declare function initClient(): void;
27
- /**
28
- * True when env-based credentials (JWT components, API token, or BasicAuth) are
29
- * configured. Used by the HTTP transport to decide whether static-auth mode is
30
- * possible without attempting a full `initClient()` call.
31
- */
32
- export declare function hasEnvCredentials(): boolean;
33
- /**
34
- * Install a custom auth provider — used by the HTTP transport bootstrap to
35
- * wire in an OAuth2 token source (where the access token is refreshed
36
- * transparently per request rather than baked in at startup).
37
- */
38
- export declare function initClientWithAuth(auth: BoondAuthProvider, baseUrl?: string): void;
39
- /** Test helper — reset the cached config so the next call re-initialises. */
40
- export declare function resetClientForTests(): void;
41
- export type QueryValue = string | number | Array<string | number> | undefined;
42
- /**
43
- * Pull the human-readable bits out of a BoondManager error body.
44
- *
45
- * Boond returns JSON:API errors of the form:
46
- * { "errors": [ { "status": "422", "code": "422", "detail": "...", "title": "..." } ] }
47
- *
48
- * Surfacing `detail` (and `title` when present) gives the model a focused
49
- * message like `422 - password mismatch` instead of the full ~500-char body
50
- * dump that previously made it hard for the LLM to reason about the failure.
51
- *
52
- * Exported for unit testing.
53
- */
54
- export declare function parseBoondErrorBody(body: string): string | null;
55
- /**
56
- * Resolve the per-request HTTP timeout in milliseconds.
57
- *
58
- * Reads BOOND_HTTP_TIMEOUT_MS at call time so tests / runtime overrides take
59
- * effect without restarting the process. Falls back to the default for
60
- * unset, non-numeric, or non-positive values.
61
- *
62
- * Exported for unit testing.
63
- */
64
- export declare function resolveTimeoutMs(): number;
65
- export interface RetryConfig {
66
- maxRetries: number;
67
- baseDelayMs: number;
68
- maxDelayMs: number;
69
- }
70
- /** Resolve retry configuration from env, with safe fallbacks. Exported for tests. */
71
- export declare function resolveRetryConfig(): RetryConfig;
72
- /**
73
- * Decide whether a failed attempt is worth retrying.
74
- *
75
- * Retry policy is intentionally conservative for non-idempotent verbs to avoid
76
- * silently duplicating writes when the server's response was lost or delayed:
77
- * - 429 (Too Many Requests) is always retried — the server explicitly
78
- * rejected the request before processing it, so it is safe regardless of
79
- * verb.
80
- * - For GET only, 5xx responses, network failures, and timeouts are retried
81
- * because GET is idempotent.
82
- * - 4xx responses (other than 429) are never retried — the client must change
83
- * the request before another attempt makes sense.
84
- *
85
- * Exported for unit testing.
86
- */
87
- export declare function isRetryable(method: string, status: number | undefined, isNetworkOrTimeout: boolean): boolean;
88
- /**
89
- * Parse a `Retry-After` header value into milliseconds.
90
- *
91
- * Accepts either a non-negative number of seconds or an HTTP-date. Returns
92
- * null when the value is absent or unparseable. Negative computed delays are
93
- * clamped to 0. Exported for unit testing.
94
- */
95
- export declare function parseRetryAfter(value: string | null, now?: number): number | null;
96
- /**
97
- * Compute the next backoff delay using full jitter:
98
- * delay = random(0, min(maxMs, baseMs * 2^attempt))
99
- *
100
- * Full jitter (vs. exponential-only) reduces thundering-herd risk when many
101
- * clients retry in lockstep. Exported for unit testing.
102
- */
103
- export declare function computeBackoffMs(attempt: number, baseMs: number, maxMs: number, random?: () => number): number;
104
- export interface RateLimitConfig {
105
- rps: number;
106
- burst: number;
107
- }
108
- /**
109
- * Read rate-limit env vars. `rps` of 0 (or non-numeric) disables rate
110
- * limiting entirely. `burst` falls back to `rps * 2` when unset, mirroring
111
- * the documented default behaviour. Exported for unit testing.
112
- */
113
- export declare function resolveRateLimitConfig(): RateLimitConfig | null;
114
- /**
115
- * Reset the cached rate limiter so the next request re-reads env vars.
116
- * Intended for tests that toggle `BOOND_HTTP_RATE_LIMIT_*` between cases.
117
- */
118
- export declare function resetRateLimiterForTests(): void;
119
- /** Build the Error message for a non-2xx HTTP response. Exported for testing. */
120
- export declare function formatApiError(status: number, statusText: string, method: string, path: string, body: string): string;
121
- /**
122
- * Defense-in-depth against path traversal / query injection through entity
123
- * ids interpolated into API paths at ~40 call sites. Even though the id
124
- * schemas are now numeric-only, a future tool could forget to validate, so we
125
- * assert here that the path is well-formed: it must start with `/`, carry no
126
- * query (`?`) or fragment (`#`) — those arrive via `queryParams`, never the
127
- * path — and contain no traversal (`..`) or percent/backslash escapes. Built
128
- * paths only ever combine static segments with numeric ids and hyphenated tab
129
- * names, so this rejects nothing legitimate. Exported for unit testing.
130
- */
131
- export declare function assertSafeApiPath(path: string): void;
132
- /**
133
- * Validates `path` and resolves it against `baseUrl`, returning the
134
- * constructed URL. Throws if the path is unsafe (see `assertSafeApiPath`) or
135
- * if the resolved URL escapes the configured API base origin/path. Centralises
136
- * the guard shared by apiRequest / apiDownload / apiUploadForm. Exported for
137
- * unit testing.
138
- */
139
- export declare function resolveApiUrl(baseUrl: string, path: string): URL;
140
- export declare function apiRequest(path: string, method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", body?: unknown, queryParams?: Record<string, QueryValue>): Promise<JsonApiResponse>;
141
- /**
142
- * Parse the filename out of a `Content-Disposition` header. Handles the
143
- * common `filename="…"`/`filename=…` forms and the RFC 5987
144
- * `filename*=UTF-8''…` form. Returns undefined when absent. Exported for
145
- * unit testing.
146
- */
147
- export declare function parseContentDispositionFilename(header: string | null): string | undefined;
148
- export interface DownloadedDocument {
149
- data: Buffer;
150
- contentType: string;
151
- filename?: string;
152
- }
153
- /**
154
- * Download a binary payload (documents, justificatifs…) from the BoondManager
155
- * API. Same auth/safety/rate-limit plumbing as `apiRequest`, but the body is
156
- * returned raw instead of being parsed as JSON:API. Single attempt: document
157
- * downloads are interactive one-offs, not worth a retry loop.
158
- *
159
- * `onProgress` reports bytes received when the client asked for progress and
160
- * the response carries a `Content-Length`; otherwise nothing is emitted.
161
- */
162
- export declare function apiDownload(path: string, onProgress?: ProgressReporter): Promise<DownloadedDocument>;
163
- /**
164
- * POST a multipart/form-data payload to the BoondManager API (document
165
- * upload). Form values are simple string fields — the file itself travels by
166
- * reference via the `fileUrl` field (Boond downloads it server-side), so the
167
- * MCP server never buffers file bytes.
168
- */
169
- export declare function apiUploadForm(path: string, fields: Record<string, string>): Promise<JsonApiResponse>;
170
- export declare function buildSearchQuery(params: SearchParams): Record<string, QueryValue>;
171
- /**
172
- * Search wrapper around `apiRequest` that enforces BoondManager's per-route
173
- * `maxResults` ceiling (see `ROUTE_MAX_RESULTS`). When the caller requests more
174
- * results than the route allows, the request is transparently split into
175
- * chunks of `cap` records and the pages are merged into a single JSON:API
176
- * response — the caller still receives the full page, but BoondManager never
177
- * sees `maxResults` above the cap (which overflows memory on `/actions`).
178
- *
179
- * Routes whose ceiling already covers the requested page size take the fast
180
- * path: a single `apiRequest`, byte-for-byte identical to calling it directly.
181
- * The chunk count is bounded by `ceil((offset + requested) / cap)`, so there is
182
- * no unbounded loop; the loop also stops early once a page comes back short
183
- * (end of the result set on the server).
184
- *
185
- * `onProgress` (optional, last position — no existing caller had to change) is
186
- * invoked **only on the chunked path**: one step per BoondManager page. The
187
- * fast path stays silent on purpose — a single API call has nothing to report
188
- * and a "1/1" notification would be pure noise. The reporter is a no-op unless
189
- * the client sent a `progressToken` (see `services/progress.ts`).
190
- */
191
- export declare function apiSearch(path: string, query: Record<string, QueryValue>, onProgress?: ProgressReporter): Promise<JsonApiResponse>;
192
- export declare function formatEntitySummary(entity: unknown): string;
193
- export declare function formatListResponse(response: JsonApiResponse, entityType: string, fields?: string[]): string;
194
- /**
195
- * Formate la réponse d'un endpoint d'onglet (ex: /resources/{id}/positionings).
196
- * Contrairement à formatDetailResponse, un tableau est restitué en entier :
197
- * certains onglets renvoient plusieurs entités (positionnements, contacts...)
198
- * et n'afficher que la première masquait les autres.
199
- */
200
- export declare function formatTabResponse(response: JsonApiResponse): string;
201
- /**
202
- * The canonical shape of a single entity as this server hands it to the model:
203
- * the JSON:API resource minus the envelope noise (`links`, `meta`).
204
- *
205
- * Extracted from `formatDetailResponse` so the entity resource templates
206
- * (`boond://candidate/{id}`) aggregate the *same* projection instead of
207
- * defining a second, drifting idea of what an entity looks like. They cannot
208
- * reuse `formatDetailResponse` itself: it renders one entity and truncates
209
- * mid-string at `CHARACTER_LIMIT`, which on pretty-printed JSON yields an
210
- * unparseable body — acceptable for a tool's text content, not for a resource
211
- * whose whole point is to be read as JSON.
212
- */
213
- export declare function projectEntity(entity: JsonApiResource): Pick<JsonApiResource, "id" | "type" | "attributes" | "relationships">;
214
- export declare function formatDetailResponse(response: JsonApiResponse): string;
2
+ * BoondManager client — public surface.
3
+ *
4
+ * This module is a barrel: the 38 tool files, the transports and the
5
+ * resources import from here, and the tests mock this path
6
+ * (`vi.mock("../services/boond-client.js", …)`). The implementation lives in
7
+ * one module per responsibility (issue #239):
8
+ *
9
+ * http/auth.ts who the request is sent as (JWT / static / OAuth), config
10
+ * http/errors.ts error envelope parsing, Cloudflare detection, hints, BoondApiError
11
+ * http/retry.ts retry policy: config, retryability, Retry-After, backoff
12
+ * http/rate-limit.ts per-identity token buckets
13
+ * http/transport.ts the single `send()` path + apiRequest / apiUploadForm
14
+ * http/download.ts apiDownload: streaming under a byte cap, progress, guards
15
+ * search.ts buildSearchQuery + apiSearch (per-route chunking)
16
+ * format/*.ts list / detail / tab rendering, summaries, HTML excerpts
17
+ *
18
+ * Add a new export here when a tool needs it; do not add implementation.
19
+ */
20
+ export { oauthContextAuth, buildJwt, JWT_HEADER_NAME, initClient, hasEnvCredentials, initClientWithAuth, resetClientForTests, } from "./http/auth.js";
21
+ export { parseBoondErrorBody, hintForUnauthorized, BoondApiError, formatApiError } from "./http/errors.js";
22
+ export { type RetryConfig, resolveRetryConfig, isRetryable, parseRetryAfter, computeBackoffMs } from "./http/retry.js";
23
+ export { type RateLimitConfig, resolveRateLimitConfig, MAX_RATE_LIMIT_BUCKETS, getRateLimiter, rateLimiterBucketCountForTests, resetRateLimiterForTests, } from "./http/rate-limit.js";
24
+ export { type QueryValue, type HttpMethod, resolveTimeoutMs, assertSafeApiPath, resolveApiUrl, apiRequest, apiUploadForm, } from "./http/transport.js";
25
+ export { parseContentDispositionFilename, type DownloadedDocument, DownloadTooLargeError, type DownloadOptions, apiDownload, } from "./http/download.js";
26
+ export { buildSearchQuery, apiSearch } from "./search.js";
27
+ export { formatEntitySummary } from "./format/summary.js";
28
+ export { formatListResponse } from "./format/list.js";
29
+ export { projectEntity, formatDetailResponse } from "./format/detail.js";
30
+ export { formatTabResponse } from "./format/tab.js";
215
31
  //# sourceMappingURL=boond-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boond-client.d.ts","sourceRoot":"","sources":["../../src/services/boond-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boond-client.d.ts","sourceRoot":"","sources":["../../src/services/boond-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,KAAK,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvH,OAAO,EACL,KAAK,eAAe,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACd,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,UAAU,EACf,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,+BAA+B,EAC/B,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,KAAK,eAAe,EACpB,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}