dev3000 0.0.108 → 0.0.109

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 (53) hide show
  1. package/dist/dev-environment.d.ts.map +1 -1
  2. package/dist/dev-environment.js +34 -1
  3. package/dist/dev-environment.js.map +1 -1
  4. package/mcp-server/.next/BUILD_ID +1 -1
  5. package/mcp-server/.next/build-manifest.json +2 -2
  6. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  7. package/mcp-server/.next/next-server.js.nft.json +1 -1
  8. package/mcp-server/.next/prerender-manifest.json +3 -3
  9. package/mcp-server/.next/server/app/_global-error.html +2 -2
  10. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  11. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/mcp-server/.next/server/app/_not-found.html +1 -1
  16. package/mcp-server/.next/server/app/_not-found.rsc +1 -1
  17. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  18. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  19. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  22. package/mcp-server/.next/server/app/auth/error.html +1 -1
  23. package/mcp-server/.next/server/app/auth/error.rsc +1 -1
  24. package/mcp-server/.next/server/app/auth/error.segments/_full.segment.rsc +1 -1
  25. package/mcp-server/.next/server/app/auth/error.segments/_index.segment.rsc +1 -1
  26. package/mcp-server/.next/server/app/auth/error.segments/_tree.segment.rsc +1 -1
  27. package/mcp-server/.next/server/app/auth/error.segments/auth/error/__PAGE__.segment.rsc +1 -1
  28. package/mcp-server/.next/server/app/auth/error.segments/auth/error.segment.rsc +1 -1
  29. package/mcp-server/.next/server/app/auth/error.segments/auth.segment.rsc +1 -1
  30. package/mcp-server/.next/server/app/index.html +1 -1
  31. package/mcp-server/.next/server/app/index.rsc +1 -1
  32. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  33. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +1 -1
  34. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +1 -1
  35. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  36. package/mcp-server/.next/server/chunks/5e4c3_next_dist_esm_build_templates_app-route_22611d04.js +106 -106
  37. package/mcp-server/.next/server/chunks/5e4c3_next_dist_esm_build_templates_app-route_22611d04.js.map +1 -1
  38. package/mcp-server/.next/server/chunks/[root-of-the-server]__2e1a5f43._.js.map +1 -1
  39. package/mcp-server/.next/server/chunks/[root-of-the-server]__8a84f9f4._.js +13 -3
  40. package/mcp-server/.next/server/chunks/[root-of-the-server]__8a84f9f4._.js.map +1 -1
  41. package/mcp-server/.next/server/chunks/[root-of-the-server]__cc067478._.js.map +1 -1
  42. package/mcp-server/.next/server/chunks/[root-of-the-server]__dec55307._.js +64 -64
  43. package/mcp-server/.next/server/chunks/[root-of-the-server]__dec55307._.js.map +1 -1
  44. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  45. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  46. package/mcp-server/app/api/cloud/start-fix/route.ts +2 -2
  47. package/mcp-server/app/mcp/tools.ts +34 -4
  48. package/mcp-server/next-env.d.ts +1 -1
  49. package/mcp-server/package.json +1 -1
  50. package/package.json +1 -1
  51. /package/mcp-server/.next/static/{BPOqN_mYRkwZey5aViiMr → wKql3X2v8Qm8F_X099H8t}/_buildManifest.js +0 -0
  52. /package/mcp-server/.next/static/{BPOqN_mYRkwZey5aViiMr → wKql3X2v8Qm8F_X099H8t}/_clientMiddlewareManifest.json +0 -0
  53. /package/mcp-server/.next/static/{BPOqN_mYRkwZey5aViiMr → wKql3X2v8Qm8F_X099H8t}/_ssgManifest.js +0 -0
@@ -67,12 +67,22 @@ dev3000-chrome-devtools:${r.function}(${JSON.stringify(t,null,2)})
67
67
  const el = document.querySelector(${JSON.stringify(t.selector)});
68
68
  if (!el) return { found: false };
69
69
  const rect = el.getBoundingClientRect();
70
+ // Calculate center point, rounding to avoid fractional pixels
71
+ const centerX = Math.round(rect.left + rect.width / 2);
72
+ const centerY = Math.round(rect.top + rect.height / 2);
73
+ // Verify what element is at this point
74
+ const elementAtPoint = document.elementFromPoint(centerX, centerY);
75
+ const isCorrectElement = elementAtPoint === el || el.contains(elementAtPoint);
70
76
  return {
71
77
  found: true,
72
- x: rect.left + rect.width / 2,
73
- y: rect.top + rect.height / 2
78
+ x: centerX,
79
+ y: centerY,
80
+ width: rect.width,
81
+ height: rect.height,
82
+ elementAtPoint: elementAtPoint?.tagName + (elementAtPoint?.className ? '.' + elementAtPoint.className : ''),
83
+ isCorrectElement: isCorrectElement
74
84
  };
75
- })()`,returnByValue:!0});if(s.result?.value?.found===!0&&"number"==typeof s.result.value.x&&"number"==typeof s.result.value.y)e=s.result.value.x,r=s.result.value.y;else throw Error(`Element not found for selector: ${t.selector}`)}else if("number"==typeof t.x&&"number"==typeof t.y)e=t.x,r=t.y;else throw Error("Click action requires either {x, y} coordinates or a {selector} CSS selector");s=await n(i,l++,"Input.dispatchMouseEvent",{type:"mousePressed",x:e,y:r,button:"left",clickCount:1}),await n(i,l++,"Input.dispatchMouseEvent",{type:"mouseReleased",x:e,y:r,button:"left",clickCount:1});break}case"navigate":if("string"!=typeof t.url)throw Error("Navigate action requires url parameter as string");s=await n(i,l++,"Page.navigate",{url:t.url});break;case"screenshot":i.close(),r({warning:"Screenshot action is not recommended!",advice:"Dev3000 automatically captures screenshots during interactions. Instead of manual screenshots, use click/navigate/scroll/type actions to reproduce user workflows, and dev3000 will capture screenshots at optimal times.",suggestion:"Run fix_my_app to see all auto-captured screenshots from your session."});return;case"evaluate":{if("string"!=typeof t.expression)throw Error("Evaluate action requires expression parameter as string");let e=t.expression;if([/eval\s*\(/,/Function\s*\(/,/setTimeout/,/setInterval/,/\.innerHTML\s*=/,/\.outerHTML\s*=/,/document\.write/,/document\.cookie\s*=/,/localStorage\.setItem/,/sessionStorage\.setItem/,/\.src\s*=/,/\.href\s*=/,/location\s*=/,/\.addEventListener/,/\.removeEventListener/,/new\s+Function/,/import\s*\(/,/fetch\s*\(/,/XMLHttpRequest/].some(t=>t.test(e)))throw Error("Expression contains dangerous patterns. Only safe read-only expressions allowed.");s=await n(i,l++,"Runtime.evaluate",{expression:e,returnByValue:!0});break}case"scroll":{let e="number"==typeof t.deltaX?t.deltaX:0,r="number"==typeof t.deltaY?t.deltaY:0;s=await n(i,l++,"Input.dispatchMouseEvent",{type:"mouseWheel",x:"number"==typeof t.x?t.x:500,y:"number"==typeof t.y?t.y:500,deltaX:e,deltaY:r});break}case"type":if("string"!=typeof t.text)throw Error("Type action requires text parameter as string");for(let e of t.text)await n(i,l++,"Input.dispatchKeyEvent",{type:"char",text:e});s={action:"type",text:t.text};break;default:throw Error(`Unsupported action: ${e}`)}i.close(),clearTimeout(o),r(s)}}catch(e){i.close(),clearTimeout(o),s(e instanceof Error?e:Error(`Browser action failed: ${e instanceof Error?e.message:String(e)}`))}}),i.on("error",e=>{clearTimeout(o),s(e)})}catch(e){i.close(),clearTimeout(o),s(e)}}),i.on("error",e=>{clearTimeout(o),s(e)})}),a=`Browser action '${e}' executed successfully. Result: ${JSON.stringify(o,null,2)}`;return await E("inspect_element")&&(a+="\n\n🔗 **ENHANCED BROWSER ANALYSIS AVAILABLE**\n\ndev3000 completed the basic browser action above. For deeper browser insights, consider also:",(await M(e)).filter(t=>{let r=t.function.toLowerCase(),s=e.toLowerCase();return!!("screenshot"===s&&(r.includes("inspect")||r.includes("performance"))||"evaluate"===s&&(r.includes("console")||r.includes("inspect"))||"navigate"===s&&(r.includes("network")||r.includes("performance"))||"click"===s&&(r.includes("console")||r.includes("inspect")))||"high"===t.priority}).slice(0,2).forEach(e=>{a+=`
85
+ })()`,returnByValue:!0});if(s.result?.value?.found===!0&&"number"==typeof s.result.value.x&&"number"==typeof s.result.value.y)e=s.result.value.x,r=s.result.value.y,!1===s.result.value.isCorrectElement&&console.warn(`[execute_browser_action] Warning: Center point (${e}, ${r}) is over ${s.result.value.elementAtPoint}, not the target element. This may cause unexpected click behavior. Element size: ${s.result.value.width}x${s.result.value.height}`);else throw Error(`Element not found for selector: ${t.selector}`)}else if("number"==typeof t.x&&"number"==typeof t.y)e=t.x,r=t.y;else throw Error("Click action requires either {x, y} coordinates or a {selector} CSS selector");s=await n(i,l++,"Input.dispatchMouseEvent",{type:"mousePressed",x:e,y:r,button:"left",clickCount:1}),await n(i,l++,"Input.dispatchMouseEvent",{type:"mouseReleased",x:e,y:r,button:"left",clickCount:1});break}case"navigate":if("string"!=typeof t.url)throw Error("Navigate action requires url parameter as string");s=await n(i,l++,"Page.navigate",{url:t.url});break;case"screenshot":i.close(),r({warning:"Screenshot action is not recommended!",advice:"Dev3000 automatically captures screenshots during interactions. Instead of manual screenshots, use click/navigate/scroll/type actions to reproduce user workflows, and dev3000 will capture screenshots at optimal times.",suggestion:"Run fix_my_app to see all auto-captured screenshots from your session."});return;case"evaluate":{if("string"!=typeof t.expression)throw Error("Evaluate action requires expression parameter as string");let e=t.expression;if([/eval\s*\(/,/Function\s*\(/,/setTimeout/,/setInterval/,/\.innerHTML\s*=/,/\.outerHTML\s*=/,/document\.write/,/document\.cookie\s*=/,/localStorage\.setItem/,/sessionStorage\.setItem/,/\.src\s*=/,/\.href\s*=/,/location\s*=/,/\.addEventListener/,/\.removeEventListener/,/new\s+Function/,/import\s*\(/,/fetch\s*\(/,/XMLHttpRequest/].some(t=>t.test(e)))throw Error("Expression contains dangerous patterns. Only safe read-only expressions allowed.");s=await n(i,l++,"Runtime.evaluate",{expression:e,returnByValue:!0});break}case"scroll":{let e="number"==typeof t.deltaX?t.deltaX:0,r="number"==typeof t.deltaY?t.deltaY:0;s=await n(i,l++,"Input.dispatchMouseEvent",{type:"mouseWheel",x:"number"==typeof t.x?t.x:500,y:"number"==typeof t.y?t.y:500,deltaX:e,deltaY:r});break}case"type":if("string"!=typeof t.text)throw Error("Type action requires text parameter as string");for(let e of t.text)await n(i,l++,"Input.dispatchKeyEvent",{type:"char",text:e});s={action:"type",text:t.text};break;default:throw Error(`Unsupported action: ${e}`)}i.close(),clearTimeout(o),r(s)}}catch(e){i.close(),clearTimeout(o),s(e instanceof Error?e:Error(`Browser action failed: ${e instanceof Error?e.message:String(e)}`))}}),i.on("error",e=>{clearTimeout(o),s(e)})}catch(e){i.close(),clearTimeout(o),s(e)}}),i.on("error",e=>{clearTimeout(o),s(e)})}),a=`Browser action '${e}' executed successfully. Result: ${JSON.stringify(o,null,2)}`;return await E("inspect_element")&&(a+="\n\n🔗 **ENHANCED BROWSER ANALYSIS AVAILABLE**\n\ndev3000 completed the basic browser action above. For deeper browser insights, consider also:",(await M(e)).filter(t=>{let r=t.function.toLowerCase(),s=e.toLowerCase();return!!("screenshot"===s&&(r.includes("inspect")||r.includes("performance"))||"evaluate"===s&&(r.includes("console")||r.includes("inspect"))||"navigate"===s&&(r.includes("network")||r.includes("performance"))||"click"===s&&(r.includes("console")||r.includes("inspect")))||"high"===t.priority}).slice(0,2).forEach(e=>{a+=`
76
86
  • \`dev3000-chrome-devtools:${e.function}()\` - ${e.reason}`}),a+="\n\n💡 **Augmented approach:** Use dev3000 for basic automation, chrome-devtools for detailed analysis and debugging."),{content:[{type:"text",text:a}]}}catch(e){return{content:[{type:"text",text:`Browser action failed: ${e instanceof Error?e.message:String(e)}`}]}}}let C={"nextjs-dev":["nextjs-dev","nextjs-dev-mcp","@modelcontextprotocol/server-nextjs-dev","mcp-server-nextjs-dev","nextjs-mcp"],"chrome-devtools":["chrome-devtools","chrome-devtools-mcp","@modelcontextprotocol/server-chrome-devtools","mcp-server-chrome-devtools","chrome-mcp"]},R={"nextjs-dev":[3001,3002,8080,8081],"chrome-devtools":[9222,9223,9224,3003]};async function N(){let e=[];try{process.platform;let{stdout:t}=await c("ps aux"),r=t.toLowerCase();for(let[t,s]of Object.entries(C))for(let i of s)if(r.includes(i.toLowerCase())){e.includes(t)||(e.push(t),A(`MCP Discovery: Found ${t} MCP via process detection [${i}]`));break}}catch(e){A(`MCP Discovery: Process detection failed - ${e instanceof Error?e.message:String(e)}`)}return e}async function k(){let e=[];for(let[t,r]of Object.entries(R))for(let s of r)try{if((await fetch(`http://localhost:${s}/health`,{method:"GET",signal:AbortSignal.timeout(2e3)})).ok){e.push(t),A(`MCP Discovery: Found ${t} MCP via HTTP ping on port ${s}`);break}}catch{try{let r=new l.default(`ws://localhost:${s}`);await new Promise((i,n)=>{let o=setTimeout(()=>{r.close(),n(Error("timeout"))},1e3);r.on("open",()=>{clearTimeout(o),r.close(),e.push(t),A(`MCP Discovery: Found ${t} MCP via WebSocket ping on port ${s}`),i(null)}),r.on("error",()=>{clearTimeout(o),n(Error("connection failed"))})});break}catch{}}return e}async function I(t){A("MCP Discovery: Starting proactive MCP discovery",t);let r=new Set;for(let e of(await N()))r.add(e);try{let s=`/Users/${process.env.USER}/Library/Caches/claude-cli-nodejs`,{readdirSync:i,existsSync:n}=await e.A(23970);if(n(s)){let e=i(s).find(e=>e.includes(process.cwd().replace(/\//g,"-")));if(e){let o=`${s}/${e}`,a=`${o}/mcp-logs-dev3000-chrome-devtools`;n(a)&&i(a).length>0&&(r.add("dev3000-chrome-devtools"),A("MCP Discovery: Found dev3000-chrome-devtools via Claude cache logs",t));let l=`${o}/mcp-logs-dev3000-nextjs-dev`;n(l)&&i(l).length>0&&(r.add("dev3000-nextjs-dev"),A("MCP Discovery: Found dev3000-nextjs-dev via Claude cache logs",t))}}}catch(e){A("MCP Discovery: Claude cache check failed, falling back to port detection",t)}if(0===r.size)for(let e of(A("MCP Discovery: No MCPs found via process or cache detection, trying port pinging",t),await k()))r.add(e);let s=Array.from(r);return s.length>0?A(`MCP Discovery: Successfully discovered MCPs [${s.join(", ")}]`,t):A("MCP Discovery: No MCPs detected - will run in standalone mode",t),s}async function O({mcpName:e}={}){let t=[];t.push("🔍 **MCP CAPABILITY INSPECTOR**"),t.push("");try{let r=await I();if(0===r.length)return t.push("❌ **NO MCPs DETECTED**"),t.push("No dev3000-chrome-devtools or dev3000-nextjs-dev MCPs found."),t.push(""),t.push("💡 **To enable enhanced capabilities:**"),t.push("• Ensure Chrome DevTools MCP is configured: `dev3000-chrome-devtools`"),t.push("• Ensure Next.js Dev MCP is configured: `dev3000-nextjs-dev`"),t.push("• Check that Claude Code has MCPs properly configured"),{content:[{type:"text",text:t.join("\n")}]};t.push(`✅ **DISCOVERED MCPs:** ${r.join(", ")}`),t.push("");let s=e?r.filter(t=>t.includes(e)):r;if(0===s.length&&e)return t.push(`❌ **MCP NOT FOUND:** ${e}`),t.push(`Available MCPs: ${r.join(", ")}`),{content:[{type:"text",text:t.join("\n")}]};for(let e of s){t.push(`📋 **${e.toUpperCase()} CAPABILITIES:**`),t.push("");let r=await v(e);if(0===r.length){t.push(" ❌ No capabilities discovered"),t.push(" 💡 This might indicate the MCP is not properly configured or accessible"),t.push("");continue}let s=r.filter(e=>"advanced"===e.category),i=r.filter(e=>"basic"===e.category);t.push(` 🚀 **ADVANCED CAPABILITIES** (${s.length} functions):`),s.length>0?s.forEach(e=>{t.push(` • \`${e.function}()\` - ${e.reason}`)}):t.push(" No advanced capabilities discovered"),t.push(""),t.push(` ⚙️ **BASIC CAPABILITIES** (${i.length} functions):`),i.length>0?i.forEach(e=>{t.push(` • \`${e.function}()\` - ${e.reason}`)}):t.push(" No basic capabilities discovered"),t.push("");let n=m.get(e);if(n){let e=Date.now()-n.timestamp,r=Math.floor(e/6e4);t.push(` 📝 **CACHE INFO:** Discovered ${r} minutes ago`),e>24e4&&t.push(" ⚠️ Cache will refresh soon on next use")}t.push("")}let i=s.reduce(async(e,t)=>{let r=await e,s=await v(t);return r+s.length},Promise.resolve(0));return t.push("🎯 **AUGMENTED DELEGATION STATUS:**"),t.push(`• Total discovered capabilities: ${await i}`),t.push(`• MCPs with advanced capabilities: ${s.filter(async e=>(await v(e)).some(e=>"advanced"===e.category)).length}`),t.push("• Dynamic discovery: ✅ Active (updates automatically)"),t.push("• Cache TTL: 5 minutes"),t.push(""),t.push("💡 **These capabilities are automatically suggested in dev3000's enhanced responses!**"),{content:[{type:"text",text:t.join("\n")}]}}catch(e){return t.push(`❌ **ERROR INSPECTING CAPABILITIES:** ${e instanceof Error?e.message:String(e)}`),t.push(""),t.push("💡 **Troubleshooting:**"),t.push("• Check that MCPs are properly configured in Claude Code"),t.push("• Verify dev3000 can access Claude cache directories"),t.push("• Try running `discover_available_mcps()` first"),{content:[{type:"text",text:t.join("\n")}]}}}async function P(e){let t,a,l=process.env.SCREENSHOT_DIR||(0,i.join)((0,s.tmpdir)(),"dev3000-mcp-deps","public","screenshots");if(!(0,r.existsSync)(l))return{detections:[],sessionId:"",totalFrames:0,screenshotDir:l};let c=(0,r.readdirSync)(l).filter(e=>e.includes("-jank-")&&e.endsWith(".png")).sort().reverse();if(0===c.length)return{detections:[],sessionId:"",totalFrames:0,screenshotDir:l};let h=c[0].split("-jank-")[0],u=c.filter(e=>e.startsWith(h)).sort((e,t)=>parseInt(e.match(/-(\d+)ms\.png$/)?.[1]||"0",10)-parseInt(t.match(/-(\d+)ms\.png$/)?.[1]||"0",10));if(u.length<2)return{detections:[],sessionId:h,totalFrames:u.length,screenshotDir:l};let d=(0,i.join)(l,`${h}-metadata.json`);if((0,r.existsSync)(d))try{let e=JSON.parse((0,r.readFileSync)(d,"utf-8"));a=e.captureTrigger,void 0!==e.layoutShifts&&(t={score:e.totalCLS||0,grade:e.clsGrade||"unknown",shifts:e.layoutShifts})}catch{}let f=[],m=new Map;try{let t=p(e);if(t&&(0,r.existsSync)(t)){let e=(0,r.readFileSync)(t,"utf-8").split("\n");for(let t=0;t<e.length;t++){let r=e[t].match(/\[CDP\] CLS #\d+ \(score: [\d.]+, time: (\d+)ms\):/);if(r){let s=parseInt(r[1],10),i=null,n=null;for(let r=t+1;r<Math.min(t+10,e.length);r++){if(!i){let t=e[r].match(/Before:\s+(http:\/\/\S+)/);t&&(i=t[1])}if(!n){let t=e[r].match(/After:\s+(http:\/\/\S+)/);t&&(n=t[1])}if(i&&n){m.set(s,{before:i,after:n});break}}}}}}catch(e){}if(t){if(0===t.shifts.length){let e=u.filter(e=>{let t=e.match(/-(\d+)ms\.png$/);return(t?parseInt(t[1],10):0)<1500}),s=!1;for(let t=1;t<e.length&&t<10;t++){let n=(0,i.join)(l,e[t-1]),a=(0,i.join)(l,e[t]);try{let i=o.PNG.sync.read((0,r.readFileSync)(n)),l=o.PNG.sync.read((0,r.readFileSync)(a));if(i.width!==l.width||i.height!==l.height)continue;let c=function(e,t){let r=e.width,s=e.height,i=Array(s).fill(0);for(let n=0;n<s;n++)for(let s=0;s<r;s++){let o=r*n+s<<2,a=Math.abs(e.data[o]-t.data[o]),l=Math.abs(e.data[o+1]-t.data[o+1]),c=Math.abs(e.data[o+2]-t.data[o+2]);(a>30||l>30||c>30)&&i[n]++}let n=i.map(e=>e/r*100),o=0,a=0;for(let e=0;e<s;e++)n[e]>50?o=Math.max(o,++a):a=0;let l=0;for(let e=5;e<s-5;e++){let t=n.slice(e-5,e).reduce((e,t)=>e+t,0)/5,r=n[e],s=n.slice(e+1,e+5+1).reduce((e,t)=>e+t,0)/5;t<10&&r>60&&s<10&&l++}let c=0;for(let e=0;e<s;e++)n[e]>5&&n[e]<25&&c++;let h=c>.3*s,u=Math.floor(s/8),d=Array(8).fill(0);for(let e=0;e<s;e++){let t=Math.min(Math.floor(e/u),7);d[t]+=i[e]}let p=r*u,f=d.map(e=>e/p*100),m=(f[0]+f[1])/2,g=(f[6]+f[7])/2,y=f.reduce((e,t)=>e+t,0)/f.length,v=f.reduce((e,t)=>e+(t-y)**2,0)/f.length,_=o>20,w=l>=3,S=h||w&&!_&&(v>500||y<10),E=!S&&(_||m>5&&g<2&&m>2*g||v<200&&y>10),b=d.reduce((e,t)=>e+t,0),x=r*s;return{isLayoutShift:E,shiftScore:b/x*.1,isOverlayNoise:S}}(i,l);if(c.isOverlayNoise){A(`Pixel Diff Hydration: Skipping frame ${t} - detected overlay noise (fixed/absolute elements), not true CLS`);continue}if(c.isLayoutShift){s=!0;let r=e[t].match(/-(\d+)ms\.png$/),i=r?parseInt(r[1],10):0;A(`Pixel Diff Hydration: Detected true layout shift at ${i}ms (score: ${c.shiftScore.toFixed(4)})`);let n=process.env.MCP_PORT||"3684";f.push({timestamp:`${i}ms`,timeSinceStart:i,visualDiff:100*c.shiftScore,severity:"high",element:"Hydration-related element",clsScore:c.shiftScore,uxImpact:"🚨 CRITICAL: Fast hydration shift detected - Chrome's observer missed this early shift",beforeFrameUrl:`http://localhost:${n}/api/screenshots/${e[t-1]}`,afterFrameUrl:`http://localhost:${n}/api/screenshots/${e[t]}`})}}catch{}}return s?{detections:f,sessionId:h,totalFrames:u.length,screenshotDir:l,realCLS:{score:.05,grade:"good"}}:{detections:[],sessionId:h,totalFrames:u.length,screenshotDir:l,realCLS:{score:0,grade:t.grade}}}return t.shifts.forEach(e=>{let t=e.sources?.[0]?.node||"unknown",r=e.sources?.[0]?.position;if(!e.sources?.[0]||"unknown"===t||null==r)return void A(`Chrome CLS: Skipping unidentified shift (score: ${e.score.toFixed(4)}) - cannot verify if it's a true CLS or fixed overlay noise`);if("fixed"===r||"absolute"===r)return void A(`Chrome CLS: Filtering out ${t} shift (position: ${r}) - fixed/absolute elements don't cause true layout shifts`);let s=["NAV","HEADER","BUTTON","A"].includes(t.toUpperCase()),i=e.timestamp<1e3,n={NAV:"Navigation header (<nav>)",HEADER:"Page header (<header>)",BUTTON:"Button (<button>)",A:"Link (<a>)"}[t.toUpperCase()]||t,o="low",a="Minor visual adjustment";s&&i?(o="high",a=`🚨 CRITICAL: ${n} shifted during initial load - highly visible and disruptive to user interaction`):s?(o="medium",a=`⚠️ ${n} shifted - affects navigation/interaction`):i&&(o="medium",a="Shift during page load - may cause mis-clicks");let l=Math.round(e.timestamp),c=m.get(l);f.push({timestamp:`${e.timestamp.toFixed(0)}ms`,timeSinceStart:l,visualDiff:100*e.score,severity:o,element:n,clsScore:e.score,uxImpact:a,beforeFrameUrl:c?.before,afterFrameUrl:c?.after})}),{detections:f,sessionId:h,totalFrames:u.length,screenshotDir:l,realCLS:{score:t.score,grade:t.grade}}}for(let e=1;e<u.length;e++){let t=(0,i.join)(l,u[e-1]),s=(0,i.join)(l,u[e]);try{let i=o.PNG.sync.read((0,r.readFileSync)(t)),a=o.PNG.sync.read((0,r.readFileSync)(s));if(i.width!==a.width||i.height!==a.height)continue;let l=new o.PNG({width:i.width,height:i.height}),c=(0,n.default)(i.data,a.data,l.data,i.width,i.height,{threshold:.1}),d=i.width*i.height,p=c/d*100;if(p>1){let t=u[e].match(/-(\d+)ms\.png$/),r=t?parseInt(t[1],10):0;f.push({timestamp:h,timeSinceStart:r,visualDiff:p,severity:p>10?"high":p>5?"medium":"low"})}}catch{}}return{detections:f,sessionId:h,totalFrames:u.length,screenshotDir:l,captureTrigger:a}}function A(e,t){try{let s=process.env.HOME||process.env.USERPROFILE;if(!s)return;let n=(0,i.join)(s,".d3k","logs");(0,r.existsSync)(n)||(0,r.mkdirSync)(n,{recursive:!0});let o=t||function(){try{let e=process.env.HOME||process.env.USERPROFILE;if(!e)return null;let t=(0,i.join)(e,".d3k");if(!(0,r.existsSync)(t))return null;let s=(0,r.readdirSync)(t).filter(e=>e.endsWith(".json"));if(0===s.length)return null;let n=(0,i.join)(t,s[0]);return JSON.parse((0,r.readFileSync)(n,"utf8")).projectName||null}catch{return null}}();if(!o)return;let a=(0,i.join)(n,`dev3000-${o}-d3k.log`),l=new Date().toISOString(),c=`[${l}] [D3K] ${e}
77
87
  `;(0,r.appendFileSync)(a,c)}catch(e){}}function $(e,t){let r=e.includes("nextjs-dev"),s=e.includes("chrome-devtools");if(e.length>0){A(`MCP Detection: Available MCPs [${e.join(", ")}]`,t);let i=[];r&&i.push("Next.js"),s&&i.push("Chrome DevTools"),i.length>0?A(`MCP Integration: Activated integrations [${i.join(", ")}]`,t):A("MCP Integration: No compatible MCPs detected - running in standalone mode",t)}else A("MCP Detection: No MCPs provided - running in standalone mode",t);return{integrateNextjs:r,integrateChromeDevtools:s}}function D(e,t){let r=Math.ceil(Math.min(2*e,20)*(t?.5:1));return r<=5||r<=60?`${r} minutes`:`${Math.ceil(r/60)} hours`}async function L(e){try{let t=await v("dev3000-nextjs-dev"),r=t.filter(e=>"advanced"===e.category).slice(0,8).map(t=>({function:t.function,reason:t.reason,priority:U(t.function,e)}));return A(`Dynamic Suggestions: Generated ${r.length} Next.js suggestions from ${t.length} discovered capabilities`),r}catch(e){return A(`Dynamic Suggestions: Failed to generate Next.js suggestions - ${e}`),[{function:"analyze_build_process",reason:"Advanced Next.js build system analysis",priority:"high"},{function:"debug_server_rendering",reason:"Server-side rendering debugging",priority:"high"}]}}async function M(e){try{let t=await v("dev3000-chrome-devtools"),r=t.filter(e=>"advanced"===e.category).slice(0,8).map(t=>({function:t.function,reason:t.reason,priority:U(t.function,e)}));return A(`Dynamic Suggestions: Generated ${r.length} Chrome DevTools suggestions from ${t.length} discovered capabilities`),r}catch(e){return A(`Dynamic Suggestions: Failed to generate Chrome DevTools suggestions - ${e}`),[{function:"inspect_element",reason:"Deep DOM inspection with DevTools-level detail",priority:"high"},{function:"access_console",reason:"Direct browser console access and manipulation",priority:"high"}]}}function U(e,t){let r=e.toLowerCase(),s=t?.toLowerCase()||"";for(let{pattern:e,keywords:t}of[{pattern:/hydration/,keywords:["hydration","ssr","render"]},{pattern:/build|compile/,keywords:["build","compile","analyze"]},{pattern:/network|fetch|api/,keywords:["network","request","intercept","performance"]},{pattern:/console|error/,keywords:["console","error","debug"]},{pattern:/click|interaction/,keywords:["dom","element","inspect"]}])if(e.test(s)&&t.some(e=>r.includes(e)))return"high";return["debug","profile","analyze","trace","inspect"].some(e=>r.includes(e))?"medium":"low"}async function F({availableMcps:e,focusArea:t="all",errorContext:r}){let s=[];A(`Workflow Creation: Creating integrated workflow with focus area [${t}]${r?`, error context [${r}]`:""}`);let i=e||[];e&&0!==e.length||(A("Workflow Creation: No MCPs provided, starting proactive discovery"),i=await I());let{integrateNextjs:n,integrateChromeDevtools:o}=$(i);s.push("🎼 **INTELLIGENT DEBUGGING ORCHESTRATOR**"),s.push(`🔍 Available MCPs: ${i.length>0?i.join(", "):"none (will attempt discovery)"}`),s.push(`⚡ Integrations: ${n?"✅ Next.js":"❌ Next.js"} | ${o?"✅ Chrome DevTools":"❌ Chrome DevTools"}`),r&&s.push(`🎯 Error Context: ${r}`),s.push("");let a=n?await L(r):[],l=o?await M(r):[];if(!n&&!o)return s.push("⚠️ **NO INTEGRATIONS DETECTED**"),s.push("Running in standalone mode. For enhanced debugging:"),s.push("• Add 'nextjs-dev' MCP for Next.js-specific analysis"),s.push("• Add 'chrome-devtools' MCP for browser inspection"),s.push(""),s.push("💡 **STANDALONE WORKFLOW:**"),s.push("1. Use fix_my_app(mode='snapshot') to analyze current issues"),s.push("2. Use execute_browser_action to reproduce and verify fixes"),s.push("3. Implement suggested code fixes"),{content:[{type:"text",text:s.join("\n")}]};s.push("🎪 **3-PHASE INTEGRATED WORKFLOW**"),s.push(""),s.push("🕐 **PHASE 1: PARALLEL DATA COLLECTION** (2-3 minutes)"),s.push("Execute these functions in parallel across all available MCPs:"),s.push(""),s.push("📊 **dev3000 (this MCP):**"),s.push(`• fix_my_app(focusArea='${t}', integrateNextjs=${n}, integrateChromeDevtools=${o}, returnRawData=true)`),s.push(" → Get comprehensive error analysis with interaction data"),s.push(""),n&&(s.push("⚛️ **nextjs-dev MCP:**"),a.filter(e=>"high"===e.priority).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";s.push(`• ${e.function}${t}`),s.push(` → ${e.reason}`)}),s.push("")),o&&(s.push("🌐 **chrome-devtools MCP:**"),l.filter(e=>"high"===e.priority).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";s.push(`• ${e.function}${t}`),s.push(` → ${e.reason}`)}),s.push("")),s.push("🕑 **PHASE 2: DEEP TARGETED ANALYSIS** (3-5 minutes)"),s.push("Based on Phase 1 findings, execute these functions sequentially:"),s.push(""),s.push("🔗 **Cross-MCP Correlation:**"),s.push("• Compare dev3000 interaction data with browser console errors"),n&&(s.push("• Correlate dev3000 server errors with Next.js build/runtime logs"),s.push("• Match interaction timestamps with Next.js request handling")),s.push("• Identify root cause by combining all data sources"),s.push(""),s.push("🎯 **Targeted Deep Dive:**"),s.push("• Use fix_my_app(mode='bisect') for regression analysis if needed"),o&&l.filter(e=>"medium"===e.priority).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";s.push(`• ${e.function}${t} - ${e.reason}`)}),s.push(""),s.push("🕒 **PHASE 3: FIX IMPLEMENTATION & VERIFICATION** (5-10 minutes)"),s.push("Orchestrated fix implementation with cross-MCP verification:"),s.push(""),s.push("🔧 **Implementation:**"),s.push("• Apply code fixes identified by dev3000 error analysis"),n&&s.push("• Address Next.js-specific issues (hydration, build, etc.)"),s.push("• Use dev3000's interaction data to create comprehensive test scenarios"),s.push(""),s.push("✅ **Verification Workflow:**"),s.push("• Use execute_browser_action to replay exact user interactions that caused errors"),o&&(s.push("• Use chrome-devtools to monitor console for error resolution"),s.push("• Take before/after screenshots to verify UI fixes")),n&&s.push("• Use nextjs-dev to verify build success and runtime stability"),s.push("• Re-run fix_my_app to confirm error resolution"),s.push(""),s.push("🚀 **INTEGRATION BENEFITS:**"),n&&o?(s.push("🎯 **Triple-Stack Coverage:**"),s.push("• dev3000: AI-powered error correlation + interaction replay"),s.push("• nextjs-dev: Framework-specific server-side analysis"),s.push("• chrome-devtools: Precise browser state inspection"),s.push("• Combined: Complete full-stack debugging with 90%+ issue resolution"),s.push(""),s.push("⚡ **Expected Results:**"),s.push("• 3x faster debugging vs using tools individually"),s.push("• AI-powered error correlation across all layers"),s.push("• Systematic fix verification workflow"),s.push("• Comprehensive interaction-based testing")):n?(s.push("🎯 **Server-Side Enhanced Coverage:**"),s.push("• dev3000: Client error analysis + interaction data"),s.push("• nextjs-dev: Server-side logs and build analysis"),s.push("• Combined: Full-stack Next.js debugging coverage")):o&&(s.push("🎯 **Browser-Enhanced Coverage:**"),s.push("• dev3000: Error detection + interaction replay"),s.push("• chrome-devtools: Detailed browser state inspection"),s.push("• Combined: Complete client-side debugging workflow"));let c=D(5,n||o);return s.push(""),s.push(`⏱️ **ESTIMATED TOTAL TIME:** ${c}`),s.push(`🎼 **dev3000 orchestrates ${i.length} MCPs for maximum debugging power!**`),{content:[{type:"text",text:s.join("\n")}]}}async function j(e){let{beforeImageUrl:t,afterImageUrl:r,context:s}=e,i=[];return i.push("🔍 **VISUAL DIFF ANALYSIS**"),i.push(""),i.push("To analyze the visual differences between these two screenshots:"),i.push(""),i.push("**Step 1: Fetch and analyze the BEFORE image**"),i.push(`Use WebFetch with URL: \`${t}\``),i.push('Prompt: "Describe this screenshot in detail, focusing on layout and visible elements"'),i.push(""),i.push("**Step 2: Fetch and analyze the AFTER image**"),i.push(`Use WebFetch with URL: \`${r}\``),i.push('Prompt: "Describe this screenshot in detail, focusing on layout and visible elements"'),i.push(""),i.push("**Step 3: Compare and describe the differences**"),s?i.push(`Focus on: ${s}`):(i.push("Look for:"),i.push("• Elements that appeared or disappeared"),i.push("• Elements that moved or changed position"),i.push("• Elements that changed size or style"),i.push("• New content that pushed existing content")),i.push(""),i.push("**Step 4: Identify the layout shift cause**"),i.push("Describe what visual change occurred that caused the layout shift."),i.push("Be specific about:"),i.push("• Which element(s) changed"),i.push("• What appeared/moved/resized"),i.push("• Why this caused other elements to shift"),{content:[{type:"text",text:i.join("\n")}]}}async function B(e){let{selector:t}=e;try{let e=d();if(0===e.length)return{content:[{type:"text",text:"❌ **NO ACTIVE SESSIONS**\n\nNo active dev3000 sessions found. Make sure your app is running with dev3000."}]};let s=JSON.parse((0,r.readFileSync)(e[0].sessionFile,"utf-8")).cdpUrl;if(!s)try{let e=await fetch("http://localhost:9222/json"),t=(await e.json()).find(e=>"page"===e.type&&!e.url.startsWith("chrome://"));t&&(s=t.webSocketDebuggerUrl)}catch{return{content:[{type:"text",text:"❌ **NO CDP CONNECTION**\n\nFailed to find Chrome DevTools Protocol URL."}]}}if(!s)return{content:[{type:"text",text:"❌ **NO CDP CONNECTION**\n\nNo Chrome DevTools Protocol URL found."}]};let i=`
78
88
  (function() {