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.
Files changed (388) hide show
  1. package/.env.example +8 -0
  2. package/.github/CODEOWNERS +6 -0
  3. package/.husky/pre-commit +1 -0
  4. package/.nvmrc +1 -0
  5. package/.prettierignore +5 -0
  6. package/.prettierrc +7 -0
  7. package/.vscode/settings.json +4 -0
  8. package/ARCHITECTURE.md +1429 -0
  9. package/CHANGELOG.md +167 -0
  10. package/CONTRIBUTING.md +327 -0
  11. package/LICENSE +201 -0
  12. package/README.md +1028 -0
  13. package/SECURITY.md +248 -0
  14. package/VISUAL_GUIDE.md +437 -0
  15. package/apps/vscode/IMPLEMENTATION.md +480 -0
  16. package/apps/vscode/README.md +248 -0
  17. package/apps/vscode/package.json +381 -0
  18. package/apps/vscode/resources/icon.png +0 -0
  19. package/apps/vscode/resources/icon.svg +5 -0
  20. package/apps/vscode/src/commands/browseRegistry.ts +211 -0
  21. package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
  22. package/apps/vscode/src/commands/convert.ts +82 -0
  23. package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
  24. package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
  25. package/apps/vscode/src/commands/index.ts +121 -0
  26. package/apps/vscode/src/commands/validate.ts +197 -0
  27. package/apps/vscode/src/extension.ts +464 -0
  28. package/apps/vscode/src/global.d.ts +36 -0
  29. package/apps/vscode/src/test/extension.test.ts +73 -0
  30. package/apps/vscode/src/utils/file-generator.ts +529 -0
  31. package/apps/vscode/src/utils/github-api.ts +335 -0
  32. package/apps/vscode/src/utils/index.ts +29 -0
  33. package/apps/vscode/src/utils/mcp-config.ts +334 -0
  34. package/apps/vscode/src/utils/storage.ts +87 -0
  35. package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
  36. package/apps/vscode/src/views/OutputChannelView.ts +195 -0
  37. package/apps/vscode/src/views/StatusBarItem.ts +251 -0
  38. package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
  39. package/apps/vscode/src/views/historyProvider.ts +75 -0
  40. package/apps/vscode/src/views/index.ts +12 -0
  41. package/apps/vscode/src/views/resultsPanel.ts +330 -0
  42. package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
  43. package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
  44. package/apps/vscode/src/webviews/index.ts +9 -0
  45. package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
  46. package/apps/vscode/tsconfig.json +20 -0
  47. package/apps/web/PLAYGROUND_GUIDE.md +499 -0
  48. package/apps/web/README.md +505 -0
  49. package/apps/web/app/api/convert/route.ts +100 -0
  50. package/apps/web/app/api/convert/stream/route.ts +198 -0
  51. package/apps/web/app/api/deploy/route.ts +157 -0
  52. package/apps/web/app/api/edge/route.ts +308 -0
  53. package/apps/web/app/api/export-docker/route.ts +284 -0
  54. package/apps/web/app/api/generate-openapi/route.ts +119 -0
  55. package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
  56. package/apps/web/app/api/playground/connect/route.ts +143 -0
  57. package/apps/web/app/api/playground/disconnect/route.ts +78 -0
  58. package/apps/web/app/api/playground/execute/route.ts +135 -0
  59. package/apps/web/app/api/playground/sessions/route.ts +103 -0
  60. package/apps/web/app/api/playground/tools/route.ts +117 -0
  61. package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
  62. package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
  63. package/apps/web/app/api/playground/v2/health/route.ts +80 -0
  64. package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
  65. package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
  66. package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
  67. package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
  68. package/apps/web/app/api/stream/route.ts +232 -0
  69. package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
  70. package/apps/web/app/batch/page.tsx +37 -0
  71. package/apps/web/app/convert/page.tsx +269 -0
  72. package/apps/web/app/dashboard/page.tsx +380 -0
  73. package/apps/web/app/globals.css +622 -0
  74. package/apps/web/app/layout.tsx +120 -0
  75. package/apps/web/app/manifest.ts +31 -0
  76. package/apps/web/app/opengraph-image.tsx +112 -0
  77. package/apps/web/app/page.old.tsx +924 -0
  78. package/apps/web/app/page.tsx +77 -0
  79. package/apps/web/app/playground/page.tsx +306 -0
  80. package/apps/web/app/playground/v2/error.tsx +163 -0
  81. package/apps/web/app/playground/v2/layout.tsx +58 -0
  82. package/apps/web/app/playground/v2/loading.tsx +152 -0
  83. package/apps/web/app/playground/v2/page.tsx +644 -0
  84. package/apps/web/app/playground/v2/providers.tsx +214 -0
  85. package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
  86. package/apps/web/app/playground/v2/use-url-state.ts +296 -0
  87. package/apps/web/app/providers.tsx +22 -0
  88. package/apps/web/app/sitemap.ts +32 -0
  89. package/apps/web/app/twitter-image.tsx +112 -0
  90. package/apps/web/components/BranchSelector.tsx +401 -0
  91. package/apps/web/components/ClaudeConfigExport.tsx +226 -0
  92. package/apps/web/components/Features.tsx +84 -0
  93. package/apps/web/components/Footer.tsx +119 -0
  94. package/apps/web/components/GenerationProgress.tsx +248 -0
  95. package/apps/web/components/GithubUrlInput.tsx +483 -0
  96. package/apps/web/components/Header.tsx +175 -0
  97. package/apps/web/components/Hero.tsx +117 -0
  98. package/apps/web/components/HowItWorks.tsx +119 -0
  99. package/apps/web/components/InstallBanner.tsx +158 -0
  100. package/apps/web/components/Logo.tsx +116 -0
  101. package/apps/web/components/ParticleBackground.tsx +105 -0
  102. package/apps/web/components/Playground.tsx +472 -0
  103. package/apps/web/components/PlaygroundToolTester.tsx +410 -0
  104. package/apps/web/components/ProductCards.tsx +179 -0
  105. package/apps/web/components/SplitView.tsx +194 -0
  106. package/apps/web/components/ToolFilter.tsx +260 -0
  107. package/apps/web/components/ToolList.tsx +325 -0
  108. package/apps/web/components/batch/BatchConvert.tsx +785 -0
  109. package/apps/web/components/batch/index.ts +7 -0
  110. package/apps/web/components/convert/ConfigTabs.tsx +230 -0
  111. package/apps/web/components/convert/ConversionResult.tsx +482 -0
  112. package/apps/web/components/convert/InlinePlayground.tsx +259 -0
  113. package/apps/web/components/convert/LoadingSteps.tsx +311 -0
  114. package/apps/web/components/convert/OneClickInstall.tsx +224 -0
  115. package/apps/web/components/convert/ToolCard.tsx +189 -0
  116. package/apps/web/components/convert/TryInPlayground.tsx +242 -0
  117. package/apps/web/components/convert/index.ts +12 -0
  118. package/apps/web/components/deploy/DeployButton.tsx +369 -0
  119. package/apps/web/components/deploy/index.ts +7 -0
  120. package/apps/web/components/docker/DockerExport.tsx +690 -0
  121. package/apps/web/components/docker/index.ts +7 -0
  122. package/apps/web/components/install/OneClickInstall.tsx +676 -0
  123. package/apps/web/components/install/index.ts +7 -0
  124. package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
  125. package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
  126. package/apps/web/components/playground/EmptyStates.tsx +305 -0
  127. package/apps/web/components/playground/ExecutionLog.tsx +260 -0
  128. package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
  129. package/apps/web/components/playground/JsonViewer.tsx +388 -0
  130. package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
  131. package/apps/web/components/playground/PromptsPanel.tsx +385 -0
  132. package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
  133. package/apps/web/components/playground/SchemaForm.tsx +477 -0
  134. package/apps/web/components/playground/ServerStatus.tsx +151 -0
  135. package/apps/web/components/playground/ShareButton.tsx +239 -0
  136. package/apps/web/components/playground/ToolsPanel.tsx +309 -0
  137. package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
  138. package/apps/web/components/playground/index.ts +74 -0
  139. package/apps/web/components/playground/types.ts +202 -0
  140. package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
  141. package/apps/web/components/streaming/index.ts +7 -0
  142. package/apps/web/components/ui/badge.tsx +42 -0
  143. package/apps/web/components/ui/button.tsx +88 -0
  144. package/apps/web/components/ui/card.tsx +75 -0
  145. package/apps/web/components/ui/code-block.tsx +122 -0
  146. package/apps/web/components/ui/index.ts +12 -0
  147. package/apps/web/components/ui/input.tsx +55 -0
  148. package/apps/web/components/ui/tabs.tsx +61 -0
  149. package/apps/web/hooks/index.ts +85 -0
  150. package/apps/web/hooks/types.ts +1173 -0
  151. package/apps/web/hooks/use-conversion.ts +133 -0
  152. package/apps/web/hooks/use-execution-history.ts +376 -0
  153. package/apps/web/hooks/use-generation-progress.ts +147 -0
  154. package/apps/web/hooks/use-local-storage.ts +88 -0
  155. package/apps/web/hooks/use-mcp-client.ts +623 -0
  156. package/apps/web/hooks/use-mcp-connection.ts +500 -0
  157. package/apps/web/hooks/use-mcp-execution.ts +282 -0
  158. package/apps/web/hooks/use-mcp-prompts.ts +441 -0
  159. package/apps/web/hooks/use-mcp-resources.ts +430 -0
  160. package/apps/web/hooks/use-mcp-tools.ts +540 -0
  161. package/apps/web/hooks/use-playground-store.ts +299 -0
  162. package/apps/web/hooks/use-playground.ts +184 -0
  163. package/apps/web/hooks/use-streaming-conversion.ts +227 -0
  164. package/apps/web/hooks/useBatchConversion.ts +271 -0
  165. package/apps/web/hooks/useDockerConfig.ts +161 -0
  166. package/apps/web/hooks/usePlatformDetection.ts +80 -0
  167. package/apps/web/hooks/useStreaming.ts +199 -0
  168. package/apps/web/lib/api/errors.ts +386 -0
  169. package/apps/web/lib/api/index.ts +137 -0
  170. package/apps/web/lib/api/logger.ts +187 -0
  171. package/apps/web/lib/api/middleware.ts +364 -0
  172. package/apps/web/lib/api/openapi.ts +977 -0
  173. package/apps/web/lib/api/session-manager.ts +594 -0
  174. package/apps/web/lib/api/types.ts +433 -0
  175. package/apps/web/lib/api/validation.ts +523 -0
  176. package/apps/web/lib/constants.ts +114 -0
  177. package/apps/web/lib/mcp/client.ts +1137 -0
  178. package/apps/web/lib/mcp/events.ts +651 -0
  179. package/apps/web/lib/mcp/index.ts +347 -0
  180. package/apps/web/lib/mcp/logger.ts +428 -0
  181. package/apps/web/lib/mcp/metrics.ts +703 -0
  182. package/apps/web/lib/mcp/retry.ts +616 -0
  183. package/apps/web/lib/mcp/session-manager.ts +779 -0
  184. package/apps/web/lib/mcp/transports.ts +988 -0
  185. package/apps/web/lib/mcp/types.ts +594 -0
  186. package/apps/web/lib/mcp-client-enhanced.ts +871 -0
  187. package/apps/web/lib/mcp-client.ts +778 -0
  188. package/apps/web/lib/mcp-errors.ts +489 -0
  189. package/apps/web/lib/mcp-sandbox.ts +593 -0
  190. package/apps/web/lib/mcp-testing.ts +428 -0
  191. package/apps/web/lib/mcp-types.ts +448 -0
  192. package/apps/web/lib/playground-store.tsx +1147 -0
  193. package/apps/web/lib/utils.ts +439 -0
  194. package/apps/web/next-env.d.ts +5 -0
  195. package/apps/web/next.config.js +23 -0
  196. package/apps/web/package.json +55 -0
  197. package/apps/web/postcss.config.js +6 -0
  198. package/apps/web/public/.well-known/ai-plugin.json +17 -0
  199. package/apps/web/public/logo.svg +6 -0
  200. package/apps/web/public/robots.txt +22 -0
  201. package/apps/web/public/schema.json +27 -0
  202. package/apps/web/tailwind.config.js +26 -0
  203. package/apps/web/tailwind.config.ts +123 -0
  204. package/apps/web/tsconfig.json +20 -0
  205. package/apps/web/types/deploy.ts +139 -0
  206. package/apps/web/types/index.ts +247 -0
  207. package/apps/web/vercel.json +39 -0
  208. package/eslint.config.mjs +23 -0
  209. package/llms.txt +102 -0
  210. package/mkdocs/docs/api/core.md +318 -0
  211. package/mkdocs/docs/api/index.md +128 -0
  212. package/mkdocs/docs/api/mcp-server.md +301 -0
  213. package/mkdocs/docs/api/openapi-parser.md +254 -0
  214. package/mkdocs/docs/assets/logo.svg +7 -0
  215. package/mkdocs/docs/changelog.md +118 -0
  216. package/mkdocs/docs/cli/generate.md +148 -0
  217. package/mkdocs/docs/cli/index.md +52 -0
  218. package/mkdocs/docs/cli/inspect.md +164 -0
  219. package/mkdocs/docs/cli/serve.md +136 -0
  220. package/mkdocs/docs/concepts/classification.md +254 -0
  221. package/mkdocs/docs/concepts/how-it-works.md +299 -0
  222. package/mkdocs/docs/concepts/index.md +77 -0
  223. package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
  224. package/mkdocs/docs/concepts/tool-types.md +382 -0
  225. package/mkdocs/docs/contributing/architecture.md +262 -0
  226. package/mkdocs/docs/contributing/development.md +245 -0
  227. package/mkdocs/docs/contributing/index.md +73 -0
  228. package/mkdocs/docs/contributing/testing.md +320 -0
  229. package/mkdocs/docs/getting-started/configuration.md +235 -0
  230. package/mkdocs/docs/getting-started/index.md +54 -0
  231. package/mkdocs/docs/getting-started/installation.md +145 -0
  232. package/mkdocs/docs/getting-started/quickstart.md +160 -0
  233. package/mkdocs/docs/guides/batch.md +375 -0
  234. package/mkdocs/docs/guides/claude-desktop.md +227 -0
  235. package/mkdocs/docs/guides/cursor.md +188 -0
  236. package/mkdocs/docs/guides/custom-tools.md +367 -0
  237. package/mkdocs/docs/guides/index.md +78 -0
  238. package/mkdocs/docs/guides/private-repos.md +221 -0
  239. package/mkdocs/docs/guides/vscode.md +247 -0
  240. package/mkdocs/docs/index.md +175 -0
  241. package/mkdocs/docs/reference/config.md +223 -0
  242. package/mkdocs/docs/reference/env.md +192 -0
  243. package/mkdocs/docs/reference/index.md +102 -0
  244. package/mkdocs/docs/reference/tools.md +309 -0
  245. package/mkdocs/docs/stylesheets/extra.css +231 -0
  246. package/mkdocs/mkdocs.yml +204 -0
  247. package/mkdocs/overrides/.gitkeep +1 -0
  248. package/mkdocs/overrides/main.html +7 -0
  249. package/mkdocs/python-deps.txt +7 -0
  250. package/mkdocs/vercel.json +11 -0
  251. package/package.json +63 -0
  252. package/packages/core/package.json +61 -0
  253. package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
  254. package/packages/core/src/__tests__/cli.test.ts +235 -0
  255. package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
  256. package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
  257. package/packages/core/src/__tests__/github-client.test.ts +390 -0
  258. package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
  259. package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
  260. package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
  261. package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
  262. package/packages/core/src/__tests__/plugins.test.ts +467 -0
  263. package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
  264. package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
  265. package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
  266. package/packages/core/src/__tests__/streaming.test.ts +251 -0
  267. package/packages/core/src/additional-extractors.ts +333 -0
  268. package/packages/core/src/cache/cache-interface.ts +179 -0
  269. package/packages/core/src/cache/index.ts +210 -0
  270. package/packages/core/src/cache/redis-cache.ts +291 -0
  271. package/packages/core/src/cache/upstash-cache.ts +379 -0
  272. package/packages/core/src/cache.ts +251 -0
  273. package/packages/core/src/cli.ts +822 -0
  274. package/packages/core/src/code-extractor.ts +696 -0
  275. package/packages/core/src/docker-generator.ts +470 -0
  276. package/packages/core/src/edge-compatible.ts +491 -0
  277. package/packages/core/src/extractors/go-extractor.ts +791 -0
  278. package/packages/core/src/extractors/index.ts +9 -0
  279. package/packages/core/src/extractors/java-extractor.ts +937 -0
  280. package/packages/core/src/extractors/rust-extractor.ts +744 -0
  281. package/packages/core/src/github-client.ts +319 -0
  282. package/packages/core/src/go-generator.ts +356 -0
  283. package/packages/core/src/graphql-extractor.ts +358 -0
  284. package/packages/core/src/index.ts +797 -0
  285. package/packages/core/src/langchain-exporter.ts +617 -0
  286. package/packages/core/src/language-parsers.ts +1114 -0
  287. package/packages/core/src/mcp-introspector.ts +279 -0
  288. package/packages/core/src/monorepo-detector.ts +378 -0
  289. package/packages/core/src/plugins/index.ts +370 -0
  290. package/packages/core/src/plugins/registry.ts +404 -0
  291. package/packages/core/src/plugins/types.ts +215 -0
  292. package/packages/core/src/providers/base-provider.ts +246 -0
  293. package/packages/core/src/providers/bitbucket-client.ts +464 -0
  294. package/packages/core/src/providers/gitlab-client.ts +388 -0
  295. package/packages/core/src/providers/index.ts +176 -0
  296. package/packages/core/src/python-generator.ts +260 -0
  297. package/packages/core/src/queue/index.ts +100 -0
  298. package/packages/core/src/queue/memory-queue.ts +445 -0
  299. package/packages/core/src/queue/redis-queue.ts +578 -0
  300. package/packages/core/src/queue/types.ts +251 -0
  301. package/packages/core/src/readme-extractor.ts +409 -0
  302. package/packages/core/src/schema-generator.ts +638 -0
  303. package/packages/core/src/streaming.ts +999 -0
  304. package/packages/core/src/types.ts +289 -0
  305. package/packages/core/tsconfig.json +9 -0
  306. package/packages/core/tsup.config.ts +25 -0
  307. package/packages/mcp-server/README.md +297 -0
  308. package/packages/mcp-server/package.json +55 -0
  309. package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
  310. package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
  311. package/packages/mcp-server/src/index.ts +1206 -0
  312. package/packages/mcp-server/src/prompts/index.ts +601 -0
  313. package/packages/mcp-server/src/tools/export-docker.ts +362 -0
  314. package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
  315. package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
  316. package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
  317. package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
  318. package/packages/mcp-server/tsconfig.json +12 -0
  319. package/packages/mcp-server/tsup.config.ts +14 -0
  320. package/packages/openapi-parser/package-lock.json +3028 -0
  321. package/packages/openapi-parser/package.json +41 -0
  322. package/packages/openapi-parser/src/analyzer.ts +700 -0
  323. package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
  324. package/packages/openapi-parser/src/cli.ts +302 -0
  325. package/packages/openapi-parser/src/generator.ts +570 -0
  326. package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
  327. package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
  328. package/packages/openapi-parser/src/generators/index.ts +200 -0
  329. package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
  330. package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
  331. package/packages/openapi-parser/src/generators/types.ts +298 -0
  332. package/packages/openapi-parser/src/graphql-parser.ts +462 -0
  333. package/packages/openapi-parser/src/grpc-parser.ts +649 -0
  334. package/packages/openapi-parser/src/har-parser.ts +723 -0
  335. package/packages/openapi-parser/src/index.ts +635 -0
  336. package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
  337. package/packages/openapi-parser/src/parser.ts +231 -0
  338. package/packages/openapi-parser/src/postman-parser.ts +611 -0
  339. package/packages/openapi-parser/src/ref-resolver.ts +313 -0
  340. package/packages/openapi-parser/src/transformer.ts +459 -0
  341. package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
  342. package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
  343. package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
  344. package/packages/openapi-parser/tests/parsers.test.ts +847 -0
  345. package/packages/openapi-parser/tsconfig.json +9 -0
  346. package/packages/openapi-parser/tsup.config.ts +11 -0
  347. package/packages/registry/package.json +59 -0
  348. package/packages/registry/src/cli.ts +456 -0
  349. package/packages/registry/src/index.ts +44 -0
  350. package/packages/registry/src/popular/github.json +47 -0
  351. package/packages/registry/src/popular/index.ts +55 -0
  352. package/packages/registry/src/popular/linear.json +42 -0
  353. package/packages/registry/src/popular/notion.json +42 -0
  354. package/packages/registry/src/popular/openai.json +40 -0
  355. package/packages/registry/src/popular/resend.json +38 -0
  356. package/packages/registry/src/popular/slack.json +42 -0
  357. package/packages/registry/src/popular/stripe.json +163 -0
  358. package/packages/registry/src/popular/supabase.json +42 -0
  359. package/packages/registry/src/popular/twilio.json +40 -0
  360. package/packages/registry/src/popular/vercel.json +40 -0
  361. package/packages/registry/src/registry.ts +492 -0
  362. package/packages/registry/src/storage.ts +334 -0
  363. package/packages/registry/src/types.ts +275 -0
  364. package/packages/registry/src/updater.ts +208 -0
  365. package/packages/registry/tsconfig.json +10 -0
  366. package/packages/registry/tsup.config.ts +11 -0
  367. package/pnpm-workspace.yaml +3 -0
  368. package/scripts/build-docs.sh +16 -0
  369. package/server.json +9 -0
  370. package/templates/Dockerfile.python.template +60 -0
  371. package/templates/Dockerfile.typescript.template +60 -0
  372. package/templates/docker-compose.template.yml +68 -0
  373. package/tests/fixtures/express-app/index.js +34 -0
  374. package/tests/fixtures/express-app/routes/posts.js +43 -0
  375. package/tests/fixtures/express-app/routes/users.js +58 -0
  376. package/tests/fixtures/fastapi-app/main.py +125 -0
  377. package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
  378. package/tests/fixtures/graphql/simple-schema.graphql +65 -0
  379. package/tests/fixtures/mocks/github-api-responses.json +63 -0
  380. package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
  381. package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
  382. package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
  383. package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
  384. package/tests/fixtures/openapi/petstore.yaml +179 -0
  385. package/tests/integration/langchain-export.test.ts +405 -0
  386. package/tests/integration/openapi-conversion.test.ts +221 -0
  387. package/tsconfig.json +18 -0
  388. 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,7 @@
1
+ /**
2
+ * Streaming components barrel export
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ export { default as StreamingProgress } from './StreamingProgress';
@@ -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 };