@cyanheads/brapi-mcp-server 0.3.5
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/CLAUDE.md +391 -0
- package/Dockerfile +99 -0
- package/LICENSE +201 -0
- package/README.md +590 -0
- package/changelog/0.1.x/0.1.0.md +19 -0
- package/changelog/0.1.x/0.1.1.md +27 -0
- package/changelog/0.1.x/0.1.2.md +22 -0
- package/changelog/0.2.x/0.2.0.md +35 -0
- package/changelog/0.2.x/0.2.1.md +36 -0
- package/changelog/0.3.x/0.3.0.md +38 -0
- package/changelog/0.3.x/0.3.1.md +40 -0
- package/changelog/0.3.x/0.3.2.md +29 -0
- package/changelog/0.3.x/0.3.3.md +19 -0
- package/changelog/0.3.x/0.3.4.md +33 -0
- package/changelog/0.3.x/0.3.5.md +24 -0
- package/changelog/template.md +51 -0
- package/dist/config/alias-credentials.d.ts +82 -0
- package/dist/config/alias-credentials.d.ts.map +1 -0
- package/dist/config/alias-credentials.js +159 -0
- package/dist/config/alias-credentials.js.map +1 -0
- package/dist/config/server-config.d.ts +39 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +128 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.d.ts +14 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js +75 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.d.ts +16 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js +109 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.d.ts +11 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.js +46 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts +13 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js +26 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.d.ts +19 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.js +45 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.d.ts +18 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.js +34 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.d.ts +11 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.js +28 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.d.ts +18 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.js +34 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts +82 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.js +106 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.d.ts +41 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.js +88 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +74 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +386 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +72 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +290 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +65 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +243 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +63 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +278 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +74 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +288 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +69 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +243 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +86 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +337 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +248 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js +306 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.d.ts +57 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.js +291 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.d.ts +75 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.js +323 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +87 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +296 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts +35 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js +148 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +33 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +126 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts +51 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.js +41 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.d.ts +117 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.js +574 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.d.ts +52 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.js +420 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.js.map +1 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.d.ts +29 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.js +55 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.js.map +1 -0
- package/dist/mcp-server/tools/shared/find-helpers.d.ts +143 -0
- package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/find-helpers.js +319 -0
- package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.d.ts +97 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.js +254 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.js.map +1 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts +10 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.js +46 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -0
- package/dist/services/brapi-client/brapi-client.d.ts +76 -0
- package/dist/services/brapi-client/brapi-client.d.ts.map +1 -0
- package/dist/services/brapi-client/brapi-client.js +320 -0
- package/dist/services/brapi-client/brapi-client.js.map +1 -0
- package/dist/services/brapi-client/index.d.ts +9 -0
- package/dist/services/brapi-client/index.d.ts.map +1 -0
- package/dist/services/brapi-client/index.js +7 -0
- package/dist/services/brapi-client/index.js.map +1 -0
- package/dist/services/brapi-client/types.d.ts +82 -0
- package/dist/services/brapi-client/types.d.ts.map +1 -0
- package/dist/services/brapi-client/types.js +8 -0
- package/dist/services/brapi-client/types.js.map +1 -0
- package/dist/services/brapi-filters/catalog.d.ts +14 -0
- package/dist/services/brapi-filters/catalog.d.ts.map +1 -0
- package/dist/services/brapi-filters/catalog.js +490 -0
- package/dist/services/brapi-filters/catalog.js.map +1 -0
- package/dist/services/brapi-filters/index.d.ts +8 -0
- package/dist/services/brapi-filters/index.d.ts.map +1 -0
- package/dist/services/brapi-filters/index.js +7 -0
- package/dist/services/brapi-filters/index.js.map +1 -0
- package/dist/services/brapi-filters/types.d.ts +23 -0
- package/dist/services/brapi-filters/types.d.ts.map +1 -0
- package/dist/services/brapi-filters/types.js +9 -0
- package/dist/services/brapi-filters/types.js.map +1 -0
- package/dist/services/capability-registry/capability-registry.d.ts +51 -0
- package/dist/services/capability-registry/capability-registry.d.ts.map +1 -0
- package/dist/services/capability-registry/capability-registry.js +234 -0
- package/dist/services/capability-registry/capability-registry.js.map +1 -0
- package/dist/services/capability-registry/index.d.ts +9 -0
- package/dist/services/capability-registry/index.d.ts.map +1 -0
- package/dist/services/capability-registry/index.js +7 -0
- package/dist/services/capability-registry/index.js.map +1 -0
- package/dist/services/capability-registry/types.d.ts +67 -0
- package/dist/services/capability-registry/types.d.ts.map +1 -0
- package/dist/services/capability-registry/types.js +9 -0
- package/dist/services/capability-registry/types.js.map +1 -0
- package/dist/services/dataset-store/dataset-store.d.ts +35 -0
- package/dist/services/dataset-store/dataset-store.d.ts.map +1 -0
- package/dist/services/dataset-store/dataset-store.js +190 -0
- package/dist/services/dataset-store/dataset-store.js.map +1 -0
- package/dist/services/dataset-store/index.d.ts +8 -0
- package/dist/services/dataset-store/index.d.ts.map +1 -0
- package/dist/services/dataset-store/index.js +7 -0
- package/dist/services/dataset-store/index.js.map +1 -0
- package/dist/services/dataset-store/types.d.ts +65 -0
- package/dist/services/dataset-store/types.d.ts.map +1 -0
- package/dist/services/dataset-store/types.js +8 -0
- package/dist/services/dataset-store/types.js.map +1 -0
- package/dist/services/ontology-resolver/index.d.ts +8 -0
- package/dist/services/ontology-resolver/index.d.ts.map +1 -0
- package/dist/services/ontology-resolver/index.js +7 -0
- package/dist/services/ontology-resolver/index.js.map +1 -0
- package/dist/services/ontology-resolver/ontology-resolver.d.ts +49 -0
- package/dist/services/ontology-resolver/ontology-resolver.d.ts.map +1 -0
- package/dist/services/ontology-resolver/ontology-resolver.js +99 -0
- package/dist/services/ontology-resolver/ontology-resolver.js.map +1 -0
- package/dist/services/ontology-resolver/types.d.ts +38 -0
- package/dist/services/ontology-resolver/types.d.ts.map +1 -0
- package/dist/services/ontology-resolver/types.js +8 -0
- package/dist/services/ontology-resolver/types.js.map +1 -0
- package/dist/services/reference-data-cache/index.d.ts +9 -0
- package/dist/services/reference-data-cache/index.d.ts.map +1 -0
- package/dist/services/reference-data-cache/index.js +7 -0
- package/dist/services/reference-data-cache/index.js.map +1 -0
- package/dist/services/reference-data-cache/reference-data-cache.d.ts +31 -0
- package/dist/services/reference-data-cache/reference-data-cache.d.ts.map +1 -0
- package/dist/services/reference-data-cache/reference-data-cache.js +131 -0
- package/dist/services/reference-data-cache/reference-data-cache.js.map +1 -0
- package/dist/services/reference-data-cache/types.d.ts +42 -0
- package/dist/services/reference-data-cache/types.d.ts.map +1 -0
- package/dist/services/reference-data-cache/types.js +9 -0
- package/dist/services/reference-data-cache/types.js.map +1 -0
- package/dist/services/server-registry/index.d.ts +9 -0
- package/dist/services/server-registry/index.d.ts.map +1 -0
- package/dist/services/server-registry/index.js +7 -0
- package/dist/services/server-registry/index.js.map +1 -0
- package/dist/services/server-registry/server-registry.d.ts +57 -0
- package/dist/services/server-registry/server-registry.d.ts.map +1 -0
- package/dist/services/server-registry/server-registry.js +210 -0
- package/dist/services/server-registry/server-registry.js.map +1 -0
- package/dist/services/server-registry/types.d.ts +43 -0
- package/dist/services/server-registry/types.d.ts.map +1 -0
- package/dist/services/server-registry/types.js +10 -0
- package/dist/services/server-registry/types.js.map +1 -0
- package/package.json +86 -0
- package/server.json +99 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Low-level HTTP client for BrAPI v2 servers. Handles URL
|
|
3
|
+
* construction, header assembly, JSON envelope parsing, retry with exponential
|
|
4
|
+
* backoff, and the async-search poll loop
|
|
5
|
+
* (`POST /search/{noun}` → `searchResultsDbId` → `GET /search/{noun}/{id}`).
|
|
6
|
+
* Stateless across connections — callers pass `baseUrl` and resolved auth per
|
|
7
|
+
* call; connection state is owned by `ServerRegistry` (added in a later phase).
|
|
8
|
+
*
|
|
9
|
+
* @module services/brapi-client/brapi-client
|
|
10
|
+
*/
|
|
11
|
+
import { forbidden, internalError, JsonRpcErrorCode, McpError, notFound, rateLimited, serviceUnavailable, unauthorized, validationError, } from '@cyanheads/mcp-ts-core/errors';
|
|
12
|
+
import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
13
|
+
/**
|
|
14
|
+
* The framework's `Context` and `RequestContext` are structurally compatible
|
|
15
|
+
* at runtime — framework docs confirm passing `Context` to `fetchWithTimeout`
|
|
16
|
+
* and `withRetry` is safe. The types diverge only under
|
|
17
|
+
* `exactOptionalPropertyTypes` (Context marks some fields as `| undefined`).
|
|
18
|
+
* One cast, one place.
|
|
19
|
+
*/
|
|
20
|
+
const asRequestContext = (ctx) => ctx;
|
|
21
|
+
const defaultFetcher = (url, timeoutMs, context, options) => fetchWithTimeout(url, timeoutMs, asRequestContext(context), options);
|
|
22
|
+
export class BrapiClient {
|
|
23
|
+
serverConfig;
|
|
24
|
+
fetcher;
|
|
25
|
+
constructor(serverConfig, fetcher = defaultFetcher) {
|
|
26
|
+
this.serverConfig = serverConfig;
|
|
27
|
+
this.fetcher = fetcher;
|
|
28
|
+
}
|
|
29
|
+
/** GET /{path} with optional query params and auth. */
|
|
30
|
+
get(baseUrl, path, ctx, options = {}) {
|
|
31
|
+
return withRetry(async () => {
|
|
32
|
+
const response = await this.doFetch(this.buildUrl(baseUrl, path, options.params), ctx, { method: 'GET', headers: this.buildHeaders(options.auth) }, options.timeoutMs);
|
|
33
|
+
return this.parseEnvelope(response);
|
|
34
|
+
}, {
|
|
35
|
+
operation: `brapi.get ${path}`,
|
|
36
|
+
context: asRequestContext(ctx),
|
|
37
|
+
maxRetries: this.serverConfig.retryMaxAttempts,
|
|
38
|
+
baseDelayMs: this.serverConfig.retryBaseDelayMs,
|
|
39
|
+
signal: ctx.signal,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* GET /{path} returning raw bytes — used for image content and other binary
|
|
44
|
+
* payloads. Honors the same retry policy as `get()`. The `accept` option
|
|
45
|
+
* overrides the default `image/*`.
|
|
46
|
+
*/
|
|
47
|
+
getBinary(baseUrl, path, ctx, options = {}) {
|
|
48
|
+
return withRetry(async () => {
|
|
49
|
+
const headers = this.buildHeaders(options.auth);
|
|
50
|
+
headers.Accept = options.accept ?? 'image/*';
|
|
51
|
+
const response = await this.doFetch(this.buildUrl(baseUrl, path, options.params), ctx, { method: 'GET', headers }, options.timeoutMs);
|
|
52
|
+
const buffer = await response.arrayBuffer();
|
|
53
|
+
const contentType = response.headers.get('Content-Type') ?? 'application/octet-stream';
|
|
54
|
+
return { bytes: new Uint8Array(buffer), contentType };
|
|
55
|
+
}, {
|
|
56
|
+
operation: `brapi.getBinary ${path}`,
|
|
57
|
+
context: asRequestContext(ctx),
|
|
58
|
+
maxRetries: this.serverConfig.retryMaxAttempts,
|
|
59
|
+
baseDelayMs: this.serverConfig.retryBaseDelayMs,
|
|
60
|
+
signal: ctx.signal,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Fetch binary bytes from an arbitrary URL — used as a fallback when a
|
|
65
|
+
* BrAPI server doesn't expose `/images/{id}/imagecontent` but the image's
|
|
66
|
+
* metadata carries an `imageURL` (CDN, S3, etc.). No auth is attached; the
|
|
67
|
+
* assumption is that these URLs are publicly reachable. Still honors the
|
|
68
|
+
* private-IP guard and request timeout.
|
|
69
|
+
*/
|
|
70
|
+
async fetchBinaryUrl(url, ctx, accept = 'image/*') {
|
|
71
|
+
const response = await this.doFetch(url, ctx, { method: 'GET', headers: { Accept: accept } }, this.serverConfig.requestTimeoutMs);
|
|
72
|
+
const buffer = await response.arrayBuffer();
|
|
73
|
+
const contentType = response.headers.get('Content-Type') ?? 'application/octet-stream';
|
|
74
|
+
return { bytes: new Uint8Array(buffer), contentType };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* POST /search/{noun}. Returns a discriminated union — `sync` when the
|
|
78
|
+
* server returns full results inline, `async` when it returns a
|
|
79
|
+
* `searchResultsDbId` the caller must poll via `getSearchResults`.
|
|
80
|
+
*/
|
|
81
|
+
postSearch(baseUrl, noun, body, ctx, options = {}) {
|
|
82
|
+
return withRetry(async () => {
|
|
83
|
+
const response = await this.doFetch(this.buildUrl(baseUrl, `/search/${noun}`), ctx, {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
headers: {
|
|
86
|
+
...this.buildHeaders(options.auth),
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify(body),
|
|
90
|
+
}, options.timeoutMs);
|
|
91
|
+
const envelope = await this.parseEnvelope(response);
|
|
92
|
+
const asyncId = extractAsyncId(envelope);
|
|
93
|
+
if (asyncId !== undefined) {
|
|
94
|
+
return { kind: 'async', searchResultsDbId: asyncId };
|
|
95
|
+
}
|
|
96
|
+
return { kind: 'sync', envelope: envelope };
|
|
97
|
+
}, {
|
|
98
|
+
operation: `brapi.postSearch ${noun}`,
|
|
99
|
+
context: asRequestContext(ctx),
|
|
100
|
+
maxRetries: this.serverConfig.retryMaxAttempts,
|
|
101
|
+
baseDelayMs: this.serverConfig.retryBaseDelayMs,
|
|
102
|
+
signal: ctx.signal,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* POST /{path} with a JSON body. Used for write endpoints (e.g. creating
|
|
107
|
+
* observations). Same retry + classification policy as `get()`. The body is
|
|
108
|
+
* serialized as JSON and `Content-Type: application/json` is forced.
|
|
109
|
+
*/
|
|
110
|
+
post(baseUrl, path, body, ctx, options = {}) {
|
|
111
|
+
return this.sendJson('POST', baseUrl, path, body, ctx, options);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* PUT /{path} with a JSON body. Used for upsert / update endpoints. BrAPI
|
|
115
|
+
* routes update calls (`PUT /observations`, `PUT /germplasm`) through this.
|
|
116
|
+
*/
|
|
117
|
+
put(baseUrl, path, body, ctx, options = {}) {
|
|
118
|
+
return this.sendJson('PUT', baseUrl, path, body, ctx, options);
|
|
119
|
+
}
|
|
120
|
+
sendJson(method, baseUrl, path, body, ctx, options = {}) {
|
|
121
|
+
return withRetry(async () => {
|
|
122
|
+
const response = await this.doFetch(this.buildUrl(baseUrl, path, options.params), ctx, {
|
|
123
|
+
method,
|
|
124
|
+
headers: {
|
|
125
|
+
...this.buildHeaders(options.auth),
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
},
|
|
128
|
+
body: JSON.stringify(body),
|
|
129
|
+
}, options.timeoutMs);
|
|
130
|
+
return this.parseEnvelope(response);
|
|
131
|
+
}, {
|
|
132
|
+
operation: `brapi.${method.toLowerCase()} ${path}`,
|
|
133
|
+
context: asRequestContext(ctx),
|
|
134
|
+
maxRetries: this.serverConfig.retryMaxAttempts,
|
|
135
|
+
baseDelayMs: this.serverConfig.retryBaseDelayMs,
|
|
136
|
+
signal: ctx.signal,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Poll `GET /search/{noun}/{searchResultsDbId}`. Returns the envelope once
|
|
141
|
+
* the server replies with 200. 202 means "still processing" — the method
|
|
142
|
+
* sleeps `searchPollIntervalMs` and retries until `searchPollTimeoutMs`.
|
|
143
|
+
*/
|
|
144
|
+
async getSearchResults(baseUrl, noun, searchResultsDbId, ctx, options = {}) {
|
|
145
|
+
const url = this.buildUrl(baseUrl, `/search/${noun}/${encodeURIComponent(searchResultsDbId)}`);
|
|
146
|
+
const pollTimeoutMs = this.serverConfig.searchPollTimeoutMs;
|
|
147
|
+
const pollIntervalMs = this.serverConfig.searchPollIntervalMs;
|
|
148
|
+
const startedAt = Date.now();
|
|
149
|
+
for (;;) {
|
|
150
|
+
if (ctx.signal.aborted) {
|
|
151
|
+
throw internalError('Async search polling aborted by caller', {
|
|
152
|
+
noun,
|
|
153
|
+
searchResultsDbId,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (Date.now() - startedAt > pollTimeoutMs) {
|
|
157
|
+
throw serviceUnavailable(`Async search ${noun}/${searchResultsDbId} timed out after ${pollTimeoutMs}ms`, { noun, searchResultsDbId, pollTimeoutMs });
|
|
158
|
+
}
|
|
159
|
+
const response = await this.doFetch(url, ctx, { method: 'GET', headers: this.buildHeaders(options.auth) }, options.timeoutMs);
|
|
160
|
+
if (response.status === 202) {
|
|
161
|
+
await sleep(pollIntervalMs, ctx);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
return this.parseEnvelope(response);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async doFetch(url, ctx, init, timeoutMs) {
|
|
168
|
+
try {
|
|
169
|
+
return await this.fetcher(url, timeoutMs ?? this.serverConfig.requestTimeoutMs, ctx, {
|
|
170
|
+
...init,
|
|
171
|
+
signal: ctx.signal,
|
|
172
|
+
rejectPrivateIPs: !this.serverConfig.allowPrivateIps,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
reclassifyHttpError(err);
|
|
177
|
+
throw err;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
buildUrl(baseUrl, path, params) {
|
|
181
|
+
const trimmedBase = baseUrl.replace(/\/$/, '');
|
|
182
|
+
const prefixedPath = path.startsWith('/') ? path : `/${path}`;
|
|
183
|
+
const url = new URL(`${trimmedBase}${prefixedPath}`);
|
|
184
|
+
if (params) {
|
|
185
|
+
for (const [key, value] of Object.entries(params)) {
|
|
186
|
+
if (value === undefined)
|
|
187
|
+
continue;
|
|
188
|
+
if (Array.isArray(value)) {
|
|
189
|
+
for (const v of value)
|
|
190
|
+
url.searchParams.append(key, String(v));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
url.searchParams.set(key, String(value));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return url.toString();
|
|
198
|
+
}
|
|
199
|
+
buildHeaders(auth) {
|
|
200
|
+
const headers = { Accept: 'application/json' };
|
|
201
|
+
if (auth) {
|
|
202
|
+
headers[auth.headerName] = auth.headerValue;
|
|
203
|
+
}
|
|
204
|
+
return headers;
|
|
205
|
+
}
|
|
206
|
+
async parseEnvelope(response) {
|
|
207
|
+
const text = await response.text();
|
|
208
|
+
if (!text) {
|
|
209
|
+
throw validationError('BrAPI returned an empty response body', {
|
|
210
|
+
httpStatus: response.status,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
let parsed;
|
|
214
|
+
try {
|
|
215
|
+
parsed = JSON.parse(text);
|
|
216
|
+
}
|
|
217
|
+
catch (cause) {
|
|
218
|
+
throw serviceUnavailable('BrAPI returned non-JSON response', { bodyPreview: text.slice(0, 500), httpStatus: response.status }, { cause });
|
|
219
|
+
}
|
|
220
|
+
if (!isEnvelope(parsed)) {
|
|
221
|
+
throw validationError('BrAPI response did not match v2 envelope shape', {
|
|
222
|
+
received: parsed,
|
|
223
|
+
httpStatus: response.status,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return parsed;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Map the `ServiceUnavailable` thrown by `fetchWithTimeout` to the correct
|
|
231
|
+
* non-transient code when the underlying HTTP status is a 4xx. 429 is promoted
|
|
232
|
+
* to `RateLimited` so the default retry policy still kicks in; 5xx stays as
|
|
233
|
+
* `ServiceUnavailable` (also retryable). Network-level errors, which have no
|
|
234
|
+
* `statusCode`, pass through untouched.
|
|
235
|
+
*/
|
|
236
|
+
function reclassifyHttpError(err) {
|
|
237
|
+
if (!(err instanceof McpError))
|
|
238
|
+
return;
|
|
239
|
+
if (err.code !== JsonRpcErrorCode.ServiceUnavailable)
|
|
240
|
+
return;
|
|
241
|
+
const status = extractHttpStatus(err);
|
|
242
|
+
if (status === undefined)
|
|
243
|
+
return;
|
|
244
|
+
if (status >= 500)
|
|
245
|
+
return;
|
|
246
|
+
const data = asRecord(err.data) ?? {};
|
|
247
|
+
if (status === 429) {
|
|
248
|
+
throw rateLimited(err.message, { ...data, reason: 'upstream_rate_limited' });
|
|
249
|
+
}
|
|
250
|
+
if (status === 401)
|
|
251
|
+
throw unauthorized(err.message, { ...data, reason: 'upstream_unauthorized' });
|
|
252
|
+
if (status === 403)
|
|
253
|
+
throw forbidden(err.message, { ...data, reason: 'upstream_forbidden' });
|
|
254
|
+
if (status === 404)
|
|
255
|
+
throw notFound(err.message, { ...data, reason: 'upstream_not_found' });
|
|
256
|
+
throw validationError(err.message, { ...data, reason: 'upstream_bad_request' });
|
|
257
|
+
}
|
|
258
|
+
function extractHttpStatus(err) {
|
|
259
|
+
const data = asRecord(err.data);
|
|
260
|
+
if (!data)
|
|
261
|
+
return;
|
|
262
|
+
const status = data.statusCode;
|
|
263
|
+
return typeof status === 'number' ? status : undefined;
|
|
264
|
+
}
|
|
265
|
+
function asRecord(value) {
|
|
266
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
267
|
+
return;
|
|
268
|
+
return value;
|
|
269
|
+
}
|
|
270
|
+
function isEnvelope(value) {
|
|
271
|
+
return typeof value === 'object' && value !== null && 'metadata' in value && 'result' in value;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Some BrAPI servers embed `searchResultsDbId` inside the `result` object on
|
|
275
|
+
* an otherwise empty payload. Detect that case.
|
|
276
|
+
*/
|
|
277
|
+
function extractAsyncId(envelope) {
|
|
278
|
+
const result = envelope.result;
|
|
279
|
+
if (typeof result !== 'object' || result === null)
|
|
280
|
+
return;
|
|
281
|
+
const id = result.searchResultsDbId;
|
|
282
|
+
if (typeof id !== 'string')
|
|
283
|
+
return;
|
|
284
|
+
const data = result.data;
|
|
285
|
+
if (Array.isArray(data) && data.length > 0)
|
|
286
|
+
return;
|
|
287
|
+
return id;
|
|
288
|
+
}
|
|
289
|
+
function sleep(ms, ctx) {
|
|
290
|
+
return new Promise((resolve, reject) => {
|
|
291
|
+
if (ctx.signal.aborted) {
|
|
292
|
+
reject(internalError('Sleep aborted by caller'));
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const timer = setTimeout(() => {
|
|
296
|
+
ctx.signal.removeEventListener('abort', onAbort);
|
|
297
|
+
resolve();
|
|
298
|
+
}, ms);
|
|
299
|
+
const onAbort = () => {
|
|
300
|
+
clearTimeout(timer);
|
|
301
|
+
reject(internalError('Sleep aborted by caller'));
|
|
302
|
+
};
|
|
303
|
+
ctx.signal.addEventListener('abort', onAbort, { once: true });
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
let _client;
|
|
307
|
+
export function initBrapiClient(serverConfig, fetcher) {
|
|
308
|
+
_client = new BrapiClient(serverConfig, fetcher);
|
|
309
|
+
}
|
|
310
|
+
export function getBrapiClient() {
|
|
311
|
+
if (!_client) {
|
|
312
|
+
throw new Error('BrapiClient not initialized — call initBrapiClient() in setup()');
|
|
313
|
+
}
|
|
314
|
+
return _client;
|
|
315
|
+
}
|
|
316
|
+
/** Test-only — clears the singleton so successive suites start clean. */
|
|
317
|
+
export function resetBrapiClient() {
|
|
318
|
+
_client = undefined;
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=brapi-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brapi-client.js","sourceRoot":"","sources":["../../../src/services/brapi-client/brapi-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public API barrel for the BrapiClient service.
|
|
3
|
+
*
|
|
4
|
+
* @module services/brapi-client
|
|
5
|
+
*/
|
|
6
|
+
export type { Fetcher } from './brapi-client.js';
|
|
7
|
+
export { BrapiClient, getBrapiClient, initBrapiClient, resetBrapiClient, } from './brapi-client.js';
|
|
8
|
+
export type { BinaryResponse, BrapiAuth, BrapiEnvelope, BrapiMetadata, BrapiPagination, BrapiRequestOptions, BrapiStatus, ResolvedAuth, SearchResponse, } from './types.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/brapi-client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared types for the BrapiClient service — envelope shape,
|
|
3
|
+
* request options, auth config, and search response variants.
|
|
4
|
+
*
|
|
5
|
+
* @module services/brapi-client/types
|
|
6
|
+
*/
|
|
7
|
+
/** BrAPI v2 standard response envelope. */
|
|
8
|
+
export interface BrapiEnvelope<T> {
|
|
9
|
+
metadata: BrapiMetadata;
|
|
10
|
+
result: T;
|
|
11
|
+
}
|
|
12
|
+
export interface BrapiMetadata {
|
|
13
|
+
datafiles?: unknown[];
|
|
14
|
+
pagination?: BrapiPagination;
|
|
15
|
+
status?: BrapiStatus[];
|
|
16
|
+
}
|
|
17
|
+
export interface BrapiPagination {
|
|
18
|
+
currentPage: number;
|
|
19
|
+
pageSize: number;
|
|
20
|
+
totalCount: number;
|
|
21
|
+
totalPages: number;
|
|
22
|
+
}
|
|
23
|
+
export interface BrapiStatus {
|
|
24
|
+
message: string;
|
|
25
|
+
messageType: 'INFO' | 'WARNING' | 'ERROR';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configured auth for a BrAPI connection. `sgn` and `oauth2` are resolved to
|
|
29
|
+
* a bearer token before being handed to the client; `api_key` and `none` are
|
|
30
|
+
* used verbatim.
|
|
31
|
+
*/
|
|
32
|
+
export type BrapiAuth = {
|
|
33
|
+
mode: 'none';
|
|
34
|
+
} | {
|
|
35
|
+
mode: 'sgn';
|
|
36
|
+
username: string;
|
|
37
|
+
password: string;
|
|
38
|
+
} | {
|
|
39
|
+
mode: 'oauth2';
|
|
40
|
+
clientId: string;
|
|
41
|
+
clientSecret: string;
|
|
42
|
+
tokenUrl?: string;
|
|
43
|
+
} | {
|
|
44
|
+
mode: 'api_key';
|
|
45
|
+
apiKey: string;
|
|
46
|
+
headerName?: string;
|
|
47
|
+
} | {
|
|
48
|
+
mode: 'bearer';
|
|
49
|
+
token: string;
|
|
50
|
+
};
|
|
51
|
+
/** Resolved auth header ready to attach to a request. */
|
|
52
|
+
export interface ResolvedAuth {
|
|
53
|
+
/** ISO 8601 timestamp — caller may refresh before this. */
|
|
54
|
+
expiresAt?: string;
|
|
55
|
+
headerName: string;
|
|
56
|
+
headerValue: string;
|
|
57
|
+
}
|
|
58
|
+
export interface BrapiRequestOptions {
|
|
59
|
+
auth?: ResolvedAuth;
|
|
60
|
+
/** Query params. Arrays are repeated per BrAPI convention. */
|
|
61
|
+
params?: Record<string, string | number | boolean | readonly (string | number)[] | undefined>;
|
|
62
|
+
/** Override the config default timeout. */
|
|
63
|
+
timeoutMs?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* POST /search/{noun} returns either full results inline, or a
|
|
67
|
+
* `searchResultsDbId` that the caller polls via getSearchResults.
|
|
68
|
+
*/
|
|
69
|
+
export type SearchResponse<T> = {
|
|
70
|
+
kind: 'sync';
|
|
71
|
+
envelope: BrapiEnvelope<T>;
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'async';
|
|
74
|
+
searchResultsDbId: string;
|
|
75
|
+
};
|
|
76
|
+
/** Raw bytes returned from a binary fetch (e.g. image content). */
|
|
77
|
+
export interface BinaryResponse {
|
|
78
|
+
bytes: Uint8Array;
|
|
79
|
+
/** `Content-Type` header as reported by the server; falls back to octet-stream. */
|
|
80
|
+
contentType: string;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC;CACX;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IAC9F,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/brapi-client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Static BrAPI v2.1 filter catalog. Covers the endpoints the
|
|
3
|
+
* goal-shaped tools target plus the common escape-hatch nouns. Agents use
|
|
4
|
+
* this via `brapi_describe_filters` to discover valid filter names before
|
|
5
|
+
* constructing `extraFilters` on `find_*` tools. Catalog entries reflect the
|
|
6
|
+
* BrAPI v2.1 spec — individual servers may implement subsets; filter failures
|
|
7
|
+
* surface through the upstream 400 body, not a static check.
|
|
8
|
+
*
|
|
9
|
+
* @module services/brapi-filters/catalog
|
|
10
|
+
*/
|
|
11
|
+
import type { FilterCatalog } from './types.js';
|
|
12
|
+
export declare function getFilterCatalog(endpoint: string): FilterCatalog | undefined;
|
|
13
|
+
export declare function listFilterEndpoints(): string[];
|
|
14
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-filters/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAC;AAmelE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAI5E;AAED,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|