dev3000 0.0.116 → 0.0.117

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 (48) hide show
  1. package/dist/dev-environment.d.ts.map +1 -1
  2. package/dist/dev-environment.js +45 -4
  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/prerender-manifest.json +3 -3
  8. package/mcp-server/.next/server/app/_global-error.html +2 -2
  9. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  10. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/mcp-server/.next/server/app/_global-error.segments/_head.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/_head.segment.rsc +1 -1
  19. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  20. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/mcp-server/.next/server/app/auth/error.html +1 -1
  24. package/mcp-server/.next/server/app/auth/error.rsc +1 -1
  25. package/mcp-server/.next/server/app/auth/error.segments/_full.segment.rsc +1 -1
  26. package/mcp-server/.next/server/app/auth/error.segments/_head.segment.rsc +1 -1
  27. package/mcp-server/.next/server/app/auth/error.segments/_index.segment.rsc +1 -1
  28. package/mcp-server/.next/server/app/auth/error.segments/_tree.segment.rsc +1 -1
  29. package/mcp-server/.next/server/app/auth/error.segments/auth/error/__PAGE__.segment.rsc +1 -1
  30. package/mcp-server/.next/server/app/auth/error.segments/auth/error.segment.rsc +1 -1
  31. package/mcp-server/.next/server/app/auth/error.segments/auth.segment.rsc +1 -1
  32. package/mcp-server/.next/server/app/index.html +1 -1
  33. package/mcp-server/.next/server/app/index.rsc +1 -1
  34. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  35. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +1 -1
  36. package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  37. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +1 -1
  38. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  39. package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js +111 -111
  40. package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js.map +1 -1
  41. package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js +52 -52
  42. package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js.map +1 -1
  43. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  44. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  45. package/package.json +1 -1
  46. /package/mcp-server/.next/static/{G5taiQ-Jp0B_MdvkQuoIT → 3tu8GDHzRVmtUnaVw3VqB}/_buildManifest.js +0 -0
  47. /package/mcp-server/.next/static/{G5taiQ-Jp0B_MdvkQuoIT → 3tu8GDHzRVmtUnaVw3VqB}/_clientMiddlewareManifest.json +0 -0
  48. /package/mcp-server/.next/static/{G5taiQ-Jp0B_MdvkQuoIT → 3tu8GDHzRVmtUnaVw3VqB}/_ssgManifest.js +0 -0
@@ -267,7 +267,108 @@ ${e.stdout||"(no output)"}`),e.stderr&&console.log(` ⚠️ Chrome CDP test std
267
267
  ${t.stdout||"(no output)"}`),t.stderr&&console.log(` ⚠️ spawn() test stderr: ${t.stderr}`)}catch(e){console.log(` ❌ spawn() test failed: ${e instanceof Error?e.message:String(e)}`)}if(console.log(" 🔍 ===== END spawn() TEST ====="),await c.runCommand({cmd:"sh",args:["-c",`mkdir -p /home/vercel-sandbox/.d3k/logs && cd ${e} && MCP_SKIP_PERMISSIONS=true d3k --no-tui --debug --headless --browser ${I} > /home/vercel-sandbox/.d3k/logs/d3k-startup.log 2>&1`],detached:!0}),o&&console.log(" ✅ d3k started in detached mode (headless)"),o&&console.log(" ⏳ Waiting for d3k to start..."),await new Promise(e=>setTimeout(e,5e3)),o){console.log(" 🔍 Checking d3k process status...");let e=await l(c,{cmd:"sh",args:["-c","ps aux | grep -E '(d3k|pnpm|next)' | grep -v grep || echo 'No d3k/pnpm/next processes found'"]});console.log(` 📋 Process list:
268
268
  ${e.stdout}`),console.log(" 🔍 Checking for d3k log files...");let t=await l(c,{cmd:"sh",args:["-c","ls -lah /home/vercel-sandbox/.d3k/logs/ 2>/dev/null || echo 'No .d3k/logs directory found'"]});console.log(` 📋 Log files:
269
269
  ${t.stdout}`);let r=await l(c,{cmd:"sh",args:["-c",'for log in /home/vercel-sandbox/.d3k/logs/*.log; do [ -f "$log" ] && echo "=== $log ===" && head -50 "$log" || true; done 2>/dev/null || true']});console.log(` 📋 Initial log content:
270
- ${r.stdout}`)}o&&console.log(" ⏳ Waiting for dev server on port 3000...");try{await cG(c,3e3,12e4,o)}catch(e){console.log(` ⚠️ Dev server failed to start: ${e instanceof Error?e.message:String(e)}`),console.log(" 🔍 Checking d3k logs for errors...");try{let e=await l(c,{cmd:"sh",args:["-c","cat /home/vercel-sandbox/.d3k/logs/*.log 2>/dev/null || echo 'No log files found'"]});0===e.exitCode&&(console.log(" 📋 All d3k logs:"),console.log(e.stdout))}catch(e){console.log(` ⚠️ Could not read d3k logs: ${e instanceof Error?e.message:String(e)}`)}throw e}let E=c.domain(3e3);o&&console.log(` ✅ Dev server ready: ${E}`),o&&console.log(" ⏳ Waiting for MCP server..."),await cG(c,3684,6e4,o);let Q=c.domain(3684);o&&console.log(` ✅ MCP server ready: ${Q}`),o&&console.log(" ⏳ Waiting for d3k to initialize Chrome and populate CDP URL...");let C=await cV(c,3e4,o);if(C)o&&console.log(` ✅ CDP URL ready: ${C}`);else{console.log(" ⚠️ CDP URL not found - chrome-devtools MCP features may not work"),console.log(" 📋 === d3k LOG DUMP (CDP URL not found) ===");try{let e=await l(c,{cmd:"sh",args:["-c",'for log in /home/vercel-sandbox/.d3k/logs/*.log; do [ -f "$log" ] && echo "\\n=== $log ===" && cat "$log" || true; done 2>/dev/null || echo "No log files found"']});console.log(e.stdout)}catch(e){console.log(` ⚠️ Could not read logs: ${e instanceof Error?e.message:String(e)}`)}console.log(" 📋 === END d3k LOG DUMP ===")}if(o){console.log(" 📋 === d3k FULL LOG DUMP (after initialization) ===");let e=await l(c,{cmd:"sh",args:["-c",'for log in /home/vercel-sandbox/.d3k/logs/*.log; do [ -f "$log" ] && echo "\\n=== $log ===" && cat "$log" || true; done 2>/dev/null || echo "No log files found"']});console.log(e.stdout),console.log(" 📋 === END d3k LOG DUMP ===")}console.log(` 🔍 Testing dev server accessibility at ${E}...`);try{let e=await fetch(E,{method:"GET",redirect:"manual"});console.log(` ✅ Dev server responded with status: ${e.status} ${e.statusText}`),(308===e.status||401===e.status)&&console.log(` ℹ️ Dev server returned ${e.status}, this is expected for protected deployments (use bypass token)`)}catch(e){console.log(` ⚠️ WARNING: Could not fetch dev server: ${e instanceof Error?e.message:String(e)}`)}return o&&console.log(" ✅ d3k sandbox ready!"),{sandbox:c,devUrl:E,mcpUrl:Q,projectName:a,bypassToken:void 0,cleanup:async()=>{o&&console.log(" 🧹 Cleaning up sandbox..."),await c.stop(),o&&console.log(" ✅ Sandbox stopped")}}}catch(e){try{await c.stop()}catch{}throw e}}async function cG(e,t,r,n=!1){let i,A,s=Date.now(),o=e.domain(t);for(;Date.now()-s<r;){try{let e=await fetch(o,{method:"HEAD",redirect:"manual"});if(A=e.status,n&&e.status!==A&&console.log(` 🔍 Port ${t} check: status ${e.status} ${e.statusText}`),e.ok||404===e.status||308===e.status||401===e.status){n&&console.log(` ✅ Port ${t} is ready (status ${e.status})`);return}e.status>=400&&404!==e.status&&(i=`HTTP ${e.status} ${e.statusText}`,n&&console.log(` ⚠️ Port ${t} returned ${i}`))}catch(r){let e=r instanceof Error?r.message:String(r);i!==e&&(i=e,n&&console.log(` ⚠️ Port ${t} check failed: ${e}`))}await new Promise(e=>setTimeout(e,1e3))}throw Error(`Server on port ${t} did not become ready within ${r}ms. Last status: ${A??"no response"}, Last error: ${i??"none"}`)}async function cV(e,t,r=!1){let n=Date.now(),i=null;for(;Date.now()-n<t;){try{let t=await e.runCommand({cmd:"sh",args:["-c",'for f in /home/vercel-sandbox/.d3k/*.json; do [ -f "$f" ] && cat "$f" 2>/dev/null && echo ""; done']}),A="";for await(let e of t.logs())"stdout"===e.stream&&(A+=e.data);await t.wait();let s={exitCode:t.exitCode,stdout:A};if(0===s.exitCode&&s.stdout.trim()){for(let e of s.stdout.trim().split("\n"))if(e.trim().startsWith("{"))try{let t=JSON.parse(e);if(t.cdpUrl?.startsWith("ws://"))return i=t.cdpUrl,r&&console.log(` ✅ CDP URL found: ${i}`),i}catch{}}r&&(Date.now()-n)%5e3<1e3&&console.log(` ⏳ Waiting for CDP URL... (${Math.round((Date.now()-n)/1e3)}s)`)}catch(e){r&&console.log(` ⚠️ Error checking CDP URL: ${e instanceof Error?e.message:String(e)}`)}await new Promise(e=>setTimeout(e,1e3))}return r&&console.log(` ⚠️ CDP URL not available after ${t}ms - chrome-devtools MCP may not work`),null}e.i(43699);var cZ=e.i(75525),cJ=Object.defineProperty,cj=Object.getOwnPropertyNames,cW=(e,t)=>cJ(e,"name",{value:t,configurable:!0}),cz=(e,t)=>function(){return e&&(t=(0,e[cj(e)[0]])(e=0)),t},cq=(e,t)=>{for(var r in t)cJ(e,r,{get:t[r],enumerable:!0})},cX={};async function cK(e,t,r){let n=await e.runCommand({cmd:t,args:r}),i="",A="";for await(let e of n.logs())"stdout"===e.stream?i+=e.data:A+=e.data;return await n.wait(),{exitCode:n.exitCode,stdout:i,stderr:A}}async function c0(e,t,r,n,i="/vercel/sandbox"){console.log(`[Screenshot] Capturing ${n} screenshot of ${t}...`);let A=`
270
+ ${r.stdout}`)}o&&console.log(" ⏳ Waiting for dev server on port 3000...");try{await cG(c,3e3,12e4,o)}catch(e){console.log(` ⚠️ Dev server failed to start: ${e instanceof Error?e.message:String(e)}`),console.log(" 🔍 Checking d3k logs for errors...");try{let e=await l(c,{cmd:"sh",args:["-c","cat /home/vercel-sandbox/.d3k/logs/*.log 2>/dev/null || echo 'No log files found'"]});0===e.exitCode&&(console.log(" 📋 All d3k logs:"),console.log(e.stdout))}catch(e){console.log(` ⚠️ Could not read d3k logs: ${e instanceof Error?e.message:String(e)}`)}throw e}let E=c.domain(3e3);o&&console.log(` ✅ Dev server ready: ${E}`),o&&console.log(" ⏳ Waiting for MCP server..."),await cG(c,3684,6e4,o);let Q=c.domain(3684);o&&console.log(` ✅ MCP server ready: ${Q}`),o&&console.log(" ⏳ Waiting for d3k to initialize Chrome and populate CDP URL...");let C=await cV(c,3e4,o);if(C)o&&console.log(` ✅ CDP URL ready: ${C}`);else{console.log(" ⚠️ CDP URL not found - chrome-devtools MCP features may not work"),console.log(" 📋 === d3k LOG DUMP (CDP URL not found) ===");try{let e=await l(c,{cmd:"sh",args:["-c",'for log in /home/vercel-sandbox/.d3k/logs/*.log; do [ -f "$log" ] && echo "\\n=== $log ===" && cat "$log" || true; done 2>/dev/null || echo "No log files found"']});console.log(e.stdout)}catch(e){console.log(` ⚠️ Could not read logs: ${e instanceof Error?e.message:String(e)}`)}console.log(" 📋 === END d3k LOG DUMP ===")}if(o){console.log(" 📋 === d3k FULL LOG DUMP (after initialization) ===");let e=await l(c,{cmd:"sh",args:["-c",'for log in /home/vercel-sandbox/.d3k/logs/*.log; do [ -f "$log" ] && echo "\\n=== $log ===" && cat "$log" || true; done 2>/dev/null || echo "No log files found"']});console.log(e.stdout),console.log(" 📋 === END d3k LOG DUMP ===")}console.log(` 🔍 Testing dev server accessibility at ${E}...`);try{let e=await fetch(E,{method:"GET",redirect:"manual"});console.log(` ✅ Dev server responded with status: ${e.status} ${e.statusText}`),(308===e.status||401===e.status)&&console.log(` ℹ️ Dev server returned ${e.status}, this is expected for protected deployments (use bypass token)`)}catch(e){console.log(` ⚠️ WARNING: Could not fetch dev server: ${e instanceof Error?e.message:String(e)}`)}return o&&console.log(" ✅ d3k sandbox ready!"),{sandbox:c,devUrl:E,mcpUrl:Q,projectName:a,bypassToken:void 0,cleanup:async()=>{o&&console.log(" 🧹 Cleaning up sandbox..."),await c.stop(),o&&console.log(" ✅ Sandbox stopped")}}}catch(e){try{await c.stop()}catch{}throw e}}async function cG(e,t,r,n=!1){let i,A,s=Date.now(),o=e.domain(t);for(;Date.now()-s<r;){try{let e=await fetch(o,{method:"HEAD",redirect:"manual"});if(A=e.status,n&&e.status!==A&&console.log(` 🔍 Port ${t} check: status ${e.status} ${e.statusText}`),e.ok||404===e.status||308===e.status||401===e.status){n&&console.log(` ✅ Port ${t} is ready (status ${e.status})`);return}e.status>=400&&404!==e.status&&(i=`HTTP ${e.status} ${e.statusText}`,n&&console.log(` ⚠️ Port ${t} returned ${i}`))}catch(r){let e=r instanceof Error?r.message:String(r);i!==e&&(i=e,n&&console.log(` ⚠️ Port ${t} check failed: ${e}`))}await new Promise(e=>setTimeout(e,1e3))}throw Error(`Server on port ${t} did not become ready within ${r}ms. Last status: ${A??"no response"}, Last error: ${i??"none"}`)}async function cV(e,t,r=!1){let n=Date.now(),i=null;for(;Date.now()-n<t;){try{let t=await e.runCommand({cmd:"sh",args:["-c",'for f in /home/vercel-sandbox/.d3k/*.json; do [ -f "$f" ] && cat "$f" 2>/dev/null && echo ""; done']}),A="";for await(let e of t.logs())"stdout"===e.stream&&(A+=e.data);await t.wait();let s={exitCode:t.exitCode,stdout:A};if(0===s.exitCode&&s.stdout.trim()){for(let e of s.stdout.trim().split("\n"))if(e.trim().startsWith("{"))try{let t=JSON.parse(e);if(t.cdpUrl?.startsWith("ws://"))return i=t.cdpUrl,r&&console.log(` ✅ CDP URL found: ${i}`),i}catch{}}r&&(Date.now()-n)%5e3<1e3&&console.log(` ⏳ Waiting for CDP URL... (${Math.round((Date.now()-n)/1e3)}s)`)}catch(e){r&&console.log(` ⚠️ Error checking CDP URL: ${e instanceof Error?e.message:String(e)}`)}await new Promise(e=>setTimeout(e,1e3))}return r&&console.log(` ⚠️ CDP URL not available after ${t}ms - chrome-devtools MCP may not work`),null}e.i(43699);var cZ=e.i(75525),cJ=Object.defineProperty,cj=Object.getOwnPropertyNames,cW=(e,t)=>cJ(e,"name",{value:t,configurable:!0}),cz=(e,t)=>function(){return e&&(t=(0,e[cj(e)[0]])(e=0)),t},cq=(e,t)=>{for(var r in t)cJ(e,r,{get:t[r],enumerable:!0})},cX={};async function cK(e,t){console.log(`[Step 1] Identifying affected pages from ${e.length} changed files...`);let r=[/\/pages\/(.*)\.(tsx?|jsx?)$/,/\/app\/(.*)\/(page|route)\.(tsx?|jsx?)$/,/\/routes\/(.*)\.(tsx?|jsx?)$/,/\/src\/routes\/(.*)\.(svelte|tsx?|jsx?)$/,/\.page\.(tsx?|jsx?)$/,/\.route\.(tsx?|jsx?)$/],n=[];for(let t of e)for(let e of r){let r=t.match(e);if(r){let e=r[1]||"";(e=(e=e.replace(/\/(page|route|index)$/,""))||"/").startsWith("/")||(e=`/${e}`),n.includes(e)||n.push(e);break}}if(console.log(`[Step 1] Detected ${n.length} pages from file patterns`),t&&t.length>10){console.log("[Step 1] Analyzing PR description for mentioned pages...");let r=ua({apiKey:process.env.AI_GATEWAY_API_KEY,baseURL:"https://ai-gateway.vercel.sh/v1/ai"})("anthropic/claude-sonnet-4-20250514"),i=`Analyze this PR description and extract any URL paths or routes that are mentioned or affected.
271
+
272
+ PR Description:
273
+ ${t}
274
+
275
+ Changed files:
276
+ ${e.join("\n")}
277
+
278
+ Return ONLY a JSON array of paths (e.g., ["/", "/about", "/api/users"]). If no specific paths are mentioned, return an empty array [].
279
+ Do not include explanations, just the JSON array.`;try{let{text:e}=await cR({model:r,prompt:i,maxTokens:500}),t=e.match(/\[.*\]/);if(t){let e=JSON.parse(t[0]);for(let t of e)t&&!n.includes(t)&&n.push(t);console.log(`[Step 1] AI found ${e.length} additional pages`)}}catch(e){console.error("[Step 1] AI analysis failed:",e)}}return 0===n.length&&(console.log("[Step 1] No specific pages detected, checking homepage"),n.push("/")),console.log(`[Step 1] Final pages to check: ${n.join(", ")}`),n}async function c0(e,t){console.log(`[Step 2] Crawling ${t.length} pages on ${e}`);let r=[];for(let n of t){console.log(`[Step 2] Crawling: ${n}`);try{let t=`${e}${n}`,i=await fetch(t,{method:"GET",headers:{"User-Agent":"dev3000-pr-checker/1.0",Accept:"text/html,application/json,*/*"}}),A=i.headers.get("content-type")||"",s=A.includes("text/html"),o=A.includes("application/json"),a="";(s||o)&&(a=(await i.text()).substring(0,1e3)),r.push({page:n,url:t,status:i.status,statusText:i.statusText,contentType:A,bodyPreview:a,headers:Object.fromEntries(i.headers.entries())}),console.log(`[Step 2] ${n}: ${i.status} ${i.statusText}`)}catch(t){console.error(`[Step 2] Failed to crawl ${n}:`,t),r.push({page:n,url:`${e}${n}`,status:0,statusText:"Fetch failed",error:t instanceof Error?t.message:String(t)})}}return console.log(`[Step 2] Crawled ${r.length} pages`),r}async function c1(e,t,r,n){console.log("[Step 3] Verifying PR claims against actual behavior...");let i=ua({apiKey:process.env.AI_GATEWAY_API_KEY,baseURL:"https://ai-gateway.vercel.sh/v1/ai"})("anthropic/claude-sonnet-4-20250514"),A=`You are verifying a Pull Request for accuracy. Compare the PR's claims with the actual deployment behavior.
280
+
281
+ PR Title: ${e}
282
+
283
+ PR Description:
284
+ ${t}
285
+
286
+ Changed Files:
287
+ ${n.join("\n")}
288
+
289
+ Crawl Results from Preview Deployment:
290
+ ${JSON.stringify(r,null,2)}
291
+
292
+ Your task:
293
+ 1. Analyze whether the PR's claimed changes match the actual behavior shown in the crawl results
294
+ 2. Check if pages load successfully (200 status codes)
295
+ 3. Identify any errors or unexpected behavior
296
+ 4. Verify the changes work as described
297
+
298
+ Respond in this exact JSON format:
299
+ {
300
+ "allChecksPassed": boolean,
301
+ "summary": "Brief summary of findings",
302
+ "details": {
303
+ "claimsVerified": ["List of claims that were verified"],
304
+ "issues": ["List of any issues found"],
305
+ "warnings": ["List of warnings"]
306
+ }
307
+ }
308
+
309
+ Only return valid JSON, no additional text.`;try{let{text:e}=await cR({model:i,prompt:A,maxTokens:1500}),t=e.match(/\{[\s\S]*\}/);if(t){let e=JSON.parse(t[0]);return console.log(`[Step 3] Verification complete: ${e.allChecksPassed?"PASSED":"FAILED"}`),e}return console.error("[Step 3] Failed to parse AI response"),{allChecksPassed:!1,summary:"Verification failed - could not parse AI response",details:{claimsVerified:[],issues:["AI verification returned invalid format"],warnings:[]}}}catch(e){return console.error("[Step 3] Verification failed:",e),{allChecksPassed:!1,summary:`Verification error: ${e instanceof Error?e.message:String(e)}`,details:{claimsVerified:[],issues:[e instanceof Error?e.message:String(e)],warnings:[]}}}}async function c2(e,t){console.log(`[Step 4] Checking performance for ${t.length} pages`);let r=[];for(let n of t){console.log(`[Step 4] Measuring performance: ${n}`);try{let t=`${e}${n}`,i=Date.now(),A=await fetch(t,{method:"GET",headers:{"User-Agent":"dev3000-pr-checker/1.0",Accept:"text/html,*/*"}}),s=Date.now()-i,o=Number.parseInt(A.headers.get("content-length")||"0",10);r.push({page:n,loadTime:s,contentLength:o,status:A.status,isSlow:s>2e3}),console.log(`[Step 4] ${n}: ${s}ms, ${o} bytes`)}catch(e){console.error(`[Step 4] Performance check failed for ${n}:`,e),r.push({page:n,loadTime:0,contentLength:0,status:0,error:e instanceof Error?e.message:String(e),isSlow:!1})}}let n=r.filter(e=>e.isSlow);return console.log(`[Step 4] Performance check complete. ${n.length} slow pages found.`),{results:r,slowPagesCount:n.length,summary:{avgLoadTime:r.reduce((e,t)=>e+t.loadTime,0)/r.length,slowPages:n.map(e=>e.page)}}}async function c4(e){console.log("[Step 5] Generating comprehensive report...");let{prTitle:t,prBody:r,prNumber:n,previewUrl:i,changedFiles:A,pagesToCheck:s,crawlResults:o,verification:a,performanceResults:l,repoOwner:u,repoName:c}=e,d=`# PR Verification Report
310
+
311
+ `;for(let e of(d+=`**PR**: #${n} - ${t}
312
+ **Repository**: ${u}/${c}
313
+ **Preview URL**: ${i}
314
+ **Timestamp**: ${new Date().toISOString()}
315
+
316
+ ## Summary
317
+
318
+ ${a.allChecksPassed?"✅":"❌"} ${a.summary}
319
+
320
+ ## Changed Files
321
+
322
+ `,A))d+=`- ${e}
323
+ `;for(let e of(d+=`
324
+ ## Pages Checked
325
+
326
+ `,s))d+=`- ${e}
327
+ `;if(d+=`
328
+ ## Verification Results
329
+
330
+ `,a.details.claimsVerified.length>0){for(let e of(d+=`### Claims Verified \u2705
331
+
332
+ `,a.details.claimsVerified))d+=`- ${e}
333
+ `;d+=`
334
+ `}if(a.details.issues.length>0){for(let e of(d+=`### Issues Found \u274C
335
+
336
+ `,a.details.issues))d+=`- ${e}
337
+ `;d+=`
338
+ `}if(a.details.warnings.length>0){for(let e of(d+=`### Warnings \u26A0\uFE0F
339
+
340
+ `,a.details.warnings))d+=`- ${e}
341
+ `;d+=`
342
+ `}for(let e of(d+=`## Crawl Results
343
+
344
+ `,o)){let t=200===e.status?"✅":e.status>=400?"❌":"⚠️";d+=`### ${t} ${e.page}
345
+
346
+ - **URL**: ${e.url}
347
+ - **Status**: ${e.status} ${e.statusText}
348
+ `,e.contentType&&(d+=`- **Content-Type**: ${e.contentType}
349
+ `),e.error&&(d+=`- **Error**: ${e.error}
350
+ `),d+=`
351
+ `}if(d+=`## Performance Analysis
352
+
353
+ **Average Load Time**: ${Math.round(l.summary.avgLoadTime)}ms
354
+
355
+ `,l.slowPagesCount>0){for(let e of(d+=`\u26A0\uFE0F **Slow Pages** (>2s):
356
+ `,l.summary.slowPages))d+=`- ${e}
357
+ `;d+=`
358
+ `}else d+=`\u2705 All pages loaded in under 2 seconds
359
+
360
+ `;for(let e of(d+=`### Detailed Metrics
361
+
362
+ `,l.results))d+=`- **${e.page}**: ${e.loadTime}ms (${e.contentLength} bytes)
363
+ `;return d+=`
364
+ ## PR Description
365
+
366
+ ${r||"(No description provided)"}
367
+
368
+ ---
369
+
370
+ *Generated by dev3000 PR Checker*
371
+ `,console.log(`[Step 5] Report generated (${d.length} characters)`),d}async function c9(e,t,r,n){console.log("[Step 6] Uploading report to blob storage...");let i=new Date().toISOString().replace(/[:.]/g,"-"),A=`pr-check-${t}-${r}-pr${n}-${i}.md`,s=await (0,q.put)(A,e,{access:"public",contentType:"text/markdown"});return console.log(`[Step 6] Report uploaded: ${s.url}`),{blobUrl:s.url,filename:A}}cq(cX,{checkPerformance:()=>c2,crawlPreviewPages:()=>c0,generateReport:()=>c4,identifyAffectedPages:()=>cK,uploadReport:()=>c9,verifyPRClaims:()=>c1});var c6=cz({"app/api/cloud/check-pr/steps.ts"(){cW(cK,"identifyAffectedPages"),cW(c0,"crawlPreviewPages"),cW(c1,"verifyPRClaims"),cW(c2,"checkPerformance"),cW(c4,"generateReport"),cW(c9,"uploadReport"),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//identifyAffectedPages",cK),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//crawlPreviewPages",c0),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//verifyPRClaims",c1),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//checkPerformance",c2),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//generateReport",c4),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//uploadReport",c9)}}),c3={};async function c5(e,t,r){let n=await e.runCommand({cmd:t,args:r}),i="",A="";for await(let e of n.logs())"stdout"===e.stream?i+=e.data:A+=e.data;return await n.wait(),{exitCode:n.exitCode,stdout:i,stderr:A}}async function c8(e,t,r,n,i="/vercel/sandbox"){console.log(`[Screenshot] Capturing ${n} screenshot of ${t}...`);let A=`
271
372
  const puppeteer = require('puppeteer-core');
272
373
 
273
374
  (async () => {
@@ -316,9 +417,9 @@ const puppeteer = require('puppeteer-core');
316
417
  process.exit(1);
317
418
  }
318
419
  })();
319
- `;try{let t=`${i}/_screenshot.js`,r=await cK(e,"sh",["-c",`cat > ${t} << 'SCRIPT_EOF'
420
+ `;try{let t=`${i}/_screenshot.js`,r=await c5(e,"sh",["-c",`cat > ${t} << 'SCRIPT_EOF'
320
421
  ${A}
321
- SCRIPT_EOF`]);if(0!==r.exitCode)return console.log(`[Screenshot] Failed to write script: ${r.stderr}`),null;let s=await e.runCommand({cmd:"node",args:[t],cwd:i}),o="",a="";for await(let e of s.logs())"stdout"===e.stream?o+=e.data:a+=e.data;await s.wait();let l=a.match(/PAGE_TITLE:(.*)/);if(l&&console.log(`[Screenshot] Page title: "${l[1]}"`),0!==s.exitCode)return console.log(`[Screenshot] Failed to capture: ${a}`),null;let u=o.trim();if(u&&u.length>100)return console.log(`[Screenshot] Captured ${n} screenshot (${u.length} bytes base64)`),u;return console.log("[Screenshot] No valid screenshot data returned"),null}catch(e){return console.log(`[Screenshot] Error: ${e instanceof Error?e.message:String(e)}`),null}}async function c1(e,t,r){try{let n=Buffer.from(e,"base64"),i=new Date().toISOString().replace(/[:.]/g,"-"),A=`screenshot-${t}-${r}-${i}.png`,s=await (0,q.put)(A,n,{access:"public",contentType:"image/png"});return console.log(`[Screenshot] Uploaded ${t} screenshot: ${s.url}`),s.url}catch(e){return console.log(`[Screenshot] Upload failed: ${e instanceof Error?e.message:String(e)}`),null}}async function c2(e,t,r,n,i){console.log(`[Step 0] Creating d3k sandbox for ${r}...`),console.log(`[Step 0] Repository: ${e}`),console.log(`[Step 0] Branch: ${t}`),console.log(`[Step 0] VERCEL_OIDC_TOKEN from env: ${!!process.env.VERCEL_OIDC_TOKEN}`),console.log(`[Step 0] VERCEL_OIDC_TOKEN passed as param: ${!!i}`),console.log(`[Step 0] VERCEL_TOKEN available: ${!!process.env.VERCEL_TOKEN}`),console.log(`[Step 0] User access token provided: ${!!n}`),i&&!process.env.VERCEL_OIDC_TOKEN&&(process.env.VERCEL_OIDC_TOKEN=i,console.log("[Step 0] Set VERCEL_OIDC_TOKEN from workflow context"));let A=await cH({repoUrl:e,branch:t,projectDir:"",packageManager:"pnpm",debug:!0});console.log("[Step 0] Sandbox created successfully"),console.log(`[Step 0] Dev URL: ${A.devUrl}`),console.log(`[Step 0] MCP URL: ${A.mcpUrl}`),console.log("[Step 0] Getting Chromium path for screenshots...");let s="/tmp/chromium";try{let e=await cK(A.sandbox,"node",["-e","require('@sparticuz/chromium').executablePath().then(p => console.log(p))"]);0===e.exitCode&&e.stdout.trim()&&(s=e.stdout.trim(),console.log(`[Step 0] Chromium path: ${s}`))}catch{console.log(`[Step 0] Could not get chromium path, using default: ${s}`)}console.log("[Step 0] ===== CHROMIUM CDP TEST (d3k exact command) =====");try{let e=`
422
+ SCRIPT_EOF`]);if(0!==r.exitCode)return console.log(`[Screenshot] Failed to write script: ${r.stderr}`),null;let s=await e.runCommand({cmd:"node",args:[t],cwd:i}),o="",a="";for await(let e of s.logs())"stdout"===e.stream?o+=e.data:a+=e.data;await s.wait();let l=a.match(/PAGE_TITLE:(.*)/);if(l&&console.log(`[Screenshot] Page title: "${l[1]}"`),0!==s.exitCode)return console.log(`[Screenshot] Failed to capture: ${a}`),null;let u=o.trim();if(u&&u.length>100)return console.log(`[Screenshot] Captured ${n} screenshot (${u.length} bytes base64)`),u;return console.log("[Screenshot] No valid screenshot data returned"),null}catch(e){return console.log(`[Screenshot] Error: ${e instanceof Error?e.message:String(e)}`),null}}async function c7(e,t,r){try{let n=Buffer.from(e,"base64"),i=new Date().toISOString().replace(/[:.]/g,"-"),A=`screenshot-${t}-${r}-${i}.png`,s=await (0,q.put)(A,n,{access:"public",contentType:"image/png"});return console.log(`[Screenshot] Uploaded ${t} screenshot: ${s.url}`),s.url}catch(e){return console.log(`[Screenshot] Upload failed: ${e instanceof Error?e.message:String(e)}`),null}}async function de(e,t,r,n,i){console.log(`[Step 0] Creating d3k sandbox for ${r}...`),console.log(`[Step 0] Repository: ${e}`),console.log(`[Step 0] Branch: ${t}`),console.log(`[Step 0] VERCEL_OIDC_TOKEN from env: ${!!process.env.VERCEL_OIDC_TOKEN}`),console.log(`[Step 0] VERCEL_OIDC_TOKEN passed as param: ${!!i}`),console.log(`[Step 0] VERCEL_TOKEN available: ${!!process.env.VERCEL_TOKEN}`),console.log(`[Step 0] User access token provided: ${!!n}`),i&&!process.env.VERCEL_OIDC_TOKEN&&(process.env.VERCEL_OIDC_TOKEN=i,console.log("[Step 0] Set VERCEL_OIDC_TOKEN from workflow context"));let A=await cH({repoUrl:e,branch:t,projectDir:"",packageManager:"pnpm",debug:!0});console.log("[Step 0] Sandbox created successfully"),console.log(`[Step 0] Dev URL: ${A.devUrl}`),console.log(`[Step 0] MCP URL: ${A.mcpUrl}`),console.log("[Step 0] Getting Chromium path for screenshots...");let s="/tmp/chromium";try{let e=await c5(A.sandbox,"node",["-e","require('@sparticuz/chromium').executablePath().then(p => console.log(p))"]);0===e.exitCode&&e.stdout.trim()&&(s=e.stdout.trim(),console.log(`[Step 0] Chromium path: ${s}`))}catch{console.log(`[Step 0] Could not get chromium path, using default: ${s}`)}console.log("[Step 0] ===== CHROMIUM CDP TEST (d3k exact command) =====");try{let e=`
322
423
  exec 2>&1
323
424
  echo "=== Chromium CDP Test (d3k exact command) ==="
324
425
  echo "Chromium path: ${s}"
@@ -397,9 +498,9 @@ LOADINGHTML
397
498
  fi
398
499
  echo ""
399
500
  echo "=== End d3k exact command test ==="
400
- `,t=await cK(A.sandbox,"bash",["-c",e]);console.log(`[Step 0] d3k Chrome test (exit ${t.exitCode}):
401
- ${t.stdout||"(no output)"}`),t.stderr&&console.log(`[Step 0] d3k Chrome test stderr: ${t.stderr}`)}catch(e){console.log(`[Step 0] d3k Chrome test error: ${e instanceof Error?e.message:String(e)}`)}console.log("[Step 0] ===== END d3k EXACT COMMAND TEST ====="),console.log("[Step 0] Capturing BEFORE screenshot...");let o=null;try{let e=await c0(A.sandbox,"http://localhost:3000",s,"before");e&&(o=await c1(e,"before",r))}catch(e){console.log(`[Step 0] Before screenshot failed: ${e instanceof Error?e.message:String(e)}`)}console.log("[Step 0] Capturing CLS metrics from inside sandbox...");let a=null,l=null;try{let e='curl -s -X POST http://localhost:3684/mcp -H "Content-Type: application/json" -d \'{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"fix_my_app","arguments":{"mode":"snapshot","focusArea":"performance","returnRawData":true}}}\'';console.log("[Step 0] Executing MCP command inside sandbox..."),console.log(`[Step 0] MCP command: ${e.substring(0,200)}...`);let t="",r="",n=-1;try{let i=await cK(A.sandbox,"bash",["-c",e]);t=i.stdout,r=i.stderr,n=i.exitCode,console.log(`[Step 0] MCP command exit code: ${n}`),console.log(`[Step 0] MCP stdout length: ${t.length} bytes`),r&&console.log(`[Step 0] MCP stderr: ${r.substring(0,500)}`)}catch(t){let e=t instanceof Error?t.message:String(t);console.log(`[Step 0] sandbox.runCommand threw: ${e}`),l=`sandbox.runCommand failed: ${e}`}if(0===n&&t)try{let e=JSON.parse(t);if(e.result?.content){for(let t of e.result.content)if("text"===t.type&&t.text)try{a=JSON.parse(t.text),console.log("[Step 0] Successfully parsed CLS data");break}catch{a={rawOutput:t.text}}}console.log("[Step 0] CLS data captured:",JSON.stringify(a).substring(0,500))}catch(e){l=`Failed to parse MCP response: ${e instanceof Error?e.message:String(e)}`,console.log(`[Step 0] ${l}`),console.log(`[Step 0] Raw stdout: ${t.substring(0,1e3)}`)}else 0!==n&&!l&&(l=`MCP command failed with exit code ${n}`,console.log(`[Step 0] ${l}`),r&&console.log(`[Step 0] stderr: ${r}`))}catch(e){l=`MCP execution error: ${e instanceof Error?e.message:String(e)}`,console.log(`[Step 0] ${l}`)}console.log("[Step 0] === Dumping sandbox logs before returning ===");try{let e=await cK(A.sandbox,"sh",["-c",'for log in /home/vercel-sandbox/.d3k/logs/*.log; do [ -f "$log" ] && echo "=== $log ===" && tail -100 "$log" || true; done 2>/dev/null || echo "No log files found"']);console.log(e.stdout)}catch(e){console.log(`[Step 0] Failed to dump logs: ${e instanceof Error?e.message:String(e)}`)}console.log("[Step 0] === End sandbox log dump ==="),console.log("[Step 0] Capturing git diff from sandbox...");let u=null;try{let e=await cK(A.sandbox,"sh",["-c","cd /vercel/sandbox && git diff --no-color 2>/dev/null || echo 'No git diff available'"]);0===e.exitCode&&e.stdout.trim()&&"No git diff available"!==e.stdout.trim()?(u=e.stdout.trim(),console.log(`[Step 0] Git diff captured (${u.length} chars)`),console.log(`[Step 0] Git diff preview:
402
- ${u.substring(0,500)}...`)):console.log("[Step 0] No git changes detected in sandbox")}catch(e){console.log(`[Step 0] Failed to capture git diff: ${e instanceof Error?e.message:String(e)}`)}return{mcpUrl:A.mcpUrl,devUrl:A.devUrl,bypassToken:A.bypassToken,clsData:a,mcpError:l,beforeScreenshotUrl:o,chromiumPath:s,gitDiff:u}}async function c4(e,t,r,n,i,A){if(n)return console.log("[Step 1] Using CLS data captured in Step 0"),A&&console.log(`[Step 1] Before screenshot from Step 0: ${A}`),{logAnalysis:JSON.stringify(n,null,2),beforeScreenshotUrl:A||null};i&&console.log(`[Step 1] Note: MCP error from Step 0: ${i}`);let s=!!r,o=r||e,a=s?e:null;console.log(`[Step 1] Fetching logs from: ${o}`),console.log(`[Step 1] Using sandbox: ${s?"yes":"no"}`),a&&console.log(`[Step 1] MCP URL: ${a}`),console.log(`[Step 1] Bypass token: ${t?"provided":"not provided"}`);try{let e=t?`${o}?x-vercel-protection-bypass=${t}`:o;if(console.log(`[Step 1] Final URL: ${e.replace(t||"","***")}`),s&&a){console.log("[Step 1] Using d3k MCP server to capture CLS metrics and errors..."),console.log("[Step 1] Validating d3k MCP server access...");let t=new AbortController,r=setTimeout(()=>t.abort(),3e4);try{let e=await fetch(`${a}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:0,method:"tools/list"}),signal:t.signal});if(clearTimeout(r),e.ok){let t=await e.text();try{let e=null;for(let r of t.split("\n"))if(r.startsWith("data: "))try{e=JSON.parse(r.substring(6));break}catch{}e||(e=JSON.parse(t));let r=e.result?.tools?.map(e=>e.name)||[];console.log(`[Step 1] \u2705 d3k MCP server accessible`),console.log(`[Step 1] Available tools (${r.length}): ${r.join(", ")}`);let n=r.some(e=>e.includes("chrome-devtools")),i=r.some(e=>e.includes("nextjs")),A=r.includes("fix_my_app");console.log(`[Step 1] Chrome DevTools MCP: ${n?"✅":"❌"}`),console.log(`[Step 1] Next.js DevTools MCP: ${i?"✅":"❌"}`),console.log(`[Step 1] fix_my_app tool: ${A?"✅":"❌"}`)}catch{console.log(`[Step 1] MCP server responded but couldn't parse tools list: ${t.substring(0,200)}`)}}else console.log(`[Step 1] \u26A0\uFE0F MCP server not accessible: ${e.status}`)}catch(n){clearTimeout(r);let e=n instanceof Error?n.message:String(n),t=n instanceof Error&&"AbortError"===n.name;console.log(`[Step 1] \u26A0\uFE0F Failed to validate MCP server: ${t?"Timed out after 30s":e}`)}console.log("[Step 1] Navigating browser to app URL...");let n=new AbortController,i=setTimeout(()=>n.abort(),3e4);try{let t=await fetch(`${a}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:0,method:"tools/call",params:{name:"execute_browser_action",arguments:{action:"navigate",params:{url:e}}}}),signal:n.signal});clearTimeout(i),t.ok?console.log("[Step 1] Browser navigation completed"):console.log(`[Step 1] Browser navigation failed: ${t.status}`)}catch(t){clearTimeout(i);let e=t instanceof Error&&"AbortError"===t.name;console.log(`[Step 1] Browser navigation error: ${e?"Timed out after 30s":t instanceof Error?t.message:String(t)}`)}console.log("[Step 1] Waiting 5s for page load..."),await new Promise(e=>setTimeout(e,5e3));let A=null;console.log("[Step 1] Capturing 'before' screenshot...");let s=new AbortController,l=setTimeout(()=>s.abort(),3e4);try{let e=await fetch(`${a}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:0,method:"tools/call",params:{name:"chrome-devtools_take_snapshot",arguments:{}}}),signal:s.signal});if(clearTimeout(l),e.ok){let t=await e.text();for(let e of t.split("\n"))if(e.startsWith("data: "))try{let t=JSON.parse(e.substring(6));if(t.result?.content){for(let e of t.result.content)if("image"===e.type&&e.data){let t=Buffer.from(e.data,"base64"),r=new Date().toISOString().replace(/[:.]/g,"-"),n=`screenshot-before-${r}.png`;A=(await (0,q.put)(n,t,{access:"public",contentType:"image/png"})).url,console.log(`[Step 1] \u2705 Before screenshot uploaded: ${A}`)}}}catch{}A||(console.log("[Step 1] Screenshot response received but no image data found"),console.log(`[Step 1] Response preview: ${t.substring(0,500)}`))}else console.log(`[Step 1] Screenshot request failed: ${e.status}`)}catch(t){clearTimeout(l);let e=t instanceof Error&&"AbortError"===t.name;console.log(`[Step 1] Screenshot capture error: ${e?"Timed out after 30s":t instanceof Error?t.message:String(t)}`)}console.log("[Step 1] Fetching d3k logs from sandbox to verify it's working...");let u=new AbortController,c=setTimeout(()=>u.abort(),15e3);try{let e=await fetch(`${a}/api/logs`,{signal:u.signal});if(clearTimeout(c),e.ok){let t=await e.text();console.log(`[Step 1] d3k logs (last 1000 chars):
501
+ `,t=await c5(A.sandbox,"bash",["-c",e]);console.log(`[Step 0] d3k Chrome test (exit ${t.exitCode}):
502
+ ${t.stdout||"(no output)"}`),t.stderr&&console.log(`[Step 0] d3k Chrome test stderr: ${t.stderr}`)}catch(e){console.log(`[Step 0] d3k Chrome test error: ${e instanceof Error?e.message:String(e)}`)}console.log("[Step 0] ===== END d3k EXACT COMMAND TEST ====="),console.log("[Step 0] Capturing BEFORE screenshot...");let o=null;try{let e=await c8(A.sandbox,"http://localhost:3000",s,"before");e&&(o=await c7(e,"before",r))}catch(e){console.log(`[Step 0] Before screenshot failed: ${e instanceof Error?e.message:String(e)}`)}console.log("[Step 0] Capturing CLS metrics from inside sandbox...");let a=null,l=null;try{let e='curl -s -X POST http://localhost:3684/mcp -H "Content-Type: application/json" -d \'{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"fix_my_app","arguments":{"mode":"snapshot","focusArea":"performance","returnRawData":true}}}\'';console.log("[Step 0] Executing MCP command inside sandbox..."),console.log(`[Step 0] MCP command: ${e.substring(0,200)}...`);let t="",r="",n=-1;try{let i=await c5(A.sandbox,"bash",["-c",e]);t=i.stdout,r=i.stderr,n=i.exitCode,console.log(`[Step 0] MCP command exit code: ${n}`),console.log(`[Step 0] MCP stdout length: ${t.length} bytes`),r&&console.log(`[Step 0] MCP stderr: ${r.substring(0,500)}`)}catch(t){let e=t instanceof Error?t.message:String(t);console.log(`[Step 0] sandbox.runCommand threw: ${e}`),l=`sandbox.runCommand failed: ${e}`}if(0===n&&t)try{let e=JSON.parse(t);if(e.result?.content){for(let t of e.result.content)if("text"===t.type&&t.text)try{a=JSON.parse(t.text),console.log("[Step 0] Successfully parsed CLS data");break}catch{a={rawOutput:t.text}}}console.log("[Step 0] CLS data captured:",JSON.stringify(a).substring(0,500))}catch(e){l=`Failed to parse MCP response: ${e instanceof Error?e.message:String(e)}`,console.log(`[Step 0] ${l}`),console.log(`[Step 0] Raw stdout: ${t.substring(0,1e3)}`)}else 0!==n&&!l&&(l=`MCP command failed with exit code ${n}`,console.log(`[Step 0] ${l}`),r&&console.log(`[Step 0] stderr: ${r}`))}catch(e){l=`MCP execution error: ${e instanceof Error?e.message:String(e)}`,console.log(`[Step 0] ${l}`)}console.log("[Step 0] === Dumping sandbox logs before returning ===");try{let e=await c5(A.sandbox,"sh",["-c",'for log in /home/vercel-sandbox/.d3k/logs/*.log; do [ -f "$log" ] && echo "=== $log ===" && tail -100 "$log" || true; done 2>/dev/null || echo "No log files found"']);console.log(e.stdout)}catch(e){console.log(`[Step 0] Failed to dump logs: ${e instanceof Error?e.message:String(e)}`)}console.log("[Step 0] === End sandbox log dump ==="),console.log("[Step 0] Capturing git diff from sandbox...");let u=null;try{let e=await c5(A.sandbox,"sh",["-c","cd /vercel/sandbox && git diff --no-color 2>/dev/null || echo 'No git diff available'"]);0===e.exitCode&&e.stdout.trim()&&"No git diff available"!==e.stdout.trim()?(u=e.stdout.trim(),console.log(`[Step 0] Git diff captured (${u.length} chars)`),console.log(`[Step 0] Git diff preview:
503
+ ${u.substring(0,500)}...`)):console.log("[Step 0] No git changes detected in sandbox")}catch(e){console.log(`[Step 0] Failed to capture git diff: ${e instanceof Error?e.message:String(e)}`)}return{mcpUrl:A.mcpUrl,devUrl:A.devUrl,bypassToken:A.bypassToken,clsData:a,mcpError:l,beforeScreenshotUrl:o,chromiumPath:s,gitDiff:u}}async function dt(e,t,r,n,i,A){if(n)return console.log("[Step 1] Using CLS data captured in Step 0"),A&&console.log(`[Step 1] Before screenshot from Step 0: ${A}`),{logAnalysis:JSON.stringify(n,null,2),beforeScreenshotUrl:A||null};i&&console.log(`[Step 1] Note: MCP error from Step 0: ${i}`);let s=!!r,o=r||e,a=s?e:null;console.log(`[Step 1] Fetching logs from: ${o}`),console.log(`[Step 1] Using sandbox: ${s?"yes":"no"}`),a&&console.log(`[Step 1] MCP URL: ${a}`),console.log(`[Step 1] Bypass token: ${t?"provided":"not provided"}`);try{let e=t?`${o}?x-vercel-protection-bypass=${t}`:o;if(console.log(`[Step 1] Final URL: ${e.replace(t||"","***")}`),s&&a){console.log("[Step 1] Using d3k MCP server to capture CLS metrics and errors..."),console.log("[Step 1] Validating d3k MCP server access...");let t=new AbortController,r=setTimeout(()=>t.abort(),3e4);try{let e=await fetch(`${a}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:0,method:"tools/list"}),signal:t.signal});if(clearTimeout(r),e.ok){let t=await e.text();try{let e=null;for(let r of t.split("\n"))if(r.startsWith("data: "))try{e=JSON.parse(r.substring(6));break}catch{}e||(e=JSON.parse(t));let r=e.result?.tools?.map(e=>e.name)||[];console.log(`[Step 1] \u2705 d3k MCP server accessible`),console.log(`[Step 1] Available tools (${r.length}): ${r.join(", ")}`);let n=r.some(e=>e.includes("chrome-devtools")),i=r.some(e=>e.includes("nextjs")),A=r.includes("fix_my_app");console.log(`[Step 1] Chrome DevTools MCP: ${n?"✅":"❌"}`),console.log(`[Step 1] Next.js DevTools MCP: ${i?"✅":"❌"}`),console.log(`[Step 1] fix_my_app tool: ${A?"✅":"❌"}`)}catch{console.log(`[Step 1] MCP server responded but couldn't parse tools list: ${t.substring(0,200)}`)}}else console.log(`[Step 1] \u26A0\uFE0F MCP server not accessible: ${e.status}`)}catch(n){clearTimeout(r);let e=n instanceof Error?n.message:String(n),t=n instanceof Error&&"AbortError"===n.name;console.log(`[Step 1] \u26A0\uFE0F Failed to validate MCP server: ${t?"Timed out after 30s":e}`)}console.log("[Step 1] Navigating browser to app URL...");let n=new AbortController,i=setTimeout(()=>n.abort(),3e4);try{let t=await fetch(`${a}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:0,method:"tools/call",params:{name:"execute_browser_action",arguments:{action:"navigate",params:{url:e}}}}),signal:n.signal});clearTimeout(i),t.ok?console.log("[Step 1] Browser navigation completed"):console.log(`[Step 1] Browser navigation failed: ${t.status}`)}catch(t){clearTimeout(i);let e=t instanceof Error&&"AbortError"===t.name;console.log(`[Step 1] Browser navigation error: ${e?"Timed out after 30s":t instanceof Error?t.message:String(t)}`)}console.log("[Step 1] Waiting 5s for page load..."),await new Promise(e=>setTimeout(e,5e3));let A=null;console.log("[Step 1] Capturing 'before' screenshot...");let s=new AbortController,l=setTimeout(()=>s.abort(),3e4);try{let e=await fetch(`${a}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:0,method:"tools/call",params:{name:"chrome-devtools_take_snapshot",arguments:{}}}),signal:s.signal});if(clearTimeout(l),e.ok){let t=await e.text();for(let e of t.split("\n"))if(e.startsWith("data: "))try{let t=JSON.parse(e.substring(6));if(t.result?.content){for(let e of t.result.content)if("image"===e.type&&e.data){let t=Buffer.from(e.data,"base64"),r=new Date().toISOString().replace(/[:.]/g,"-"),n=`screenshot-before-${r}.png`;A=(await (0,q.put)(n,t,{access:"public",contentType:"image/png"})).url,console.log(`[Step 1] \u2705 Before screenshot uploaded: ${A}`)}}}catch{}A||(console.log("[Step 1] Screenshot response received but no image data found"),console.log(`[Step 1] Response preview: ${t.substring(0,500)}`))}else console.log(`[Step 1] Screenshot request failed: ${e.status}`)}catch(t){clearTimeout(l);let e=t instanceof Error&&"AbortError"===t.name;console.log(`[Step 1] Screenshot capture error: ${e?"Timed out after 30s":t instanceof Error?t.message:String(t)}`)}console.log("[Step 1] Fetching d3k logs from sandbox to verify it's working...");let u=new AbortController,c=setTimeout(()=>u.abort(),15e3);try{let e=await fetch(`${a}/api/logs`,{signal:u.signal});if(clearTimeout(c),e.ok){let t=await e.text();console.log(`[Step 1] d3k logs (last 1000 chars):
403
504
  ${t.slice(-1e3)}`)}else console.log(`[Step 1] Could not fetch d3k logs: ${e.status}`)}catch(t){clearTimeout(c);let e=t instanceof Error&&"AbortError"===t.name;console.log(`[Step 1] Failed to fetch d3k logs: ${e?"Timed out after 15s":t instanceof Error?t.message:String(t)}`)}console.log("[Step 1] Calling fix_my_app with focusArea='performance'...");let d=new AbortController,g=setTimeout(()=>d.abort(),18e4);try{let e=await fetch(`${a}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"tools/call",params:{name:"fix_my_app",arguments:{mode:"snapshot",focusArea:"performance",timeRangeMinutes:5,returnRawData:!1}}}),signal:d.signal});if(clearTimeout(g),!e.ok)throw Error(`MCP request failed: ${e.status}`);let t=await e.text();console.log(`[Step 1] fix_my_app response length: ${t.length} bytes`),console.log(`[Step 1] fix_my_app response preview (first 500 chars):
404
505
  ${t.substring(0,500)}`);let r=t.split("\n");console.log(`[Step 1] Response split into ${r.length} lines`);let n="",i=0,s=0;for(let e of r)if(e.startsWith("data: ")){i++;try{let t=JSON.parse(e.substring(6));if(console.log(`[Step 1] Parsed JSON line ${i}:`,JSON.stringify(t).substring(0,200)),t.result?.content)for(let e of t.result.content)"text"===e.type&&(s++,n+=e.text,console.log(`[Step 1] Added text content block ${s}, length: ${e.text.length}`));else t.error&&console.log(`[Step 1] ERROR in response: ${JSON.stringify(t.error)}`)}catch(t){console.log(`[Step 1] Failed to parse JSON line ${i}: ${t instanceof Error?t.message:String(t)}`),console.log(`[Step 1] Problem line: ${e.substring(0,200)}`)}}return console.log(`[Step 1] Processed ${i} data lines, ${s} content blocks`),console.log(`[Step 1] Got ${n.length} chars from fix_my_app (performance analysis)`),0===n.length&&console.log(`[Step 1] WARNING: fix_my_app returned NO data. Full response:
405
506
  ${t}`),{logAnalysis:`d3k Performance Analysis for ${o}
@@ -444,7 +545,7 @@ ${i.substring(0,2e3)}
444
545
 
445
546
  Error: ${e}
446
547
 
447
- This may indicate the dev server is not accessible or has crashed.`,beforeScreenshotUrl:null}}}}async function c9(e,t){console.log("[Step 2] Invoking AI agent to analyze logs...");let r=ua({apiKey:process.env.AI_GATEWAY_API_KEY,baseURL:"https://ai-gateway.vercel.sh/v1/ai"})("anthropic/claude-sonnet-4-20250514"),n=`You are a skilled software engineer debugging an application.
548
+ This may indicate the dev server is not accessible or has crashed.`,beforeScreenshotUrl:null}}}}async function dr(e,t){console.log("[Step 2] Invoking AI agent to analyze logs...");let r=ua({apiKey:process.env.AI_GATEWAY_API_KEY,baseURL:"https://ai-gateway.vercel.sh/v1/ai"})("anthropic/claude-sonnet-4-20250514"),n=`You are a skilled software engineer debugging an application.
448
549
 
449
550
  The dev server is running at: ${t}
450
551
 
@@ -491,7 +592,7 @@ Format your response EXACTLY as follows:
491
592
  IMPORTANT:
492
593
  - The Git Patch section must be a valid unified diff that can be applied directly with 'git apply'.
493
594
  - If no errors are found, respond with "\u2705 **SYSTEM HEALTHY** - No errors found" and do NOT include a Git Patch section.
494
- - Only include a Git Patch if there are actual issues that need fixing.`,{text:i}=await cR({model:r,prompt:n});return console.log(`[Step 2] AI agent response (first 500 chars): ${i.substring(0,500)}...`),i}async function c6(e,t,r,n,i,A){console.log("[Step 3] Uploading fix proposal to blob storage..."),i&&console.log(`[Step 3] Including before screenshot: ${i}`),A&&console.log(`[Step 3] Including git diff (${A.length} chars)`);let s=i?`## Before Screenshot
595
+ - Only include a Git Patch if there are actual issues that need fixing.`,{text:i}=await cR({model:r,prompt:n});return console.log(`[Step 2] AI agent response (first 500 chars): ${i.substring(0,500)}...`),i}async function dn(e,t,r,n,i,A){console.log("[Step 3] Uploading fix proposal to blob storage..."),i&&console.log(`[Step 3] Including before screenshot: ${i}`),A&&console.log(`[Step 3] Including git diff (${A.length} chars)`);let s=i?`## Before Screenshot
495
596
 
496
597
  This screenshot was captured when the sandbox dev server first loaded, proving the page rendered successfully.
497
598
 
@@ -547,7 +648,7 @@ dev3000 monitors your development server, captures errors in real-time, and uses
547
648
  - Suggest specific code changes
548
649
 
549
650
  Learn more at https://github.com/vercel-labs/dev3000
550
- `,u=a.replace(/[:.]/g,"-"),c=`fix-${t}-${u}.md`,d=await (0,q.put)(c,l,{access:"public",contentType:"text/markdown"});return console.log(`[Step 3] Fix proposal uploaded to: ${d.url}`),{success:!0,projectName:t,fixProposal:e,blobUrl:d.url,beforeScreenshotUrl:i||null,message:"Fix analysis completed and uploaded to blob storage"}}async function c3(e,t,r,n,i,A){console.log(`[Step 4] Creating GitHub PR for ${r}/${n}...`);let s=process.env.GITHUB_TOKEN;if(!s)return console.error("[Step 4] GITHUB_TOKEN not found in environment"),{success:!1,error:"GitHub token not configured"};try{let o=e.match(/```diff\n([\s\S]*?)\n```/);if(!o)return console.error("[Step 4] No git patch found in fix proposal"),{success:!1,error:"No git patch found in fix proposal"};let a=o[1];console.log(`[Step 4] Extracted patch (${a.length} chars)`);let l=c5(a);if(0===l.length)return console.error("[Step 4] Failed to parse any file changes from patch"),{success:!1,error:"Failed to parse file changes from patch"};console.log(`[Step 4] Parsed ${l.length} file change(s)`);let u=`dev3000-fix-${A}-${Date.now()}`;console.log(`[Step 4] Branch name: ${u}`);let c=await fetch(`https://api.github.com/repos/${r}/${n}/git/ref/heads/${i}`,{headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json"}});if(!c.ok){let e=await c.text();return console.error(`[Step 4] Failed to get base branch: ${e}`),{success:!1,error:`Failed to get base branch: ${c.status}`}}let d=(await c.json()).object.sha;console.log(`[Step 4] Base SHA: ${d}`);let g=await fetch(`https://api.github.com/repos/${r}/${n}/git/refs`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","Content-Type":"application/json"},body:JSON.stringify({ref:`refs/heads/${u}`,sha:d})});if(!g.ok){let e=await g.text();return console.error(`[Step 4] Failed to create branch: ${e}`),{success:!1,error:`Failed to create branch: ${g.status}`}}for(let e of(console.log(`[Step 4] Created branch: ${u}`),l)){console.log(`[Step 4] Processing file: ${e.path}`);let t=await fetch(`https://api.github.com/repos/${r}/${n}/contents/${e.path}?ref=${u}`,{headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json"}}),i="",o="";if(t.ok){let e=await t.json();o=e.sha,i=Buffer.from(e.content,"base64").toString("utf-8")}else console.log("[Step 4] File doesn't exist, will create new file");let a=c8(i,e.changes),l=await fetch(`https://api.github.com/repos/${r}/${n}/contents/${e.path}`,{method:"PUT",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","Content-Type":"application/json"},body:JSON.stringify({message:`Fix: Apply dev3000 fix for ${A}`,content:Buffer.from(a).toString("base64"),branch:u,...o&&{sha:o}})});if(!l.ok){let t=await l.text();return console.error(`[Step 4] Failed to update file ${e.path}: ${t}`),{success:!1,error:`Failed to update file ${e.path}: ${l.status}`}}console.log(`[Step 4] Updated file: ${e.path}`)}let h=`## Automated Fix Proposal
651
+ `,u=a.replace(/[:.]/g,"-"),c=`fix-${t}-${u}.md`,d=await (0,q.put)(c,l,{access:"public",contentType:"text/markdown"});return console.log(`[Step 3] Fix proposal uploaded to: ${d.url}`),{success:!0,projectName:t,fixProposal:e,blobUrl:d.url,beforeScreenshotUrl:i||null,message:"Fix analysis completed and uploaded to blob storage"}}async function di(e,t,r,n,i,A){console.log(`[Step 4] Creating GitHub PR for ${r}/${n}...`);let s=process.env.GITHUB_TOKEN;if(!s)return console.error("[Step 4] GITHUB_TOKEN not found in environment"),{success:!1,error:"GitHub token not configured"};try{let o=e.match(/```diff\n([\s\S]*?)\n```/);if(!o)return console.error("[Step 4] No git patch found in fix proposal"),{success:!1,error:"No git patch found in fix proposal"};let a=o[1];console.log(`[Step 4] Extracted patch (${a.length} chars)`);let l=dA(a);if(0===l.length)return console.error("[Step 4] Failed to parse any file changes from patch"),{success:!1,error:"Failed to parse file changes from patch"};console.log(`[Step 4] Parsed ${l.length} file change(s)`);let u=`dev3000-fix-${A}-${Date.now()}`;console.log(`[Step 4] Branch name: ${u}`);let c=await fetch(`https://api.github.com/repos/${r}/${n}/git/ref/heads/${i}`,{headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json"}});if(!c.ok){let e=await c.text();return console.error(`[Step 4] Failed to get base branch: ${e}`),{success:!1,error:`Failed to get base branch: ${c.status}`}}let d=(await c.json()).object.sha;console.log(`[Step 4] Base SHA: ${d}`);let g=await fetch(`https://api.github.com/repos/${r}/${n}/git/refs`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","Content-Type":"application/json"},body:JSON.stringify({ref:`refs/heads/${u}`,sha:d})});if(!g.ok){let e=await g.text();return console.error(`[Step 4] Failed to create branch: ${e}`),{success:!1,error:`Failed to create branch: ${g.status}`}}for(let e of(console.log(`[Step 4] Created branch: ${u}`),l)){console.log(`[Step 4] Processing file: ${e.path}`);let t=await fetch(`https://api.github.com/repos/${r}/${n}/contents/${e.path}?ref=${u}`,{headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json"}}),i="",o="";if(t.ok){let e=await t.json();o=e.sha,i=Buffer.from(e.content,"base64").toString("utf-8")}else console.log("[Step 4] File doesn't exist, will create new file");let a=ds(i,e.changes),l=await fetch(`https://api.github.com/repos/${r}/${n}/contents/${e.path}`,{method:"PUT",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","Content-Type":"application/json"},body:JSON.stringify({message:`Fix: Apply dev3000 fix for ${A}`,content:Buffer.from(a).toString("base64"),branch:u,...o&&{sha:o}})});if(!l.ok){let t=await l.text();return console.error(`[Step 4] Failed to update file ${e.path}: ${t}`),{success:!1,error:`Failed to update file ${e.path}: ${l.status}`}}console.log(`[Step 4] Updated file: ${e.path}`)}let h=`## Automated Fix Proposal
551
652
 
552
653
  This PR was automatically generated by [dev3000](https://github.com/vercel-labs/dev3000) after analyzing your application.
553
654
 
@@ -560,107 +661,6 @@ ${e}
560
661
 
561
662
  \u{1F916} Generated with [Claude Code](https://claude.com/claude-code)
562
663
 
563
- Co-Authored-By: Claude (dev3000) <noreply@anthropic.com>`,p=await fetch(`https://api.github.com/repos/${r}/${n}/pulls`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","Content-Type":"application/json"},body:JSON.stringify({title:`Fix: ${A} - Automated fix from dev3000`,head:u,base:i,body:h})});if(!p.ok){let e=await p.text();return console.error(`[Step 4] Failed to create PR: ${e}`),{success:!1,error:`Failed to create PR: ${p.status}`}}let I=await p.json();return console.log(`[Step 4] Created PR: ${I.html_url}`),{success:!0,prUrl:I.html_url,prNumber:I.number,branch:u}}catch(e){return console.error("[Step 4] Error creating PR:",e),{success:!1,error:e instanceof Error?e.message:String(e)}}}function c5(e){let t=[];for(let r of e.split(/diff --git /).filter(Boolean)){let e=r.split("\n"),n=e[0].match(/a\/(.*?) b\//);if(!n)continue;let i=n[1],A=e.slice(1).join("\n");t.push({path:i,changes:A})}return t}function c8(e,t){let r=e.split("\n"),n=t.split("\n"),i=0,A=[];for(let e of n)if(e.startsWith("@@")){let t=e.match(/@@ -(\d+)/);t&&(i=Number.parseInt(t[1],10)-1)}else e.startsWith("-")?i++:e.startsWith("+")?A.push(e.substring(1)):e.startsWith(" ")&&i<r.length&&(A.push(r[i]),i++);return A.join("\n")}async function c7(e){console.log("[Cleanup] Stopping sandbox...");try{await e(),console.log("[Cleanup] Sandbox stopped successfully")}catch(e){console.error("[Cleanup] Error stopping sandbox:",e)}}cq(cX,{analyzeLogsWithAgent:()=>c9,cleanupSandbox:()=>c7,createD3kSandbox:()=>c2,createGitHubPR:()=>c3,fetchRealLogs:()=>c4,uploadToBlob:()=>c6});var de=cz({"app/api/cloud/fix-workflow/steps.ts"(){cW(cK,"runSandboxCommand"),cW(c0,"captureScreenshotInSandbox"),cW(c1,"uploadScreenshot"),cW(c2,"createD3kSandbox"),cW(c4,"fetchRealLogs"),cW(c9,"analyzeLogsWithAgent"),cW(c6,"uploadToBlob"),cW(c3,"createGitHubPR"),cW(c5,"parsePatchToFileChanges"),cW(c8,"applyPatchChanges"),cW(c7,"cleanupSandbox"),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//createD3kSandbox",c2),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//fetchRealLogs",c4),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//analyzeLogsWithAgent",c9),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//uploadToBlob",c6),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//createGitHubPR",c3),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//cleanupSandbox",c7)}}),dt={};async function dr(e,t){console.log(`[Step 1] Identifying affected pages from ${e.length} changed files...`);let r=[/\/pages\/(.*)\.(tsx?|jsx?)$/,/\/app\/(.*)\/(page|route)\.(tsx?|jsx?)$/,/\/routes\/(.*)\.(tsx?|jsx?)$/,/\/src\/routes\/(.*)\.(svelte|tsx?|jsx?)$/,/\.page\.(tsx?|jsx?)$/,/\.route\.(tsx?|jsx?)$/],n=[];for(let t of e)for(let e of r){let r=t.match(e);if(r){let e=r[1]||"";(e=(e=e.replace(/\/(page|route|index)$/,""))||"/").startsWith("/")||(e=`/${e}`),n.includes(e)||n.push(e);break}}if(console.log(`[Step 1] Detected ${n.length} pages from file patterns`),t&&t.length>10){console.log("[Step 1] Analyzing PR description for mentioned pages...");let r=ua({apiKey:process.env.AI_GATEWAY_API_KEY,baseURL:"https://ai-gateway.vercel.sh/v1/ai"})("anthropic/claude-sonnet-4-20250514"),i=`Analyze this PR description and extract any URL paths or routes that are mentioned or affected.
564
-
565
- PR Description:
566
- ${t}
567
-
568
- Changed files:
569
- ${e.join("\n")}
570
-
571
- Return ONLY a JSON array of paths (e.g., ["/", "/about", "/api/users"]). If no specific paths are mentioned, return an empty array [].
572
- Do not include explanations, just the JSON array.`;try{let{text:e}=await cR({model:r,prompt:i,maxTokens:500}),t=e.match(/\[.*\]/);if(t){let e=JSON.parse(t[0]);for(let t of e)t&&!n.includes(t)&&n.push(t);console.log(`[Step 1] AI found ${e.length} additional pages`)}}catch(e){console.error("[Step 1] AI analysis failed:",e)}}return 0===n.length&&(console.log("[Step 1] No specific pages detected, checking homepage"),n.push("/")),console.log(`[Step 1] Final pages to check: ${n.join(", ")}`),n}async function dn(e,t){console.log(`[Step 2] Crawling ${t.length} pages on ${e}`);let r=[];for(let n of t){console.log(`[Step 2] Crawling: ${n}`);try{let t=`${e}${n}`,i=await fetch(t,{method:"GET",headers:{"User-Agent":"dev3000-pr-checker/1.0",Accept:"text/html,application/json,*/*"}}),A=i.headers.get("content-type")||"",s=A.includes("text/html"),o=A.includes("application/json"),a="";(s||o)&&(a=(await i.text()).substring(0,1e3)),r.push({page:n,url:t,status:i.status,statusText:i.statusText,contentType:A,bodyPreview:a,headers:Object.fromEntries(i.headers.entries())}),console.log(`[Step 2] ${n}: ${i.status} ${i.statusText}`)}catch(t){console.error(`[Step 2] Failed to crawl ${n}:`,t),r.push({page:n,url:`${e}${n}`,status:0,statusText:"Fetch failed",error:t instanceof Error?t.message:String(t)})}}return console.log(`[Step 2] Crawled ${r.length} pages`),r}async function di(e,t,r,n){console.log("[Step 3] Verifying PR claims against actual behavior...");let i=ua({apiKey:process.env.AI_GATEWAY_API_KEY,baseURL:"https://ai-gateway.vercel.sh/v1/ai"})("anthropic/claude-sonnet-4-20250514"),A=`You are verifying a Pull Request for accuracy. Compare the PR's claims with the actual deployment behavior.
573
-
574
- PR Title: ${e}
575
-
576
- PR Description:
577
- ${t}
578
-
579
- Changed Files:
580
- ${n.join("\n")}
581
-
582
- Crawl Results from Preview Deployment:
583
- ${JSON.stringify(r,null,2)}
584
-
585
- Your task:
586
- 1. Analyze whether the PR's claimed changes match the actual behavior shown in the crawl results
587
- 2. Check if pages load successfully (200 status codes)
588
- 3. Identify any errors or unexpected behavior
589
- 4. Verify the changes work as described
590
-
591
- Respond in this exact JSON format:
592
- {
593
- "allChecksPassed": boolean,
594
- "summary": "Brief summary of findings",
595
- "details": {
596
- "claimsVerified": ["List of claims that were verified"],
597
- "issues": ["List of any issues found"],
598
- "warnings": ["List of warnings"]
599
- }
600
- }
601
-
602
- Only return valid JSON, no additional text.`;try{let{text:e}=await cR({model:i,prompt:A,maxTokens:1500}),t=e.match(/\{[\s\S]*\}/);if(t){let e=JSON.parse(t[0]);return console.log(`[Step 3] Verification complete: ${e.allChecksPassed?"PASSED":"FAILED"}`),e}return console.error("[Step 3] Failed to parse AI response"),{allChecksPassed:!1,summary:"Verification failed - could not parse AI response",details:{claimsVerified:[],issues:["AI verification returned invalid format"],warnings:[]}}}catch(e){return console.error("[Step 3] Verification failed:",e),{allChecksPassed:!1,summary:`Verification error: ${e instanceof Error?e.message:String(e)}`,details:{claimsVerified:[],issues:[e instanceof Error?e.message:String(e)],warnings:[]}}}}async function dA(e,t){console.log(`[Step 4] Checking performance for ${t.length} pages`);let r=[];for(let n of t){console.log(`[Step 4] Measuring performance: ${n}`);try{let t=`${e}${n}`,i=Date.now(),A=await fetch(t,{method:"GET",headers:{"User-Agent":"dev3000-pr-checker/1.0",Accept:"text/html,*/*"}}),s=Date.now()-i,o=Number.parseInt(A.headers.get("content-length")||"0",10);r.push({page:n,loadTime:s,contentLength:o,status:A.status,isSlow:s>2e3}),console.log(`[Step 4] ${n}: ${s}ms, ${o} bytes`)}catch(e){console.error(`[Step 4] Performance check failed for ${n}:`,e),r.push({page:n,loadTime:0,contentLength:0,status:0,error:e instanceof Error?e.message:String(e),isSlow:!1})}}let n=r.filter(e=>e.isSlow);return console.log(`[Step 4] Performance check complete. ${n.length} slow pages found.`),{results:r,slowPagesCount:n.length,summary:{avgLoadTime:r.reduce((e,t)=>e+t.loadTime,0)/r.length,slowPages:n.map(e=>e.page)}}}async function ds(e){console.log("[Step 5] Generating comprehensive report...");let{prTitle:t,prBody:r,prNumber:n,previewUrl:i,changedFiles:A,pagesToCheck:s,crawlResults:o,verification:a,performanceResults:l,repoOwner:u,repoName:c}=e,d=`# PR Verification Report
603
-
604
- `;for(let e of(d+=`**PR**: #${n} - ${t}
605
- **Repository**: ${u}/${c}
606
- **Preview URL**: ${i}
607
- **Timestamp**: ${new Date().toISOString()}
608
-
609
- ## Summary
610
-
611
- ${a.allChecksPassed?"✅":"❌"} ${a.summary}
612
-
613
- ## Changed Files
614
-
615
- `,A))d+=`- ${e}
616
- `;for(let e of(d+=`
617
- ## Pages Checked
618
-
619
- `,s))d+=`- ${e}
620
- `;if(d+=`
621
- ## Verification Results
622
-
623
- `,a.details.claimsVerified.length>0){for(let e of(d+=`### Claims Verified \u2705
624
-
625
- `,a.details.claimsVerified))d+=`- ${e}
626
- `;d+=`
627
- `}if(a.details.issues.length>0){for(let e of(d+=`### Issues Found \u274C
628
-
629
- `,a.details.issues))d+=`- ${e}
630
- `;d+=`
631
- `}if(a.details.warnings.length>0){for(let e of(d+=`### Warnings \u26A0\uFE0F
632
-
633
- `,a.details.warnings))d+=`- ${e}
634
- `;d+=`
635
- `}for(let e of(d+=`## Crawl Results
636
-
637
- `,o)){let t=200===e.status?"✅":e.status>=400?"❌":"⚠️";d+=`### ${t} ${e.page}
638
-
639
- - **URL**: ${e.url}
640
- - **Status**: ${e.status} ${e.statusText}
641
- `,e.contentType&&(d+=`- **Content-Type**: ${e.contentType}
642
- `),e.error&&(d+=`- **Error**: ${e.error}
643
- `),d+=`
644
- `}if(d+=`## Performance Analysis
645
-
646
- **Average Load Time**: ${Math.round(l.summary.avgLoadTime)}ms
647
-
648
- `,l.slowPagesCount>0){for(let e of(d+=`\u26A0\uFE0F **Slow Pages** (>2s):
649
- `,l.summary.slowPages))d+=`- ${e}
650
- `;d+=`
651
- `}else d+=`\u2705 All pages loaded in under 2 seconds
652
-
653
- `;for(let e of(d+=`### Detailed Metrics
654
-
655
- `,l.results))d+=`- **${e.page}**: ${e.loadTime}ms (${e.contentLength} bytes)
656
- `;return d+=`
657
- ## PR Description
658
-
659
- ${r||"(No description provided)"}
660
-
661
- ---
662
-
663
- *Generated by dev3000 PR Checker*
664
- `,console.log(`[Step 5] Report generated (${d.length} characters)`),d}async function da(e,t,r,n){console.log("[Step 6] Uploading report to blob storage...");let i=new Date().toISOString().replace(/[:.]/g,"-"),A=`pr-check-${t}-${r}-pr${n}-${i}.md`,s=await (0,q.put)(A,e,{access:"public",contentType:"text/markdown"});return console.log(`[Step 6] Report uploaded: ${s.url}`),{blobUrl:s.url,filename:A}}cq(dt,{checkPerformance:()=>dA,crawlPreviewPages:()=>dn,generateReport:()=>ds,identifyAffectedPages:()=>dr,uploadReport:()=>da,verifyPRClaims:()=>di});var dl=cz({"app/api/cloud/check-pr/steps.ts"(){cW(dr,"identifyAffectedPages"),cW(dn,"crawlPreviewPages"),cW(di,"verifyPRClaims"),cW(dA,"checkPerformance"),cW(ds,"generateReport"),cW(da,"uploadReport"),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//identifyAffectedPages",dr),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//crawlPreviewPages",dn),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//verifyPRClaims",di),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//checkPerformance",dA),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//generateReport",ds),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/steps.ts//uploadReport",da)}});async function du(e){return e.arrayBuffer()}async function dc(e){return e.json()}async function dd(e){return e.text()}async function dg(e){throw Error("You attempted to execute workflow cloudFixWorkflow function directly. To start a workflow, use start(cloudFixWorkflow) from workflow/api")}async function dh(e,t,r,n,i){let{createD3kSandbox:A}=await Promise.resolve().then(()=>(de(),cX));return A(e,t,r,n,i)}async function dp(e,t,r,n,i,A){let{fetchRealLogs:s}=await Promise.resolve().then(()=>(de(),cX));return s(e,t,r,n,i,A)}async function dI(e,t){let{analyzeLogsWithAgent:r}=await Promise.resolve().then(()=>(de(),cX));return r(e,t)}async function df(e,t,r,n,i,A){let{uploadToBlob:s}=await Promise.resolve().then(()=>(de(),cX));return s(e,t,r,n,i,A)}async function dE(e,t,r,n,i,A){let{createGitHubPR:s}=await Promise.resolve().then(()=>(de(),cX));return s(e,t,r,n,i,A)}async function dQ(e){throw Error("You attempted to execute workflow cloudCheckPRWorkflow function directly. To start a workflow, use start(cloudCheckPRWorkflow) from workflow/api")}async function dC(e,t){let{identifyAffectedPages:r}=await Promise.resolve().then(()=>(dl(),dt));return r(e,t)}async function dB(e,t){let{crawlPreviewPages:r}=await Promise.resolve().then(()=>(dl(),dt));return r(e,t)}async function dm(e,t,r,n){let{verifyPRClaims:i}=await Promise.resolve().then(()=>(dl(),dt));return i(e,t,r,n)}async function dy(e,t){let{checkPerformance:r}=await Promise.resolve().then(()=>(dl(),dt));return r(e,t)}async function db(e){let{generateReport:t}=await Promise.resolve().then(()=>(dl(),dt));return t(e)}async function dw(e,t,r,n){let{uploadReport:i}=await Promise.resolve().then(()=>(dl(),dt));return i(e,t,r,n)}cW(du,"__builtin_response_array_buffer"),cW(dc,"__builtin_response_json"),cW(dd,"__builtin_response_text"),(0,z.registerStepFunction)("__builtin_response_array_buffer",du),(0,z.registerStepFunction)("__builtin_response_json",dc),(0,z.registerStepFunction)("__builtin_response_text",dd),cW(dg,"cloudFixWorkflow"),dg.workflowId="workflow//app/api/cloud/fix-workflow/workflow.ts//cloudFixWorkflow",cW(dh,"createD3kSandbox"),cW(dp,"fetchRealLogs"),cW(dI,"analyzeLogsWithAgent"),cW(df,"uploadToBlob"),cW(dE,"createGitHubPR"),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//createD3kSandbox",dh),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//fetchRealLogs",dp),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//analyzeLogsWithAgent",dI),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//uploadToBlob",df),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//createGitHubPR",dE),cW(dQ,"cloudCheckPRWorkflow"),dQ.workflowId="workflow//app/api/cloud/check-pr/workflow.ts//cloudCheckPRWorkflow",cW(dC,"identifyAffectedPagesStep"),cW(dB,"crawlPreviewPagesStep"),cW(dm,"verifyPRClaimsStep"),cW(dy,"checkPerformanceStep"),cW(db,"generateReportStep"),cW(dw,"uploadReportStep"),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//identifyAffectedPagesStep",dC),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//crawlPreviewPagesStep",dB),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//verifyPRClaimsStep",dm),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//checkPerformanceStep",dy),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//generateReportStep",db),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//uploadReportStep",dw),de(),dl(),e.s([],43048),e.i(43048),e.s(["POST",()=>cZ.stepEntrypoint],42530);var dv=e.i(42530);let dD=new R.AppRouteRouteModule({definition:{kind:U.RouteKind.APP_ROUTE,page:"/.well-known/workflow/v1/step/route",pathname:"/.well-known/workflow/v1/step",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/mcp-server/app/.well-known/workflow/v1/step/route.js",nextConfigOutput:"",userland:dv}),{workAsyncStorage:dS,workUnitAsyncStorage:dN,serverHooks:dk}=dD;function dR(){return(0,_.patchFetch)({workAsyncStorage:dS,workUnitAsyncStorage:dN})}async function dU(e,t,r){dD.isDev&&(0,x.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let n="/.well-known/workflow/v1/step/route";n=n.replace(/\/index$/,"")||"/";let i=await dD.prepare(e,t,{srcPage:n,multiZoneDraftMode:!1});if(!i)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:A,params:s,nextConfig:o,parsedUrl:a,isDraftMode:l,prerenderManifest:u,routerServerContext:c,isOnDemandRevalidate:d,revalidateOnlyGenerated:g,resolvedPathname:h,clientReferenceManifest:p,serverActionsManifest:I}=i,f=(0,L.normalizeAppPath)(n),E=!!(u.dynamicRoutes[f]||u.routes[h]),Q=async()=>((null==c?void 0:c.render404)?await c.render404(e,t,a,!1):t.end("This page could not be found"),null);if(E&&!l){let e=!!u.routes[h],t=u.dynamicRoutes[f];if(t&&!1===t.fallback&&!e){if(o.experimental.adapterPath)return await Q();throw new J.NoFallbackError}}let C=null;!E||dD.isDev||l||(C="/index"===(C=h)?"/":C);let B=!0===dD.isDev||!E,m=E&&!B;I&&p&&(0,F.setReferenceManifestsSingleton)({page:n,clientReferenceManifest:p,serverActionsManifest:I,serverModuleMap:(0,M.createServerModuleMap)({serverActionsManifest:I})});let y=e.method||"GET",b=(0,T.getTracer)(),w=b.getActiveScopeSpan(),v={params:s,prerenderManifest:u,renderOpts:{experimental:{authInterrupts:!!o.experimental.authInterrupts},cacheComponents:!!o.cacheComponents,supportsDynamicResponse:B,incrementalCache:(0,x.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:o.cacheLife,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,i)=>dD.onRequestError(e,t,n,i,c)},sharedContext:{buildId:A}},D=new O.NodeNextRequest(e),S=new O.NodeNextResponse(t),N=$.NextRequestAdapter.fromNodeNextRequest(D,(0,$.signalFromNodeResponse)(t));try{let i=async e=>dD.handle(N,v).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=b.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==Y.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=r.get("next.route");if(i){let t=`${y} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":t}),e.updateName(t)}else e.updateName(`${y} ${n}`)}),A=!!(0,x.getRequestMeta)(e,"minimalMode"),s=async s=>{var a,h;let p=async({previousCacheEntry:o})=>{try{if(!A&&d&&g&&!o)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await i(s);e.fetchMetrics=v.renderOpts.fetchMetrics;let a=v.renderOpts.pendingWaitUntil;a&&r.waitUntil&&(r.waitUntil(a),a=void 0);let l=v.renderOpts.collectedTags;if(!E)return await (0,H.sendResponse)(D,S,n,v.renderOpts.pendingWaitUntil),null;{let e=await n.blob(),t=(0,G.toNodeOutgoingHttpHeaders)(n.headers);l&&(t[Z.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==v.renderOpts.collectedRevalidate&&!(v.renderOpts.collectedRevalidate>=Z.INFINITE_CACHE)&&v.renderOpts.collectedRevalidate,i=void 0===v.renderOpts.collectedExpire||v.renderOpts.collectedExpire>=Z.INFINITE_CACHE?void 0:v.renderOpts.collectedExpire;return{value:{kind:j.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:i}}}}catch(t){throw(null==o?void 0:o.isStale)&&await dD.onRequestError(e,t,{routerKind:"App Router",routePath:n,routeType:"route",revalidateReason:(0,P.getRevalidateReason)({isStaticGeneration:m,isOnDemandRevalidate:d})},!1,c),t}},I=await dD.handleResponse({req:e,nextConfig:o,cacheKey:C,routeKind:U.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:u,isRoutePPREnabled:!1,isOnDemandRevalidate:d,revalidateOnlyGenerated:g,responseGenerator:p,waitUntil:r.waitUntil,isMinimalMode:A});if(!E)return null;if((null==I||null==(a=I.value)?void 0:a.kind)!==j.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==I||null==(h=I.value)?void 0:h.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});A||t.setHeader("x-nextjs-cache",d?"REVALIDATED":I.isMiss?"MISS":I.isStale?"STALE":"HIT"),l&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let f=(0,G.fromNodeOutgoingHttpHeaders)(I.value.headers);return A&&E||f.delete(Z.NEXT_CACHE_TAGS_HEADER),!I.cacheControl||t.getHeader("Cache-Control")||f.get("Cache-Control")||f.set("Cache-Control",(0,V.getCacheControlHeader)(I.cacheControl)),await (0,H.sendResponse)(D,S,new Response(I.value.body,{headers:f,status:I.value.status||200})),null};w?await s(w):await b.withPropagatedContext(e.headers,()=>b.trace(Y.BaseServerSpan.handleRequest,{spanName:`${y} ${n}`,kind:T.SpanKind.SERVER,attributes:{"http.method":y,"http.target":e.url}},s))}catch(t){if(t instanceof J.NoFallbackError||await dD.onRequestError(e,t,{routerKind:"App Router",routePath:f,routeType:"route",revalidateReason:(0,P.getRevalidateReason)({isStaticGeneration:m,isOnDemandRevalidate:d})},!1,c),E)throw t;return await (0,H.sendResponse)(D,S,new Response(null,{status:500})),null}}e.s(["handler",()=>dU,"patchFetch",()=>dR,"routeModule",()=>dD,"serverHooks",()=>dk,"workAsyncStorage",()=>dS,"workUnitAsyncStorage",()=>dN],51540)}];
664
+ Co-Authored-By: Claude (dev3000) <noreply@anthropic.com>`,p=await fetch(`https://api.github.com/repos/${r}/${n}/pulls`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","Content-Type":"application/json"},body:JSON.stringify({title:`Fix: ${A} - Automated fix from dev3000`,head:u,base:i,body:h})});if(!p.ok){let e=await p.text();return console.error(`[Step 4] Failed to create PR: ${e}`),{success:!1,error:`Failed to create PR: ${p.status}`}}let I=await p.json();return console.log(`[Step 4] Created PR: ${I.html_url}`),{success:!0,prUrl:I.html_url,prNumber:I.number,branch:u}}catch(e){return console.error("[Step 4] Error creating PR:",e),{success:!1,error:e instanceof Error?e.message:String(e)}}}function dA(e){let t=[];for(let r of e.split(/diff --git /).filter(Boolean)){let e=r.split("\n"),n=e[0].match(/a\/(.*?) b\//);if(!n)continue;let i=n[1],A=e.slice(1).join("\n");t.push({path:i,changes:A})}return t}function ds(e,t){let r=e.split("\n"),n=t.split("\n"),i=0,A=[];for(let e of n)if(e.startsWith("@@")){let t=e.match(/@@ -(\d+)/);t&&(i=Number.parseInt(t[1],10)-1)}else e.startsWith("-")?i++:e.startsWith("+")?A.push(e.substring(1)):e.startsWith(" ")&&i<r.length&&(A.push(r[i]),i++);return A.join("\n")}async function da(e){console.log("[Cleanup] Stopping sandbox...");try{await e(),console.log("[Cleanup] Sandbox stopped successfully")}catch(e){console.error("[Cleanup] Error stopping sandbox:",e)}}cq(c3,{analyzeLogsWithAgent:()=>dr,cleanupSandbox:()=>da,createD3kSandbox:()=>de,createGitHubPR:()=>di,fetchRealLogs:()=>dt,uploadToBlob:()=>dn});var dl=cz({"app/api/cloud/fix-workflow/steps.ts"(){cW(c5,"runSandboxCommand"),cW(c8,"captureScreenshotInSandbox"),cW(c7,"uploadScreenshot"),cW(de,"createD3kSandbox"),cW(dt,"fetchRealLogs"),cW(dr,"analyzeLogsWithAgent"),cW(dn,"uploadToBlob"),cW(di,"createGitHubPR"),cW(dA,"parsePatchToFileChanges"),cW(ds,"applyPatchChanges"),cW(da,"cleanupSandbox"),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//createD3kSandbox",de),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//fetchRealLogs",dt),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//analyzeLogsWithAgent",dr),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//uploadToBlob",dn),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//createGitHubPR",di),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/steps.ts//cleanupSandbox",da)}});async function du(e){return e.arrayBuffer()}async function dc(e){return e.json()}async function dd(e){return e.text()}async function dg(e){throw Error("You attempted to execute workflow cloudCheckPRWorkflow function directly. To start a workflow, use start(cloudCheckPRWorkflow) from workflow/api")}async function dh(e,t){let{identifyAffectedPages:r}=await Promise.resolve().then(()=>(c6(),cX));return r(e,t)}async function dp(e,t){let{crawlPreviewPages:r}=await Promise.resolve().then(()=>(c6(),cX));return r(e,t)}async function dI(e,t,r,n){let{verifyPRClaims:i}=await Promise.resolve().then(()=>(c6(),cX));return i(e,t,r,n)}async function df(e,t){let{checkPerformance:r}=await Promise.resolve().then(()=>(c6(),cX));return r(e,t)}async function dE(e){let{generateReport:t}=await Promise.resolve().then(()=>(c6(),cX));return t(e)}async function dQ(e,t,r,n){let{uploadReport:i}=await Promise.resolve().then(()=>(c6(),cX));return i(e,t,r,n)}async function dC(e){throw Error("You attempted to execute workflow cloudFixWorkflow function directly. To start a workflow, use start(cloudFixWorkflow) from workflow/api")}async function dB(e,t,r,n,i){let{createD3kSandbox:A}=await Promise.resolve().then(()=>(dl(),c3));return A(e,t,r,n,i)}async function dm(e,t,r,n,i,A){let{fetchRealLogs:s}=await Promise.resolve().then(()=>(dl(),c3));return s(e,t,r,n,i,A)}async function dy(e,t){let{analyzeLogsWithAgent:r}=await Promise.resolve().then(()=>(dl(),c3));return r(e,t)}async function db(e,t,r,n,i,A){let{uploadToBlob:s}=await Promise.resolve().then(()=>(dl(),c3));return s(e,t,r,n,i,A)}async function dw(e,t,r,n,i,A){let{createGitHubPR:s}=await Promise.resolve().then(()=>(dl(),c3));return s(e,t,r,n,i,A)}cW(du,"__builtin_response_array_buffer"),cW(dc,"__builtin_response_json"),cW(dd,"__builtin_response_text"),(0,z.registerStepFunction)("__builtin_response_array_buffer",du),(0,z.registerStepFunction)("__builtin_response_json",dc),(0,z.registerStepFunction)("__builtin_response_text",dd),cW(dg,"cloudCheckPRWorkflow"),dg.workflowId="workflow//app/api/cloud/check-pr/workflow.ts//cloudCheckPRWorkflow",cW(dh,"identifyAffectedPagesStep"),cW(dp,"crawlPreviewPagesStep"),cW(dI,"verifyPRClaimsStep"),cW(df,"checkPerformanceStep"),cW(dE,"generateReportStep"),cW(dQ,"uploadReportStep"),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//identifyAffectedPagesStep",dh),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//crawlPreviewPagesStep",dp),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//verifyPRClaimsStep",dI),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//checkPerformanceStep",df),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//generateReportStep",dE),(0,z.registerStepFunction)("step//app/api/cloud/check-pr/workflow.ts//uploadReportStep",dQ),cW(dC,"cloudFixWorkflow"),dC.workflowId="workflow//app/api/cloud/fix-workflow/workflow.ts//cloudFixWorkflow",cW(dB,"createD3kSandbox"),cW(dm,"fetchRealLogs"),cW(dy,"analyzeLogsWithAgent"),cW(db,"uploadToBlob"),cW(dw,"createGitHubPR"),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//createD3kSandbox",dB),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//fetchRealLogs",dm),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//analyzeLogsWithAgent",dy),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//uploadToBlob",db),(0,z.registerStepFunction)("step//app/api/cloud/fix-workflow/workflow.ts//createGitHubPR",dw),c6(),dl(),e.s([],43048),e.i(43048),e.s(["POST",()=>cZ.stepEntrypoint],42530);var dv=e.i(42530);let dD=new R.AppRouteRouteModule({definition:{kind:U.RouteKind.APP_ROUTE,page:"/.well-known/workflow/v1/step/route",pathname:"/.well-known/workflow/v1/step",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/mcp-server/app/.well-known/workflow/v1/step/route.js",nextConfigOutput:"",userland:dv}),{workAsyncStorage:dS,workUnitAsyncStorage:dN,serverHooks:dk}=dD;function dR(){return(0,_.patchFetch)({workAsyncStorage:dS,workUnitAsyncStorage:dN})}async function dU(e,t,r){dD.isDev&&(0,x.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let n="/.well-known/workflow/v1/step/route";n=n.replace(/\/index$/,"")||"/";let i=await dD.prepare(e,t,{srcPage:n,multiZoneDraftMode:!1});if(!i)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:A,params:s,nextConfig:o,parsedUrl:a,isDraftMode:l,prerenderManifest:u,routerServerContext:c,isOnDemandRevalidate:d,revalidateOnlyGenerated:g,resolvedPathname:h,clientReferenceManifest:p,serverActionsManifest:I}=i,f=(0,L.normalizeAppPath)(n),E=!!(u.dynamicRoutes[f]||u.routes[h]),Q=async()=>((null==c?void 0:c.render404)?await c.render404(e,t,a,!1):t.end("This page could not be found"),null);if(E&&!l){let e=!!u.routes[h],t=u.dynamicRoutes[f];if(t&&!1===t.fallback&&!e){if(o.experimental.adapterPath)return await Q();throw new J.NoFallbackError}}let C=null;!E||dD.isDev||l||(C="/index"===(C=h)?"/":C);let B=!0===dD.isDev||!E,m=E&&!B;I&&p&&(0,F.setReferenceManifestsSingleton)({page:n,clientReferenceManifest:p,serverActionsManifest:I,serverModuleMap:(0,M.createServerModuleMap)({serverActionsManifest:I})});let y=e.method||"GET",b=(0,T.getTracer)(),w=b.getActiveScopeSpan(),v={params:s,prerenderManifest:u,renderOpts:{experimental:{authInterrupts:!!o.experimental.authInterrupts},cacheComponents:!!o.cacheComponents,supportsDynamicResponse:B,incrementalCache:(0,x.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:o.cacheLife,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,i)=>dD.onRequestError(e,t,n,i,c)},sharedContext:{buildId:A}},D=new O.NodeNextRequest(e),S=new O.NodeNextResponse(t),N=$.NextRequestAdapter.fromNodeNextRequest(D,(0,$.signalFromNodeResponse)(t));try{let i=async e=>dD.handle(N,v).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=b.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==Y.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=r.get("next.route");if(i){let t=`${y} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":t}),e.updateName(t)}else e.updateName(`${y} ${n}`)}),A=!!(0,x.getRequestMeta)(e,"minimalMode"),s=async s=>{var a,h;let p=async({previousCacheEntry:o})=>{try{if(!A&&d&&g&&!o)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await i(s);e.fetchMetrics=v.renderOpts.fetchMetrics;let a=v.renderOpts.pendingWaitUntil;a&&r.waitUntil&&(r.waitUntil(a),a=void 0);let l=v.renderOpts.collectedTags;if(!E)return await (0,H.sendResponse)(D,S,n,v.renderOpts.pendingWaitUntil),null;{let e=await n.blob(),t=(0,G.toNodeOutgoingHttpHeaders)(n.headers);l&&(t[Z.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==v.renderOpts.collectedRevalidate&&!(v.renderOpts.collectedRevalidate>=Z.INFINITE_CACHE)&&v.renderOpts.collectedRevalidate,i=void 0===v.renderOpts.collectedExpire||v.renderOpts.collectedExpire>=Z.INFINITE_CACHE?void 0:v.renderOpts.collectedExpire;return{value:{kind:j.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:i}}}}catch(t){throw(null==o?void 0:o.isStale)&&await dD.onRequestError(e,t,{routerKind:"App Router",routePath:n,routeType:"route",revalidateReason:(0,P.getRevalidateReason)({isStaticGeneration:m,isOnDemandRevalidate:d})},!1,c),t}},I=await dD.handleResponse({req:e,nextConfig:o,cacheKey:C,routeKind:U.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:u,isRoutePPREnabled:!1,isOnDemandRevalidate:d,revalidateOnlyGenerated:g,responseGenerator:p,waitUntil:r.waitUntil,isMinimalMode:A});if(!E)return null;if((null==I||null==(a=I.value)?void 0:a.kind)!==j.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==I||null==(h=I.value)?void 0:h.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});A||t.setHeader("x-nextjs-cache",d?"REVALIDATED":I.isMiss?"MISS":I.isStale?"STALE":"HIT"),l&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let f=(0,G.fromNodeOutgoingHttpHeaders)(I.value.headers);return A&&E||f.delete(Z.NEXT_CACHE_TAGS_HEADER),!I.cacheControl||t.getHeader("Cache-Control")||f.get("Cache-Control")||f.set("Cache-Control",(0,V.getCacheControlHeader)(I.cacheControl)),await (0,H.sendResponse)(D,S,new Response(I.value.body,{headers:f,status:I.value.status||200})),null};w?await s(w):await b.withPropagatedContext(e.headers,()=>b.trace(Y.BaseServerSpan.handleRequest,{spanName:`${y} ${n}`,kind:T.SpanKind.SERVER,attributes:{"http.method":y,"http.target":e.url}},s))}catch(t){if(t instanceof J.NoFallbackError||await dD.onRequestError(e,t,{routerKind:"App Router",routePath:f,routeType:"route",revalidateReason:(0,P.getRevalidateReason)({isStaticGeneration:m,isOnDemandRevalidate:d})},!1,c),E)throw t;return await (0,H.sendResponse)(D,S,new Response(null,{status:500})),null}}e.s(["handler",()=>dU,"patchFetch",()=>dR,"routeModule",()=>dD,"serverHooks",()=>dk,"workAsyncStorage",()=>dS,"workUnitAsyncStorage",()=>dN],51540)}];
665
665
 
666
666
  //# sourceMappingURL=%5Broot-of-the-server%5D__157de66b._.js.map