dev3000 0.0.157 → 0.0.159
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/README.md +3 -1
- package/dist/cdp-monitor.d.ts +2 -3
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +5 -11
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.js +182 -161
- package/dist/cli.js.map +1 -1
- package/dist/commands/cloud-check-pr.js +2 -1
- package/dist/commands/cloud-check-pr.js.map +1 -1
- package/dist/commands/cloud-fix.d.ts +1 -2
- package/dist/commands/cloud-fix.d.ts.map +1 -1
- package/dist/commands/cloud-fix.js +49 -685
- package/dist/commands/cloud-fix.js.map +1 -1
- package/dist/components/PackageSelector.d.ts +3 -2
- package/dist/components/PackageSelector.d.ts.map +1 -1
- package/dist/components/PackageSelector.js +9 -4
- package/dist/components/PackageSelector.js.map +1 -1
- package/dist/dev-environment.d.ts +9 -40
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +241 -544
- package/dist/dev-environment.js.map +1 -1
- package/dist/skills/d3k/SKILL.md +35 -2
- package/dist/src/tui-interface-impl.tsx +2 -12
- package/dist/tui-interface-impl.d.ts +0 -1
- package/dist/tui-interface-impl.d.ts.map +1 -1
- package/dist/tui-interface-impl.js +3 -7
- package/dist/tui-interface-impl.js.map +1 -1
- package/dist/tui-interface-opentui.d.ts +0 -1
- package/dist/tui-interface-opentui.d.ts.map +1 -1
- package/dist/tui-interface-opentui.js +26 -10
- package/dist/tui-interface-opentui.js.map +1 -1
- package/dist/tui-interface.d.ts +0 -1
- package/dist/tui-interface.d.ts.map +1 -1
- package/dist/tui-interface.js.map +1 -1
- package/dist/utils/agent-browser.d.ts.map +1 -1
- package/dist/utils/agent-browser.js +18 -13
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/agent-selection.d.ts +1 -0
- package/dist/utils/agent-selection.d.ts.map +1 -1
- package/dist/utils/agent-selection.js +26 -1
- package/dist/utils/agent-selection.js.map +1 -1
- package/dist/utils/d3k-dir.d.ts +3 -0
- package/dist/utils/d3k-dir.d.ts.map +1 -0
- package/dist/utils/d3k-dir.js +12 -0
- package/dist/utils/d3k-dir.js.map +1 -0
- package/dist/utils/skill-installer.d.ts +7 -7
- package/dist/utils/skill-installer.d.ts.map +1 -1
- package/dist/utils/skill-installer.js +131 -18
- package/dist/utils/skill-installer.js.map +1 -1
- package/dist/utils/user-config.d.ts +0 -1
- package/dist/utils/user-config.d.ts.map +1 -1
- package/dist/utils/user-config.js +0 -13
- package/dist/utils/user-config.js.map +1 -1
- package/package.json +9 -29
- package/src/tui-interface-impl.tsx +2 -12
- package/dist/commands/cloud-fix-workflow.d.ts +0 -16
- package/dist/commands/cloud-fix-workflow.d.ts.map +0 -1
- package/dist/commands/cloud-fix-workflow.js +0 -153
- package/dist/commands/cloud-fix-workflow.js.map +0 -1
- package/dist/commands/restart.d.ts +0 -8
- package/dist/commands/restart.d.ts.map +0 -1
- package/dist/commands/restart.js +0 -92
- package/dist/commands/restart.js.map +0 -1
- package/dist/utils/mcp-configs.d.ts +0 -6
- package/dist/utils/mcp-configs.d.ts.map +0 -1
- package/dist/utils/mcp-configs.js +0 -54
- package/dist/utils/mcp-configs.js.map +0 -1
- package/mcp-server/.next/BUILD_ID +0 -1
- package/mcp-server/.next/app-path-routes-manifest.json +0 -22
- package/mcp-server/.next/build/chunks/[root-of-the-server]__25374c4f._.js +0 -500
- package/mcp-server/.next/build/chunks/[root-of-the-server]__25374c4f._.js.map +0 -11
- package/mcp-server/.next/build/chunks/[root-of-the-server]__6e020478._.js +0 -441
- package/mcp-server/.next/build/chunks/[root-of-the-server]__6e020478._.js.map +0 -7
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js +0 -205
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js.map +0 -8
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c7ae8543._.js +0 -500
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c7ae8543._.js.map +0 -11
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_7988927e._.js +0 -13
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_7988927e._.js.map +0 -5
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_webpack-loaders_ts_1efa112f._.js +0 -12
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_webpack-loaders_ts_1efa112f._.js.map +0 -5
- package/mcp-server/.next/build/chunks/[turbopack]_runtime.js +0 -795
- package/mcp-server/.next/build/chunks/[turbopack]_runtime.js.map +0 -10
- package/mcp-server/.next/build/chunks/node_modules__bun_19755e4f._.js +0 -6758
- package/mcp-server/.next/build/chunks/node_modules__bun_19755e4f._.js.map +0 -47
- package/mcp-server/.next/build/package.json +0 -1
- package/mcp-server/.next/build/postcss.js +0 -6
- package/mcp-server/.next/build/postcss.js.map +0 -5
- package/mcp-server/.next/build/webpack-loaders.js +0 -6
- package/mcp-server/.next/build/webpack-loaders.js.map +0 -5
- package/mcp-server/.next/build-manifest.json +0 -20
- package/mcp-server/.next/export-marker.json +0 -6
- package/mcp-server/.next/fallback-build-manifest.json +0 -12
- package/mcp-server/.next/images-manifest.json +0 -66
- package/mcp-server/.next/next-minimal-server.js.nft.json +0 -1
- package/mcp-server/.next/next-server.js.nft.json +0 -1
- package/mcp-server/.next/package.json +0 -1
- package/mcp-server/.next/prerender-manifest.json +0 -85
- package/mcp-server/.next/required-server-files.js +0 -164
- package/mcp-server/.next/required-server-files.json +0 -164
- package/mcp-server/.next/routes-manifest.json +0 -171
- package/mcp-server/.next/server/app/_global-error/page/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +0 -17
- package/mcp-server/.next/server/app/_global-error/page/next-font-manifest.json +0 -6
- package/mcp-server/.next/server/app/_global-error/page/react-loadable-manifest.json +0 -1
- package/mcp-server/.next/server/app/_global-error/page/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/_global-error/page.js +0 -10
- package/mcp-server/.next/server/app/_global-error/page.js.map +0 -5
- package/mcp-server/.next/server/app/_global-error/page.js.nft.json +0 -1
- package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/_global-error.html +0 -2
- package/mcp-server/.next/server/app/_global-error.meta +0 -15
- package/mcp-server/.next/server/app/_global-error.rsc +0 -12
- package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +0 -5
- package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +0 -12
- package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +0 -5
- package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +0 -4
- package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +0 -1
- package/mcp-server/.next/server/app/_not-found/page/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +0 -17
- package/mcp-server/.next/server/app/_not-found/page/next-font-manifest.json +0 -6
- package/mcp-server/.next/server/app/_not-found/page/react-loadable-manifest.json +0 -1
- package/mcp-server/.next/server/app/_not-found/page/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/_not-found/page.js +0 -13
- package/mcp-server/.next/server/app/_not-found/page.js.map +0 -5
- package/mcp-server/.next/server/app/_not-found/page.js.nft.json +0 -1
- package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/_not-found.html +0 -1
- package/mcp-server/.next/server/app/_not-found.meta +0 -16
- package/mcp-server/.next/server/app/_not-found.rsc +0 -14
- package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +0 -14
- package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +0 -5
- package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +0 -6
- package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
- package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -4
- package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
- package/mcp-server/.next/server/app/api/jank/[session]/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/jank/[session]/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/jank/[session]/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/jank/[session]/route.js +0 -10
- package/mcp-server/.next/server/app/api/jank/[session]/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/jank/[session]/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/logs/append/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/logs/append/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/logs/append/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/logs/append/route.js +0 -6
- package/mcp-server/.next/server/app/api/logs/append/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/logs/append/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/logs/head/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/logs/head/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/logs/head/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/logs/head/route.js +0 -6
- package/mcp-server/.next/server/app/api/logs/head/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/logs/head/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/logs/list/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/logs/list/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/logs/list/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/logs/list/route.js +0 -6
- package/mcp-server/.next/server/app/api/logs/list/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/logs/list/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/logs/rotate/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/logs/rotate/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/logs/rotate/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/logs/rotate/route.js +0 -8
- package/mcp-server/.next/server/app/api/logs/rotate/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/logs/rotate/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/logs/stream/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/logs/stream/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/logs/stream/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/logs/stream/route.js +0 -6
- package/mcp-server/.next/server/app/api/logs/stream/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/logs/stream/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/logs/tail/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/logs/tail/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/logs/tail/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/logs/tail/route.js +0 -6
- package/mcp-server/.next/server/app/api/logs/tail/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/logs/tail/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/orchestrator/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/orchestrator/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/orchestrator/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/orchestrator/route.js +0 -9
- package/mcp-server/.next/server/app/api/orchestrator/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/orchestrator/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/orchestrator/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +0 -8
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/screenshots/capture/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/screenshots/capture/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/screenshots/capture/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js +0 -9
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/screenshots/capture/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/screenshots/clear/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/screenshots/clear/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/screenshots/clear/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/screenshots/clear/route.js +0 -8
- package/mcp-server/.next/server/app/api/screenshots/clear/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/screenshots/clear/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/screenshots/clear/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/screenshots/list/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/screenshots/list/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/screenshots/list/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/screenshots/list/route.js +0 -8
- package/mcp-server/.next/server/app/api/screenshots/list/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/screenshots/list/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/screenshots/list/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/teams/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/teams/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/teams/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/teams/route.js +0 -8
- package/mcp-server/.next/server/app/api/teams/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/teams/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/teams/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/api/tools/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/api/tools/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/api/tools/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/api/tools/route.js +0 -8
- package/mcp-server/.next/server/app/api/tools/route.js.map +0 -5
- package/mcp-server/.next/server/app/api/tools/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/api/tools/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/index.html +0 -1
- package/mcp-server/.next/server/app/index.meta +0 -14
- package/mcp-server/.next/server/app/index.rsc +0 -18
- package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -9
- package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +0 -18
- package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +0 -5
- package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +0 -6
- package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +0 -2
- package/mcp-server/.next/server/app/logs/page/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/logs/page/build-manifest.json +0 -17
- package/mcp-server/.next/server/app/logs/page/next-font-manifest.json +0 -6
- package/mcp-server/.next/server/app/logs/page/react-loadable-manifest.json +0 -1
- package/mcp-server/.next/server/app/logs/page/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/logs/page.js +0 -16
- package/mcp-server/.next/server/app/logs/page.js.map +0 -5
- package/mcp-server/.next/server/app/logs/page.js.nft.json +0 -1
- package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/mcp/route/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/mcp/route/build-manifest.json +0 -11
- package/mcp-server/.next/server/app/mcp/route/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/mcp/route.js +0 -11
- package/mcp-server/.next/server/app/mcp/route.js.map +0 -5
- package/mcp-server/.next/server/app/mcp/route.js.nft.json +0 -1
- package/mcp-server/.next/server/app/mcp/route_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/page/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/page/build-manifest.json +0 -17
- package/mcp-server/.next/server/app/page/next-font-manifest.json +0 -6
- package/mcp-server/.next/server/app/page/react-loadable-manifest.json +0 -1
- package/mcp-server/.next/server/app/page/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/page.js +0 -15
- package/mcp-server/.next/server/app/page.js.map +0 -5
- package/mcp-server/.next/server/app/page.js.nft.json +0 -1
- package/mcp-server/.next/server/app/page_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app/video/[session]/page/app-paths-manifest.json +0 -3
- package/mcp-server/.next/server/app/video/[session]/page/build-manifest.json +0 -17
- package/mcp-server/.next/server/app/video/[session]/page/next-font-manifest.json +0 -6
- package/mcp-server/.next/server/app/video/[session]/page/react-loadable-manifest.json +0 -1
- package/mcp-server/.next/server/app/video/[session]/page/server-reference-manifest.json +0 -4
- package/mcp-server/.next/server/app/video/[session]/page.js +0 -15
- package/mcp-server/.next/server/app/video/[session]/page.js.map +0 -5
- package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +0 -1
- package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +0 -2
- package/mcp-server/.next/server/app-paths-manifest.json +0 -22
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_[filename]_route_actions_4f8d6e37.js +0 -3
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_[filename]_route_actions_4f8d6e37.js.map +0 -1
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_capture_route_actions_4034f26c.js +0 -3
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_capture_route_actions_4034f26c.js.map +0 -1
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_clear_route_actions_e26206f4.js +0 -3
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_clear_route_actions_e26206f4.js.map +0 -1
- package/mcp-server/.next/server/chunks/[externals]__0e1fd2ca._.js +0 -3
- package/mcp-server/.next/server/chunks/[externals]__0e1fd2ca._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[externals]_next_dist_2a398dc7._.js +0 -3
- package/mcp-server/.next/server/chunks/[externals]_next_dist_2a398dc7._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[externals]_node:crypto_c20cce38._.js +0 -3
- package/mcp-server/.next/server/chunks/[externals]_node:crypto_c20cce38._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__1dca9894._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__1dca9894._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__21541e6b._.js +0 -11
- package/mcp-server/.next/server/chunks/[root-of-the-server]__21541e6b._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js +0 -17
- package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__377f76d7._.js +0 -7
- package/mcp-server/.next/server/chunks/[root-of-the-server]__377f76d7._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__454b0d3c._.js +0 -7
- package/mcp-server/.next/server/chunks/[root-of-the-server]__454b0d3c._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__69e6dfb7._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__69e6dfb7._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6baff21e._.js +0 -4
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6baff21e._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__7049acd5._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__7049acd5._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__73c9cc46._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__73c9cc46._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__78991125._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__78991125._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__7ae828c6._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__7ae828c6._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__94946101._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__94946101._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__99274dd8._.js +0 -4
- package/mcp-server/.next/server/chunks/[root-of-the-server]__99274dd8._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__9c4c7095._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__9c4c7095._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b56464d6._.js +0 -7
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b56464d6._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b698502d._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b698502d._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b86e20b6._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b86e20b6._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c8cf5b23._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c8cf5b23._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e6a83e60._.js +0 -4
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e6a83e60._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ee139f8a._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ee139f8a._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[turbopack]_runtime.js +0 -795
- package/mcp-server/.next/server/chunks/[turbopack]_runtime.js.map +0 -10
- package/mcp-server/.next/server/chunks/edd96_next_80752ad3._.js +0 -3
- package/mcp-server/.next/server/chunks/edd96_next_80752ad3._.js.map +0 -1
- package/mcp-server/.next/server/chunks/edd96_next_dist_esm_build_templates_app-route_f51c5640.js +0 -3
- package/mcp-server/.next/server/chunks/edd96_next_dist_esm_build_templates_app-route_f51c5640.js.map +0 -1
- package/mcp-server/.next/server/chunks/edd96_next_dist_fa47e982._.js +0 -6
- package/mcp-server/.next/server/chunks/edd96_next_dist_fa47e982._.js.map +0 -1
- package/mcp-server/.next/server/chunks/edd96_next_ef93dda6._.js +0 -14
- package/mcp-server/.next/server/chunks/edd96_next_ef93dda6._.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server_70405c2f._.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server_70405c2f._.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_jank_[session]_route_actions_3b2b275b.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_jank_[session]_route_actions_3b2b275b.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_append_route_actions_bc66060f.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_append_route_actions_bc66060f.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_head_route_actions_1152480c.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_head_route_actions_1152480c.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_list_route_actions_b9e24400.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_list_route_actions_b9e24400.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_rotate_route_actions_76075d08.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_rotate_route_actions_76075d08.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_stream_route_actions_16e5c553.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_stream_route_actions_16e5c553.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_tail_route_actions_55440150.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_logs_tail_route_actions_55440150.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_orchestrator_route_actions_c6fba9ec.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_orchestrator_route_actions_c6fba9ec.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_screenshots_list_route_actions_acfa57bd.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_screenshots_list_route_actions_acfa57bd.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_teams_route_actions_aaa1c876.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_teams_route_actions_aaa1c876.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_tools_route_actions_007f3c7c.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_tools_route_actions_007f3c7c.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_mcp_route_actions_7f7b5be4.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_mcp_route_actions_7f7b5be4.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js +0 -185
- package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js.map +0 -1
- package/mcp-server/.next/server/chunks/mcp-server_instrumentation_node_ts_32271e34._.js +0 -3
- package/mcp-server/.next/server/chunks/mcp-server_instrumentation_node_ts_32271e34._.js.map +0 -1
- package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js +0 -3
- package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js.map +0 -1
- package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js +0 -3
- package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__250a4cf3._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__250a4cf3._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__41e244ae._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__41e244ae._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__4a45fb1f._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__4a45fb1f._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__4feaccaf._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__4feaccaf._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__6d9fa861._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__6d9fa861._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9913ce94._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9913ce94._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9923da5e._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9923da5e._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__a8fcf205._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__a8fcf205._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b17d4048._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b17d4048._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__dcf84f77._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__dcf84f77._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__df4ed844._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__df4ed844._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[turbopack]_runtime.js +0 -795
- package/mcp-server/.next/server/chunks/ssr/[turbopack]_runtime.js.map +0 -10
- package/mcp-server/.next/server/chunks/ssr/_213c874b._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/_213c874b._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_69be9abe._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/_69be9abe._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_b38781f1._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/_b38781f1._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_edba94b0._.js +0 -8
- package/mcp-server/.next/server/chunks/ssr/_edba94b0._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_f478416d._.js +0 -8
- package/mcp-server/.next/server/chunks/ssr/_f478416d._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_22d4e869._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_22d4e869._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_329c4a9b._.js +0 -10
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_329c4a9b._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_6cceb2cd._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_6cceb2cd._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_861297ac._.js +0 -6
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_861297ac._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_85c7e922._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_85c7e922._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_forbidden_0eb1cacd.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_forbidden_0eb1cacd.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_global-error_e64e654b.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_global-error_e64e654b.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_unauthorized_06e7b5f5.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_unauthorized_06e7b5f5.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_esm_build_templates_app-page_f82c7ca4.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_esm_build_templates_app-page_f82c7ca4.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app__global-error_page_actions_404453e7.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app__global-error_page_actions_404453e7.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app__not-found_page_actions_c1864427.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app__not-found_page_actions_c1864427.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app_logs_page_actions_71542ba9.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app_logs_page_actions_71542ba9.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app_page_actions_a5ee4758.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app_page_actions_a5ee4758.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app_video_[session]_page_actions_a6aab323.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server__next-internal_server_app_video_[session]_page_actions_a6aab323.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__bun_39d5fbaf._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/node_modules__bun_39d5fbaf._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__bun_d6d37386._.js +0 -5
- package/mcp-server/.next/server/chunks/ssr/node_modules__bun_d6d37386._.js.map +0 -1
- package/mcp-server/.next/server/functions-config-manifest.json +0 -4
- package/mcp-server/.next/server/instrumentation.js +0 -4
- package/mcp-server/.next/server/instrumentation.js.nft.json +0 -1
- package/mcp-server/.next/server/interception-route-rewrite-manifest.js +0 -1
- package/mcp-server/.next/server/middleware-build-manifest.js +0 -21
- package/mcp-server/.next/server/middleware-manifest.json +0 -6
- package/mcp-server/.next/server/next-font-manifest.js +0 -1
- package/mcp-server/.next/server/next-font-manifest.json +0 -6
- package/mcp-server/.next/server/pages/404.html +0 -1
- package/mcp-server/.next/server/pages/500.html +0 -2
- package/mcp-server/.next/server/pages-manifest.json +0 -4
- package/mcp-server/.next/server/server-reference-manifest.js +0 -1
- package/mcp-server/.next/server/server-reference-manifest.json +0 -5
- package/mcp-server/.next/static/chunks/10099c90a1ca89ea.js +0 -4
- package/mcp-server/.next/static/chunks/10c04cb580a9beec.js +0 -1
- package/mcp-server/.next/static/chunks/13606014ef33124c.js +0 -2
- package/mcp-server/.next/static/chunks/39e9bdcc541cc428.js +0 -1
- package/mcp-server/.next/static/chunks/3f3f8e7d16ba3bf4.js +0 -1
- package/mcp-server/.next/static/chunks/4785978304fb9e19.js +0 -1
- package/mcp-server/.next/static/chunks/59cdeaf92a780e96.css +0 -1
- package/mcp-server/.next/static/chunks/5df77c9395248155.js +0 -1
- package/mcp-server/.next/static/chunks/807aef58565dccb1.js +0 -1
- package/mcp-server/.next/static/chunks/a6dad97d9634a72d.js +0 -1
- package/mcp-server/.next/static/chunks/a6dad97d9634a72d.js.map +0 -1
- package/mcp-server/.next/static/chunks/b8eb42a9560f7980.js +0 -3
- package/mcp-server/.next/static/chunks/ea7b53054294e7bb.js +0 -3
- package/mcp-server/.next/static/chunks/ec58e1c556f5d0fa.js +0 -3
- package/mcp-server/.next/static/chunks/turbopack-b64e111cadf03885.js +0 -4
- package/mcp-server/.next/static/gTFARHqj7X4ZmcJWlUVID/_buildManifest.js +0 -11
- package/mcp-server/.next/static/gTFARHqj7X4ZmcJWlUVID/_clientMiddlewareManifest.json +0 -1
- package/mcp-server/.next/static/gTFARHqj7X4ZmcJWlUVID/_ssgManifest.js +0 -1
- package/mcp-server/app/api/jank/[session]/route.ts +0 -344
- package/mcp-server/app/api/logs/append/route.ts +0 -82
- package/mcp-server/app/api/logs/head/route.ts +0 -32
- package/mcp-server/app/api/logs/list/route.ts +0 -71
- package/mcp-server/app/api/logs/rotate/route.ts +0 -48
- package/mcp-server/app/api/logs/stream/route.ts +0 -61
- package/mcp-server/app/api/logs/tail/route.ts +0 -32
- package/mcp-server/app/api/orchestrator/route.ts +0 -73
- package/mcp-server/app/api/screenshots/[filename]/route.ts +0 -61
- package/mcp-server/app/api/screenshots/capture/route.ts +0 -137
- package/mcp-server/app/api/screenshots/clear/route.ts +0 -44
- package/mcp-server/app/api/screenshots/list/route.ts +0 -22
- package/mcp-server/app/api/teams/route.ts +0 -86
- package/mcp-server/app/api/tools/route.ts +0 -92
- package/mcp-server/app/globals.css +0 -124
- package/mcp-server/app/layout.tsx +0 -23
- package/mcp-server/app/logs/LogsClient.infinite-loop.test.tsx +0 -127
- package/mcp-server/app/logs/LogsClient.test.ts +0 -416
- package/mcp-server/app/logs/LogsClient.tsx +0 -1967
- package/mcp-server/app/logs/page.tsx +0 -150
- package/mcp-server/app/logs/utils.ts +0 -151
- package/mcp-server/app/mcp/client-manager.ts +0 -346
- package/mcp-server/app/mcp/route.ts +0 -765
- package/mcp-server/app/mcp/tools.ts +0 -4158
- package/mcp-server/app/page.tsx +0 -399
- package/mcp-server/app/video/[session]/page.tsx +0 -239
- package/mcp-server/next-env.d.ts +0 -6
- package/mcp-server/package.json +0 -48
- package/mcp-server/postcss.config.mjs +0 -5
- package/mcp-server/public/favicon-16.svg +0 -4
- package/mcp-server/public/favicon-180.png +0 -0
- package/mcp-server/public/favicon-64.svg +0 -4
- package/mcp-server/public/favicon-preview.html +0 -67
- package/mcp-server/public/favicon.ico +0 -0
- package/mcp-server/public/favicon.svg +0 -4
- package/mcp-server/public/screenshots/test.txt +0 -1
- package/mcp-server/start-production.mjs +0 -101
- package/mcp-server/tsconfig.json +0 -28
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { extractProjectNameFromLogFilename, logFilenameMatchesProject } from "@dev3000/src/utils/log-filename"
|
|
2
|
-
import { existsSync, readdirSync, readFileSync, statSync } from "fs"
|
|
3
|
-
import { redirect } from "next/navigation"
|
|
4
|
-
import { basename, dirname, join } from "path"
|
|
5
|
-
import LogsClient from "./LogsClient"
|
|
6
|
-
import { parseLogEntries } from "./utils"
|
|
7
|
-
|
|
8
|
-
interface PageProps {
|
|
9
|
-
searchParams: Promise<{ file?: string; mode?: "head" | "tail"; project?: string }>
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async function getLogFiles() {
|
|
13
|
-
try {
|
|
14
|
-
const currentLogPath = process.env.LOG_FILE_PATH || "/var/log/dev3000/dev3000.log"
|
|
15
|
-
|
|
16
|
-
if (!existsSync(currentLogPath)) {
|
|
17
|
-
return { files: [], currentFile: "", projectName: "unknown" }
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const logDir = dirname(currentLogPath)
|
|
21
|
-
const currentLogName = basename(currentLogPath)
|
|
22
|
-
|
|
23
|
-
// Extract project name from current log filename using shared utility
|
|
24
|
-
const projectName = extractProjectNameFromLogFilename(currentLogName) || "unknown"
|
|
25
|
-
|
|
26
|
-
const dirContents = readdirSync(logDir)
|
|
27
|
-
const logFiles = dirContents
|
|
28
|
-
// Get all log files for this project
|
|
29
|
-
.filter((file) => logFilenameMatchesProject(file, projectName))
|
|
30
|
-
.map((file) => {
|
|
31
|
-
const filePath = join(logDir, file)
|
|
32
|
-
const stats = statSync(filePath)
|
|
33
|
-
|
|
34
|
-
const timestampMatch = file.match(/(\d{4}-\d{2}-\d{2}T[\d-]+Z)/)
|
|
35
|
-
const timestamp = timestampMatch ? timestampMatch[1].replace(/-/g, ":") : ""
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
name: file,
|
|
39
|
-
path: filePath,
|
|
40
|
-
timestamp,
|
|
41
|
-
size: stats.size,
|
|
42
|
-
mtime: stats.mtime,
|
|
43
|
-
isCurrent: file === currentLogName
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime())
|
|
47
|
-
.map((file) => ({
|
|
48
|
-
...file,
|
|
49
|
-
mtime: file.mtime.toISOString() // Convert to string after sorting
|
|
50
|
-
}))
|
|
51
|
-
|
|
52
|
-
return {
|
|
53
|
-
files: logFiles,
|
|
54
|
-
currentFile: currentLogPath,
|
|
55
|
-
projectName
|
|
56
|
-
}
|
|
57
|
-
} catch (_error) {
|
|
58
|
-
return { files: [], currentFile: "", projectName: "unknown" }
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async function getLogData(logPath: string, mode: "head" | "tail" = "tail", lines: number = 100) {
|
|
63
|
-
try {
|
|
64
|
-
if (!existsSync(logPath)) {
|
|
65
|
-
return { logs: "", total: 0 }
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const logContent = readFileSync(logPath, "utf-8")
|
|
69
|
-
const allLines = logContent.split("\n").filter((line) => line.trim())
|
|
70
|
-
|
|
71
|
-
const selectedLines = mode === "head" ? allLines.slice(0, lines) : allLines.slice(-lines)
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
logs: selectedLines.join("\n"),
|
|
75
|
-
total: allLines.length
|
|
76
|
-
}
|
|
77
|
-
} catch (_error) {
|
|
78
|
-
return { logs: "", total: 0 }
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export default async function LogsPage({ searchParams }: PageProps) {
|
|
83
|
-
const version = process.env.DEV3000_VERSION || "0.0.0"
|
|
84
|
-
|
|
85
|
-
// Await searchParams (Next.js 15 requirement)
|
|
86
|
-
const params = await searchParams
|
|
87
|
-
|
|
88
|
-
// Get available log files
|
|
89
|
-
const { files, currentFile } = await getLogFiles()
|
|
90
|
-
|
|
91
|
-
// If project parameter is provided, find latest file for that project
|
|
92
|
-
if (params.project && !params.file) {
|
|
93
|
-
// Look for files that match the project name (supports partial matching)
|
|
94
|
-
const projectFiles = files.filter((f) => logFilenameMatchesProject(f.name, params.project ?? ""))
|
|
95
|
-
if (projectFiles.length > 0) {
|
|
96
|
-
redirect(`/logs?file=${encodeURIComponent(projectFiles[0].name)}&mode=tail`)
|
|
97
|
-
}
|
|
98
|
-
// If no matching project files found but we have other files, show the latest
|
|
99
|
-
else if (files.length > 0) {
|
|
100
|
-
redirect(`/logs?file=${encodeURIComponent(files[0].name)}&mode=tail`)
|
|
101
|
-
}
|
|
102
|
-
// Otherwise fall through to render empty state
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// If no file specified and we have files, redirect to latest with tail mode
|
|
106
|
-
else if (!params.file && files.length > 0) {
|
|
107
|
-
const latestFile = files[0].name
|
|
108
|
-
redirect(`/logs?file=${encodeURIComponent(latestFile)}&mode=tail`)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// If no file specified and no files available, render with empty data
|
|
112
|
-
if (!params.file) {
|
|
113
|
-
return (
|
|
114
|
-
<LogsClient
|
|
115
|
-
version={version}
|
|
116
|
-
initialData={{
|
|
117
|
-
logs: [],
|
|
118
|
-
logFiles: [],
|
|
119
|
-
currentLogFile: "",
|
|
120
|
-
mode: "tail"
|
|
121
|
-
}}
|
|
122
|
-
/>
|
|
123
|
-
)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Find the selected log file
|
|
127
|
-
const selectedFile = files.find((f) => f.name === params.file)
|
|
128
|
-
const logPath = selectedFile?.path || currentFile
|
|
129
|
-
|
|
130
|
-
// Always default to 'tail' mode for initial loads
|
|
131
|
-
const _isCurrentFile = selectedFile?.isCurrent !== false
|
|
132
|
-
const defaultMode = "tail" // Always start in tail mode
|
|
133
|
-
const mode = (params.mode as "head" | "tail") || defaultMode
|
|
134
|
-
|
|
135
|
-
// Get initial log data server-side
|
|
136
|
-
const logData = await getLogData(logPath, mode)
|
|
137
|
-
const parsedLogs = parseLogEntries(logData.logs)
|
|
138
|
-
|
|
139
|
-
return (
|
|
140
|
-
<LogsClient
|
|
141
|
-
version={version}
|
|
142
|
-
initialData={{
|
|
143
|
-
logs: parsedLogs,
|
|
144
|
-
logFiles: files,
|
|
145
|
-
currentLogFile: logPath,
|
|
146
|
-
mode
|
|
147
|
-
}}
|
|
148
|
-
/>
|
|
149
|
-
)
|
|
150
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import type { LogEntry } from "@/types"
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Cleans up console log messages that contain CSS formatting directives
|
|
5
|
-
* Example: "%c[Vercel Web Analytics]%c Debug mode... color: rgb(120, 120, 120) color: inherit"
|
|
6
|
-
* Becomes: "[Vercel Web Analytics] Debug mode..."
|
|
7
|
-
*/
|
|
8
|
-
function cleanConsoleFormatting(message: string): string {
|
|
9
|
-
// Pattern to match console log entries with CSS formatting
|
|
10
|
-
const consoleLogPattern = /^\[CONSOLE LOG\] (.+)$/
|
|
11
|
-
const match = message.match(consoleLogPattern)
|
|
12
|
-
|
|
13
|
-
if (!match) {
|
|
14
|
-
return message
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const consoleMessage = match[1]
|
|
18
|
-
|
|
19
|
-
// Check if this message has %c CSS formatting directives
|
|
20
|
-
if (!consoleMessage.includes("%c")) {
|
|
21
|
-
return message // No formatting to clean
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Remove CSS formatting directives step by step
|
|
25
|
-
let cleaned = consoleMessage
|
|
26
|
-
|
|
27
|
-
// Remove %c markers
|
|
28
|
-
cleaned = cleaned.replace(/%c/g, "")
|
|
29
|
-
|
|
30
|
-
// Remove trailing CSS color declarations - look for CSS patterns before JSON or at end of string
|
|
31
|
-
// Match CSS color declarations that appear after %c removal
|
|
32
|
-
cleaned = cleaned.replace(/\s+color:\s*[^{}\n]*?(?=\s*[{[]|$)/g, "")
|
|
33
|
-
|
|
34
|
-
// Clean up any extra whitespace
|
|
35
|
-
cleaned = cleaned.replace(/\s+/g, " ").trim()
|
|
36
|
-
|
|
37
|
-
return `[CONSOLE LOG] ${cleaned}`
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function parseLogEntries(logContent: string): LogEntry[] {
|
|
41
|
-
// Enhanced pattern to handle multiple timestamp formats:
|
|
42
|
-
// Format 1 (CDP): [timestamp] [SOURCE] message
|
|
43
|
-
// Format 2 (Extension): [timestamp] [TAB-id] [SOURCE] [event] message
|
|
44
|
-
// Format 3 (Short): [HH:MM:SS.mmm] [SOURCE] message
|
|
45
|
-
const timestampPattern = /\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z|\d{2}:\d{2}:\d{2}\.\d{3})\] \[([^\]]+)\] /
|
|
46
|
-
|
|
47
|
-
const entries: LogEntry[] = []
|
|
48
|
-
const lines = logContent.split("\n")
|
|
49
|
-
let currentEntry: LogEntry | null = null
|
|
50
|
-
|
|
51
|
-
for (const line of lines) {
|
|
52
|
-
if (!line.trim()) continue
|
|
53
|
-
|
|
54
|
-
const match = line.match(timestampPattern)
|
|
55
|
-
if (match) {
|
|
56
|
-
// Save previous entry if exists
|
|
57
|
-
if (currentEntry) {
|
|
58
|
-
entries.push(currentEntry)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const [fullMatch, timestamp, firstBracket] = match
|
|
62
|
-
const remainingLine = line.substring(fullMatch.length)
|
|
63
|
-
|
|
64
|
-
// Check if this is a Chrome extension format with tab identifier
|
|
65
|
-
const isTabIdentifier = /^TAB-\d+\.\d+$/.test(firstBracket)
|
|
66
|
-
let source = firstBracket
|
|
67
|
-
let message = remainingLine
|
|
68
|
-
let tabIdentifier: string | undefined
|
|
69
|
-
let userAgent: string | undefined
|
|
70
|
-
|
|
71
|
-
if (isTabIdentifier) {
|
|
72
|
-
// Chrome extension format: [TAB-id] [SOURCE] [event] message
|
|
73
|
-
tabIdentifier = firstBracket
|
|
74
|
-
|
|
75
|
-
// Look for the next bracketed section which should be the actual source
|
|
76
|
-
const sourceMatch = remainingLine.match(/^\[([^\]]+)\] /)
|
|
77
|
-
if (sourceMatch) {
|
|
78
|
-
source = sourceMatch[1] // This should be "BROWSER"
|
|
79
|
-
message = remainingLine.substring(sourceMatch[0].length)
|
|
80
|
-
|
|
81
|
-
// Extract user agent from INFO entries if present
|
|
82
|
-
if (message.includes("User-Agent:")) {
|
|
83
|
-
const uaMatch = message.match(/User-Agent: ([^,\n]+)/)
|
|
84
|
-
if (uaMatch) {
|
|
85
|
-
userAgent = uaMatch[1]
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const screenshot = message.match(/\[SCREENSHOT\] ([^\s[]+)/)?.[1]
|
|
92
|
-
const screencast = message.match(/\[SCREENCAST\] View jank analysis: ([^\s]+)/)?.[1]
|
|
93
|
-
|
|
94
|
-
// Clean up CSS formatting directives in console log messages
|
|
95
|
-
let cleanedMessage = cleanConsoleFormatting(message)
|
|
96
|
-
|
|
97
|
-
// Remove browser type markers from displayed message (they'll show as pills instead)
|
|
98
|
-
// cleanedMessage = cleanedMessage.replace(/ \[PLAYWRIGHT\]$/, "").replace(/ \[CHROME_EXTENSION\]$/, "")
|
|
99
|
-
cleanedMessage = cleanedMessage.replace(/ \[CHROME_EXTENSION\]$/, "") // Only remove Chrome Extension tag
|
|
100
|
-
|
|
101
|
-
// Filter out noisy WebSocket logs from Next.js dev server
|
|
102
|
-
const isNoisyWebSocketLog =
|
|
103
|
-
cleanedMessage.includes("[Network.webSocketFrameSent]") ||
|
|
104
|
-
cleanedMessage.includes("[Network.webSocketFrameReceived]") ||
|
|
105
|
-
cleanedMessage.includes("[Network.webSocketFrame") ||
|
|
106
|
-
(cleanedMessage.includes("webSocketDebuggerUrl") && cleanedMessage.includes("localhost")) ||
|
|
107
|
-
(cleanedMessage.includes("[NETWORK") &&
|
|
108
|
-
cleanedMessage.includes("__PAGE__") &&
|
|
109
|
-
cleanedMessage.includes("refresh"))
|
|
110
|
-
|
|
111
|
-
// Skip noisy WebSocket logs unless user specifically wants to see them
|
|
112
|
-
if (isNoisyWebSocketLog) {
|
|
113
|
-
currentEntry = null // Skip this entry
|
|
114
|
-
continue
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Normalize timestamp to full ISO format if it's just time
|
|
118
|
-
let normalizedTimestamp = timestamp
|
|
119
|
-
if (/^\d{2}:\d{2}:\d{2}\.\d{3}$/.test(timestamp)) {
|
|
120
|
-
// It's just HH:MM:SS.mmm, convert to today's date with this time
|
|
121
|
-
const today = new Date()
|
|
122
|
-
const [hours, minutes, secondsMs] = timestamp.split(":")
|
|
123
|
-
const [seconds, ms] = secondsMs.split(".")
|
|
124
|
-
today.setHours(parseInt(hours, 10), parseInt(minutes, 10), parseInt(seconds, 10), parseInt(ms, 10))
|
|
125
|
-
normalizedTimestamp = today.toISOString()
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
currentEntry = {
|
|
129
|
-
timestamp: normalizedTimestamp,
|
|
130
|
-
source,
|
|
131
|
-
message: cleanedMessage,
|
|
132
|
-
screenshot,
|
|
133
|
-
screencast,
|
|
134
|
-
original: line,
|
|
135
|
-
tabIdentifier,
|
|
136
|
-
userAgent
|
|
137
|
-
}
|
|
138
|
-
} else if (currentEntry) {
|
|
139
|
-
// Append to current entry's message
|
|
140
|
-
currentEntry.message += `\n${line}`
|
|
141
|
-
currentEntry.original += `\n${line}`
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Don't forget the last entry
|
|
146
|
-
if (currentEntry) {
|
|
147
|
-
entries.push(currentEntry)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return entries
|
|
151
|
-
}
|
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Client Manager - Orchestrates connections to downstream MCP servers
|
|
3
|
-
*
|
|
4
|
-
* This implements the "orchestrator" or "gateway" pattern where dev3000 acts as:
|
|
5
|
-
* - MCP Server (to AI clients like Claude)
|
|
6
|
-
* - MCP Client (to chrome-devtools and nextjs-dev MCPs)
|
|
7
|
-
*
|
|
8
|
-
* Benefits:
|
|
9
|
-
* - Users only configure dev3000 once globally
|
|
10
|
-
* - Auto-discovery of chrome-devtools and nextjs-dev MCPs
|
|
11
|
-
* - Reduced context bloat for AI clients
|
|
12
|
-
* - Intelligent orchestration across multiple MCP sources
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
|
|
16
|
-
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
|
|
17
|
-
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
|
|
18
|
-
import type { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js"
|
|
19
|
-
|
|
20
|
-
interface MCPClientConfig {
|
|
21
|
-
name: string
|
|
22
|
-
type: "http" | "stdio"
|
|
23
|
-
url?: string // For HTTP transport
|
|
24
|
-
command?: string // For stdio transport
|
|
25
|
-
args?: string[] // For stdio transport
|
|
26
|
-
enabled: boolean
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export class MCPClientManager {
|
|
30
|
-
private clients: Map<string, Client> = new Map()
|
|
31
|
-
private transports: Map<string, StreamableHTTPClientTransport | StdioClientTransport> = new Map()
|
|
32
|
-
private tools: Map<string, Tool[]> = new Map()
|
|
33
|
-
private reconnectTimers: Map<string, NodeJS.Timeout> = new Map()
|
|
34
|
-
private lastConfigs: Map<string, MCPClientConfig> = new Map()
|
|
35
|
-
private toolDiscoveryListeners: Array<() => void> = []
|
|
36
|
-
private toolUpdateSubscribers: Array<(info: { mcpName: string; tools: Tool[] }) => void> = []
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Initialize MCP clients for available downstream servers
|
|
40
|
-
*/
|
|
41
|
-
async initialize(config: {
|
|
42
|
-
chromeDevtools?: { command: string; args: string[]; enabled: boolean }
|
|
43
|
-
nextjsDev?: { command: string; args: string[]; enabled: boolean }
|
|
44
|
-
svelteDev?: { command: string; args: string[]; enabled: boolean }
|
|
45
|
-
}): Promise<void> {
|
|
46
|
-
const configs: MCPClientConfig[] = []
|
|
47
|
-
|
|
48
|
-
if (config.chromeDevtools?.enabled) {
|
|
49
|
-
configs.push({
|
|
50
|
-
name: "chrome-devtools",
|
|
51
|
-
type: "stdio",
|
|
52
|
-
command: config.chromeDevtools.command,
|
|
53
|
-
args: config.chromeDevtools.args,
|
|
54
|
-
enabled: true
|
|
55
|
-
})
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (config.nextjsDev?.enabled) {
|
|
59
|
-
configs.push({
|
|
60
|
-
name: "nextjs-dev",
|
|
61
|
-
type: "stdio",
|
|
62
|
-
command: config.nextjsDev.command,
|
|
63
|
-
args: config.nextjsDev.args,
|
|
64
|
-
enabled: true
|
|
65
|
-
})
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (config.svelteDev?.enabled) {
|
|
69
|
-
configs.push({
|
|
70
|
-
name: "svelte-dev",
|
|
71
|
-
type: "stdio",
|
|
72
|
-
command: config.svelteDev.command,
|
|
73
|
-
args: config.svelteDev.args,
|
|
74
|
-
enabled: true
|
|
75
|
-
})
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Connect to each available MCP
|
|
79
|
-
for (const cfg of configs) {
|
|
80
|
-
try {
|
|
81
|
-
await this.connectToMCP(cfg)
|
|
82
|
-
const location = cfg.type === "http" ? cfg.url : `${cfg.command} ${cfg.args?.join(" ")}`
|
|
83
|
-
console.log(`[MCP Orchestrator] Connected to ${cfg.name} (${cfg.type}) at ${location}`)
|
|
84
|
-
} catch (error) {
|
|
85
|
-
console.warn(`[MCP Orchestrator] Failed to connect to ${cfg.name}:`, error)
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Connect to a downstream MCP server
|
|
92
|
-
*/
|
|
93
|
-
private async connectToMCP(config: MCPClientConfig): Promise<void> {
|
|
94
|
-
// Store config for reconnection
|
|
95
|
-
this.lastConfigs.set(config.name, config)
|
|
96
|
-
|
|
97
|
-
const client = new Client(
|
|
98
|
-
{
|
|
99
|
-
name: "dev3000-orchestrator",
|
|
100
|
-
version: "1.0.0"
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
capabilities: {}
|
|
104
|
-
}
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
client.onerror = (error) => {
|
|
108
|
-
console.error(`[MCP Orchestrator] ${config.name} error:`, error)
|
|
109
|
-
// Schedule reconnection for HTTP transports (SSE disconnects)
|
|
110
|
-
if (config.type === "http") {
|
|
111
|
-
this.scheduleReconnect(config.name)
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
let transport: StreamableHTTPClientTransport | StdioClientTransport
|
|
116
|
-
|
|
117
|
-
if (config.type === "http" && config.url) {
|
|
118
|
-
transport = new StreamableHTTPClientTransport(new URL(config.url))
|
|
119
|
-
} else if (config.type === "stdio" && config.command) {
|
|
120
|
-
transport = new StdioClientTransport({
|
|
121
|
-
command: config.command,
|
|
122
|
-
args: config.args || []
|
|
123
|
-
})
|
|
124
|
-
} else {
|
|
125
|
-
throw new Error(`Invalid MCP config for ${config.name}`)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
await client.connect(transport)
|
|
129
|
-
|
|
130
|
-
this.clients.set(config.name, client)
|
|
131
|
-
this.transports.set(config.name, transport)
|
|
132
|
-
|
|
133
|
-
// Discover available tools (non-fatal - connection already succeeded)
|
|
134
|
-
try {
|
|
135
|
-
const toolsResult = await client.listTools()
|
|
136
|
-
const discoveredTools = Array.isArray(toolsResult?.tools) ? (toolsResult.tools as Tool[]) : []
|
|
137
|
-
|
|
138
|
-
this.tools.set(config.name, discoveredTools)
|
|
139
|
-
|
|
140
|
-
if (discoveredTools.length > 0) {
|
|
141
|
-
console.log(`[MCP Orchestrator] Discovered ${discoveredTools.length} tools from ${config.name}`)
|
|
142
|
-
this.notifyToolDiscovery()
|
|
143
|
-
} else {
|
|
144
|
-
console.log(`[MCP Orchestrator] No tools discovered from ${config.name} (will retry on first use)`)
|
|
145
|
-
}
|
|
146
|
-
this.notifyToolsUpdated(config.name)
|
|
147
|
-
} catch (_error) {
|
|
148
|
-
// Tool discovery failed but connection succeeded - tools will be discovered on first use
|
|
149
|
-
this.tools.set(config.name, [])
|
|
150
|
-
console.log(`[MCP Orchestrator] Tool discovery deferred for ${config.name} (will discover on first tool call)`)
|
|
151
|
-
this.notifyToolsUpdated(config.name)
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Get all discovered tools from all connected MCPs
|
|
157
|
-
*/
|
|
158
|
-
getAllTools(): Array<{ mcpName: string; tool: Tool }> {
|
|
159
|
-
const allTools: Array<{ mcpName: string; tool: Tool }> = []
|
|
160
|
-
|
|
161
|
-
for (const [mcpName, tools] of this.tools.entries()) {
|
|
162
|
-
for (const tool of tools) {
|
|
163
|
-
allTools.push({ mcpName, tool })
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return allTools
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Call a tool on a downstream MCP server
|
|
172
|
-
*/
|
|
173
|
-
async callTool(mcpName: string, toolName: string, args: Record<string, unknown>): Promise<CallToolResult> {
|
|
174
|
-
const client = this.clients.get(mcpName)
|
|
175
|
-
|
|
176
|
-
if (!client) {
|
|
177
|
-
throw new Error(`MCP client '${mcpName}' not connected`)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
try {
|
|
181
|
-
const result = await client.callTool({
|
|
182
|
-
name: toolName,
|
|
183
|
-
arguments: args
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
return result as CallToolResult
|
|
187
|
-
} catch (error) {
|
|
188
|
-
console.error(`[MCP Orchestrator] Error calling ${mcpName}.${toolName}:`, error)
|
|
189
|
-
throw error
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Check if a specific MCP is connected
|
|
195
|
-
*/
|
|
196
|
-
isConnected(mcpName: string): boolean {
|
|
197
|
-
return this.clients.has(mcpName)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Get list of connected MCP names
|
|
202
|
-
*/
|
|
203
|
-
getConnectedMCPs(): string[] {
|
|
204
|
-
return Array.from(this.clients.keys())
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Subscribe to tool updates for a specific MCP. Returns an unsubscribe function.
|
|
209
|
-
*/
|
|
210
|
-
onToolsUpdated(subscriber: (info: { mcpName: string; tools: Tool[] }) => void): () => void {
|
|
211
|
-
this.toolUpdateSubscribers.push(subscriber)
|
|
212
|
-
return () => {
|
|
213
|
-
this.toolUpdateSubscribers = this.toolUpdateSubscribers.filter((fn) => fn !== subscriber)
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Wait for at least one downstream MCP to finish tool discovery, or resolve after a timeout.
|
|
219
|
-
* Prevents registering an empty toolset before downstream servers are ready.
|
|
220
|
-
*/
|
|
221
|
-
async waitForInitialTools(timeoutMs: number = 8000): Promise<void> {
|
|
222
|
-
if (this.getAllTools().length > 0) {
|
|
223
|
-
return
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
await new Promise<void>((resolve) => {
|
|
227
|
-
let timeoutId: NodeJS.Timeout
|
|
228
|
-
|
|
229
|
-
const onDiscovery = () => {
|
|
230
|
-
clearTimeout(timeoutId)
|
|
231
|
-
this.toolDiscoveryListeners = this.toolDiscoveryListeners.filter((listener) => listener !== onDiscovery)
|
|
232
|
-
resolve()
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
timeoutId = setTimeout(() => {
|
|
236
|
-
this.toolDiscoveryListeners = this.toolDiscoveryListeners.filter((listener) => listener !== onDiscovery)
|
|
237
|
-
resolve()
|
|
238
|
-
}, timeoutMs)
|
|
239
|
-
|
|
240
|
-
this.toolDiscoveryListeners.push(onDiscovery)
|
|
241
|
-
})
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
private notifyToolDiscovery(): void {
|
|
245
|
-
if (this.toolDiscoveryListeners.length === 0 || this.getAllTools().length === 0) {
|
|
246
|
-
return
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const listeners = [...this.toolDiscoveryListeners]
|
|
250
|
-
this.toolDiscoveryListeners = []
|
|
251
|
-
for (const listener of listeners) {
|
|
252
|
-
listener()
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
private notifyToolsUpdated(mcpName: string): void {
|
|
257
|
-
const tools = this.tools.get(mcpName) ?? []
|
|
258
|
-
for (const subscriber of this.toolUpdateSubscribers) {
|
|
259
|
-
try {
|
|
260
|
-
subscriber({ mcpName, tools })
|
|
261
|
-
} catch (error) {
|
|
262
|
-
console.warn(`[MCP Orchestrator] Tool update subscriber error for ${mcpName}:`, error)
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Schedule reconnection for a disconnected MCP
|
|
269
|
-
*/
|
|
270
|
-
private scheduleReconnect(mcpName: string): void {
|
|
271
|
-
// Clear any existing reconnect timer
|
|
272
|
-
const existingTimer = this.reconnectTimers.get(mcpName)
|
|
273
|
-
if (existingTimer) {
|
|
274
|
-
clearTimeout(existingTimer)
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Schedule reconnection after 3 seconds
|
|
278
|
-
const timer = setTimeout(async () => {
|
|
279
|
-
const config = this.lastConfigs.get(mcpName)
|
|
280
|
-
if (!config) {
|
|
281
|
-
console.warn(`[MCP Orchestrator] No config found for reconnection: ${mcpName}`)
|
|
282
|
-
return
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
console.log(`[MCP Orchestrator] Attempting to reconnect to ${mcpName}...`)
|
|
286
|
-
try {
|
|
287
|
-
// Clean up old connection
|
|
288
|
-
const oldTransport = this.transports.get(mcpName)
|
|
289
|
-
if (oldTransport) {
|
|
290
|
-
try {
|
|
291
|
-
await oldTransport.close()
|
|
292
|
-
} catch {
|
|
293
|
-
// Ignore close errors
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
this.clients.delete(mcpName)
|
|
297
|
-
this.transports.delete(mcpName)
|
|
298
|
-
|
|
299
|
-
// Attempt reconnection
|
|
300
|
-
await this.connectToMCP(config)
|
|
301
|
-
console.log(`[MCP Orchestrator] Successfully reconnected to ${mcpName}`)
|
|
302
|
-
} catch (error) {
|
|
303
|
-
console.warn(`[MCP Orchestrator] Reconnection to ${mcpName} failed:`, error)
|
|
304
|
-
// Schedule another retry
|
|
305
|
-
this.scheduleReconnect(mcpName)
|
|
306
|
-
}
|
|
307
|
-
}, 3000)
|
|
308
|
-
|
|
309
|
-
this.reconnectTimers.set(mcpName, timer)
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Disconnect all MCP clients
|
|
314
|
-
*/
|
|
315
|
-
async disconnect(): Promise<void> {
|
|
316
|
-
// Clear all reconnect timers
|
|
317
|
-
for (const timer of this.reconnectTimers.values()) {
|
|
318
|
-
clearTimeout(timer)
|
|
319
|
-
}
|
|
320
|
-
this.reconnectTimers.clear()
|
|
321
|
-
|
|
322
|
-
for (const [name, transport] of this.transports.entries()) {
|
|
323
|
-
try {
|
|
324
|
-
await transport.close()
|
|
325
|
-
console.log(`[MCP Orchestrator] Disconnected from ${name}`)
|
|
326
|
-
} catch (error) {
|
|
327
|
-
console.error(`[MCP Orchestrator] Error disconnecting from ${name}:`, error)
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
this.clients.clear()
|
|
332
|
-
this.transports.clear()
|
|
333
|
-
this.tools.clear()
|
|
334
|
-
this.lastConfigs.clear()
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Singleton instance
|
|
339
|
-
let clientManager: MCPClientManager | null = null
|
|
340
|
-
|
|
341
|
-
export function getMCPClientManager(): MCPClientManager {
|
|
342
|
-
if (!clientManager) {
|
|
343
|
-
clientManager = new MCPClientManager()
|
|
344
|
-
}
|
|
345
|
-
return clientManager
|
|
346
|
-
}
|