github-to-mcp-monorepo 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/.env.example +8 -0
- package/.github/CODEOWNERS +6 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/.prettierignore +5 -0
- package/.prettierrc +7 -0
- package/.vscode/settings.json +4 -0
- package/ARCHITECTURE.md +1429 -0
- package/CHANGELOG.md +167 -0
- package/CONTRIBUTING.md +327 -0
- package/LICENSE +201 -0
- package/README.md +1028 -0
- package/SECURITY.md +248 -0
- package/VISUAL_GUIDE.md +437 -0
- package/apps/vscode/IMPLEMENTATION.md +480 -0
- package/apps/vscode/README.md +248 -0
- package/apps/vscode/package.json +381 -0
- package/apps/vscode/resources/icon.png +0 -0
- package/apps/vscode/resources/icon.svg +5 -0
- package/apps/vscode/src/commands/browseRegistry.ts +211 -0
- package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
- package/apps/vscode/src/commands/convert.ts +82 -0
- package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
- package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
- package/apps/vscode/src/commands/index.ts +121 -0
- package/apps/vscode/src/commands/validate.ts +197 -0
- package/apps/vscode/src/extension.ts +464 -0
- package/apps/vscode/src/global.d.ts +36 -0
- package/apps/vscode/src/test/extension.test.ts +73 -0
- package/apps/vscode/src/utils/file-generator.ts +529 -0
- package/apps/vscode/src/utils/github-api.ts +335 -0
- package/apps/vscode/src/utils/index.ts +29 -0
- package/apps/vscode/src/utils/mcp-config.ts +334 -0
- package/apps/vscode/src/utils/storage.ts +87 -0
- package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
- package/apps/vscode/src/views/OutputChannelView.ts +195 -0
- package/apps/vscode/src/views/StatusBarItem.ts +251 -0
- package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
- package/apps/vscode/src/views/historyProvider.ts +75 -0
- package/apps/vscode/src/views/index.ts +12 -0
- package/apps/vscode/src/views/resultsPanel.ts +330 -0
- package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
- package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
- package/apps/vscode/src/webviews/index.ts +9 -0
- package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
- package/apps/vscode/tsconfig.json +20 -0
- package/apps/web/PLAYGROUND_GUIDE.md +499 -0
- package/apps/web/README.md +505 -0
- package/apps/web/app/api/convert/route.ts +100 -0
- package/apps/web/app/api/convert/stream/route.ts +198 -0
- package/apps/web/app/api/deploy/route.ts +157 -0
- package/apps/web/app/api/edge/route.ts +308 -0
- package/apps/web/app/api/export-docker/route.ts +284 -0
- package/apps/web/app/api/generate-openapi/route.ts +119 -0
- package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
- package/apps/web/app/api/playground/connect/route.ts +143 -0
- package/apps/web/app/api/playground/disconnect/route.ts +78 -0
- package/apps/web/app/api/playground/execute/route.ts +135 -0
- package/apps/web/app/api/playground/sessions/route.ts +103 -0
- package/apps/web/app/api/playground/tools/route.ts +117 -0
- package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
- package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
- package/apps/web/app/api/playground/v2/health/route.ts +80 -0
- package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
- package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
- package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
- package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
- package/apps/web/app/api/stream/route.ts +232 -0
- package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
- package/apps/web/app/batch/page.tsx +37 -0
- package/apps/web/app/convert/page.tsx +269 -0
- package/apps/web/app/dashboard/page.tsx +380 -0
- package/apps/web/app/globals.css +622 -0
- package/apps/web/app/layout.tsx +120 -0
- package/apps/web/app/manifest.ts +31 -0
- package/apps/web/app/opengraph-image.tsx +112 -0
- package/apps/web/app/page.old.tsx +924 -0
- package/apps/web/app/page.tsx +77 -0
- package/apps/web/app/playground/page.tsx +306 -0
- package/apps/web/app/playground/v2/error.tsx +163 -0
- package/apps/web/app/playground/v2/layout.tsx +58 -0
- package/apps/web/app/playground/v2/loading.tsx +152 -0
- package/apps/web/app/playground/v2/page.tsx +644 -0
- package/apps/web/app/playground/v2/providers.tsx +214 -0
- package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
- package/apps/web/app/playground/v2/use-url-state.ts +296 -0
- package/apps/web/app/providers.tsx +22 -0
- package/apps/web/app/sitemap.ts +32 -0
- package/apps/web/app/twitter-image.tsx +112 -0
- package/apps/web/components/BranchSelector.tsx +401 -0
- package/apps/web/components/ClaudeConfigExport.tsx +226 -0
- package/apps/web/components/Features.tsx +84 -0
- package/apps/web/components/Footer.tsx +119 -0
- package/apps/web/components/GenerationProgress.tsx +248 -0
- package/apps/web/components/GithubUrlInput.tsx +483 -0
- package/apps/web/components/Header.tsx +175 -0
- package/apps/web/components/Hero.tsx +117 -0
- package/apps/web/components/HowItWorks.tsx +119 -0
- package/apps/web/components/InstallBanner.tsx +158 -0
- package/apps/web/components/Logo.tsx +116 -0
- package/apps/web/components/ParticleBackground.tsx +105 -0
- package/apps/web/components/Playground.tsx +472 -0
- package/apps/web/components/PlaygroundToolTester.tsx +410 -0
- package/apps/web/components/ProductCards.tsx +179 -0
- package/apps/web/components/SplitView.tsx +194 -0
- package/apps/web/components/ToolFilter.tsx +260 -0
- package/apps/web/components/ToolList.tsx +325 -0
- package/apps/web/components/batch/BatchConvert.tsx +785 -0
- package/apps/web/components/batch/index.ts +7 -0
- package/apps/web/components/convert/ConfigTabs.tsx +230 -0
- package/apps/web/components/convert/ConversionResult.tsx +482 -0
- package/apps/web/components/convert/InlinePlayground.tsx +259 -0
- package/apps/web/components/convert/LoadingSteps.tsx +311 -0
- package/apps/web/components/convert/OneClickInstall.tsx +224 -0
- package/apps/web/components/convert/ToolCard.tsx +189 -0
- package/apps/web/components/convert/TryInPlayground.tsx +242 -0
- package/apps/web/components/convert/index.ts +12 -0
- package/apps/web/components/deploy/DeployButton.tsx +369 -0
- package/apps/web/components/deploy/index.ts +7 -0
- package/apps/web/components/docker/DockerExport.tsx +690 -0
- package/apps/web/components/docker/index.ts +7 -0
- package/apps/web/components/install/OneClickInstall.tsx +676 -0
- package/apps/web/components/install/index.ts +7 -0
- package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
- package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
- package/apps/web/components/playground/EmptyStates.tsx +305 -0
- package/apps/web/components/playground/ExecutionLog.tsx +260 -0
- package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
- package/apps/web/components/playground/JsonViewer.tsx +388 -0
- package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
- package/apps/web/components/playground/PromptsPanel.tsx +385 -0
- package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
- package/apps/web/components/playground/SchemaForm.tsx +477 -0
- package/apps/web/components/playground/ServerStatus.tsx +151 -0
- package/apps/web/components/playground/ShareButton.tsx +239 -0
- package/apps/web/components/playground/ToolsPanel.tsx +309 -0
- package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
- package/apps/web/components/playground/index.ts +74 -0
- package/apps/web/components/playground/types.ts +202 -0
- package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
- package/apps/web/components/streaming/index.ts +7 -0
- package/apps/web/components/ui/badge.tsx +42 -0
- package/apps/web/components/ui/button.tsx +88 -0
- package/apps/web/components/ui/card.tsx +75 -0
- package/apps/web/components/ui/code-block.tsx +122 -0
- package/apps/web/components/ui/index.ts +12 -0
- package/apps/web/components/ui/input.tsx +55 -0
- package/apps/web/components/ui/tabs.tsx +61 -0
- package/apps/web/hooks/index.ts +85 -0
- package/apps/web/hooks/types.ts +1173 -0
- package/apps/web/hooks/use-conversion.ts +133 -0
- package/apps/web/hooks/use-execution-history.ts +376 -0
- package/apps/web/hooks/use-generation-progress.ts +147 -0
- package/apps/web/hooks/use-local-storage.ts +88 -0
- package/apps/web/hooks/use-mcp-client.ts +623 -0
- package/apps/web/hooks/use-mcp-connection.ts +500 -0
- package/apps/web/hooks/use-mcp-execution.ts +282 -0
- package/apps/web/hooks/use-mcp-prompts.ts +441 -0
- package/apps/web/hooks/use-mcp-resources.ts +430 -0
- package/apps/web/hooks/use-mcp-tools.ts +540 -0
- package/apps/web/hooks/use-playground-store.ts +299 -0
- package/apps/web/hooks/use-playground.ts +184 -0
- package/apps/web/hooks/use-streaming-conversion.ts +227 -0
- package/apps/web/hooks/useBatchConversion.ts +271 -0
- package/apps/web/hooks/useDockerConfig.ts +161 -0
- package/apps/web/hooks/usePlatformDetection.ts +80 -0
- package/apps/web/hooks/useStreaming.ts +199 -0
- package/apps/web/lib/api/errors.ts +386 -0
- package/apps/web/lib/api/index.ts +137 -0
- package/apps/web/lib/api/logger.ts +187 -0
- package/apps/web/lib/api/middleware.ts +364 -0
- package/apps/web/lib/api/openapi.ts +977 -0
- package/apps/web/lib/api/session-manager.ts +594 -0
- package/apps/web/lib/api/types.ts +433 -0
- package/apps/web/lib/api/validation.ts +523 -0
- package/apps/web/lib/constants.ts +114 -0
- package/apps/web/lib/mcp/client.ts +1137 -0
- package/apps/web/lib/mcp/events.ts +651 -0
- package/apps/web/lib/mcp/index.ts +347 -0
- package/apps/web/lib/mcp/logger.ts +428 -0
- package/apps/web/lib/mcp/metrics.ts +703 -0
- package/apps/web/lib/mcp/retry.ts +616 -0
- package/apps/web/lib/mcp/session-manager.ts +779 -0
- package/apps/web/lib/mcp/transports.ts +988 -0
- package/apps/web/lib/mcp/types.ts +594 -0
- package/apps/web/lib/mcp-client-enhanced.ts +871 -0
- package/apps/web/lib/mcp-client.ts +778 -0
- package/apps/web/lib/mcp-errors.ts +489 -0
- package/apps/web/lib/mcp-sandbox.ts +593 -0
- package/apps/web/lib/mcp-testing.ts +428 -0
- package/apps/web/lib/mcp-types.ts +448 -0
- package/apps/web/lib/playground-store.tsx +1147 -0
- package/apps/web/lib/utils.ts +439 -0
- package/apps/web/next-env.d.ts +5 -0
- package/apps/web/next.config.js +23 -0
- package/apps/web/package.json +55 -0
- package/apps/web/postcss.config.js +6 -0
- package/apps/web/public/.well-known/ai-plugin.json +17 -0
- package/apps/web/public/logo.svg +6 -0
- package/apps/web/public/robots.txt +22 -0
- package/apps/web/public/schema.json +27 -0
- package/apps/web/tailwind.config.js +26 -0
- package/apps/web/tailwind.config.ts +123 -0
- package/apps/web/tsconfig.json +20 -0
- package/apps/web/types/deploy.ts +139 -0
- package/apps/web/types/index.ts +247 -0
- package/apps/web/vercel.json +39 -0
- package/eslint.config.mjs +23 -0
- package/llms.txt +102 -0
- package/mkdocs/docs/api/core.md +318 -0
- package/mkdocs/docs/api/index.md +128 -0
- package/mkdocs/docs/api/mcp-server.md +301 -0
- package/mkdocs/docs/api/openapi-parser.md +254 -0
- package/mkdocs/docs/assets/logo.svg +7 -0
- package/mkdocs/docs/changelog.md +118 -0
- package/mkdocs/docs/cli/generate.md +148 -0
- package/mkdocs/docs/cli/index.md +52 -0
- package/mkdocs/docs/cli/inspect.md +164 -0
- package/mkdocs/docs/cli/serve.md +136 -0
- package/mkdocs/docs/concepts/classification.md +254 -0
- package/mkdocs/docs/concepts/how-it-works.md +299 -0
- package/mkdocs/docs/concepts/index.md +77 -0
- package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
- package/mkdocs/docs/concepts/tool-types.md +382 -0
- package/mkdocs/docs/contributing/architecture.md +262 -0
- package/mkdocs/docs/contributing/development.md +245 -0
- package/mkdocs/docs/contributing/index.md +73 -0
- package/mkdocs/docs/contributing/testing.md +320 -0
- package/mkdocs/docs/getting-started/configuration.md +235 -0
- package/mkdocs/docs/getting-started/index.md +54 -0
- package/mkdocs/docs/getting-started/installation.md +145 -0
- package/mkdocs/docs/getting-started/quickstart.md +160 -0
- package/mkdocs/docs/guides/batch.md +375 -0
- package/mkdocs/docs/guides/claude-desktop.md +227 -0
- package/mkdocs/docs/guides/cursor.md +188 -0
- package/mkdocs/docs/guides/custom-tools.md +367 -0
- package/mkdocs/docs/guides/index.md +78 -0
- package/mkdocs/docs/guides/private-repos.md +221 -0
- package/mkdocs/docs/guides/vscode.md +247 -0
- package/mkdocs/docs/index.md +175 -0
- package/mkdocs/docs/reference/config.md +223 -0
- package/mkdocs/docs/reference/env.md +192 -0
- package/mkdocs/docs/reference/index.md +102 -0
- package/mkdocs/docs/reference/tools.md +309 -0
- package/mkdocs/docs/stylesheets/extra.css +231 -0
- package/mkdocs/mkdocs.yml +204 -0
- package/mkdocs/overrides/.gitkeep +1 -0
- package/mkdocs/overrides/main.html +7 -0
- package/mkdocs/python-deps.txt +7 -0
- package/mkdocs/vercel.json +11 -0
- package/package.json +63 -0
- package/packages/core/package.json +61 -0
- package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
- package/packages/core/src/__tests__/cli.test.ts +235 -0
- package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
- package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
- package/packages/core/src/__tests__/github-client.test.ts +390 -0
- package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
- package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
- package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
- package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
- package/packages/core/src/__tests__/plugins.test.ts +467 -0
- package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
- package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
- package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
- package/packages/core/src/__tests__/streaming.test.ts +251 -0
- package/packages/core/src/additional-extractors.ts +333 -0
- package/packages/core/src/cache/cache-interface.ts +179 -0
- package/packages/core/src/cache/index.ts +210 -0
- package/packages/core/src/cache/redis-cache.ts +291 -0
- package/packages/core/src/cache/upstash-cache.ts +379 -0
- package/packages/core/src/cache.ts +251 -0
- package/packages/core/src/cli.ts +822 -0
- package/packages/core/src/code-extractor.ts +696 -0
- package/packages/core/src/docker-generator.ts +470 -0
- package/packages/core/src/edge-compatible.ts +491 -0
- package/packages/core/src/extractors/go-extractor.ts +791 -0
- package/packages/core/src/extractors/index.ts +9 -0
- package/packages/core/src/extractors/java-extractor.ts +937 -0
- package/packages/core/src/extractors/rust-extractor.ts +744 -0
- package/packages/core/src/github-client.ts +319 -0
- package/packages/core/src/go-generator.ts +356 -0
- package/packages/core/src/graphql-extractor.ts +358 -0
- package/packages/core/src/index.ts +797 -0
- package/packages/core/src/langchain-exporter.ts +617 -0
- package/packages/core/src/language-parsers.ts +1114 -0
- package/packages/core/src/mcp-introspector.ts +279 -0
- package/packages/core/src/monorepo-detector.ts +378 -0
- package/packages/core/src/plugins/index.ts +370 -0
- package/packages/core/src/plugins/registry.ts +404 -0
- package/packages/core/src/plugins/types.ts +215 -0
- package/packages/core/src/providers/base-provider.ts +246 -0
- package/packages/core/src/providers/bitbucket-client.ts +464 -0
- package/packages/core/src/providers/gitlab-client.ts +388 -0
- package/packages/core/src/providers/index.ts +176 -0
- package/packages/core/src/python-generator.ts +260 -0
- package/packages/core/src/queue/index.ts +100 -0
- package/packages/core/src/queue/memory-queue.ts +445 -0
- package/packages/core/src/queue/redis-queue.ts +578 -0
- package/packages/core/src/queue/types.ts +251 -0
- package/packages/core/src/readme-extractor.ts +409 -0
- package/packages/core/src/schema-generator.ts +638 -0
- package/packages/core/src/streaming.ts +999 -0
- package/packages/core/src/types.ts +289 -0
- package/packages/core/tsconfig.json +9 -0
- package/packages/core/tsup.config.ts +25 -0
- package/packages/mcp-server/README.md +297 -0
- package/packages/mcp-server/package.json +55 -0
- package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
- package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
- package/packages/mcp-server/src/index.ts +1206 -0
- package/packages/mcp-server/src/prompts/index.ts +601 -0
- package/packages/mcp-server/src/tools/export-docker.ts +362 -0
- package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
- package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
- package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
- package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
- package/packages/mcp-server/tsconfig.json +12 -0
- package/packages/mcp-server/tsup.config.ts +14 -0
- package/packages/openapi-parser/package-lock.json +3028 -0
- package/packages/openapi-parser/package.json +41 -0
- package/packages/openapi-parser/src/analyzer.ts +700 -0
- package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
- package/packages/openapi-parser/src/cli.ts +302 -0
- package/packages/openapi-parser/src/generator.ts +570 -0
- package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
- package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
- package/packages/openapi-parser/src/generators/index.ts +200 -0
- package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
- package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
- package/packages/openapi-parser/src/generators/types.ts +298 -0
- package/packages/openapi-parser/src/graphql-parser.ts +462 -0
- package/packages/openapi-parser/src/grpc-parser.ts +649 -0
- package/packages/openapi-parser/src/har-parser.ts +723 -0
- package/packages/openapi-parser/src/index.ts +635 -0
- package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
- package/packages/openapi-parser/src/parser.ts +231 -0
- package/packages/openapi-parser/src/postman-parser.ts +611 -0
- package/packages/openapi-parser/src/ref-resolver.ts +313 -0
- package/packages/openapi-parser/src/transformer.ts +459 -0
- package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
- package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
- package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
- package/packages/openapi-parser/tests/parsers.test.ts +847 -0
- package/packages/openapi-parser/tsconfig.json +9 -0
- package/packages/openapi-parser/tsup.config.ts +11 -0
- package/packages/registry/package.json +59 -0
- package/packages/registry/src/cli.ts +456 -0
- package/packages/registry/src/index.ts +44 -0
- package/packages/registry/src/popular/github.json +47 -0
- package/packages/registry/src/popular/index.ts +55 -0
- package/packages/registry/src/popular/linear.json +42 -0
- package/packages/registry/src/popular/notion.json +42 -0
- package/packages/registry/src/popular/openai.json +40 -0
- package/packages/registry/src/popular/resend.json +38 -0
- package/packages/registry/src/popular/slack.json +42 -0
- package/packages/registry/src/popular/stripe.json +163 -0
- package/packages/registry/src/popular/supabase.json +42 -0
- package/packages/registry/src/popular/twilio.json +40 -0
- package/packages/registry/src/popular/vercel.json +40 -0
- package/packages/registry/src/registry.ts +492 -0
- package/packages/registry/src/storage.ts +334 -0
- package/packages/registry/src/types.ts +275 -0
- package/packages/registry/src/updater.ts +208 -0
- package/packages/registry/tsconfig.json +10 -0
- package/packages/registry/tsup.config.ts +11 -0
- package/pnpm-workspace.yaml +3 -0
- package/scripts/build-docs.sh +16 -0
- package/server.json +9 -0
- package/templates/Dockerfile.python.template +60 -0
- package/templates/Dockerfile.typescript.template +60 -0
- package/templates/docker-compose.template.yml +68 -0
- package/tests/fixtures/express-app/index.js +34 -0
- package/tests/fixtures/express-app/routes/posts.js +43 -0
- package/tests/fixtures/express-app/routes/users.js +58 -0
- package/tests/fixtures/fastapi-app/main.py +125 -0
- package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
- package/tests/fixtures/graphql/simple-schema.graphql +65 -0
- package/tests/fixtures/mocks/github-api-responses.json +63 -0
- package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
- package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
- package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
- package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
- package/tests/fixtures/openapi/petstore.yaml +179 -0
- package/tests/integration/langchain-export.test.ts +405 -0
- package/tests/integration/openapi-conversion.test.ts +221 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +32 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Logger - Pluggable logging interface for MCP client
|
|
3
|
+
* @copyright 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Log Levels
|
|
9
|
+
// ============================================================================
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Log level enumeration with numeric values for comparison
|
|
13
|
+
*/
|
|
14
|
+
export enum LogLevel {
|
|
15
|
+
/** No logging */
|
|
16
|
+
None = 0,
|
|
17
|
+
/** Error messages only */
|
|
18
|
+
Error = 1,
|
|
19
|
+
/** Warnings and errors */
|
|
20
|
+
Warn = 2,
|
|
21
|
+
/** Informational messages */
|
|
22
|
+
Info = 3,
|
|
23
|
+
/** Debug information */
|
|
24
|
+
Debug = 4,
|
|
25
|
+
/** Verbose tracing */
|
|
26
|
+
Trace = 5,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Log level string type for configuration
|
|
31
|
+
*/
|
|
32
|
+
export type LogLevelName = 'none' | 'error' | 'warn' | 'info' | 'debug' | 'trace';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Convert log level name to enum value
|
|
36
|
+
*/
|
|
37
|
+
export function parseLogLevel(level: LogLevelName): LogLevel {
|
|
38
|
+
const levelMap: Record<LogLevelName, LogLevel> = {
|
|
39
|
+
none: LogLevel.None,
|
|
40
|
+
error: LogLevel.Error,
|
|
41
|
+
warn: LogLevel.Warn,
|
|
42
|
+
info: LogLevel.Info,
|
|
43
|
+
debug: LogLevel.Debug,
|
|
44
|
+
trace: LogLevel.Trace,
|
|
45
|
+
};
|
|
46
|
+
return levelMap[level] ?? LogLevel.Info;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Logger Interface
|
|
51
|
+
// ============================================================================
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Log entry metadata
|
|
55
|
+
*/
|
|
56
|
+
export interface LogContext {
|
|
57
|
+
/** Timestamp of the log entry */
|
|
58
|
+
readonly timestamp: Date;
|
|
59
|
+
/** Logger name/namespace */
|
|
60
|
+
readonly logger: string;
|
|
61
|
+
/** Log level */
|
|
62
|
+
readonly level: LogLevel;
|
|
63
|
+
/** Additional structured data */
|
|
64
|
+
readonly data?: Readonly<Record<string, unknown>>;
|
|
65
|
+
/** Error object if applicable */
|
|
66
|
+
readonly error?: Error;
|
|
67
|
+
/** Request/operation ID for correlation */
|
|
68
|
+
readonly requestId?: string;
|
|
69
|
+
/** Session ID if applicable */
|
|
70
|
+
readonly sessionId?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Logger interface that all loggers must implement
|
|
75
|
+
*/
|
|
76
|
+
export interface Logger {
|
|
77
|
+
/** Current log level */
|
|
78
|
+
readonly level: LogLevel;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Log an error message
|
|
82
|
+
* @param message - Error message
|
|
83
|
+
* @param context - Optional context data
|
|
84
|
+
*/
|
|
85
|
+
error(message: string, context?: Partial<LogContext>): void;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Log a warning message
|
|
89
|
+
* @param message - Warning message
|
|
90
|
+
* @param context - Optional context data
|
|
91
|
+
*/
|
|
92
|
+
warn(message: string, context?: Partial<LogContext>): void;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Log an informational message
|
|
96
|
+
* @param message - Info message
|
|
97
|
+
* @param context - Optional context data
|
|
98
|
+
*/
|
|
99
|
+
info(message: string, context?: Partial<LogContext>): void;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Log a debug message
|
|
103
|
+
* @param message - Debug message
|
|
104
|
+
* @param context - Optional context data
|
|
105
|
+
*/
|
|
106
|
+
debug(message: string, context?: Partial<LogContext>): void;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Log a trace message
|
|
110
|
+
* @param message - Trace message
|
|
111
|
+
* @param context - Optional context data
|
|
112
|
+
*/
|
|
113
|
+
trace(message: string, context?: Partial<LogContext>): void;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create a child logger with a sub-namespace
|
|
117
|
+
* @param namespace - Child namespace
|
|
118
|
+
* @returns Child logger instance
|
|
119
|
+
*/
|
|
120
|
+
child(namespace: string): Logger;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Create a logger with bound context
|
|
124
|
+
* @param context - Context to bind
|
|
125
|
+
* @returns Logger with bound context
|
|
126
|
+
*/
|
|
127
|
+
withContext(context: Partial<LogContext>): Logger;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ============================================================================
|
|
131
|
+
// Console Logger Implementation
|
|
132
|
+
// ============================================================================
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Console logger configuration
|
|
136
|
+
*/
|
|
137
|
+
export interface ConsoleLoggerOptions {
|
|
138
|
+
/** Minimum log level to output */
|
|
139
|
+
level?: LogLevel;
|
|
140
|
+
/** Logger namespace */
|
|
141
|
+
namespace?: string;
|
|
142
|
+
/** Whether to include timestamps */
|
|
143
|
+
timestamps?: boolean;
|
|
144
|
+
/** Whether to colorize output (for terminals) */
|
|
145
|
+
colors?: boolean;
|
|
146
|
+
/** Custom formatter function */
|
|
147
|
+
formatter?: (entry: LogEntry) => string;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Log entry for formatting
|
|
152
|
+
*/
|
|
153
|
+
export interface LogEntry {
|
|
154
|
+
readonly timestamp: Date;
|
|
155
|
+
readonly level: LogLevel;
|
|
156
|
+
readonly levelName: string;
|
|
157
|
+
readonly namespace: string;
|
|
158
|
+
readonly message: string;
|
|
159
|
+
readonly context?: Partial<LogContext>;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* ANSI color codes for terminal output
|
|
164
|
+
*/
|
|
165
|
+
const COLORS = {
|
|
166
|
+
reset: '\x1b[0m',
|
|
167
|
+
red: '\x1b[31m',
|
|
168
|
+
yellow: '\x1b[33m',
|
|
169
|
+
blue: '\x1b[34m',
|
|
170
|
+
gray: '\x1b[90m',
|
|
171
|
+
cyan: '\x1b[36m',
|
|
172
|
+
white: '\x1b[37m',
|
|
173
|
+
} as const;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Level to color mapping
|
|
177
|
+
*/
|
|
178
|
+
const LEVEL_COLORS: Record<LogLevel, string> = {
|
|
179
|
+
[LogLevel.None]: COLORS.white,
|
|
180
|
+
[LogLevel.Error]: COLORS.red,
|
|
181
|
+
[LogLevel.Warn]: COLORS.yellow,
|
|
182
|
+
[LogLevel.Info]: COLORS.blue,
|
|
183
|
+
[LogLevel.Debug]: COLORS.cyan,
|
|
184
|
+
[LogLevel.Trace]: COLORS.gray,
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Level to name mapping
|
|
189
|
+
*/
|
|
190
|
+
const LEVEL_NAMES: Record<LogLevel, string> = {
|
|
191
|
+
[LogLevel.None]: 'NONE',
|
|
192
|
+
[LogLevel.Error]: 'ERROR',
|
|
193
|
+
[LogLevel.Warn]: 'WARN',
|
|
194
|
+
[LogLevel.Info]: 'INFO',
|
|
195
|
+
[LogLevel.Debug]: 'DEBUG',
|
|
196
|
+
[LogLevel.Trace]: 'TRACE',
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Default log formatter
|
|
201
|
+
*/
|
|
202
|
+
function defaultFormatter(entry: LogEntry, colors: boolean): string {
|
|
203
|
+
const timestamp = entry.timestamp.toISOString();
|
|
204
|
+
const levelName = entry.levelName.padEnd(5);
|
|
205
|
+
const namespace = entry.namespace ? `[${entry.namespace}]` : '';
|
|
206
|
+
|
|
207
|
+
let contextStr = '';
|
|
208
|
+
if (entry.context) {
|
|
209
|
+
const { timestamp: _, level: __, logger: ___, ...rest } = entry.context;
|
|
210
|
+
if (Object.keys(rest).length > 0) {
|
|
211
|
+
if (rest.error instanceof Error) {
|
|
212
|
+
contextStr = ` ${rest.error.message}`;
|
|
213
|
+
if (rest.error.stack) {
|
|
214
|
+
contextStr += `\n${rest.error.stack}`;
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
contextStr = ` ${JSON.stringify(rest)}`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (colors) {
|
|
223
|
+
const color = LEVEL_COLORS[entry.level] || COLORS.white;
|
|
224
|
+
return `${COLORS.gray}${timestamp}${COLORS.reset} ${color}${levelName}${COLORS.reset} ${COLORS.cyan}${namespace}${COLORS.reset} ${entry.message}${contextStr}`;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return `${timestamp} ${levelName} ${namespace} ${entry.message}${contextStr}`;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Console-based logger implementation
|
|
232
|
+
*/
|
|
233
|
+
export class ConsoleLogger implements Logger {
|
|
234
|
+
readonly level: LogLevel;
|
|
235
|
+
private readonly _namespace: string;
|
|
236
|
+
private readonly _timestamps: boolean;
|
|
237
|
+
private readonly _colors: boolean;
|
|
238
|
+
private readonly _formatter: (entry: LogEntry) => string;
|
|
239
|
+
private readonly _boundContext: Partial<LogContext>;
|
|
240
|
+
|
|
241
|
+
constructor(options: ConsoleLoggerOptions = {}) {
|
|
242
|
+
this.level = options.level ?? LogLevel.Info;
|
|
243
|
+
this._namespace = options.namespace ?? 'mcp';
|
|
244
|
+
this._timestamps = options.timestamps ?? true;
|
|
245
|
+
this._colors = options.colors ?? (typeof process !== 'undefined' && process.stdout?.isTTY === true);
|
|
246
|
+
this._formatter = options.formatter ?? ((entry) => defaultFormatter(entry, this._colors));
|
|
247
|
+
this._boundContext = {};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Private constructor for creating child loggers
|
|
252
|
+
*/
|
|
253
|
+
private static _createChild(
|
|
254
|
+
level: LogLevel,
|
|
255
|
+
namespace: string,
|
|
256
|
+
timestamps: boolean,
|
|
257
|
+
colors: boolean,
|
|
258
|
+
formatter: (entry: LogEntry) => string,
|
|
259
|
+
boundContext: Partial<LogContext>
|
|
260
|
+
): ConsoleLogger {
|
|
261
|
+
const logger = Object.create(ConsoleLogger.prototype) as ConsoleLogger;
|
|
262
|
+
// Use Object.defineProperty to set readonly properties
|
|
263
|
+
Object.defineProperty(logger, 'level', { value: level, writable: false });
|
|
264
|
+
Object.defineProperty(logger, '_namespace', { value: namespace, writable: false });
|
|
265
|
+
Object.defineProperty(logger, '_timestamps', { value: timestamps, writable: false });
|
|
266
|
+
Object.defineProperty(logger, '_colors', { value: colors, writable: false });
|
|
267
|
+
Object.defineProperty(logger, '_formatter', { value: formatter, writable: false });
|
|
268
|
+
Object.defineProperty(logger, '_boundContext', { value: boundContext, writable: false });
|
|
269
|
+
return logger;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
private _log(level: LogLevel, message: string, context?: Partial<LogContext>): void {
|
|
273
|
+
if (level > this.level) return;
|
|
274
|
+
|
|
275
|
+
const entry: LogEntry = {
|
|
276
|
+
timestamp: new Date(),
|
|
277
|
+
level,
|
|
278
|
+
levelName: LEVEL_NAMES[level],
|
|
279
|
+
namespace: this._namespace,
|
|
280
|
+
message,
|
|
281
|
+
context: { ...this._boundContext, ...context },
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const formatted = this._formatter(entry);
|
|
285
|
+
|
|
286
|
+
switch (level) {
|
|
287
|
+
case LogLevel.Error:
|
|
288
|
+
console.error(formatted);
|
|
289
|
+
break;
|
|
290
|
+
case LogLevel.Warn:
|
|
291
|
+
console.warn(formatted);
|
|
292
|
+
break;
|
|
293
|
+
case LogLevel.Info:
|
|
294
|
+
console.info(formatted);
|
|
295
|
+
break;
|
|
296
|
+
case LogLevel.Debug:
|
|
297
|
+
case LogLevel.Trace:
|
|
298
|
+
console.debug(formatted);
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
error(message: string, context?: Partial<LogContext>): void {
|
|
304
|
+
this._log(LogLevel.Error, message, context);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
warn(message: string, context?: Partial<LogContext>): void {
|
|
308
|
+
this._log(LogLevel.Warn, message, context);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
info(message: string, context?: Partial<LogContext>): void {
|
|
312
|
+
this._log(LogLevel.Info, message, context);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
debug(message: string, context?: Partial<LogContext>): void {
|
|
316
|
+
this._log(LogLevel.Debug, message, context);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
trace(message: string, context?: Partial<LogContext>): void {
|
|
320
|
+
this._log(LogLevel.Trace, message, context);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
child(namespace: string): Logger {
|
|
324
|
+
const childNamespace = this._namespace ? `${this._namespace}:${namespace}` : namespace;
|
|
325
|
+
return ConsoleLogger._createChild(
|
|
326
|
+
this.level,
|
|
327
|
+
childNamespace,
|
|
328
|
+
this._timestamps,
|
|
329
|
+
this._colors,
|
|
330
|
+
this._formatter,
|
|
331
|
+
{ ...this._boundContext }
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
withContext(context: Partial<LogContext>): Logger {
|
|
336
|
+
return ConsoleLogger._createChild(
|
|
337
|
+
this.level,
|
|
338
|
+
this._namespace,
|
|
339
|
+
this._timestamps,
|
|
340
|
+
this._colors,
|
|
341
|
+
this._formatter,
|
|
342
|
+
{ ...this._boundContext, ...context }
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// ============================================================================
|
|
348
|
+
// Noop Logger Implementation
|
|
349
|
+
// ============================================================================
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* No-operation logger that discards all log messages
|
|
353
|
+
* Useful for testing or when logging should be completely disabled
|
|
354
|
+
*/
|
|
355
|
+
export class NoopLogger implements Logger {
|
|
356
|
+
readonly level = LogLevel.None;
|
|
357
|
+
|
|
358
|
+
error(_message: string, _context?: Partial<LogContext>): void {
|
|
359
|
+
// No-op
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
warn(_message: string, _context?: Partial<LogContext>): void {
|
|
363
|
+
// No-op
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
info(_message: string, _context?: Partial<LogContext>): void {
|
|
367
|
+
// No-op
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
debug(_message: string, _context?: Partial<LogContext>): void {
|
|
371
|
+
// No-op
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
trace(_message: string, _context?: Partial<LogContext>): void {
|
|
375
|
+
// No-op
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
child(_namespace: string): Logger {
|
|
379
|
+
return this;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
withContext(_context: Partial<LogContext>): Logger {
|
|
383
|
+
return this;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// ============================================================================
|
|
388
|
+
// Logger Factory
|
|
389
|
+
// ============================================================================
|
|
390
|
+
|
|
391
|
+
/** Global default logger instance */
|
|
392
|
+
let globalLogger: Logger = new ConsoleLogger({ level: LogLevel.Warn });
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Get the global logger instance
|
|
396
|
+
*/
|
|
397
|
+
export function getLogger(): Logger {
|
|
398
|
+
return globalLogger;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Set the global logger instance
|
|
403
|
+
*/
|
|
404
|
+
export function setLogger(logger: Logger): void {
|
|
405
|
+
globalLogger = logger;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Create a new console logger
|
|
410
|
+
*/
|
|
411
|
+
export function createConsoleLogger(options?: ConsoleLoggerOptions): Logger {
|
|
412
|
+
return new ConsoleLogger(options);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Create a no-op logger
|
|
417
|
+
*/
|
|
418
|
+
export function createNoopLogger(): Logger {
|
|
419
|
+
return new NoopLogger();
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Create a logger with the specified level
|
|
424
|
+
*/
|
|
425
|
+
export function createLogger(level: LogLevel | LogLevelName, namespace?: string): Logger {
|
|
426
|
+
const numericLevel = typeof level === 'string' ? parseLogLevel(level) : level;
|
|
427
|
+
return new ConsoleLogger({ level: numericLevel, namespace });
|
|
428
|
+
}
|