mnehmos.trace.mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1662 -0
- package/dist/adapters/bootstrap.d.ts +29 -0
- package/dist/adapters/bootstrap.d.ts.map +1 -0
- package/dist/adapters/bootstrap.js +46 -0
- package/dist/adapters/bootstrap.js.map +1 -0
- package/dist/adapters/errors.d.ts +94 -0
- package/dist/adapters/errors.d.ts.map +1 -0
- package/dist/adapters/errors.js +107 -0
- package/dist/adapters/errors.js.map +1 -0
- package/dist/adapters/graphql/index.d.ts +9 -0
- package/dist/adapters/graphql/index.d.ts.map +1 -0
- package/dist/adapters/graphql/index.js +9 -0
- package/dist/adapters/graphql/index.js.map +1 -0
- package/dist/adapters/graphql/sdl-parser.d.ts +74 -0
- package/dist/adapters/graphql/sdl-parser.d.ts.map +1 -0
- package/dist/adapters/graphql/sdl-parser.js +559 -0
- package/dist/adapters/graphql/sdl-parser.js.map +1 -0
- package/dist/adapters/grpc/adapter.d.ts +76 -0
- package/dist/adapters/grpc/adapter.d.ts.map +1 -0
- package/dist/adapters/grpc/adapter.js +362 -0
- package/dist/adapters/grpc/adapter.js.map +1 -0
- package/dist/adapters/grpc/index.d.ts +10 -0
- package/dist/adapters/grpc/index.d.ts.map +1 -0
- package/dist/adapters/grpc/index.js +12 -0
- package/dist/adapters/grpc/index.js.map +1 -0
- package/dist/adapters/grpc/proto-parser.d.ts +76 -0
- package/dist/adapters/grpc/proto-parser.d.ts.map +1 -0
- package/dist/adapters/grpc/proto-parser.js +523 -0
- package/dist/adapters/grpc/proto-parser.js.map +1 -0
- package/dist/adapters/grpc/type-converter.d.ts +43 -0
- package/dist/adapters/grpc/type-converter.d.ts.map +1 -0
- package/dist/adapters/grpc/type-converter.js +270 -0
- package/dist/adapters/grpc/type-converter.js.map +1 -0
- package/dist/adapters/grpc/types.d.ts +85 -0
- package/dist/adapters/grpc/types.d.ts.map +1 -0
- package/dist/adapters/grpc/types.js +7 -0
- package/dist/adapters/grpc/types.js.map +1 -0
- package/dist/adapters/index.d.ts +39 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +50 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mcp.d.ts +23 -0
- package/dist/adapters/mcp.d.ts.map +1 -0
- package/dist/adapters/mcp.js +293 -0
- package/dist/adapters/mcp.js.map +1 -0
- package/dist/adapters/openapi/adapter.d.ts +213 -0
- package/dist/adapters/openapi/adapter.d.ts.map +1 -0
- package/dist/adapters/openapi/adapter.js +557 -0
- package/dist/adapters/openapi/adapter.js.map +1 -0
- package/dist/adapters/openapi/convert.d.ts +120 -0
- package/dist/adapters/openapi/convert.d.ts.map +1 -0
- package/dist/adapters/openapi/convert.js +363 -0
- package/dist/adapters/openapi/convert.js.map +1 -0
- package/dist/adapters/openapi/index.d.ts +39 -0
- package/dist/adapters/openapi/index.d.ts.map +1 -0
- package/dist/adapters/openapi/index.js +48 -0
- package/dist/adapters/openapi/index.js.map +1 -0
- package/dist/adapters/openapi/parser.d.ts +95 -0
- package/dist/adapters/openapi/parser.d.ts.map +1 -0
- package/dist/adapters/openapi/parser.js +171 -0
- package/dist/adapters/openapi/parser.js.map +1 -0
- package/dist/adapters/registry.d.ts +116 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +246 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/trpc/adapter.d.ts +159 -0
- package/dist/adapters/trpc/adapter.d.ts.map +1 -0
- package/dist/adapters/trpc/adapter.js +223 -0
- package/dist/adapters/trpc/adapter.js.map +1 -0
- package/dist/adapters/trpc/extractor.d.ts +218 -0
- package/dist/adapters/trpc/extractor.d.ts.map +1 -0
- package/dist/adapters/trpc/extractor.js +708 -0
- package/dist/adapters/trpc/extractor.js.map +1 -0
- package/dist/adapters/trpc/index.d.ts +31 -0
- package/dist/adapters/trpc/index.d.ts.map +1 -0
- package/dist/adapters/trpc/index.js +40 -0
- package/dist/adapters/trpc/index.js.map +1 -0
- package/dist/adapters/trpc/parser.d.ts +119 -0
- package/dist/adapters/trpc/parser.d.ts.map +1 -0
- package/dist/adapters/trpc/parser.js +128 -0
- package/dist/adapters/trpc/parser.js.map +1 -0
- package/dist/compare/index.d.ts +33 -0
- package/dist/compare/index.d.ts.map +1 -0
- package/dist/compare/index.js +261 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/types.d.ts +188 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/extract/index.d.ts +26 -0
- package/dist/extract/index.d.ts.map +1 -0
- package/dist/extract/index.js +44 -0
- package/dist/extract/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +674 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/base.d.ts +57 -0
- package/dist/languages/base.d.ts.map +1 -0
- package/dist/languages/base.js +6 -0
- package/dist/languages/base.js.map +1 -0
- package/dist/languages/bootstrap.d.ts +10 -0
- package/dist/languages/bootstrap.d.ts.map +1 -0
- package/dist/languages/bootstrap.js +25 -0
- package/dist/languages/bootstrap.js.map +1 -0
- package/dist/languages/go/handlers/chi.d.ts +24 -0
- package/dist/languages/go/handlers/chi.d.ts.map +1 -0
- package/dist/languages/go/handlers/chi.js +205 -0
- package/dist/languages/go/handlers/chi.js.map +1 -0
- package/dist/languages/go/handlers/gin.d.ts +24 -0
- package/dist/languages/go/handlers/gin.d.ts.map +1 -0
- package/dist/languages/go/handlers/gin.js +156 -0
- package/dist/languages/go/handlers/gin.js.map +1 -0
- package/dist/languages/go/handlers/stdlib.d.ts +19 -0
- package/dist/languages/go/handlers/stdlib.d.ts.map +1 -0
- package/dist/languages/go/handlers/stdlib.js +112 -0
- package/dist/languages/go/handlers/stdlib.js.map +1 -0
- package/dist/languages/go/index.d.ts +18 -0
- package/dist/languages/go/index.d.ts.map +1 -0
- package/dist/languages/go/index.js +20 -0
- package/dist/languages/go/index.js.map +1 -0
- package/dist/languages/go/parser.d.ts +33 -0
- package/dist/languages/go/parser.d.ts.map +1 -0
- package/dist/languages/go/parser.js +95 -0
- package/dist/languages/go/parser.js.map +1 -0
- package/dist/languages/go/struct-extractor.d.ts +59 -0
- package/dist/languages/go/struct-extractor.d.ts.map +1 -0
- package/dist/languages/go/struct-extractor.js +483 -0
- package/dist/languages/go/struct-extractor.js.map +1 -0
- package/dist/languages/go/tag-parser.d.ts +62 -0
- package/dist/languages/go/tag-parser.d.ts.map +1 -0
- package/dist/languages/go/tag-parser.js +108 -0
- package/dist/languages/go/tag-parser.js.map +1 -0
- package/dist/languages/go/type-converter.d.ts +32 -0
- package/dist/languages/go/type-converter.d.ts.map +1 -0
- package/dist/languages/go/type-converter.js +226 -0
- package/dist/languages/go/type-converter.js.map +1 -0
- package/dist/languages/go/types.d.ts +153 -0
- package/dist/languages/go/types.d.ts.map +1 -0
- package/dist/languages/go/types.js +6 -0
- package/dist/languages/go/types.js.map +1 -0
- package/dist/languages/import-resolver.d.ts +645 -0
- package/dist/languages/import-resolver.d.ts.map +1 -0
- package/dist/languages/import-resolver.js +1278 -0
- package/dist/languages/import-resolver.js.map +1 -0
- package/dist/languages/index.d.ts +34 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +93 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/json-schema.d.ts +40 -0
- package/dist/languages/json-schema.d.ts.map +1 -0
- package/dist/languages/json-schema.js +188 -0
- package/dist/languages/json-schema.js.map +1 -0
- package/dist/languages/python-ast/index.d.ts +8 -0
- package/dist/languages/python-ast/index.d.ts.map +1 -0
- package/dist/languages/python-ast/index.js +7 -0
- package/dist/languages/python-ast/index.js.map +1 -0
- package/dist/languages/python-ast/parser.d.ts +174 -0
- package/dist/languages/python-ast/parser.d.ts.map +1 -0
- package/dist/languages/python-ast/parser.js +1205 -0
- package/dist/languages/python-ast/parser.js.map +1 -0
- package/dist/languages/python-ast/type-resolver.d.ts +75 -0
- package/dist/languages/python-ast/type-resolver.d.ts.map +1 -0
- package/dist/languages/python-ast/type-resolver.js +421 -0
- package/dist/languages/python-ast/type-resolver.js.map +1 -0
- package/dist/languages/python-ast/types.d.ts +216 -0
- package/dist/languages/python-ast/types.d.ts.map +1 -0
- package/dist/languages/python-ast/types.js +6 -0
- package/dist/languages/python-ast/types.js.map +1 -0
- package/dist/languages/python.d.ts +55 -0
- package/dist/languages/python.d.ts.map +1 -0
- package/dist/languages/python.js +311 -0
- package/dist/languages/python.js.map +1 -0
- package/dist/languages/typescript.d.ts +272 -0
- package/dist/languages/typescript.d.ts.map +1 -0
- package/dist/languages/typescript.js +1381 -0
- package/dist/languages/typescript.js.map +1 -0
- package/dist/patterns/base.d.ts +146 -0
- package/dist/patterns/base.d.ts.map +1 -0
- package/dist/patterns/base.js +89 -0
- package/dist/patterns/base.js.map +1 -0
- package/dist/patterns/errors.d.ts +172 -0
- package/dist/patterns/errors.d.ts.map +1 -0
- package/dist/patterns/errors.js +185 -0
- package/dist/patterns/errors.js.map +1 -0
- package/dist/patterns/extractors.d.ts +170 -0
- package/dist/patterns/extractors.d.ts.map +1 -0
- package/dist/patterns/extractors.js +305 -0
- package/dist/patterns/extractors.js.map +1 -0
- package/dist/patterns/graphql/apollo-client.d.ts +80 -0
- package/dist/patterns/graphql/apollo-client.d.ts.map +1 -0
- package/dist/patterns/graphql/apollo-client.js +800 -0
- package/dist/patterns/graphql/apollo-client.js.map +1 -0
- package/dist/patterns/graphql/apollo-server.d.ts +55 -0
- package/dist/patterns/graphql/apollo-server.d.ts.map +1 -0
- package/dist/patterns/graphql/apollo-server.js +523 -0
- package/dist/patterns/graphql/apollo-server.js.map +1 -0
- package/dist/patterns/graphql/index.d.ts +11 -0
- package/dist/patterns/graphql/index.d.ts.map +1 -0
- package/dist/patterns/graphql/index.js +12 -0
- package/dist/patterns/graphql/index.js.map +1 -0
- package/dist/patterns/graphql/types.d.ts +213 -0
- package/dist/patterns/graphql/types.d.ts.map +1 -0
- package/dist/patterns/graphql/types.js +16 -0
- package/dist/patterns/graphql/types.js.map +1 -0
- package/dist/patterns/http-clients/axios.d.ts +148 -0
- package/dist/patterns/http-clients/axios.d.ts.map +1 -0
- package/dist/patterns/http-clients/axios.js +652 -0
- package/dist/patterns/http-clients/axios.js.map +1 -0
- package/dist/patterns/http-clients/fetch.d.ts +88 -0
- package/dist/patterns/http-clients/fetch.d.ts.map +1 -0
- package/dist/patterns/http-clients/fetch.js +364 -0
- package/dist/patterns/http-clients/fetch.js.map +1 -0
- package/dist/patterns/http-clients/index.d.ts +36 -0
- package/dist/patterns/http-clients/index.d.ts.map +1 -0
- package/dist/patterns/http-clients/index.js +50 -0
- package/dist/patterns/http-clients/index.js.map +1 -0
- package/dist/patterns/http-clients/property-access.d.ts +46 -0
- package/dist/patterns/http-clients/property-access.d.ts.map +1 -0
- package/dist/patterns/http-clients/property-access.js +818 -0
- package/dist/patterns/http-clients/property-access.js.map +1 -0
- package/dist/patterns/http-clients/type-inference.d.ts +48 -0
- package/dist/patterns/http-clients/type-inference.d.ts.map +1 -0
- package/dist/patterns/http-clients/type-inference.js +293 -0
- package/dist/patterns/http-clients/type-inference.js.map +1 -0
- package/dist/patterns/http-clients/types.d.ts +168 -0
- package/dist/patterns/http-clients/types.d.ts.map +1 -0
- package/dist/patterns/http-clients/types.js +10 -0
- package/dist/patterns/http-clients/types.js.map +1 -0
- package/dist/patterns/http-clients/url-extractor.d.ts +53 -0
- package/dist/patterns/http-clients/url-extractor.d.ts.map +1 -0
- package/dist/patterns/http-clients/url-extractor.js +338 -0
- package/dist/patterns/http-clients/url-extractor.js.map +1 -0
- package/dist/patterns/index.d.ts +44 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +49 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/python/aiohttp.d.ts +21 -0
- package/dist/patterns/python/aiohttp.d.ts.map +1 -0
- package/dist/patterns/python/aiohttp.js +188 -0
- package/dist/patterns/python/aiohttp.js.map +1 -0
- package/dist/patterns/python/httpx.d.ts +20 -0
- package/dist/patterns/python/httpx.d.ts.map +1 -0
- package/dist/patterns/python/httpx.js +183 -0
- package/dist/patterns/python/httpx.js.map +1 -0
- package/dist/patterns/python/index.d.ts +32 -0
- package/dist/patterns/python/index.d.ts.map +1 -0
- package/dist/patterns/python/index.js +63 -0
- package/dist/patterns/python/index.js.map +1 -0
- package/dist/patterns/python/property-access.d.ts +27 -0
- package/dist/patterns/python/property-access.d.ts.map +1 -0
- package/dist/patterns/python/property-access.js +132 -0
- package/dist/patterns/python/property-access.js.map +1 -0
- package/dist/patterns/python/requests.d.ts +19 -0
- package/dist/patterns/python/requests.d.ts.map +1 -0
- package/dist/patterns/python/requests.js +239 -0
- package/dist/patterns/python/requests.js.map +1 -0
- package/dist/patterns/python/types.d.ts +95 -0
- package/dist/patterns/python/types.d.ts.map +1 -0
- package/dist/patterns/python/types.js +43 -0
- package/dist/patterns/python/types.js.map +1 -0
- package/dist/patterns/registry.d.ts +181 -0
- package/dist/patterns/registry.d.ts.map +1 -0
- package/dist/patterns/registry.js +304 -0
- package/dist/patterns/registry.js.map +1 -0
- package/dist/patterns/rest/express.d.ts +78 -0
- package/dist/patterns/rest/express.d.ts.map +1 -0
- package/dist/patterns/rest/express.js +289 -0
- package/dist/patterns/rest/express.js.map +1 -0
- package/dist/patterns/rest/fastify.d.ts +93 -0
- package/dist/patterns/rest/fastify.d.ts.map +1 -0
- package/dist/patterns/rest/fastify.js +420 -0
- package/dist/patterns/rest/fastify.js.map +1 -0
- package/dist/patterns/rest/index.d.ts +31 -0
- package/dist/patterns/rest/index.d.ts.map +1 -0
- package/dist/patterns/rest/index.js +45 -0
- package/dist/patterns/rest/index.js.map +1 -0
- package/dist/patterns/rest/middleware.d.ts +25 -0
- package/dist/patterns/rest/middleware.d.ts.map +1 -0
- package/dist/patterns/rest/middleware.js +219 -0
- package/dist/patterns/rest/middleware.js.map +1 -0
- package/dist/patterns/rest/path-parser.d.ts +50 -0
- package/dist/patterns/rest/path-parser.d.ts.map +1 -0
- package/dist/patterns/rest/path-parser.js +137 -0
- package/dist/patterns/rest/path-parser.js.map +1 -0
- package/dist/patterns/rest/response-inference.d.ts +44 -0
- package/dist/patterns/rest/response-inference.d.ts.map +1 -0
- package/dist/patterns/rest/response-inference.js +218 -0
- package/dist/patterns/rest/response-inference.js.map +1 -0
- package/dist/patterns/rest/types.d.ts +102 -0
- package/dist/patterns/rest/types.d.ts.map +1 -0
- package/dist/patterns/rest/types.js +10 -0
- package/dist/patterns/rest/types.js.map +1 -0
- package/dist/patterns/types.d.ts +105 -0
- package/dist/patterns/types.d.ts.map +1 -0
- package/dist/patterns/types.js +11 -0
- package/dist/patterns/types.js.map +1 -0
- package/dist/report/index.d.ts +11 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +55 -0
- package/dist/report/index.js.map +1 -0
- package/dist/tools/contract-comments.d.ts +48 -0
- package/dist/tools/contract-comments.d.ts.map +1 -0
- package/dist/tools/contract-comments.js +130 -0
- package/dist/tools/contract-comments.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/scaffold.d.ts +38 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +373 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/trace/index.d.ts +28 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +45 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/watch/cache.d.ts +41 -0
- package/dist/watch/cache.d.ts.map +1 -0
- package/dist/watch/cache.js +230 -0
- package/dist/watch/cache.js.map +1 -0
- package/dist/watch/index.d.ts +9 -0
- package/dist/watch/index.d.ts.map +1 -0
- package/dist/watch/index.js +7 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/project.d.ts +128 -0
- package/dist/watch/project.d.ts.map +1 -0
- package/dist/watch/project.js +152 -0
- package/dist/watch/project.js.map +1 -0
- package/dist/watch/watcher.d.ts +76 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +235 -0
- package/dist/watch/watcher.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔗 OpenAPI Ref Parser
|
|
3
|
+
* Parses and builds SchemaRef ID strings for the OpenAPI adapter
|
|
4
|
+
*
|
|
5
|
+
* The OpenAPI adapter uses structured reference IDs to identify
|
|
6
|
+
* specific parts of an OpenAPI specification. This module provides
|
|
7
|
+
* utilities to parse these IDs and reconstruct them from components.
|
|
8
|
+
*
|
|
9
|
+
* @module adapters/openapi/parser
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Parsed components of an OpenAPI reference ID.
|
|
13
|
+
*
|
|
14
|
+
* Reference IDs encode the type, location, and spec path:
|
|
15
|
+
* - `file` - Entire spec file
|
|
16
|
+
* - `endpoint` - Full endpoint (request + responses)
|
|
17
|
+
* - `request` - Request body schema only
|
|
18
|
+
* - `response` - Specific response by status code
|
|
19
|
+
* - `schema` - Named component schema
|
|
20
|
+
*/
|
|
21
|
+
export interface OpenAPIRef {
|
|
22
|
+
/** The type of reference being accessed */
|
|
23
|
+
type: 'file' | 'endpoint' | 'request' | 'response' | 'schema';
|
|
24
|
+
/** HTTP method (GET, POST, etc.) - for endpoint/request/response types */
|
|
25
|
+
method?: string;
|
|
26
|
+
/** API path (e.g., /users/{id}) - for endpoint/request/response types */
|
|
27
|
+
path?: string;
|
|
28
|
+
/** Response status code (e.g., 200, 404) - for response type only */
|
|
29
|
+
statusCode?: string;
|
|
30
|
+
/** Component schema name - for schema type only */
|
|
31
|
+
schemaName?: string;
|
|
32
|
+
/** Path to the OpenAPI specification file */
|
|
33
|
+
specPath: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse an OpenAPI SchemaRef ID string into its components.
|
|
37
|
+
*
|
|
38
|
+
* ID formats by type:
|
|
39
|
+
* - `endpoint:METHOD:/path@specPath` - Full endpoint
|
|
40
|
+
* - `request:METHOD:/path@specPath` - Request body only
|
|
41
|
+
* - `response:METHOD:/path:statusCode@specPath` - Specific response
|
|
42
|
+
* - `schema:SchemaName@specPath` - Component schema
|
|
43
|
+
* - `file:specPath` - Entire spec file
|
|
44
|
+
*
|
|
45
|
+
* @param refId - The reference ID string to parse
|
|
46
|
+
* @returns Parsed reference object, or null if the ID is invalid
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // Parse an endpoint reference
|
|
51
|
+
* const ref = parseOpenAPIRef('endpoint:GET:/users/{id}@./api.yaml');
|
|
52
|
+
* // { type: 'endpoint', method: 'GET', path: '/users/{id}', specPath: './api.yaml' }
|
|
53
|
+
*
|
|
54
|
+
* // Parse a response reference
|
|
55
|
+
* const ref = parseOpenAPIRef('response:POST:/users:201@./api.yaml');
|
|
56
|
+
* // { type: 'response', method: 'POST', path: '/users', statusCode: '201', specPath: './api.yaml' }
|
|
57
|
+
*
|
|
58
|
+
* // Parse a component schema reference
|
|
59
|
+
* const ref = parseOpenAPIRef('schema:User@./api.yaml');
|
|
60
|
+
* // { type: 'schema', schemaName: 'User', specPath: './api.yaml' }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function parseOpenAPIRef(refId: string): OpenAPIRef | null;
|
|
64
|
+
/**
|
|
65
|
+
* Build an OpenAPI SchemaRef ID string from its components.
|
|
66
|
+
*
|
|
67
|
+
* This is the inverse of `parseOpenAPIRef` - it takes parsed
|
|
68
|
+
* components and constructs a valid reference ID string.
|
|
69
|
+
*
|
|
70
|
+
* @param ref - The OpenAPIRef components to encode
|
|
71
|
+
* @returns The formatted ID string
|
|
72
|
+
* @throws {Error} If the ref type is unknown
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* // Build an endpoint reference
|
|
77
|
+
* const id = buildOpenAPIRefId({
|
|
78
|
+
* type: 'endpoint',
|
|
79
|
+
* method: 'GET',
|
|
80
|
+
* path: '/users/{id}',
|
|
81
|
+
* specPath: './api.yaml'
|
|
82
|
+
* });
|
|
83
|
+
* // 'endpoint:GET:/users/{id}@./api.yaml'
|
|
84
|
+
*
|
|
85
|
+
* // Build a schema reference
|
|
86
|
+
* const id = buildOpenAPIRefId({
|
|
87
|
+
* type: 'schema',
|
|
88
|
+
* schemaName: 'User',
|
|
89
|
+
* specPath: './api.yaml'
|
|
90
|
+
* });
|
|
91
|
+
* // 'schema:User@./api.yaml'
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function buildOpenAPIRefId(ref: OpenAPIRef): string;
|
|
95
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/adapters/openapi/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAE9D,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAmGhE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAoBzD"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔗 OpenAPI Ref Parser
|
|
3
|
+
* Parses and builds SchemaRef ID strings for the OpenAPI adapter
|
|
4
|
+
*
|
|
5
|
+
* The OpenAPI adapter uses structured reference IDs to identify
|
|
6
|
+
* specific parts of an OpenAPI specification. This module provides
|
|
7
|
+
* utilities to parse these IDs and reconstruct them from components.
|
|
8
|
+
*
|
|
9
|
+
* @module adapters/openapi/parser
|
|
10
|
+
*/
|
|
11
|
+
/** Valid reference type identifiers */
|
|
12
|
+
const VALID_TYPES = ['file', 'endpoint', 'request', 'response', 'schema'];
|
|
13
|
+
/**
|
|
14
|
+
* Parse an OpenAPI SchemaRef ID string into its components.
|
|
15
|
+
*
|
|
16
|
+
* ID formats by type:
|
|
17
|
+
* - `endpoint:METHOD:/path@specPath` - Full endpoint
|
|
18
|
+
* - `request:METHOD:/path@specPath` - Request body only
|
|
19
|
+
* - `response:METHOD:/path:statusCode@specPath` - Specific response
|
|
20
|
+
* - `schema:SchemaName@specPath` - Component schema
|
|
21
|
+
* - `file:specPath` - Entire spec file
|
|
22
|
+
*
|
|
23
|
+
* @param refId - The reference ID string to parse
|
|
24
|
+
* @returns Parsed reference object, or null if the ID is invalid
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Parse an endpoint reference
|
|
29
|
+
* const ref = parseOpenAPIRef('endpoint:GET:/users/{id}@./api.yaml');
|
|
30
|
+
* // { type: 'endpoint', method: 'GET', path: '/users/{id}', specPath: './api.yaml' }
|
|
31
|
+
*
|
|
32
|
+
* // Parse a response reference
|
|
33
|
+
* const ref = parseOpenAPIRef('response:POST:/users:201@./api.yaml');
|
|
34
|
+
* // { type: 'response', method: 'POST', path: '/users', statusCode: '201', specPath: './api.yaml' }
|
|
35
|
+
*
|
|
36
|
+
* // Parse a component schema reference
|
|
37
|
+
* const ref = parseOpenAPIRef('schema:User@./api.yaml');
|
|
38
|
+
* // { type: 'schema', schemaName: 'User', specPath: './api.yaml' }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function parseOpenAPIRef(refId) {
|
|
42
|
+
if (!refId || refId.length === 0) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
// Find the @ separator (last occurrence for spec path)
|
|
46
|
+
const atIndex = refId.lastIndexOf('@');
|
|
47
|
+
// Find the first colon (type separator)
|
|
48
|
+
const colonIndex = refId.indexOf(':');
|
|
49
|
+
if (colonIndex === -1) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const type = refId.slice(0, colonIndex);
|
|
53
|
+
if (!VALID_TYPES.includes(type)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// Handle file type specially (format: file:path)
|
|
57
|
+
if (type === 'file') {
|
|
58
|
+
const specPath = refId.slice(colonIndex + 1);
|
|
59
|
+
if (!specPath) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return { type: 'file', specPath };
|
|
63
|
+
}
|
|
64
|
+
// All other types require @ separator for spec path
|
|
65
|
+
if (atIndex === -1) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const specPath = refId.slice(atIndex + 1);
|
|
69
|
+
const identifier = refId.slice(colonIndex + 1, atIndex);
|
|
70
|
+
if (!specPath) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
switch (type) {
|
|
74
|
+
case 'schema': {
|
|
75
|
+
// Format: schema:SchemaName@specPath
|
|
76
|
+
return {
|
|
77
|
+
type: 'schema',
|
|
78
|
+
schemaName: identifier,
|
|
79
|
+
specPath,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
case 'endpoint':
|
|
83
|
+
case 'request': {
|
|
84
|
+
// Format: type:METHOD:/path@specPath
|
|
85
|
+
const methodEnd = identifier.indexOf(':');
|
|
86
|
+
if (methodEnd === -1) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const method = identifier.slice(0, methodEnd);
|
|
90
|
+
const path = decodeURIComponent(identifier.slice(methodEnd + 1));
|
|
91
|
+
return {
|
|
92
|
+
type,
|
|
93
|
+
method,
|
|
94
|
+
path,
|
|
95
|
+
specPath,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
case 'response': {
|
|
99
|
+
// Format: response:METHOD:/path:statusCode@specPath
|
|
100
|
+
const methodEnd = identifier.indexOf(':');
|
|
101
|
+
if (methodEnd === -1) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const method = identifier.slice(0, methodEnd);
|
|
105
|
+
const restPart = identifier.slice(methodEnd + 1);
|
|
106
|
+
// Find the last colon for status code
|
|
107
|
+
const lastColon = restPart.lastIndexOf(':');
|
|
108
|
+
if (lastColon === -1) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const path = decodeURIComponent(restPart.slice(0, lastColon));
|
|
112
|
+
const statusCode = restPart.slice(lastColon + 1);
|
|
113
|
+
return {
|
|
114
|
+
type: 'response',
|
|
115
|
+
method,
|
|
116
|
+
path,
|
|
117
|
+
statusCode,
|
|
118
|
+
specPath,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
default:
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Build an OpenAPI SchemaRef ID string from its components.
|
|
127
|
+
*
|
|
128
|
+
* This is the inverse of `parseOpenAPIRef` - it takes parsed
|
|
129
|
+
* components and constructs a valid reference ID string.
|
|
130
|
+
*
|
|
131
|
+
* @param ref - The OpenAPIRef components to encode
|
|
132
|
+
* @returns The formatted ID string
|
|
133
|
+
* @throws {Error} If the ref type is unknown
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* // Build an endpoint reference
|
|
138
|
+
* const id = buildOpenAPIRefId({
|
|
139
|
+
* type: 'endpoint',
|
|
140
|
+
* method: 'GET',
|
|
141
|
+
* path: '/users/{id}',
|
|
142
|
+
* specPath: './api.yaml'
|
|
143
|
+
* });
|
|
144
|
+
* // 'endpoint:GET:/users/{id}@./api.yaml'
|
|
145
|
+
*
|
|
146
|
+
* // Build a schema reference
|
|
147
|
+
* const id = buildOpenAPIRefId({
|
|
148
|
+
* type: 'schema',
|
|
149
|
+
* schemaName: 'User',
|
|
150
|
+
* specPath: './api.yaml'
|
|
151
|
+
* });
|
|
152
|
+
* // 'schema:User@./api.yaml'
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export function buildOpenAPIRefId(ref) {
|
|
156
|
+
const { type, method, path, statusCode, schemaName, specPath } = ref;
|
|
157
|
+
switch (type) {
|
|
158
|
+
case 'file':
|
|
159
|
+
return `file:${specPath}`;
|
|
160
|
+
case 'schema':
|
|
161
|
+
return `schema:${schemaName}@${specPath}`;
|
|
162
|
+
case 'endpoint':
|
|
163
|
+
case 'request':
|
|
164
|
+
return `${type}:${method}:${path}@${specPath}`;
|
|
165
|
+
case 'response':
|
|
166
|
+
return `response:${method}:${path}:${statusCode}@${specPath}`;
|
|
167
|
+
default:
|
|
168
|
+
throw new Error(`Unknown OpenAPI ref type: ${type}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/adapters/openapi/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📦 Adapter Registry
|
|
3
|
+
* Central registry for managing schema adapters with validation and lookup
|
|
4
|
+
*
|
|
5
|
+
* @module adapters/registry
|
|
6
|
+
*/
|
|
7
|
+
import type { SchemaAdapter, SchemaRef, NormalizedSchema, SchemaSourceKind } from '../core/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Register a schema adapter.
|
|
10
|
+
*
|
|
11
|
+
* The adapter is validated before registration. If an adapter for
|
|
12
|
+
* the same kind already exists, it is replaced (last-wins semantics).
|
|
13
|
+
*
|
|
14
|
+
* @param adapter - The schema adapter to register
|
|
15
|
+
* @throws {AdapterValidationError} If the adapter is invalid
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* registerAdapter(new MCPAdapter());
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function registerAdapter(adapter: SchemaAdapter): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get a registered adapter by kind.
|
|
25
|
+
*
|
|
26
|
+
* @param kind - The schema source kind to look up
|
|
27
|
+
* @returns The registered adapter
|
|
28
|
+
* @throws {AdapterNotFoundError} If no adapter is registered for the kind
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const adapter = getAdapter('mcp');
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function getAdapter(kind: SchemaSourceKind): SchemaAdapter;
|
|
36
|
+
/**
|
|
37
|
+
* Check if an adapter is registered for a kind.
|
|
38
|
+
*
|
|
39
|
+
* @param kind - The schema source kind to check
|
|
40
|
+
* @returns True if an adapter is registered
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* if (hasAdapter('mcp')) {
|
|
45
|
+
* console.log('MCP adapter available');
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function hasAdapter(kind: SchemaSourceKind): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* List all registered adapter kinds.
|
|
52
|
+
*
|
|
53
|
+
* @returns Array of registered schema source kinds
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const kinds = listAdapters();
|
|
58
|
+
* console.log('Available:', kinds.join(', '));
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function listAdapters(): SchemaSourceKind[];
|
|
62
|
+
/**
|
|
63
|
+
* Get an adapter that supports a given schema ref.
|
|
64
|
+
*
|
|
65
|
+
* @param ref - The schema reference to find an adapter for
|
|
66
|
+
* @returns The adapter that supports the ref
|
|
67
|
+
* @throws {AdapterNotFoundError} If no adapter supports the ref
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const ref: SchemaRef = { source: 'mcp', id: 'tool:get_weather' };
|
|
72
|
+
* const adapter = getAdapterForRef(ref);
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function getAdapterForRef(ref: SchemaRef): SchemaAdapter;
|
|
76
|
+
/**
|
|
77
|
+
* Extract a schema using the appropriate adapter.
|
|
78
|
+
*
|
|
79
|
+
* Automatically selects the adapter based on the ref's source kind
|
|
80
|
+
* and delegates extraction to that adapter.
|
|
81
|
+
*
|
|
82
|
+
* @param ref - The schema reference to extract
|
|
83
|
+
* @returns Promise resolving to the normalized schema
|
|
84
|
+
* @throws {AdapterNotFoundError} If no adapter supports the ref
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const schema = await extractSchema({
|
|
89
|
+
* source: 'mcp',
|
|
90
|
+
* id: 'tool:get_weather'
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function extractSchema(ref: SchemaRef): Promise<NormalizedSchema>;
|
|
95
|
+
/**
|
|
96
|
+
* List available schemas using the appropriate adapter.
|
|
97
|
+
*
|
|
98
|
+
* Not all adapters support listing. This function throws if
|
|
99
|
+
* the adapter doesn't implement the list() method.
|
|
100
|
+
*
|
|
101
|
+
* @param kind - The schema source kind
|
|
102
|
+
* @param basePath - Base path to search for schemas
|
|
103
|
+
* @returns Promise resolving to array of schema refs
|
|
104
|
+
* @throws {AdapterNotFoundError} If no adapter is registered for the kind
|
|
105
|
+
* @throws {Error} If the adapter doesn't support listing
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const refs = await listSchemas('mcp', './src');
|
|
110
|
+
* for (const ref of refs) {
|
|
111
|
+
* console.log(`Found: ${ref.id}`);
|
|
112
|
+
* }
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function listSchemas(kind: SchemaSourceKind, basePath: string): Promise<SchemaRef[]>;
|
|
116
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA4HrG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAE5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,aAAa,CAEhE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAE1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,IAAI,gBAAgB,EAAE,CAEjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,aAAa,CAE9D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQ7E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAYhG"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📦 Adapter Registry
|
|
3
|
+
* Central registry for managing schema adapters with validation and lookup
|
|
4
|
+
*
|
|
5
|
+
* @module adapters/registry
|
|
6
|
+
*/
|
|
7
|
+
import { AdapterNotFoundError, AdapterValidationError } from './errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Internal registry class that manages schema adapters.
|
|
10
|
+
*
|
|
11
|
+
* Provides validated registration, lookup by kind, and ref-based
|
|
12
|
+
* adapter resolution. Uses last-wins semantics for replacement.
|
|
13
|
+
*/
|
|
14
|
+
class AdapterRegistry {
|
|
15
|
+
adapters = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* Register an adapter with validation.
|
|
18
|
+
*
|
|
19
|
+
* Validates the adapter interface before registration.
|
|
20
|
+
* If an adapter for the same kind exists, it is replaced (last-wins).
|
|
21
|
+
*
|
|
22
|
+
* @param adapter - The schema adapter to register
|
|
23
|
+
* @throws {AdapterValidationError} If the adapter is missing required properties
|
|
24
|
+
*/
|
|
25
|
+
register(adapter) {
|
|
26
|
+
this.validateAdapter(adapter);
|
|
27
|
+
if (this.adapters.has(adapter.kind) && process.env.DEBUG_TRACE_MCP) {
|
|
28
|
+
console.error(`[AdapterRegistry] Overwriting adapter for kind: ${adapter.kind}`);
|
|
29
|
+
}
|
|
30
|
+
this.adapters.set(adapter.kind, adapter);
|
|
31
|
+
if (process.env.DEBUG_TRACE_MCP) {
|
|
32
|
+
console.error(`[AdapterRegistry] Registered adapter: ${adapter.kind}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get an adapter by its kind.
|
|
37
|
+
*
|
|
38
|
+
* @param kind - The schema source kind to look up
|
|
39
|
+
* @returns The registered adapter for the kind
|
|
40
|
+
* @throws {AdapterNotFoundError} If no adapter is registered for the kind
|
|
41
|
+
*/
|
|
42
|
+
get(kind) {
|
|
43
|
+
const adapter = this.adapters.get(kind);
|
|
44
|
+
if (!adapter) {
|
|
45
|
+
throw new AdapterNotFoundError(kind, this.list());
|
|
46
|
+
}
|
|
47
|
+
return adapter;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if an adapter is registered for a kind.
|
|
51
|
+
*
|
|
52
|
+
* @param kind - The schema source kind to check
|
|
53
|
+
* @returns True if an adapter is registered
|
|
54
|
+
*/
|
|
55
|
+
has(kind) {
|
|
56
|
+
return this.adapters.has(kind);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* List all registered adapter kinds.
|
|
60
|
+
*
|
|
61
|
+
* @returns Array of registered schema source kinds
|
|
62
|
+
*/
|
|
63
|
+
list() {
|
|
64
|
+
return Array.from(this.adapters.keys());
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get an adapter that supports a given schema ref.
|
|
68
|
+
*
|
|
69
|
+
* Looks up the adapter by the ref's source kind and verifies
|
|
70
|
+
* that the adapter supports the specific ref.
|
|
71
|
+
*
|
|
72
|
+
* @param ref - The schema reference to find an adapter for
|
|
73
|
+
* @returns The adapter that supports the ref
|
|
74
|
+
* @throws {AdapterNotFoundError} If no adapter supports the ref
|
|
75
|
+
*/
|
|
76
|
+
getForRef(ref) {
|
|
77
|
+
const adapter = this.adapters.get(ref.source);
|
|
78
|
+
if (adapter && adapter.supports(ref)) {
|
|
79
|
+
return adapter;
|
|
80
|
+
}
|
|
81
|
+
throw new AdapterNotFoundError(ref.source, this.list());
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate adapter before registration.
|
|
85
|
+
*
|
|
86
|
+
* Ensures the adapter has all required properties and methods:
|
|
87
|
+
* - kind: string identifier
|
|
88
|
+
* - supports(): function to check ref compatibility
|
|
89
|
+
* - extract(): function to extract schemas
|
|
90
|
+
* - list() (optional): function to list available refs
|
|
91
|
+
*
|
|
92
|
+
* @param adapter - The adapter to validate
|
|
93
|
+
* @throws {AdapterValidationError} If validation fails
|
|
94
|
+
*/
|
|
95
|
+
validateAdapter(adapter) {
|
|
96
|
+
const partial = adapter;
|
|
97
|
+
if (!partial.kind || typeof partial.kind !== 'string') {
|
|
98
|
+
throw new AdapterValidationError(partial, 'kind is required and must be a string');
|
|
99
|
+
}
|
|
100
|
+
if (typeof partial.supports !== 'function') {
|
|
101
|
+
throw new AdapterValidationError(partial, 'supports() must be a function');
|
|
102
|
+
}
|
|
103
|
+
if (typeof partial.extract !== 'function') {
|
|
104
|
+
throw new AdapterValidationError(partial, 'extract() must be a function');
|
|
105
|
+
}
|
|
106
|
+
if (partial.list !== undefined && typeof partial.list !== 'function') {
|
|
107
|
+
throw new AdapterValidationError(partial, 'list() must be a function if defined');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Singleton instance
|
|
112
|
+
const registry = new AdapterRegistry();
|
|
113
|
+
/**
|
|
114
|
+
* Register a schema adapter.
|
|
115
|
+
*
|
|
116
|
+
* The adapter is validated before registration. If an adapter for
|
|
117
|
+
* the same kind already exists, it is replaced (last-wins semantics).
|
|
118
|
+
*
|
|
119
|
+
* @param adapter - The schema adapter to register
|
|
120
|
+
* @throws {AdapterValidationError} If the adapter is invalid
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* registerAdapter(new MCPAdapter());
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export function registerAdapter(adapter) {
|
|
128
|
+
registry.register(adapter);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get a registered adapter by kind.
|
|
132
|
+
*
|
|
133
|
+
* @param kind - The schema source kind to look up
|
|
134
|
+
* @returns The registered adapter
|
|
135
|
+
* @throws {AdapterNotFoundError} If no adapter is registered for the kind
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const adapter = getAdapter('mcp');
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export function getAdapter(kind) {
|
|
143
|
+
return registry.get(kind);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if an adapter is registered for a kind.
|
|
147
|
+
*
|
|
148
|
+
* @param kind - The schema source kind to check
|
|
149
|
+
* @returns True if an adapter is registered
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* if (hasAdapter('mcp')) {
|
|
154
|
+
* console.log('MCP adapter available');
|
|
155
|
+
* }
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
export function hasAdapter(kind) {
|
|
159
|
+
return registry.has(kind);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* List all registered adapter kinds.
|
|
163
|
+
*
|
|
164
|
+
* @returns Array of registered schema source kinds
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* const kinds = listAdapters();
|
|
169
|
+
* console.log('Available:', kinds.join(', '));
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
export function listAdapters() {
|
|
173
|
+
return registry.list();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get an adapter that supports a given schema ref.
|
|
177
|
+
*
|
|
178
|
+
* @param ref - The schema reference to find an adapter for
|
|
179
|
+
* @returns The adapter that supports the ref
|
|
180
|
+
* @throws {AdapterNotFoundError} If no adapter supports the ref
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```typescript
|
|
184
|
+
* const ref: SchemaRef = { source: 'mcp', id: 'tool:get_weather' };
|
|
185
|
+
* const adapter = getAdapterForRef(ref);
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
export function getAdapterForRef(ref) {
|
|
189
|
+
return registry.getForRef(ref);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Extract a schema using the appropriate adapter.
|
|
193
|
+
*
|
|
194
|
+
* Automatically selects the adapter based on the ref's source kind
|
|
195
|
+
* and delegates extraction to that adapter.
|
|
196
|
+
*
|
|
197
|
+
* @param ref - The schema reference to extract
|
|
198
|
+
* @returns Promise resolving to the normalized schema
|
|
199
|
+
* @throws {AdapterNotFoundError} If no adapter supports the ref
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* ```typescript
|
|
203
|
+
* const schema = await extractSchema({
|
|
204
|
+
* source: 'mcp',
|
|
205
|
+
* id: 'tool:get_weather'
|
|
206
|
+
* });
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
export async function extractSchema(ref) {
|
|
210
|
+
const adapter = getAdapterForRef(ref);
|
|
211
|
+
if (process.env.DEBUG_TRACE_MCP) {
|
|
212
|
+
console.error(`[AdapterRegistry] Extracting schema: ${ref.id} via ${adapter.kind}`);
|
|
213
|
+
}
|
|
214
|
+
return adapter.extract(ref);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* List available schemas using the appropriate adapter.
|
|
218
|
+
*
|
|
219
|
+
* Not all adapters support listing. This function throws if
|
|
220
|
+
* the adapter doesn't implement the list() method.
|
|
221
|
+
*
|
|
222
|
+
* @param kind - The schema source kind
|
|
223
|
+
* @param basePath - Base path to search for schemas
|
|
224
|
+
* @returns Promise resolving to array of schema refs
|
|
225
|
+
* @throws {AdapterNotFoundError} If no adapter is registered for the kind
|
|
226
|
+
* @throws {Error} If the adapter doesn't support listing
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* const refs = await listSchemas('mcp', './src');
|
|
231
|
+
* for (const ref of refs) {
|
|
232
|
+
* console.log(`Found: ${ref.id}`);
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
export async function listSchemas(kind, basePath) {
|
|
237
|
+
const adapter = getAdapter(kind);
|
|
238
|
+
if (!adapter.list) {
|
|
239
|
+
throw new Error(`Adapter for kind "${kind}" does not support list() method`);
|
|
240
|
+
}
|
|
241
|
+
if (process.env.DEBUG_TRACE_MCP) {
|
|
242
|
+
console.error(`[AdapterRegistry] Listing schemas via ${kind} in ${basePath}`);
|
|
243
|
+
}
|
|
244
|
+
return adapter.list(basePath);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"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"}
|