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,651 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Events - Typed event emitter for MCP client events
|
|
3
|
+
* @copyright 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
ConnectionState,
|
|
9
|
+
McpTool,
|
|
10
|
+
McpResource,
|
|
11
|
+
McpPrompt,
|
|
12
|
+
McpToolCallResult,
|
|
13
|
+
McpError,
|
|
14
|
+
} from './types.js';
|
|
15
|
+
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Event Types
|
|
18
|
+
// ============================================================================
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Connection state change event
|
|
22
|
+
*/
|
|
23
|
+
export interface ConnectionStateChangeEvent {
|
|
24
|
+
readonly type: 'connection:stateChange';
|
|
25
|
+
readonly previousState: ConnectionState;
|
|
26
|
+
readonly currentState: ConnectionState;
|
|
27
|
+
readonly timestamp: Date;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Connection established event
|
|
32
|
+
*/
|
|
33
|
+
export interface ConnectionEstablishedEvent {
|
|
34
|
+
readonly type: 'connection:established';
|
|
35
|
+
readonly serverName: string;
|
|
36
|
+
readonly serverVersion: string;
|
|
37
|
+
readonly timestamp: Date;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Connection closed event
|
|
42
|
+
*/
|
|
43
|
+
export interface ConnectionClosedEvent {
|
|
44
|
+
readonly type: 'connection:closed';
|
|
45
|
+
readonly reason?: string;
|
|
46
|
+
readonly wasClean: boolean;
|
|
47
|
+
readonly timestamp: Date;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Connection error event
|
|
52
|
+
*/
|
|
53
|
+
export interface ConnectionErrorEvent {
|
|
54
|
+
readonly type: 'connection:error';
|
|
55
|
+
readonly error: McpError | Error;
|
|
56
|
+
readonly recoverable: boolean;
|
|
57
|
+
readonly timestamp: Date;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Reconnection attempt event
|
|
62
|
+
*/
|
|
63
|
+
export interface ReconnectionAttemptEvent {
|
|
64
|
+
readonly type: 'connection:reconnecting';
|
|
65
|
+
readonly attempt: number;
|
|
66
|
+
readonly maxAttempts: number;
|
|
67
|
+
readonly delayMs: number;
|
|
68
|
+
readonly timestamp: Date;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Tool list change event (from server notification)
|
|
73
|
+
*/
|
|
74
|
+
export interface ToolsChangedEvent {
|
|
75
|
+
readonly type: 'tools:changed';
|
|
76
|
+
readonly tools: readonly McpTool[];
|
|
77
|
+
readonly timestamp: Date;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Tool execution start event
|
|
82
|
+
*/
|
|
83
|
+
export interface ToolExecutionStartEvent {
|
|
84
|
+
readonly type: 'tool:start';
|
|
85
|
+
readonly toolName: string;
|
|
86
|
+
readonly requestId: string;
|
|
87
|
+
readonly params: Readonly<Record<string, unknown>>;
|
|
88
|
+
readonly timestamp: Date;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Tool execution complete event
|
|
93
|
+
*/
|
|
94
|
+
export interface ToolExecutionCompleteEvent {
|
|
95
|
+
readonly type: 'tool:complete';
|
|
96
|
+
readonly toolName: string;
|
|
97
|
+
readonly requestId: string;
|
|
98
|
+
readonly result: McpToolCallResult;
|
|
99
|
+
readonly durationMs: number;
|
|
100
|
+
readonly timestamp: Date;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Tool execution error event
|
|
105
|
+
*/
|
|
106
|
+
export interface ToolExecutionErrorEvent {
|
|
107
|
+
readonly type: 'tool:error';
|
|
108
|
+
readonly toolName: string;
|
|
109
|
+
readonly requestId: string;
|
|
110
|
+
readonly error: McpError | Error;
|
|
111
|
+
readonly durationMs: number;
|
|
112
|
+
readonly timestamp: Date;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Resource list change event (from server notification)
|
|
117
|
+
*/
|
|
118
|
+
export interface ResourcesChangedEvent {
|
|
119
|
+
readonly type: 'resources:changed';
|
|
120
|
+
readonly resources: readonly McpResource[];
|
|
121
|
+
readonly timestamp: Date;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Resource updated event (from subscription)
|
|
126
|
+
*/
|
|
127
|
+
export interface ResourceUpdatedEvent {
|
|
128
|
+
readonly type: 'resource:updated';
|
|
129
|
+
readonly uri: string;
|
|
130
|
+
readonly timestamp: Date;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Prompt list change event (from server notification)
|
|
135
|
+
*/
|
|
136
|
+
export interface PromptsChangedEvent {
|
|
137
|
+
readonly type: 'prompts:changed';
|
|
138
|
+
readonly prompts: readonly McpPrompt[];
|
|
139
|
+
readonly timestamp: Date;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Server log message event
|
|
144
|
+
*/
|
|
145
|
+
export interface ServerLogEvent {
|
|
146
|
+
readonly type: 'server:log';
|
|
147
|
+
readonly level: 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical' | 'alert' | 'emergency';
|
|
148
|
+
readonly message: string;
|
|
149
|
+
readonly data?: unknown;
|
|
150
|
+
readonly timestamp: Date;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Request start event (for any MCP request)
|
|
155
|
+
*/
|
|
156
|
+
export interface RequestStartEvent {
|
|
157
|
+
readonly type: 'request:start';
|
|
158
|
+
readonly requestId: string;
|
|
159
|
+
readonly method: string;
|
|
160
|
+
readonly timestamp: Date;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Request complete event
|
|
165
|
+
*/
|
|
166
|
+
export interface RequestCompleteEvent {
|
|
167
|
+
readonly type: 'request:complete';
|
|
168
|
+
readonly requestId: string;
|
|
169
|
+
readonly method: string;
|
|
170
|
+
readonly durationMs: number;
|
|
171
|
+
readonly timestamp: Date;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Request error event
|
|
176
|
+
*/
|
|
177
|
+
export interface RequestErrorEvent {
|
|
178
|
+
readonly type: 'request:error';
|
|
179
|
+
readonly requestId: string;
|
|
180
|
+
readonly method: string;
|
|
181
|
+
readonly error: McpError | Error;
|
|
182
|
+
readonly durationMs: number;
|
|
183
|
+
readonly timestamp: Date;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Request cancelled event
|
|
188
|
+
*/
|
|
189
|
+
export interface RequestCancelledEvent {
|
|
190
|
+
readonly type: 'request:cancelled';
|
|
191
|
+
readonly requestId: string;
|
|
192
|
+
readonly method: string;
|
|
193
|
+
readonly durationMs: number;
|
|
194
|
+
readonly timestamp: Date;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Session created event
|
|
199
|
+
*/
|
|
200
|
+
export interface SessionCreatedEvent {
|
|
201
|
+
readonly type: 'session:created';
|
|
202
|
+
readonly sessionId: string;
|
|
203
|
+
readonly timestamp: Date;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Session destroyed event
|
|
208
|
+
*/
|
|
209
|
+
export interface SessionDestroyedEvent {
|
|
210
|
+
readonly type: 'session:destroyed';
|
|
211
|
+
readonly sessionId: string;
|
|
212
|
+
readonly reason: 'timeout' | 'manual' | 'evicted' | 'error' | 'shutdown';
|
|
213
|
+
readonly timestamp: Date;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Union of all MCP events
|
|
218
|
+
*/
|
|
219
|
+
export type McpEvent =
|
|
220
|
+
| ConnectionStateChangeEvent
|
|
221
|
+
| ConnectionEstablishedEvent
|
|
222
|
+
| ConnectionClosedEvent
|
|
223
|
+
| ConnectionErrorEvent
|
|
224
|
+
| ReconnectionAttemptEvent
|
|
225
|
+
| ToolsChangedEvent
|
|
226
|
+
| ToolExecutionStartEvent
|
|
227
|
+
| ToolExecutionCompleteEvent
|
|
228
|
+
| ToolExecutionErrorEvent
|
|
229
|
+
| ResourcesChangedEvent
|
|
230
|
+
| ResourceUpdatedEvent
|
|
231
|
+
| PromptsChangedEvent
|
|
232
|
+
| ServerLogEvent
|
|
233
|
+
| RequestStartEvent
|
|
234
|
+
| RequestCompleteEvent
|
|
235
|
+
| RequestErrorEvent
|
|
236
|
+
| RequestCancelledEvent
|
|
237
|
+
| SessionCreatedEvent
|
|
238
|
+
| SessionDestroyedEvent;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Event type to event mapping for type safety
|
|
242
|
+
*/
|
|
243
|
+
export interface McpEventMap {
|
|
244
|
+
'connection:stateChange': ConnectionStateChangeEvent;
|
|
245
|
+
'connection:established': ConnectionEstablishedEvent;
|
|
246
|
+
'connection:closed': ConnectionClosedEvent;
|
|
247
|
+
'connection:error': ConnectionErrorEvent;
|
|
248
|
+
'connection:reconnecting': ReconnectionAttemptEvent;
|
|
249
|
+
'tools:changed': ToolsChangedEvent;
|
|
250
|
+
'tool:start': ToolExecutionStartEvent;
|
|
251
|
+
'tool:complete': ToolExecutionCompleteEvent;
|
|
252
|
+
'tool:error': ToolExecutionErrorEvent;
|
|
253
|
+
'resources:changed': ResourcesChangedEvent;
|
|
254
|
+
'resource:updated': ResourceUpdatedEvent;
|
|
255
|
+
'prompts:changed': PromptsChangedEvent;
|
|
256
|
+
'server:log': ServerLogEvent;
|
|
257
|
+
'request:start': RequestStartEvent;
|
|
258
|
+
'request:complete': RequestCompleteEvent;
|
|
259
|
+
'request:error': RequestErrorEvent;
|
|
260
|
+
'request:cancelled': RequestCancelledEvent;
|
|
261
|
+
'session:created': SessionCreatedEvent;
|
|
262
|
+
'session:destroyed': SessionDestroyedEvent;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Event type string literal type
|
|
267
|
+
*/
|
|
268
|
+
export type McpEventType = keyof McpEventMap;
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Event listener function type
|
|
272
|
+
*/
|
|
273
|
+
export type McpEventListener<T extends McpEventType> = (event: McpEventMap[T]) => void;
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Wildcard listener that receives all events
|
|
277
|
+
*/
|
|
278
|
+
export type McpWildcardListener = (event: McpEvent) => void;
|
|
279
|
+
|
|
280
|
+
// ============================================================================
|
|
281
|
+
// Event Emitter Class
|
|
282
|
+
// ============================================================================
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Subscription handle for unsubscribing from events
|
|
286
|
+
*/
|
|
287
|
+
export interface EventSubscription {
|
|
288
|
+
/** Unsubscribe from the event */
|
|
289
|
+
unsubscribe(): void;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Typed event emitter for MCP events
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```typescript
|
|
297
|
+
* const emitter = new McpEventEmitter();
|
|
298
|
+
*
|
|
299
|
+
* // Subscribe to specific event
|
|
300
|
+
* const sub = emitter.on('connection:established', (event) => {
|
|
301
|
+
* console.log(`Connected to ${event.serverName}`);
|
|
302
|
+
* });
|
|
303
|
+
*
|
|
304
|
+
* // Subscribe to all events
|
|
305
|
+
* emitter.onAny((event) => {
|
|
306
|
+
* console.log(`Event: ${event.type}`);
|
|
307
|
+
* });
|
|
308
|
+
*
|
|
309
|
+
* // Emit an event
|
|
310
|
+
* emitter.emit({
|
|
311
|
+
* type: 'connection:established',
|
|
312
|
+
* serverName: 'my-server',
|
|
313
|
+
* serverVersion: '1.0.0',
|
|
314
|
+
* timestamp: new Date(),
|
|
315
|
+
* });
|
|
316
|
+
*
|
|
317
|
+
* // Unsubscribe
|
|
318
|
+
* sub.unsubscribe();
|
|
319
|
+
* ```
|
|
320
|
+
*/
|
|
321
|
+
export class McpEventEmitter {
|
|
322
|
+
private readonly _listeners: Map<McpEventType, Set<McpEventListener<McpEventType>>> = new Map();
|
|
323
|
+
private readonly _wildcardListeners: Set<McpWildcardListener> = new Set();
|
|
324
|
+
private readonly _onceListeners: Map<McpEventType, Set<McpEventListener<McpEventType>>> = new Map();
|
|
325
|
+
private _maxListeners = 100;
|
|
326
|
+
private _isPaused = false;
|
|
327
|
+
private _eventQueue: McpEvent[] = [];
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Maximum number of listeners per event type
|
|
331
|
+
*/
|
|
332
|
+
get maxListeners(): number {
|
|
333
|
+
return this._maxListeners;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
set maxListeners(value: number) {
|
|
337
|
+
this._maxListeners = value;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Subscribe to a specific event type
|
|
342
|
+
*
|
|
343
|
+
* @param eventType - Event type to listen for
|
|
344
|
+
* @param listener - Callback function
|
|
345
|
+
* @returns Subscription handle
|
|
346
|
+
*/
|
|
347
|
+
on<T extends McpEventType>(eventType: T, listener: McpEventListener<T>): EventSubscription {
|
|
348
|
+
let listeners = this._listeners.get(eventType);
|
|
349
|
+
if (!listeners) {
|
|
350
|
+
listeners = new Set();
|
|
351
|
+
this._listeners.set(eventType, listeners);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (listeners.size >= this._maxListeners) {
|
|
355
|
+
console.warn(
|
|
356
|
+
`McpEventEmitter: Maximum listeners (${this._maxListeners}) reached for event '${eventType}'`
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
listeners.add(listener as McpEventListener<McpEventType>);
|
|
361
|
+
|
|
362
|
+
return {
|
|
363
|
+
unsubscribe: () => {
|
|
364
|
+
listeners?.delete(listener as McpEventListener<McpEventType>);
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Subscribe to a specific event type for one emission only
|
|
371
|
+
*
|
|
372
|
+
* @param eventType - Event type to listen for
|
|
373
|
+
* @param listener - Callback function
|
|
374
|
+
* @returns Subscription handle
|
|
375
|
+
*/
|
|
376
|
+
once<T extends McpEventType>(eventType: T, listener: McpEventListener<T>): EventSubscription {
|
|
377
|
+
let onceListeners = this._onceListeners.get(eventType);
|
|
378
|
+
if (!onceListeners) {
|
|
379
|
+
onceListeners = new Set();
|
|
380
|
+
this._onceListeners.set(eventType, onceListeners);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
onceListeners.add(listener as McpEventListener<McpEventType>);
|
|
384
|
+
|
|
385
|
+
return {
|
|
386
|
+
unsubscribe: () => {
|
|
387
|
+
onceListeners?.delete(listener as McpEventListener<McpEventType>);
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Subscribe to all events
|
|
394
|
+
*
|
|
395
|
+
* @param listener - Callback function
|
|
396
|
+
* @returns Subscription handle
|
|
397
|
+
*/
|
|
398
|
+
onAny(listener: McpWildcardListener): EventSubscription {
|
|
399
|
+
this._wildcardListeners.add(listener);
|
|
400
|
+
|
|
401
|
+
return {
|
|
402
|
+
unsubscribe: () => {
|
|
403
|
+
this._wildcardListeners.delete(listener);
|
|
404
|
+
},
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Unsubscribe a listener from a specific event type
|
|
410
|
+
*
|
|
411
|
+
* @param eventType - Event type
|
|
412
|
+
* @param listener - Listener to remove
|
|
413
|
+
*/
|
|
414
|
+
off<T extends McpEventType>(eventType: T, listener: McpEventListener<T>): void {
|
|
415
|
+
const listeners = this._listeners.get(eventType);
|
|
416
|
+
listeners?.delete(listener as McpEventListener<McpEventType>);
|
|
417
|
+
|
|
418
|
+
const onceListeners = this._onceListeners.get(eventType);
|
|
419
|
+
onceListeners?.delete(listener as McpEventListener<McpEventType>);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Remove all listeners for a specific event type, or all listeners if no type specified
|
|
424
|
+
*
|
|
425
|
+
* @param eventType - Optional event type
|
|
426
|
+
*/
|
|
427
|
+
removeAllListeners(eventType?: McpEventType): void {
|
|
428
|
+
if (eventType) {
|
|
429
|
+
this._listeners.delete(eventType);
|
|
430
|
+
this._onceListeners.delete(eventType);
|
|
431
|
+
} else {
|
|
432
|
+
this._listeners.clear();
|
|
433
|
+
this._onceListeners.clear();
|
|
434
|
+
this._wildcardListeners.clear();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Emit an event to all listeners
|
|
440
|
+
*
|
|
441
|
+
* @param event - Event to emit
|
|
442
|
+
*/
|
|
443
|
+
emit<T extends McpEvent>(event: T): void {
|
|
444
|
+
if (this._isPaused) {
|
|
445
|
+
this._eventQueue.push(event);
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
this._emitInternal(event);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Internal emit implementation
|
|
454
|
+
*/
|
|
455
|
+
private _emitInternal(event: McpEvent): void {
|
|
456
|
+
const eventType = event.type as McpEventType;
|
|
457
|
+
|
|
458
|
+
// Notify specific listeners
|
|
459
|
+
const listeners = this._listeners.get(eventType);
|
|
460
|
+
if (listeners) {
|
|
461
|
+
for (const listener of listeners) {
|
|
462
|
+
try {
|
|
463
|
+
listener(event as McpEventMap[typeof eventType]);
|
|
464
|
+
} catch (error) {
|
|
465
|
+
console.error(`Error in event listener for '${eventType}':`, error);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Notify once listeners
|
|
471
|
+
const onceListeners = this._onceListeners.get(eventType);
|
|
472
|
+
if (onceListeners && onceListeners.size > 0) {
|
|
473
|
+
const listenersToCall = Array.from(onceListeners);
|
|
474
|
+
onceListeners.clear();
|
|
475
|
+
for (const listener of listenersToCall) {
|
|
476
|
+
try {
|
|
477
|
+
listener(event as McpEventMap[typeof eventType]);
|
|
478
|
+
} catch (error) {
|
|
479
|
+
console.error(`Error in once listener for '${eventType}':`, error);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Notify wildcard listeners
|
|
485
|
+
for (const listener of this._wildcardListeners) {
|
|
486
|
+
try {
|
|
487
|
+
listener(event);
|
|
488
|
+
} catch (error) {
|
|
489
|
+
console.error('Error in wildcard event listener:', error);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Get the count of listeners for a specific event type
|
|
496
|
+
*
|
|
497
|
+
* @param eventType - Event type
|
|
498
|
+
* @returns Number of listeners
|
|
499
|
+
*/
|
|
500
|
+
listenerCount(eventType?: McpEventType): number {
|
|
501
|
+
if (eventType) {
|
|
502
|
+
const listeners = this._listeners.get(eventType);
|
|
503
|
+
const onceListeners = this._onceListeners.get(eventType);
|
|
504
|
+
return (listeners?.size ?? 0) + (onceListeners?.size ?? 0);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
let count = this._wildcardListeners.size;
|
|
508
|
+
for (const listeners of this._listeners.values()) {
|
|
509
|
+
count += listeners.size;
|
|
510
|
+
}
|
|
511
|
+
for (const listeners of this._onceListeners.values()) {
|
|
512
|
+
count += listeners.size;
|
|
513
|
+
}
|
|
514
|
+
return count;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Get all event types that have listeners
|
|
519
|
+
*
|
|
520
|
+
* @returns Array of event types
|
|
521
|
+
*/
|
|
522
|
+
eventTypes(): McpEventType[] {
|
|
523
|
+
const types = new Set<McpEventType>();
|
|
524
|
+
for (const type of this._listeners.keys()) {
|
|
525
|
+
types.add(type);
|
|
526
|
+
}
|
|
527
|
+
for (const type of this._onceListeners.keys()) {
|
|
528
|
+
types.add(type);
|
|
529
|
+
}
|
|
530
|
+
return Array.from(types);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Pause event emission - events will be queued
|
|
535
|
+
*/
|
|
536
|
+
pause(): void {
|
|
537
|
+
this._isPaused = true;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Resume event emission and flush queued events
|
|
542
|
+
*/
|
|
543
|
+
resume(): void {
|
|
544
|
+
this._isPaused = false;
|
|
545
|
+
const queuedEvents = this._eventQueue;
|
|
546
|
+
this._eventQueue = [];
|
|
547
|
+
for (const event of queuedEvents) {
|
|
548
|
+
this._emitInternal(event);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Wait for a specific event type
|
|
554
|
+
*
|
|
555
|
+
* @param eventType - Event type to wait for
|
|
556
|
+
* @param timeoutMs - Optional timeout
|
|
557
|
+
* @returns Promise that resolves with the event
|
|
558
|
+
*/
|
|
559
|
+
waitFor<T extends McpEventType>(
|
|
560
|
+
eventType: T,
|
|
561
|
+
timeoutMs?: number
|
|
562
|
+
): Promise<McpEventMap[T]> {
|
|
563
|
+
return new Promise((resolve, reject) => {
|
|
564
|
+
let timeoutHandle: ReturnType<typeof setTimeout> | undefined;
|
|
565
|
+
|
|
566
|
+
const subscription = this.once(eventType, (event) => {
|
|
567
|
+
if (timeoutHandle) {
|
|
568
|
+
clearTimeout(timeoutHandle);
|
|
569
|
+
}
|
|
570
|
+
resolve(event);
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
if (timeoutMs !== undefined) {
|
|
574
|
+
timeoutHandle = setTimeout(() => {
|
|
575
|
+
subscription.unsubscribe();
|
|
576
|
+
reject(new Error(`Timeout waiting for event '${eventType}' after ${timeoutMs}ms`));
|
|
577
|
+
}, timeoutMs);
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
// ============================================================================
|
|
584
|
+
// Helper Functions
|
|
585
|
+
// ============================================================================
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* Create a new event emitter instance
|
|
589
|
+
*/
|
|
590
|
+
export function createEventEmitter(): McpEventEmitter {
|
|
591
|
+
return new McpEventEmitter();
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Create a timestamp for event creation
|
|
596
|
+
*/
|
|
597
|
+
export function createEventTimestamp(): Date {
|
|
598
|
+
return new Date();
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Type guard for connection events
|
|
603
|
+
*/
|
|
604
|
+
export function isConnectionEvent(event: McpEvent): event is
|
|
605
|
+
| ConnectionStateChangeEvent
|
|
606
|
+
| ConnectionEstablishedEvent
|
|
607
|
+
| ConnectionClosedEvent
|
|
608
|
+
| ConnectionErrorEvent
|
|
609
|
+
| ReconnectionAttemptEvent {
|
|
610
|
+
return event.type.startsWith('connection:');
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Type guard for tool events
|
|
615
|
+
*/
|
|
616
|
+
export function isToolEvent(event: McpEvent): event is
|
|
617
|
+
| ToolsChangedEvent
|
|
618
|
+
| ToolExecutionStartEvent
|
|
619
|
+
| ToolExecutionCompleteEvent
|
|
620
|
+
| ToolExecutionErrorEvent {
|
|
621
|
+
return event.type.startsWith('tool:') || event.type === 'tools:changed';
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Type guard for resource events
|
|
626
|
+
*/
|
|
627
|
+
export function isResourceEvent(event: McpEvent): event is
|
|
628
|
+
| ResourcesChangedEvent
|
|
629
|
+
| ResourceUpdatedEvent {
|
|
630
|
+
return event.type.startsWith('resource:') || event.type === 'resources:changed';
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* Type guard for request events
|
|
635
|
+
*/
|
|
636
|
+
export function isRequestEvent(event: McpEvent): event is
|
|
637
|
+
| RequestStartEvent
|
|
638
|
+
| RequestCompleteEvent
|
|
639
|
+
| RequestErrorEvent
|
|
640
|
+
| RequestCancelledEvent {
|
|
641
|
+
return event.type.startsWith('request:');
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Type guard for session events
|
|
646
|
+
*/
|
|
647
|
+
export function isSessionEvent(event: McpEvent): event is
|
|
648
|
+
| SessionCreatedEvent
|
|
649
|
+
| SessionDestroyedEvent {
|
|
650
|
+
return event.type.startsWith('session:');
|
|
651
|
+
}
|