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,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playground Component Types
|
|
3
|
+
* @copyright 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Transport type for MCP connections
|
|
9
|
+
*/
|
|
10
|
+
export type TransportType = 'stdio' | 'sse' | 'streamable-http';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for stdio transport
|
|
14
|
+
*/
|
|
15
|
+
export interface StdioTransportConfig {
|
|
16
|
+
type: 'stdio';
|
|
17
|
+
command: string;
|
|
18
|
+
args?: string[];
|
|
19
|
+
env?: Record<string, string>;
|
|
20
|
+
generatedCode?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Configuration for SSE transport
|
|
25
|
+
*/
|
|
26
|
+
export interface SseTransportConfig {
|
|
27
|
+
type: 'sse';
|
|
28
|
+
url: string;
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Configuration for streamable HTTP transport
|
|
34
|
+
*/
|
|
35
|
+
export interface StreamableHttpTransportConfig {
|
|
36
|
+
type: 'streamable-http';
|
|
37
|
+
url: string;
|
|
38
|
+
headers?: Record<string, string>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Union type for all transport configurations
|
|
43
|
+
*/
|
|
44
|
+
export type TransportConfig =
|
|
45
|
+
| StdioTransportConfig
|
|
46
|
+
| SseTransportConfig
|
|
47
|
+
| StreamableHttpTransportConfig;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* MCP server capabilities
|
|
51
|
+
*/
|
|
52
|
+
export interface McpCapabilities {
|
|
53
|
+
tools?: boolean | { listChanged?: boolean };
|
|
54
|
+
resources?: boolean | { subscribe?: boolean; listChanged?: boolean };
|
|
55
|
+
prompts?: boolean | { listChanged?: boolean };
|
|
56
|
+
logging?: boolean;
|
|
57
|
+
sampling?: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* MCP server information
|
|
62
|
+
*/
|
|
63
|
+
export interface ServerInfo {
|
|
64
|
+
name: string;
|
|
65
|
+
version: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* JSON Schema type for tool input
|
|
70
|
+
*/
|
|
71
|
+
export interface JsonSchema {
|
|
72
|
+
type: string;
|
|
73
|
+
properties?: Record<string, JsonSchemaProperty>;
|
|
74
|
+
required?: string[];
|
|
75
|
+
description?: string;
|
|
76
|
+
additionalProperties?: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* JSON Schema property definition
|
|
81
|
+
*/
|
|
82
|
+
export interface JsonSchemaProperty {
|
|
83
|
+
type: string;
|
|
84
|
+
description?: string;
|
|
85
|
+
default?: unknown;
|
|
86
|
+
enum?: string[];
|
|
87
|
+
items?: JsonSchemaProperty;
|
|
88
|
+
properties?: Record<string, JsonSchemaProperty>;
|
|
89
|
+
required?: string[];
|
|
90
|
+
minimum?: number;
|
|
91
|
+
maximum?: number;
|
|
92
|
+
minLength?: number;
|
|
93
|
+
maxLength?: number;
|
|
94
|
+
pattern?: string;
|
|
95
|
+
format?: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* MCP Tool definition
|
|
100
|
+
*/
|
|
101
|
+
export interface McpTool {
|
|
102
|
+
name: string;
|
|
103
|
+
description?: string;
|
|
104
|
+
inputSchema?: JsonSchema;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* MCP Resource definition
|
|
109
|
+
*/
|
|
110
|
+
export interface McpResource {
|
|
111
|
+
uri: string;
|
|
112
|
+
name?: string;
|
|
113
|
+
description?: string;
|
|
114
|
+
mimeType?: string;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Resource contents from reading
|
|
119
|
+
*/
|
|
120
|
+
export interface ResourceContents {
|
|
121
|
+
uri: string;
|
|
122
|
+
mimeType?: string;
|
|
123
|
+
text?: string;
|
|
124
|
+
blob?: string;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* MCP Prompt definition
|
|
129
|
+
*/
|
|
130
|
+
export interface McpPrompt {
|
|
131
|
+
name: string;
|
|
132
|
+
description?: string;
|
|
133
|
+
arguments?: PromptArgument[];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Prompt argument definition
|
|
138
|
+
*/
|
|
139
|
+
export interface PromptArgument {
|
|
140
|
+
name: string;
|
|
141
|
+
description?: string;
|
|
142
|
+
required?: boolean;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Prompt message from execution
|
|
147
|
+
*/
|
|
148
|
+
export interface PromptMessage {
|
|
149
|
+
role: 'user' | 'assistant' | 'system';
|
|
150
|
+
content: TextContent | ImageContent | ResourceContent;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Text content in prompt message
|
|
155
|
+
*/
|
|
156
|
+
export interface TextContent {
|
|
157
|
+
type: 'text';
|
|
158
|
+
text: string;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Image content in prompt message
|
|
163
|
+
*/
|
|
164
|
+
export interface ImageContent {
|
|
165
|
+
type: 'image';
|
|
166
|
+
data: string;
|
|
167
|
+
mimeType: string;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Resource content in prompt message
|
|
172
|
+
*/
|
|
173
|
+
export interface ResourceContent {
|
|
174
|
+
type: 'resource';
|
|
175
|
+
resource: {
|
|
176
|
+
uri: string;
|
|
177
|
+
mimeType?: string;
|
|
178
|
+
text?: string;
|
|
179
|
+
blob?: string;
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Log entry for execution logs
|
|
185
|
+
*/
|
|
186
|
+
export interface LogEntry {
|
|
187
|
+
id: string;
|
|
188
|
+
timestamp: Date;
|
|
189
|
+
type: 'info' | 'request' | 'response' | 'error' | 'stdout' | 'stderr' | 'success';
|
|
190
|
+
message: string;
|
|
191
|
+
data?: unknown;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Connection status type
|
|
196
|
+
*/
|
|
197
|
+
export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Capability tab type
|
|
201
|
+
*/
|
|
202
|
+
export type CapabilityTab = 'tools' | 'resources' | 'prompts';
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Progress Component - Real-time conversion progress via SSE
|
|
3
|
+
* @copyright 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use client';
|
|
8
|
+
|
|
9
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
10
|
+
import { motion, AnimatePresence } from 'framer-motion';
|
|
11
|
+
import {
|
|
12
|
+
Github,
|
|
13
|
+
Code2,
|
|
14
|
+
Package,
|
|
15
|
+
Terminal,
|
|
16
|
+
Check,
|
|
17
|
+
Loader2,
|
|
18
|
+
AlertCircle,
|
|
19
|
+
Wifi,
|
|
20
|
+
WifiOff,
|
|
21
|
+
Play,
|
|
22
|
+
Pause,
|
|
23
|
+
X,
|
|
24
|
+
RefreshCw,
|
|
25
|
+
Zap,
|
|
26
|
+
FileJson,
|
|
27
|
+
Database,
|
|
28
|
+
Search,
|
|
29
|
+
} from 'lucide-react';
|
|
30
|
+
import type {
|
|
31
|
+
StreamingEvent,
|
|
32
|
+
StreamingProgressData,
|
|
33
|
+
StreamingToolData,
|
|
34
|
+
StreamingStatus,
|
|
35
|
+
Tool,
|
|
36
|
+
ConversionResult,
|
|
37
|
+
} from '@/types';
|
|
38
|
+
|
|
39
|
+
interface StreamingProgressProps {
|
|
40
|
+
url: string;
|
|
41
|
+
onComplete: (result: ConversionResult) => void;
|
|
42
|
+
onError: (error: string) => void;
|
|
43
|
+
onCancel?: () => void;
|
|
44
|
+
autoStart?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const STEP_ICONS: Record<string, typeof Github> = {
|
|
48
|
+
'fetch': Github,
|
|
49
|
+
'clone': Github,
|
|
50
|
+
'analyze': Search,
|
|
51
|
+
'parse': Code2,
|
|
52
|
+
'extract': Package,
|
|
53
|
+
'generate': Terminal,
|
|
54
|
+
'openapi': FileJson,
|
|
55
|
+
'graphql': Database,
|
|
56
|
+
'readme': FileJson,
|
|
57
|
+
'code': Code2,
|
|
58
|
+
'complete': Check,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const STEP_COLORS: Record<string, string> = {
|
|
62
|
+
'fetch': 'from-blue-500/20 to-blue-600/10',
|
|
63
|
+
'clone': 'from-blue-500/20 to-blue-600/10',
|
|
64
|
+
'analyze': 'from-purple-500/20 to-purple-600/10',
|
|
65
|
+
'parse': 'from-green-500/20 to-green-600/10',
|
|
66
|
+
'extract': 'from-orange-500/20 to-orange-600/10',
|
|
67
|
+
'generate': 'from-pink-500/20 to-pink-600/10',
|
|
68
|
+
'complete': 'from-emerald-500/20 to-emerald-600/10',
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export default function StreamingProgress({
|
|
72
|
+
url,
|
|
73
|
+
onComplete,
|
|
74
|
+
onError,
|
|
75
|
+
onCancel,
|
|
76
|
+
autoStart = true,
|
|
77
|
+
}: StreamingProgressProps) {
|
|
78
|
+
const [status, setStatus] = useState<StreamingStatus>('idle');
|
|
79
|
+
const [currentProgress, setCurrentProgress] = useState<StreamingProgressData | null>(null);
|
|
80
|
+
const [discoveredTools, setDiscoveredTools] = useState<Tool[]>([]);
|
|
81
|
+
const [logs, setLogs] = useState<Array<{ message: string; timestamp: string; type: 'info' | 'tool' | 'error' }>>([]);
|
|
82
|
+
const [overallProgress, setOverallProgress] = useState(0);
|
|
83
|
+
const [elapsedTime, setElapsedTime] = useState(0);
|
|
84
|
+
const [isPaused, setIsPaused] = useState(false);
|
|
85
|
+
|
|
86
|
+
const eventSourceRef = useRef<EventSource | null>(null);
|
|
87
|
+
const startTimeRef = useRef<number | null>(null);
|
|
88
|
+
const timerRef = useRef<NodeJS.Timeout | null>(null);
|
|
89
|
+
|
|
90
|
+
// Elapsed time timer
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (status === 'streaming' && !isPaused) {
|
|
93
|
+
startTimeRef.current = startTimeRef.current || Date.now();
|
|
94
|
+
timerRef.current = setInterval(() => {
|
|
95
|
+
if (startTimeRef.current) {
|
|
96
|
+
setElapsedTime(Math.floor((Date.now() - startTimeRef.current) / 1000));
|
|
97
|
+
}
|
|
98
|
+
}, 100);
|
|
99
|
+
} else {
|
|
100
|
+
if (timerRef.current) {
|
|
101
|
+
clearInterval(timerRef.current);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return () => {
|
|
106
|
+
if (timerRef.current) {
|
|
107
|
+
clearInterval(timerRef.current);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}, [status, isPaused]);
|
|
111
|
+
|
|
112
|
+
const addLog = useCallback((message: string, type: 'info' | 'tool' | 'error' = 'info') => {
|
|
113
|
+
setLogs(prev => [...prev, {
|
|
114
|
+
message,
|
|
115
|
+
timestamp: new Date().toISOString(),
|
|
116
|
+
type,
|
|
117
|
+
}].slice(-50)); // Keep last 50 logs
|
|
118
|
+
}, []);
|
|
119
|
+
|
|
120
|
+
const startStreaming = useCallback(() => {
|
|
121
|
+
if (eventSourceRef.current) {
|
|
122
|
+
eventSourceRef.current.close();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
setStatus('connecting');
|
|
126
|
+
setDiscoveredTools([]);
|
|
127
|
+
setLogs([]);
|
|
128
|
+
setOverallProgress(0);
|
|
129
|
+
setElapsedTime(0);
|
|
130
|
+
startTimeRef.current = null;
|
|
131
|
+
addLog('Connecting to conversion stream...');
|
|
132
|
+
|
|
133
|
+
const encodedUrl = encodeURIComponent(url);
|
|
134
|
+
const eventSource = new EventSource(`/api/stream?url=${encodedUrl}`);
|
|
135
|
+
eventSourceRef.current = eventSource;
|
|
136
|
+
|
|
137
|
+
eventSource.onopen = () => {
|
|
138
|
+
setStatus('streaming');
|
|
139
|
+
addLog('Connected. Starting conversion...');
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
eventSource.onmessage = (event) => {
|
|
143
|
+
try {
|
|
144
|
+
const data: StreamingEvent = JSON.parse(event.data);
|
|
145
|
+
|
|
146
|
+
switch (data.type) {
|
|
147
|
+
case 'progress': {
|
|
148
|
+
const progressData = data.data as StreamingProgressData;
|
|
149
|
+
setCurrentProgress(progressData);
|
|
150
|
+
setOverallProgress(progressData.progress);
|
|
151
|
+
addLog(`${progressData.step}: ${progressData.description}`);
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
case 'tool': {
|
|
156
|
+
const toolData = data.data as StreamingToolData;
|
|
157
|
+
setDiscoveredTools(prev => [...prev, toolData.tool]);
|
|
158
|
+
setOverallProgress(Math.min(90, 50 + (toolData.index / toolData.total) * 40));
|
|
159
|
+
addLog(`Discovered tool: ${toolData.tool.name}`, 'tool');
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
case 'complete': {
|
|
164
|
+
const completeData = data.data as { result: ConversionResult; totalTime: number };
|
|
165
|
+
setStatus('complete');
|
|
166
|
+
setOverallProgress(100);
|
|
167
|
+
addLog(`Conversion complete! Found ${completeData.result.tools.length} tools in ${(completeData.totalTime / 1000).toFixed(1)}s`);
|
|
168
|
+
eventSource.close();
|
|
169
|
+
onComplete(completeData.result);
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
case 'error': {
|
|
174
|
+
const errorData = data.data as { error: string; code: string };
|
|
175
|
+
setStatus('error');
|
|
176
|
+
addLog(`Error: ${errorData.error}`, 'error');
|
|
177
|
+
eventSource.close();
|
|
178
|
+
onError(errorData.error);
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
} catch (err) {
|
|
183
|
+
console.error('Failed to parse streaming event:', err);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
eventSource.onerror = () => {
|
|
188
|
+
if (status !== 'complete' && status !== 'error') {
|
|
189
|
+
setStatus('error');
|
|
190
|
+
addLog('Connection lost. Please try again.', 'error');
|
|
191
|
+
eventSource.close();
|
|
192
|
+
onError('Connection to server lost');
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
}, [url, onComplete, onError, addLog, status]);
|
|
196
|
+
|
|
197
|
+
const stopStreaming = useCallback(() => {
|
|
198
|
+
if (eventSourceRef.current) {
|
|
199
|
+
eventSourceRef.current.close();
|
|
200
|
+
eventSourceRef.current = null;
|
|
201
|
+
}
|
|
202
|
+
setStatus('idle');
|
|
203
|
+
addLog('Conversion cancelled');
|
|
204
|
+
onCancel?.();
|
|
205
|
+
}, [onCancel, addLog]);
|
|
206
|
+
|
|
207
|
+
const togglePause = useCallback(() => {
|
|
208
|
+
setIsPaused(prev => !prev);
|
|
209
|
+
// Note: True pause would require server-side support
|
|
210
|
+
// This just pauses the UI timer
|
|
211
|
+
}, []);
|
|
212
|
+
|
|
213
|
+
// Auto-start if configured
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
if (autoStart && status === 'idle' && url) {
|
|
216
|
+
startStreaming();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return () => {
|
|
220
|
+
if (eventSourceRef.current) {
|
|
221
|
+
eventSourceRef.current.close();
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}, [autoStart, url]); // Intentionally not including startStreaming to prevent loops
|
|
225
|
+
|
|
226
|
+
const formatTime = (seconds: number): string => {
|
|
227
|
+
const mins = Math.floor(seconds / 60);
|
|
228
|
+
const secs = seconds % 60;
|
|
229
|
+
return mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const getStatusIcon = () => {
|
|
233
|
+
switch (status) {
|
|
234
|
+
case 'connecting':
|
|
235
|
+
return <Wifi className="w-5 h-5 text-blue-400 animate-pulse" />;
|
|
236
|
+
case 'streaming':
|
|
237
|
+
return <Zap className="w-5 h-5 text-green-400 animate-pulse" />;
|
|
238
|
+
case 'complete':
|
|
239
|
+
return <Check className="w-5 h-5 text-green-400" />;
|
|
240
|
+
case 'error':
|
|
241
|
+
return <WifiOff className="w-5 h-5 text-red-400" />;
|
|
242
|
+
default:
|
|
243
|
+
return <Loader2 className="w-5 h-5 text-neutral-400" />;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const StepIcon = currentProgress?.step ? (STEP_ICONS[currentProgress.step] || Code2) : Code2;
|
|
248
|
+
const stepColor = currentProgress?.step ? (STEP_COLORS[currentProgress.step] || 'from-neutral-500/20 to-neutral-600/10') : 'from-neutral-500/20 to-neutral-600/10';
|
|
249
|
+
|
|
250
|
+
return (
|
|
251
|
+
<div className="space-y-6">
|
|
252
|
+
{/* Main progress card */}
|
|
253
|
+
<motion.div
|
|
254
|
+
initial={{ opacity: 0, y: 20 }}
|
|
255
|
+
animate={{ opacity: 1, y: 0 }}
|
|
256
|
+
className="rounded-2xl border border-neutral-800 bg-neutral-900/50 backdrop-blur-xl overflow-hidden"
|
|
257
|
+
>
|
|
258
|
+
{/* Header */}
|
|
259
|
+
<div className={`p-6 bg-gradient-to-br ${stepColor}`}>
|
|
260
|
+
<div className="flex items-center justify-between mb-4">
|
|
261
|
+
<div className="flex items-center gap-3">
|
|
262
|
+
{getStatusIcon()}
|
|
263
|
+
<div>
|
|
264
|
+
<h3 className="text-lg font-semibold text-white">
|
|
265
|
+
{status === 'connecting' && 'Connecting...'}
|
|
266
|
+
{status === 'streaming' && 'Converting Repository'}
|
|
267
|
+
{status === 'complete' && 'Conversion Complete'}
|
|
268
|
+
{status === 'error' && 'Conversion Failed'}
|
|
269
|
+
{status === 'idle' && 'Ready to Convert'}
|
|
270
|
+
</h3>
|
|
271
|
+
<p className="text-sm text-neutral-400">
|
|
272
|
+
{status === 'streaming' && `Elapsed: ${formatTime(elapsedTime)}`}
|
|
273
|
+
{status === 'complete' && `Completed in ${formatTime(elapsedTime)}`}
|
|
274
|
+
{status === 'idle' && 'Click start to begin'}
|
|
275
|
+
</p>
|
|
276
|
+
</div>
|
|
277
|
+
</div>
|
|
278
|
+
|
|
279
|
+
<div className="flex items-center gap-2">
|
|
280
|
+
{status === 'streaming' && (
|
|
281
|
+
<>
|
|
282
|
+
<button
|
|
283
|
+
onClick={togglePause}
|
|
284
|
+
className="p-2 rounded-lg bg-white/10 hover:bg-white/20 transition-colors"
|
|
285
|
+
title={isPaused ? 'Resume' : 'Pause'}
|
|
286
|
+
>
|
|
287
|
+
{isPaused ? <Play className="w-4 h-4" /> : <Pause className="w-4 h-4" />}
|
|
288
|
+
</button>
|
|
289
|
+
<button
|
|
290
|
+
onClick={stopStreaming}
|
|
291
|
+
className="p-2 rounded-lg bg-white/10 hover:bg-red-500/20 transition-colors"
|
|
292
|
+
title="Cancel"
|
|
293
|
+
>
|
|
294
|
+
<X className="w-4 h-4" />
|
|
295
|
+
</button>
|
|
296
|
+
</>
|
|
297
|
+
)}
|
|
298
|
+
{(status === 'error' || status === 'idle') && (
|
|
299
|
+
<button
|
|
300
|
+
onClick={startStreaming}
|
|
301
|
+
className="flex items-center gap-2 px-4 py-2 bg-white text-black rounded-lg font-medium hover:bg-neutral-200 transition-colors"
|
|
302
|
+
>
|
|
303
|
+
<RefreshCw className="w-4 h-4" />
|
|
304
|
+
{status === 'error' ? 'Retry' : 'Start'}
|
|
305
|
+
</button>
|
|
306
|
+
)}
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
|
|
310
|
+
{/* Progress bar */}
|
|
311
|
+
<div className="relative h-2 bg-black/30 rounded-full overflow-hidden">
|
|
312
|
+
<motion.div
|
|
313
|
+
className="absolute inset-y-0 left-0 bg-white rounded-full"
|
|
314
|
+
initial={{ width: 0 }}
|
|
315
|
+
animate={{ width: `${overallProgress}%` }}
|
|
316
|
+
transition={{ duration: 0.3, ease: 'easeOut' }}
|
|
317
|
+
/>
|
|
318
|
+
{status === 'streaming' && (
|
|
319
|
+
<motion.div
|
|
320
|
+
className="absolute inset-y-0 w-20 bg-gradient-to-r from-transparent via-white/30 to-transparent"
|
|
321
|
+
animate={{ x: ['-100%', '500%'] }}
|
|
322
|
+
transition={{ duration: 1.5, repeat: Infinity, ease: 'linear' }}
|
|
323
|
+
/>
|
|
324
|
+
)}
|
|
325
|
+
</div>
|
|
326
|
+
<div className="flex justify-between mt-2 text-xs text-neutral-400">
|
|
327
|
+
<span>{currentProgress?.description || 'Waiting...'}</span>
|
|
328
|
+
<span>{Math.round(overallProgress)}%</span>
|
|
329
|
+
</div>
|
|
330
|
+
</div>
|
|
331
|
+
|
|
332
|
+
{/* Current step detail */}
|
|
333
|
+
{currentProgress && status === 'streaming' && (
|
|
334
|
+
<div className="p-4 border-t border-neutral-800">
|
|
335
|
+
<div className="flex items-center gap-4">
|
|
336
|
+
<motion.div
|
|
337
|
+
animate={{ rotate: 360 }}
|
|
338
|
+
transition={{ duration: 2, repeat: Infinity, ease: 'linear' }}
|
|
339
|
+
className="w-12 h-12 rounded-xl bg-white/5 border border-neutral-700 flex items-center justify-center"
|
|
340
|
+
>
|
|
341
|
+
<StepIcon className="w-6 h-6 text-white" />
|
|
342
|
+
</motion.div>
|
|
343
|
+
<div className="flex-1">
|
|
344
|
+
<div className="font-medium text-white capitalize">{currentProgress.step}</div>
|
|
345
|
+
<div className="text-sm text-neutral-400">{currentProgress.description}</div>
|
|
346
|
+
{currentProgress.details && (
|
|
347
|
+
<div className="text-xs text-neutral-500 mt-1 font-mono">{currentProgress.details}</div>
|
|
348
|
+
)}
|
|
349
|
+
</div>
|
|
350
|
+
</div>
|
|
351
|
+
</div>
|
|
352
|
+
)}
|
|
353
|
+
</motion.div>
|
|
354
|
+
|
|
355
|
+
{/* Discovered tools */}
|
|
356
|
+
<AnimatePresence>
|
|
357
|
+
{discoveredTools.length > 0 && (
|
|
358
|
+
<motion.div
|
|
359
|
+
initial={{ opacity: 0, height: 0 }}
|
|
360
|
+
animate={{ opacity: 1, height: 'auto' }}
|
|
361
|
+
exit={{ opacity: 0, height: 0 }}
|
|
362
|
+
className="rounded-xl border border-neutral-800 bg-neutral-900/50 backdrop-blur-xl overflow-hidden"
|
|
363
|
+
>
|
|
364
|
+
<div className="p-4 border-b border-neutral-800">
|
|
365
|
+
<div className="flex items-center justify-between">
|
|
366
|
+
<div className="flex items-center gap-2">
|
|
367
|
+
<Package className="w-4 h-4 text-green-400" />
|
|
368
|
+
<span className="font-medium text-white">Discovered Tools</span>
|
|
369
|
+
</div>
|
|
370
|
+
<span className="text-sm text-neutral-400">{discoveredTools.length} found</span>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
<div className="max-h-60 overflow-y-auto">
|
|
374
|
+
<div className="p-2 space-y-1">
|
|
375
|
+
{discoveredTools.map((tool, index) => (
|
|
376
|
+
<motion.div
|
|
377
|
+
key={`${tool.name}-${index}`}
|
|
378
|
+
initial={{ opacity: 0, x: -20 }}
|
|
379
|
+
animate={{ opacity: 1, x: 0 }}
|
|
380
|
+
transition={{ delay: index * 0.05 }}
|
|
381
|
+
className="flex items-center gap-3 p-2 rounded-lg hover:bg-white/5 transition-colors"
|
|
382
|
+
>
|
|
383
|
+
<div className="w-6 h-6 rounded bg-white/10 flex items-center justify-center">
|
|
384
|
+
<Check className="w-3 h-3 text-green-400" />
|
|
385
|
+
</div>
|
|
386
|
+
<div className="flex-1 min-w-0">
|
|
387
|
+
<div className="font-mono text-sm text-white truncate">{tool.name}</div>
|
|
388
|
+
<div className="text-xs text-neutral-500 truncate">{tool.description}</div>
|
|
389
|
+
</div>
|
|
390
|
+
<span className="text-xs text-neutral-600 px-1.5 py-0.5 bg-white/5 rounded">
|
|
391
|
+
{tool.source?.type || 'unknown'}
|
|
392
|
+
</span>
|
|
393
|
+
</motion.div>
|
|
394
|
+
))}
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
</motion.div>
|
|
398
|
+
)}
|
|
399
|
+
</AnimatePresence>
|
|
400
|
+
|
|
401
|
+
{/* Live logs */}
|
|
402
|
+
<motion.div
|
|
403
|
+
initial={{ opacity: 0 }}
|
|
404
|
+
animate={{ opacity: 1 }}
|
|
405
|
+
transition={{ delay: 0.2 }}
|
|
406
|
+
className="rounded-xl border border-neutral-800 bg-black/50 overflow-hidden"
|
|
407
|
+
>
|
|
408
|
+
<div className="flex items-center justify-between p-3 border-b border-neutral-800">
|
|
409
|
+
<div className="flex items-center gap-2">
|
|
410
|
+
<Terminal className="w-4 h-4 text-neutral-500" />
|
|
411
|
+
<span className="text-sm font-medium text-neutral-400">Live Log</span>
|
|
412
|
+
</div>
|
|
413
|
+
<div className="flex items-center gap-1">
|
|
414
|
+
<span className="w-2 h-2 rounded-full bg-green-500 animate-pulse" />
|
|
415
|
+
<span className="text-xs text-neutral-500">Live</span>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
<div className="h-40 overflow-y-auto font-mono text-xs p-3 space-y-1 scrollbar-thin">
|
|
419
|
+
{logs.map((log, index) => (
|
|
420
|
+
<div
|
|
421
|
+
key={index}
|
|
422
|
+
className={`flex gap-2 ${
|
|
423
|
+
log.type === 'error' ? 'text-red-400' :
|
|
424
|
+
log.type === 'tool' ? 'text-green-400' :
|
|
425
|
+
'text-neutral-500'
|
|
426
|
+
}`}
|
|
427
|
+
>
|
|
428
|
+
<span className="text-neutral-600 flex-shrink-0">
|
|
429
|
+
{new Date(log.timestamp).toLocaleTimeString()}
|
|
430
|
+
</span>
|
|
431
|
+
<span>{log.message}</span>
|
|
432
|
+
</div>
|
|
433
|
+
))}
|
|
434
|
+
{logs.length === 0 && (
|
|
435
|
+
<div className="text-neutral-600">Waiting for events...</div>
|
|
436
|
+
)}
|
|
437
|
+
</div>
|
|
438
|
+
</motion.div>
|
|
439
|
+
</div>
|
|
440
|
+
);
|
|
441
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Badge Component
|
|
3
|
+
* @copyright 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
9
|
+
import { cn } from '@/lib/utils';
|
|
10
|
+
|
|
11
|
+
const badgeVariants = cva(
|
|
12
|
+
'inline-flex items-center rounded-full px-2.5 py-1 text-xs font-medium transition-colors',
|
|
13
|
+
{
|
|
14
|
+
variants: {
|
|
15
|
+
variant: {
|
|
16
|
+
default: 'bg-white/10 text-white border border-neutral-700',
|
|
17
|
+
secondary: 'bg-white/5 text-neutral-400 border border-neutral-800',
|
|
18
|
+
success: 'bg-green-500/20 text-green-300 border border-green-500/30',
|
|
19
|
+
warning: 'bg-amber-500/20 text-amber-300 border border-amber-500/30',
|
|
20
|
+
destructive: 'bg-red-500/20 text-red-300 border border-red-500/30',
|
|
21
|
+
blue: 'bg-blue-500/20 text-blue-300 border border-blue-500/30',
|
|
22
|
+
purple: 'bg-purple-500/20 text-purple-300 border border-purple-500/30',
|
|
23
|
+
outline: 'bg-transparent border border-neutral-700 text-neutral-400',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
defaultVariants: {
|
|
27
|
+
variant: 'default',
|
|
28
|
+
},
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export interface BadgeProps
|
|
33
|
+
extends React.HTMLAttributes<HTMLDivElement>,
|
|
34
|
+
VariantProps<typeof badgeVariants> {}
|
|
35
|
+
|
|
36
|
+
function Badge({ className, variant, ...props }: BadgeProps) {
|
|
37
|
+
return (
|
|
38
|
+
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { Badge, badgeVariants };
|