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,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Schema Adapter
|
|
3
|
+
* Converts MCP tool definitions to NormalizedSchema
|
|
4
|
+
*/
|
|
5
|
+
import { Project, Node } from 'ts-morph';
|
|
6
|
+
/**
|
|
7
|
+
* MCP adapter for extracting schemas from MCP server.tool() calls
|
|
8
|
+
*/
|
|
9
|
+
export class MCPAdapter {
|
|
10
|
+
kind = 'mcp';
|
|
11
|
+
supports(ref) {
|
|
12
|
+
return ref.source === 'mcp';
|
|
13
|
+
}
|
|
14
|
+
async extract(ref) {
|
|
15
|
+
const { id, options } = ref;
|
|
16
|
+
// Parse ID format: "file:path/to/file.ts" or "dir:path/to/dir" or "tool:toolName@path"
|
|
17
|
+
// Use indexOf to handle Windows paths with colons (e.g., C:\path\to\file.ts)
|
|
18
|
+
const colonIndex = id.indexOf(':');
|
|
19
|
+
if (colonIndex === -1) {
|
|
20
|
+
throw new Error(`Invalid ID format (missing type prefix): ${id}`);
|
|
21
|
+
}
|
|
22
|
+
const type = id.slice(0, colonIndex);
|
|
23
|
+
const pathPart = id.slice(colonIndex + 1);
|
|
24
|
+
if (type === 'file') {
|
|
25
|
+
return this.extractFromFile(pathPart, ref);
|
|
26
|
+
}
|
|
27
|
+
else if (type === 'dir') {
|
|
28
|
+
// Extract first tool from directory (or could return all)
|
|
29
|
+
const schemas = await this.extractFromDirectory(pathPart, options);
|
|
30
|
+
if (schemas.length === 0) {
|
|
31
|
+
throw new Error(`No MCP tools found in directory: ${pathPart}`);
|
|
32
|
+
}
|
|
33
|
+
return schemas[0];
|
|
34
|
+
}
|
|
35
|
+
else if (type === 'tool') {
|
|
36
|
+
// Format: "tool:toolName@path"
|
|
37
|
+
const atIndex = pathPart.indexOf('@');
|
|
38
|
+
if (atIndex === -1) {
|
|
39
|
+
throw new Error(`Invalid tool ID format (missing @): ${id}`);
|
|
40
|
+
}
|
|
41
|
+
const toolName = pathPart.slice(0, atIndex);
|
|
42
|
+
const filePath = pathPart.slice(atIndex + 1);
|
|
43
|
+
return this.extractToolByName(toolName, filePath, ref);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
throw new Error(`Unsupported MCP schema reference format: ${id}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async list(basePath) {
|
|
50
|
+
const project = new Project({
|
|
51
|
+
tsConfigFilePath: undefined,
|
|
52
|
+
skipAddingFilesFromTsConfig: true,
|
|
53
|
+
});
|
|
54
|
+
project.addSourceFilesAtPaths([`${basePath}/**/*.ts`]);
|
|
55
|
+
const refs = [];
|
|
56
|
+
for (const sourceFile of project.getSourceFiles()) {
|
|
57
|
+
const filePath = sourceFile.getFilePath();
|
|
58
|
+
// Skip node_modules and dist
|
|
59
|
+
if (filePath.includes('node_modules') || filePath.includes('dist')) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const toolCalls = this.findToolCalls(sourceFile);
|
|
63
|
+
for (const toolCall of toolCalls) {
|
|
64
|
+
const toolName = this.extractToolName(toolCall);
|
|
65
|
+
if (toolName) {
|
|
66
|
+
refs.push({
|
|
67
|
+
source: 'mcp',
|
|
68
|
+
id: `tool:${toolName}@${filePath}`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return refs;
|
|
74
|
+
}
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// Private extraction methods
|
|
77
|
+
// ============================================================================
|
|
78
|
+
async extractFromFile(filePath, ref) {
|
|
79
|
+
const project = new Project({
|
|
80
|
+
skipAddingFilesFromTsConfig: true,
|
|
81
|
+
});
|
|
82
|
+
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
83
|
+
const toolCalls = this.findToolCalls(sourceFile);
|
|
84
|
+
if (toolCalls.length === 0) {
|
|
85
|
+
throw new Error(`No MCP tools found in file: ${filePath}`);
|
|
86
|
+
}
|
|
87
|
+
// Extract first tool (or specific tool if specified in options)
|
|
88
|
+
const toolCall = toolCalls[0];
|
|
89
|
+
return this.parseToolCallToNormalized(toolCall, filePath, ref);
|
|
90
|
+
}
|
|
91
|
+
async extractFromDirectory(dirPath, options) {
|
|
92
|
+
const project = new Project({
|
|
93
|
+
tsConfigFilePath: undefined,
|
|
94
|
+
skipAddingFilesFromTsConfig: true,
|
|
95
|
+
});
|
|
96
|
+
const patterns = options?.include || ['**/*.ts'];
|
|
97
|
+
const excludePatterns = options?.exclude || [
|
|
98
|
+
'**/node_modules/**',
|
|
99
|
+
'**/dist/**',
|
|
100
|
+
];
|
|
101
|
+
project.addSourceFilesAtPaths(patterns.map((p) => `${dirPath}/${p}`));
|
|
102
|
+
const schemas = [];
|
|
103
|
+
for (const sourceFile of project.getSourceFiles()) {
|
|
104
|
+
const filePath = sourceFile.getFilePath();
|
|
105
|
+
// Skip excluded patterns
|
|
106
|
+
if (excludePatterns.some((pattern) => filePath.includes(pattern.replace('**/', '')))) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const toolCalls = this.findToolCalls(sourceFile);
|
|
110
|
+
for (const toolCall of toolCalls) {
|
|
111
|
+
const ref = { source: 'mcp', id: `file:${filePath}` };
|
|
112
|
+
const schema = this.parseToolCallToNormalized(toolCall, filePath, ref);
|
|
113
|
+
schemas.push(schema);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return schemas;
|
|
117
|
+
}
|
|
118
|
+
async extractToolByName(toolName, filePath, ref) {
|
|
119
|
+
const project = new Project({
|
|
120
|
+
skipAddingFilesFromTsConfig: true,
|
|
121
|
+
});
|
|
122
|
+
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
123
|
+
const toolCalls = this.findToolCalls(sourceFile);
|
|
124
|
+
for (const toolCall of toolCalls) {
|
|
125
|
+
const name = this.extractToolName(toolCall);
|
|
126
|
+
if (name === toolName) {
|
|
127
|
+
return this.parseToolCallToNormalized(toolCall, filePath, ref);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
throw new Error(`Tool "${toolName}" not found in ${filePath}`);
|
|
131
|
+
}
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Parsing utilities
|
|
134
|
+
// ============================================================================
|
|
135
|
+
findToolCalls(sourceFile) {
|
|
136
|
+
const toolCalls = [];
|
|
137
|
+
sourceFile.forEachDescendant((node) => {
|
|
138
|
+
if (Node.isCallExpression(node)) {
|
|
139
|
+
const expression = node.getExpression();
|
|
140
|
+
// Check for pattern: server.tool() or *.tool()
|
|
141
|
+
if (Node.isPropertyAccessExpression(expression)) {
|
|
142
|
+
const methodName = expression.getName();
|
|
143
|
+
if (methodName === 'tool') {
|
|
144
|
+
toolCalls.push(node);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
return toolCalls;
|
|
150
|
+
}
|
|
151
|
+
extractToolName(callExpr) {
|
|
152
|
+
const args = callExpr.getArguments();
|
|
153
|
+
if (args.length === 0)
|
|
154
|
+
return null;
|
|
155
|
+
const nameArg = args[0];
|
|
156
|
+
if (Node.isStringLiteral(nameArg)) {
|
|
157
|
+
return nameArg.getLiteralValue();
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
parseToolCallToNormalized(callExpr, filePath, ref) {
|
|
162
|
+
const args = callExpr.getArguments();
|
|
163
|
+
if (args.length < 3) {
|
|
164
|
+
throw new Error(`Invalid tool call at ${filePath}:${callExpr.getStartLineNumber()}`);
|
|
165
|
+
}
|
|
166
|
+
// Extract tool name
|
|
167
|
+
const nameArg = args[0];
|
|
168
|
+
let toolName = 'unknown';
|
|
169
|
+
if (Node.isStringLiteral(nameArg)) {
|
|
170
|
+
toolName = nameArg.getLiteralValue();
|
|
171
|
+
}
|
|
172
|
+
// Extract description (second argument if string, otherwise schema is second)
|
|
173
|
+
let description;
|
|
174
|
+
let schemaArg;
|
|
175
|
+
const secondArg = args[1];
|
|
176
|
+
if (Node.isStringLiteral(secondArg)) {
|
|
177
|
+
description = secondArg.getLiteralValue();
|
|
178
|
+
schemaArg = args[2];
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
schemaArg = secondArg;
|
|
182
|
+
}
|
|
183
|
+
// Parse the Zod schema object to NormalizedSchema
|
|
184
|
+
const normalized = this.parseZodSchemaToNormalized(schemaArg);
|
|
185
|
+
const location = {
|
|
186
|
+
file: filePath,
|
|
187
|
+
line: callExpr.getStartLineNumber(),
|
|
188
|
+
column: callExpr.getStartLinePos(),
|
|
189
|
+
};
|
|
190
|
+
return {
|
|
191
|
+
...normalized,
|
|
192
|
+
name: toolName,
|
|
193
|
+
source: ref,
|
|
194
|
+
location,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
parseZodSchemaToNormalized(node) {
|
|
198
|
+
const properties = {};
|
|
199
|
+
const required = [];
|
|
200
|
+
if (!Node.isObjectLiteralExpression(node)) {
|
|
201
|
+
return { properties, required, source: { source: 'mcp', id: '' } };
|
|
202
|
+
}
|
|
203
|
+
for (const prop of node.getProperties()) {
|
|
204
|
+
if (!Node.isPropertyAssignment(prop))
|
|
205
|
+
continue;
|
|
206
|
+
const propName = prop.getName();
|
|
207
|
+
const initializer = prop.getInitializer();
|
|
208
|
+
if (!initializer)
|
|
209
|
+
continue;
|
|
210
|
+
// Parse the Zod type chain
|
|
211
|
+
const type = this.parseZodType(initializer);
|
|
212
|
+
const initText = initializer.getText();
|
|
213
|
+
const isOptional = initText.includes('.optional()');
|
|
214
|
+
const isNullable = initText.includes('.nullable()');
|
|
215
|
+
const isDeprecated = initText.includes('.deprecated()');
|
|
216
|
+
properties[propName] = {
|
|
217
|
+
type,
|
|
218
|
+
optional: isOptional,
|
|
219
|
+
nullable: isNullable,
|
|
220
|
+
readonly: false,
|
|
221
|
+
deprecated: isDeprecated,
|
|
222
|
+
};
|
|
223
|
+
if (!isOptional) {
|
|
224
|
+
required.push(propName);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
properties,
|
|
229
|
+
required,
|
|
230
|
+
source: { source: 'mcp', id: '' },
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
parseZodType(node) {
|
|
234
|
+
const text = node.getText();
|
|
235
|
+
// z.string()
|
|
236
|
+
if (text.includes('z.string()')) {
|
|
237
|
+
return { kind: 'primitive', value: 'string' };
|
|
238
|
+
}
|
|
239
|
+
// z.number()
|
|
240
|
+
if (text.includes('z.number()')) {
|
|
241
|
+
return { kind: 'primitive', value: 'number' };
|
|
242
|
+
}
|
|
243
|
+
// z.boolean()
|
|
244
|
+
if (text.includes('z.boolean()')) {
|
|
245
|
+
return { kind: 'primitive', value: 'boolean' };
|
|
246
|
+
}
|
|
247
|
+
// z.literal(...)
|
|
248
|
+
if (text.includes('z.literal(')) {
|
|
249
|
+
const literalMatch = text.match(/z\.literal\((.*?)\)/);
|
|
250
|
+
if (literalMatch) {
|
|
251
|
+
const value = literalMatch[1].replace(/['"]/g, '');
|
|
252
|
+
return { kind: 'literal', value };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// z.enum([...])
|
|
256
|
+
if (text.includes('z.enum(')) {
|
|
257
|
+
const enumMatch = text.match(/z\.enum\(\[(.*?)\]\)/);
|
|
258
|
+
if (enumMatch) {
|
|
259
|
+
const values = enumMatch[1]
|
|
260
|
+
.split(',')
|
|
261
|
+
.map((v) => v.trim().replace(/['"]/g, ''));
|
|
262
|
+
// Convert enum to union of literals
|
|
263
|
+
return {
|
|
264
|
+
kind: 'union',
|
|
265
|
+
variants: values.map((v) => ({ kind: 'literal', value: v })),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// z.array(...)
|
|
270
|
+
if (text.includes('z.array(')) {
|
|
271
|
+
// For now, return array of unknown
|
|
272
|
+
// TODO: Parse element type
|
|
273
|
+
return { kind: 'array', element: { kind: 'unknown' } };
|
|
274
|
+
}
|
|
275
|
+
// z.object(...)
|
|
276
|
+
if (text.includes('z.object(')) {
|
|
277
|
+
// For now, return object with empty schema
|
|
278
|
+
// TODO: Parse nested object
|
|
279
|
+
return {
|
|
280
|
+
kind: 'object',
|
|
281
|
+
schema: { properties: {}, required: [], source: { source: 'mcp', id: '' } },
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// z.union([...])
|
|
285
|
+
if (text.includes('z.union(')) {
|
|
286
|
+
// For now, return generic union
|
|
287
|
+
return { kind: 'union', variants: [{ kind: 'unknown' }] };
|
|
288
|
+
}
|
|
289
|
+
// Default
|
|
290
|
+
return { kind: 'unknown' };
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/adapters/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📋 OpenAPI Schema Adapter
|
|
3
|
+
* Extracts and converts OpenAPI/Swagger specifications to NormalizedSchema
|
|
4
|
+
*
|
|
5
|
+
* This adapter implements the SchemaAdapter interface for OpenAPI 3.x
|
|
6
|
+
* specifications. It supports extraction of:
|
|
7
|
+
* - Full endpoints (request + all responses)
|
|
8
|
+
* - Request body schemas
|
|
9
|
+
* - Response schemas by status code
|
|
10
|
+
* - Component schemas
|
|
11
|
+
* - File-level extraction (first endpoint)
|
|
12
|
+
*
|
|
13
|
+
* @module adapters/openapi/adapter
|
|
14
|
+
*/
|
|
15
|
+
import type { SchemaAdapter, SchemaRef, NormalizedSchema } from '../../core/types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Schema adapter for OpenAPI 3.x specifications.
|
|
18
|
+
*
|
|
19
|
+
* Implements the SchemaAdapter interface to extract schemas from
|
|
20
|
+
* OpenAPI/Swagger specifications. Uses `@apidevtools/swagger-parser`
|
|
21
|
+
* for parsing and validation.
|
|
22
|
+
*
|
|
23
|
+
* @implements {SchemaAdapter}
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* import { OpenAPIAdapter } from './adapter.js';
|
|
28
|
+
* import { registerAdapter } from '../registry.js';
|
|
29
|
+
*
|
|
30
|
+
* // Register the adapter
|
|
31
|
+
* registerAdapter(new OpenAPIAdapter());
|
|
32
|
+
*
|
|
33
|
+
* // Extract an endpoint schema
|
|
34
|
+
* const adapter = new OpenAPIAdapter();
|
|
35
|
+
* const schema = await adapter.extract({
|
|
36
|
+
* source: 'openapi',
|
|
37
|
+
* id: 'endpoint:GET:/users/{id}@./api.yaml'
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare class OpenAPIAdapter implements SchemaAdapter {
|
|
42
|
+
/** Adapter kind identifier */
|
|
43
|
+
readonly kind: "openapi";
|
|
44
|
+
/**
|
|
45
|
+
* Check if this adapter supports the given schema reference.
|
|
46
|
+
*
|
|
47
|
+
* @param ref - The schema reference to check
|
|
48
|
+
* @returns True if the ref source is 'openapi'
|
|
49
|
+
*/
|
|
50
|
+
supports(ref: SchemaRef): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Extract a schema from an OpenAPI specification.
|
|
53
|
+
*
|
|
54
|
+
* Parses the ref ID to determine what to extract:
|
|
55
|
+
* - `file:` - Extract first endpoint from spec
|
|
56
|
+
* - `endpoint:` - Full endpoint schema (request + responses)
|
|
57
|
+
* - `request:` - Request body schema only
|
|
58
|
+
* - `response:` - Specific response by status code
|
|
59
|
+
* - `schema:` - Named component schema
|
|
60
|
+
*
|
|
61
|
+
* @param ref - The schema reference specifying what to extract
|
|
62
|
+
* @returns Promise resolving to the normalized schema
|
|
63
|
+
* @throws {Error} If the ref ID is invalid or extraction fails
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* // Extract a full endpoint
|
|
68
|
+
* const schema = await adapter.extract({
|
|
69
|
+
* source: 'openapi',
|
|
70
|
+
* id: 'endpoint:GET:/users/{id}@./api.yaml'
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* // Extract a component schema
|
|
74
|
+
* const schema = await adapter.extract({
|
|
75
|
+
* source: 'openapi',
|
|
76
|
+
* id: 'schema:User@./api.yaml'
|
|
77
|
+
* });
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
extract(ref: SchemaRef): Promise<NormalizedSchema>;
|
|
81
|
+
/**
|
|
82
|
+
* List all endpoints in an OpenAPI specification.
|
|
83
|
+
*
|
|
84
|
+
* Scans the paths object and returns a SchemaRef for each
|
|
85
|
+
* method/path combination found. Handles errors gracefully
|
|
86
|
+
* by returning an empty array per ADR guidelines.
|
|
87
|
+
*
|
|
88
|
+
* @param basePath - Path to the OpenAPI specification file
|
|
89
|
+
* @returns Promise resolving to array of endpoint SchemaRefs
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const refs = await adapter.list('./api.yaml');
|
|
94
|
+
* // [
|
|
95
|
+
* // { source: 'openapi', id: 'endpoint:GET:/users@./api.yaml' },
|
|
96
|
+
* // { source: 'openapi', id: 'endpoint:POST:/users@./api.yaml' },
|
|
97
|
+
* // ...
|
|
98
|
+
* // ]
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
list(basePath: string): Promise<SchemaRef[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Load and validate an OpenAPI specification.
|
|
104
|
+
*
|
|
105
|
+
* Uses swagger-parser to validate the spec and resolve references.
|
|
106
|
+
*
|
|
107
|
+
* @param specPath - Path to the specification file
|
|
108
|
+
* @returns Promise resolving to the parsed OpenAPI document
|
|
109
|
+
* @throws {Error} If the spec cannot be loaded or is invalid
|
|
110
|
+
*/
|
|
111
|
+
private loadSpec;
|
|
112
|
+
/**
|
|
113
|
+
* Extract the first endpoint from a spec.
|
|
114
|
+
*
|
|
115
|
+
* Used for `file:` refs that don't specify a specific endpoint.
|
|
116
|
+
*
|
|
117
|
+
* @param api - The parsed OpenAPI document
|
|
118
|
+
* @param specPath - Path to the spec file
|
|
119
|
+
* @param ref - The original schema reference
|
|
120
|
+
* @returns The normalized schema for the first endpoint
|
|
121
|
+
* @throws {Error} If no endpoints are found
|
|
122
|
+
*/
|
|
123
|
+
private extractFirstEndpoint;
|
|
124
|
+
/**
|
|
125
|
+
* Extract a full endpoint schema (request + responses).
|
|
126
|
+
*
|
|
127
|
+
* Creates a normalized schema with two top-level properties:
|
|
128
|
+
* - `request`: Path params, query params, headers, and body
|
|
129
|
+
* - `responses`: All response schemas keyed by status code
|
|
130
|
+
*
|
|
131
|
+
* @param api - The parsed OpenAPI document
|
|
132
|
+
* @param method - HTTP method (GET, POST, etc.)
|
|
133
|
+
* @param path - API path (/users/{id})
|
|
134
|
+
* @param ref - The original schema reference
|
|
135
|
+
* @param specPath - Path to the spec file
|
|
136
|
+
* @returns The normalized endpoint schema
|
|
137
|
+
* @throws {Error} If path or method not found
|
|
138
|
+
*/
|
|
139
|
+
private extractEndpoint;
|
|
140
|
+
/**
|
|
141
|
+
* Build the request schema for an endpoint.
|
|
142
|
+
*
|
|
143
|
+
* Combines path-level and operation-level parameters into
|
|
144
|
+
* a structured schema with path, query, headers, and body sections.
|
|
145
|
+
*
|
|
146
|
+
* @param api - The parsed OpenAPI document
|
|
147
|
+
* @param operation - The operation object
|
|
148
|
+
* @param pathItem - The path item object
|
|
149
|
+
* @param ref - The original schema reference
|
|
150
|
+
* @returns The request schema
|
|
151
|
+
*/
|
|
152
|
+
private buildRequestSchema;
|
|
153
|
+
/**
|
|
154
|
+
* Build the responses schema for an endpoint.
|
|
155
|
+
*
|
|
156
|
+
* Creates a schema with status codes as property keys,
|
|
157
|
+
* each containing the response body schema.
|
|
158
|
+
*
|
|
159
|
+
* @param operation - The operation object
|
|
160
|
+
* @param ref - The original schema reference
|
|
161
|
+
* @returns The responses schema
|
|
162
|
+
*/
|
|
163
|
+
private buildResponsesSchema;
|
|
164
|
+
/**
|
|
165
|
+
* Extract just the request body schema for an endpoint.
|
|
166
|
+
*
|
|
167
|
+
* @param api - The parsed OpenAPI document
|
|
168
|
+
* @param method - HTTP method
|
|
169
|
+
* @param path - API path
|
|
170
|
+
* @param ref - The original schema reference
|
|
171
|
+
* @returns The request body schema
|
|
172
|
+
* @throws {Error} If no request body is defined
|
|
173
|
+
*/
|
|
174
|
+
private extractRequest;
|
|
175
|
+
/**
|
|
176
|
+
* Extract a response schema by status code.
|
|
177
|
+
*
|
|
178
|
+
* @param api - The parsed OpenAPI document
|
|
179
|
+
* @param method - HTTP method
|
|
180
|
+
* @param path - API path
|
|
181
|
+
* @param statusCode - Response status code (e.g., '200')
|
|
182
|
+
* @param ref - The original schema reference
|
|
183
|
+
* @returns The response body schema
|
|
184
|
+
* @throws {Error} If response not found
|
|
185
|
+
*/
|
|
186
|
+
private extractResponse;
|
|
187
|
+
/**
|
|
188
|
+
* Extract a component schema by name.
|
|
189
|
+
*
|
|
190
|
+
* @param api - The parsed OpenAPI document
|
|
191
|
+
* @param schemaName - Name of the component schema
|
|
192
|
+
* @param ref - The original schema reference
|
|
193
|
+
* @param specPath - Path to the spec file
|
|
194
|
+
* @returns The component schema
|
|
195
|
+
* @throws {Error} If schema not found
|
|
196
|
+
*/
|
|
197
|
+
private extractComponentSchema;
|
|
198
|
+
/**
|
|
199
|
+
* Dereference a schema by resolving $ref if present.
|
|
200
|
+
*
|
|
201
|
+
* Recursively resolves references in the schema tree, including:
|
|
202
|
+
* - Top-level $ref
|
|
203
|
+
* - allOf, oneOf, anyOf members
|
|
204
|
+
* - Array items
|
|
205
|
+
* - Object properties
|
|
206
|
+
*
|
|
207
|
+
* @param api - The parsed OpenAPI document
|
|
208
|
+
* @param schema - The schema to dereference
|
|
209
|
+
* @returns The dereferenced schema object
|
|
210
|
+
*/
|
|
211
|
+
private dereferenceSchema;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/openapi/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,gBAAgB,EAGjB,MAAM,qBAAqB,CAAC;AAW7B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAEnC;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO;IAIjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6BxD;;;;;;;;;;;;;;;;;;;OAmBG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA+BlD;;;;;;;;OAQG;YACW,QAAQ;IAatB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,eAAe;IAuDvB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kBAAkB;IAmF1B;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IA4C5B;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAgCtB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,eAAe;IAsCvB;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;IA+B9B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,iBAAiB;CAsE1B"}
|