dev3000 0.0.117 → 0.0.118

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 (104) hide show
  1. package/dist/cdp-monitor.d.ts +1 -0
  2. package/dist/cdp-monitor.d.ts.map +1 -1
  3. package/dist/cdp-monitor.js +11 -2
  4. package/dist/cdp-monitor.js.map +1 -1
  5. package/mcp-server/.next/BUILD_ID +1 -1
  6. package/mcp-server/.next/build-manifest.json +2 -2
  7. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  8. package/mcp-server/.next/prerender-manifest.json +3 -3
  9. package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js +1 -1
  10. package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js.nft.json +1 -1
  11. package/mcp-server/.next/server/app/_global-error.html +2 -2
  12. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  13. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  14. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  16. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  17. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/mcp-server/.next/server/app/_not-found.html +1 -1
  20. package/mcp-server/.next/server/app/_not-found.rsc +2 -2
  21. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  22. package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  23. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  24. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  25. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  26. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  27. package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js +1 -1
  28. package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js.nft.json +1 -1
  29. package/mcp-server/.next/server/app/api/cloud/start-fix/route.js +1 -1
  30. package/mcp-server/.next/server/app/api/cloud/start-fix/route.js.nft.json +1 -1
  31. package/mcp-server/.next/server/app/api/jank/[session]/route.js +1 -1
  32. package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
  33. package/mcp-server/.next/server/app/auth/error/page_client-reference-manifest.js +1 -1
  34. package/mcp-server/.next/server/app/auth/error.html +1 -1
  35. package/mcp-server/.next/server/app/auth/error.rsc +2 -2
  36. package/mcp-server/.next/server/app/auth/error.segments/_full.segment.rsc +2 -2
  37. package/mcp-server/.next/server/app/auth/error.segments/_head.segment.rsc +1 -1
  38. package/mcp-server/.next/server/app/auth/error.segments/_index.segment.rsc +2 -2
  39. package/mcp-server/.next/server/app/auth/error.segments/_tree.segment.rsc +2 -2
  40. package/mcp-server/.next/server/app/auth/error.segments/auth/error/__PAGE__.segment.rsc +1 -1
  41. package/mcp-server/.next/server/app/auth/error.segments/auth/error.segment.rsc +1 -1
  42. package/mcp-server/.next/server/app/auth/error.segments/auth.segment.rsc +1 -1
  43. package/mcp-server/.next/server/app/index.html +1 -1
  44. package/mcp-server/.next/server/app/index.rsc +2 -2
  45. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  46. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +2 -2
  47. package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  48. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +2 -2
  49. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  50. package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  51. package/mcp-server/.next/server/app/mcp/route.js +1 -1
  52. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  53. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  54. package/mcp-server/.next/server/app/signin/page_client-reference-manifest.js +1 -1
  55. package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +1 -1
  56. package/mcp-server/.next/server/app/workflows/[id]/report/page.js +1 -1
  57. package/mcp-server/.next/server/app/workflows/[id]/report/page.js.nft.json +1 -1
  58. package/mcp-server/.next/server/app/workflows/[id]/report/page_client-reference-manifest.js +1 -1
  59. package/mcp-server/.next/server/app/workflows/new/page_client-reference-manifest.js +1 -1
  60. package/mcp-server/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
  61. package/mcp-server/.next/server/chunks/{[root-of-the-server]__ec6a1335._.js → [root-of-the-server]__1095b0eb._.js} +2 -2
  62. package/mcp-server/.next/server/chunks/[root-of-the-server]__1095b0eb._.js.map +1 -0
  63. package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js +111 -111
  64. package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js.map +1 -1
  65. package/mcp-server/.next/server/chunks/[root-of-the-server]__18ce35ee._.js +3 -0
  66. package/mcp-server/.next/server/chunks/[root-of-the-server]__18ce35ee._.js.map +1 -0
  67. package/mcp-server/.next/server/chunks/{[root-of-the-server]__2920484d._.js → [root-of-the-server]__29c39fca._.js} +2 -2
  68. package/mcp-server/.next/server/chunks/{[root-of-the-server]__2920484d._.js.map → [root-of-the-server]__29c39fca._.js.map} +1 -1
  69. package/mcp-server/.next/server/chunks/[root-of-the-server]__55642730._.js +3 -0
  70. package/mcp-server/.next/server/chunks/[root-of-the-server]__55642730._.js.map +1 -0
  71. package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js +1 -1
  72. package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js.map +1 -1
  73. package/mcp-server/.next/server/chunks/{[root-of-the-server]__ece7a7f7._.js → [root-of-the-server]__951b3108._.js} +2 -2
  74. package/mcp-server/.next/server/chunks/{[root-of-the-server]__bcb77a22._.js → [root-of-the-server]__fd11bb92._.js} +2 -2
  75. package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js +83 -53
  76. package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js.map +1 -1
  77. package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js +19 -19
  78. package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js.map +1 -1
  79. package/mcp-server/.next/server/chunks/mcp-server_lib_workflow-storage_ts_30ca7761._.js +3 -0
  80. package/mcp-server/.next/server/chunks/mcp-server_lib_workflow-storage_ts_30ca7761._.js.map +1 -0
  81. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__bb161645._.js → [root-of-the-server]__34cc4876._.js} +2 -2
  82. package/mcp-server/.next/server/chunks/ssr/_cd4dc25e._.js.map +1 -1
  83. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js +1 -1
  84. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js.map +1 -1
  85. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  86. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  87. package/mcp-server/.next/static/chunks/{93db5737a327ab0c.js → 7b9a23e7f572d8a7.js} +1 -1
  88. package/mcp-server/.next/static/chunks/98585d170d82e3e8.css +1 -0
  89. package/mcp-server/app/api/cloud/fix-workflow/steps.ts +35 -4
  90. package/mcp-server/app/api/cloud/fix-workflow/workflow.ts +53 -1
  91. package/mcp-server/app/api/cloud/start-fix/route.ts +11 -2
  92. package/mcp-server/app/api/workflows/route.ts +36 -14
  93. package/mcp-server/app/workflows/new-workflow-modal.tsx +90 -23
  94. package/package.json +1 -1
  95. package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js +0 -3
  96. package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js.map +0 -1
  97. package/mcp-server/.next/server/chunks/[root-of-the-server]__ec6a1335._.js.map +0 -1
  98. package/mcp-server/.next/static/chunks/000849a6a897f531.css +0 -1
  99. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__ece7a7f7._.js.map → [root-of-the-server]__951b3108._.js.map} +0 -0
  100. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__bcb77a22._.js.map → [root-of-the-server]__fd11bb92._.js.map} +0 -0
  101. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__bb161645._.js.map → [root-of-the-server]__34cc4876._.js.map} +0 -0
  102. /package/mcp-server/.next/static/{3tu8GDHzRVmtUnaVw3VqB → GVm-012A2JbRg9oviNAqV}/_buildManifest.js +0 -0
  103. /package/mcp-server/.next/static/{3tu8GDHzRVmtUnaVw3VqB → GVm-012A2JbRg9oviNAqV}/_clientMiddlewareManifest.json +0 -0
  104. /package/mcp-server/.next/static/{3tu8GDHzRVmtUnaVw3VqB → GVm-012A2JbRg9oviNAqV}/_ssgManifest.js +0 -0
@@ -391,21 +391,30 @@ LOADINGHTML
391
391
  // Try to parse the text as JSON if it contains structured data
392
392
  try {
393
393
  clsData = JSON.parse(item.text)
394
- console.log(`[Step 0] Successfully parsed CLS data`)
395
- break
394
+ console.log(`[Step 0] Successfully parsed CLS data as JSON`)
396
395
  } catch {
397
396
  // If not JSON, treat as plain text
398
397
  clsData = { rawOutput: item.text }
398
+ console.log(`[Step 0] CLS data stored as rawOutput (not JSON)`)
399
399
  }
400
+ break
400
401
  }
401
402
  }
402
403
  }
403
404
 
404
- console.log(`[Step 0] CLS data captured:`, JSON.stringify(clsData).substring(0, 500))
405
+ if (clsData) {
406
+ console.log(`[Step 0] CLS data captured:`, JSON.stringify(clsData).substring(0, 500))
407
+ } else {
408
+ console.log(`[Step 0] No CLS data extracted from MCP response`)
409
+ console.log(`[Step 0] Response structure: ${JSON.stringify(mcpResponse).substring(0, 500)}`)
410
+ }
405
411
  } catch (parseError) {
406
412
  mcpError = `Failed to parse MCP response: ${parseError instanceof Error ? parseError.message : String(parseError)}`
407
413
  console.log(`[Step 0] ${mcpError}`)
408
414
  console.log(`[Step 0] Raw stdout: ${stdout.substring(0, 1000)}`)
415
+ // Use raw stdout as fallback CLS data so Step 1 doesn't hang
416
+ clsData = { rawMcpOutput: stdout.substring(0, 10000), parseError: mcpError }
417
+ console.log(`[Step 0] Using raw stdout as fallback CLS data`)
409
418
  }
410
419
  } else if (exitCode !== 0 && !mcpError) {
411
420
  mcpError = `MCP command failed with exit code ${exitCode}`
@@ -419,6 +428,19 @@ LOADINGHTML
419
428
  console.log(`[Step 0] ${mcpError}`)
420
429
  }
421
430
 
431
+ // IMPORTANT: Ensure clsData is ALWAYS set to something truthy so Step 1 doesn't hang on timeouts
432
+ // Even if MCP failed, we should have sandbox logs that Step 1 can use
433
+ if (!clsData) {
434
+ console.log(`[Step 0] WARNING: No CLS data captured, creating placeholder to prevent Step 1 timeout`)
435
+ clsData = {
436
+ warning: "MCP fix_my_app did not return data",
437
+ mcpError: mcpError || "Unknown error",
438
+ sandboxDevUrl: sandboxResult.devUrl,
439
+ sandboxMcpUrl: sandboxResult.mcpUrl
440
+ }
441
+ }
442
+ console.log(`[Step 0] Final clsData truthy check: ${!!clsData}`)
443
+
422
444
  // Dump all sandbox logs before returning for debugging
423
445
  console.log(`[Step 0] === Dumping sandbox logs before returning ===`)
424
446
  try {
@@ -481,15 +503,24 @@ export async function fetchRealLogs(
481
503
  ) {
482
504
  "use step"
483
505
 
506
+ // Debug: Log what we received from Step 0
507
+ console.log(`[Step 1] Received clsData: ${clsData ? "truthy" : "falsy"}, type: ${typeof clsData}`)
508
+ if (clsData) {
509
+ console.log(`[Step 1] clsData preview: ${JSON.stringify(clsData).substring(0, 200)}`)
510
+ }
511
+
484
512
  // If we already have CLS data from Step 0, use it along with the screenshot
513
+ // This early return prevents the long MCP timeout delays
485
514
  if (clsData) {
486
- console.log("[Step 1] Using CLS data captured in Step 0")
515
+ console.log("[Step 1] Using CLS data captured in Step 0 (skipping MCP calls)")
487
516
  if (beforeScreenshotUrlFromStep0) {
488
517
  console.log(`[Step 1] Before screenshot from Step 0: ${beforeScreenshotUrlFromStep0}`)
489
518
  }
490
519
  return { logAnalysis: JSON.stringify(clsData, null, 2), beforeScreenshotUrl: beforeScreenshotUrlFromStep0 || null }
491
520
  }
492
521
 
522
+ console.log("[Step 1] ⚠️ No CLS data from Step 0, will try MCP calls (may timeout)")
523
+
493
524
  // If there was an MCP error in Step 0, log it
494
525
  if (mcpError) {
495
526
  console.log(`[Step 1] Note: MCP error from Step 0: ${mcpError}`)
@@ -19,6 +19,8 @@ export async function cloudFixWorkflow(params: {
19
19
  bypassToken?: string
20
20
  repoUrl?: string
21
21
  repoBranch?: string
22
+ runId?: string // For progress tracking
23
+ userId?: string // For progress tracking
22
24
  }) {
23
25
  "use workflow"
24
26
 
@@ -32,8 +34,11 @@ export async function cloudFixWorkflow(params: {
32
34
  baseBranch = "main",
33
35
  bypassToken,
34
36
  repoUrl,
35
- repoBranch
37
+ repoBranch,
38
+ runId,
39
+ userId
36
40
  } = params
41
+ const timestamp = new Date().toISOString()
37
42
 
38
43
  console.log("[Workflow] Starting cloud fix workflow...")
39
44
  console.log(`[Workflow] Dev URL: ${devUrl}`)
@@ -56,6 +61,13 @@ export async function cloudFixWorkflow(params: {
56
61
  console.log(`[Workflow] VERCEL_OIDC_TOKEN from env: ${!!process.env.VERCEL_OIDC_TOKEN}`)
57
62
  console.log(`[Workflow] VERCEL_OIDC_TOKEN available: ${!!vercelOidcToken}`)
58
63
 
64
+ // Helper to update progress if tracking is enabled
65
+ const updateProgress = async (stepNumber: number, currentStep: string, sandboxUrl?: string) => {
66
+ if (runId && userId) {
67
+ await updateWorkflowProgressStep(userId, runId, projectName, timestamp, stepNumber, currentStep, sandboxUrl)
68
+ }
69
+ }
70
+
59
71
  // Step 0: Create d3k sandbox if repoUrl provided
60
72
  // This step also captures CLS data, "before" screenshot, and git diff from inside the sandbox
61
73
  let sandboxInfo: {
@@ -69,13 +81,18 @@ export async function cloudFixWorkflow(params: {
69
81
  gitDiff?: string | null
70
82
  } | null = null
71
83
  if (repoUrl) {
84
+ await updateProgress(0, "Creating development sandbox...")
72
85
  sandboxInfo = await createD3kSandbox(repoUrl, repoBranch || "main", projectName, vercelToken, vercelOidcToken)
86
+ if (sandboxInfo?.devUrl) {
87
+ await updateProgress(0, "Sandbox ready, starting dev server...", sandboxInfo.devUrl)
88
+ }
73
89
  }
74
90
 
75
91
  // Step 1: Fetch real logs (using sandbox MCP if available, otherwise devUrl directly)
76
92
  // If we got CLS data from Step 0, pass it to Step 1 to avoid re-fetching
77
93
  // Use bypass token from sandbox if available, otherwise use provided one
78
94
  // Also pass the beforeScreenshotUrl from Step 0 if available
95
+ await updateProgress(1, "Capturing performance metrics (CLS, LCP, errors)...")
79
96
  const effectiveBypassToken = sandboxInfo?.bypassToken || bypassToken
80
97
  const step1Result = await fetchRealLogs(
81
98
  sandboxInfo?.mcpUrl || devUrl,
@@ -86,11 +103,25 @@ export async function cloudFixWorkflow(params: {
86
103
  sandboxInfo?.beforeScreenshotUrl
87
104
  )
88
105
  const { logAnalysis, beforeScreenshotUrl } = step1Result
106
+ await updateProgress(1, `Captured ${logAnalysis.length > 5000 ? "detailed" : "initial"} diagnostics`)
89
107
 
90
108
  // Step 2: Invoke AI agent to analyze logs and create fix
109
+ await updateProgress(2, "AI agent analyzing logs and generating fixes...")
91
110
  const fixProposal = await analyzeLogsWithAgent(logAnalysis, sandboxInfo?.devUrl || devUrl)
92
111
 
112
+ // Provide feedback on what was found
113
+ const hasError = fixProposal.toLowerCase().includes("error") || fixProposal.toLowerCase().includes("issue")
114
+ const hasFix = fixProposal.includes("```diff")
115
+ if (hasFix) {
116
+ await updateProgress(2, "AI generated a fix proposal with code changes")
117
+ } else if (hasError) {
118
+ await updateProgress(2, "AI identified issues but no code fix needed")
119
+ } else {
120
+ await updateProgress(2, "AI analysis complete - system appears healthy")
121
+ }
122
+
93
123
  // Step 3: Upload to blob storage with full context, screenshot, and git diff
124
+ await updateProgress(3, "Compiling full report with screenshots...")
94
125
  const blobResult = await uploadToBlob(
95
126
  fixProposal,
96
127
  projectName,
@@ -99,13 +130,19 @@ export async function cloudFixWorkflow(params: {
99
130
  beforeScreenshotUrl,
100
131
  sandboxInfo?.gitDiff
101
132
  )
133
+ await updateProgress(3, "Report uploaded to Vercel Blob")
102
134
 
103
135
  // Step 4: Create GitHub PR if repo info provided AND there are actual fixes to apply
104
136
  let prResult = null
105
137
  const hasGitPatch = fixProposal.includes("```diff")
106
138
  if (repoOwner && repoName && hasGitPatch) {
139
+ await updateProgress(4, `Creating PR on ${repoOwner}/${repoName}...`)
107
140
  prResult = await createGitHubPR(fixProposal, blobResult.blobUrl, repoOwner, repoName, baseBranch, projectName)
141
+ if (prResult?.success) {
142
+ await updateProgress(4, `PR #${prResult.prNumber} created successfully`)
143
+ }
108
144
  } else if (repoOwner && repoName && !hasGitPatch) {
145
+ await updateProgress(4, "No code changes needed - skipping PR")
109
146
  console.log("[Workflow] No git patch found - skipping PR creation (system is healthy)")
110
147
  }
111
148
 
@@ -175,3 +212,18 @@ async function createGitHubPR(
175
212
  const { createGitHubPR } = await import("./steps")
176
213
  return createGitHubPR(fixProposal, blobUrl, repoOwner, repoName, baseBranch, projectName)
177
214
  }
215
+
216
+ // Step wrapper for updating workflow progress (uses dynamic import like other steps)
217
+ async function updateWorkflowProgressStep(
218
+ userId: string,
219
+ runId: string,
220
+ projectName: string,
221
+ timestamp: string,
222
+ stepNumber: number,
223
+ currentStep: string,
224
+ sandboxUrl?: string
225
+ ) {
226
+ "use step"
227
+ const { updateWorkflowProgress } = await import("@/lib/workflow-storage")
228
+ return updateWorkflowProgress(userId, runId, projectName, timestamp, stepNumber, currentStep, sandboxUrl)
229
+ }
@@ -102,12 +102,21 @@ export async function POST(request: Request) {
102
102
  userId,
103
103
  projectName,
104
104
  timestamp: new Date().toISOString(),
105
- status: "running"
105
+ status: "running",
106
+ currentStep: "Starting workflow...",
107
+ stepNumber: 0
106
108
  })
107
109
  console.log(`[Start Fix] Saved workflow run metadata (running): ${runId}`)
108
110
  }
109
111
 
110
- const run = await start(cloudFixWorkflow, [workflowParams])
112
+ // Pass runId and userId to workflow for progress tracking
113
+ const workflowParamsWithTracking = {
114
+ ...workflowParams,
115
+ runId,
116
+ userId
117
+ }
118
+
119
+ const run = await start(cloudFixWorkflow, [workflowParamsWithTracking])
111
120
 
112
121
  console.log(`[Start Fix] Workflow started, waiting for completion...`)
113
122
 
@@ -1,5 +1,21 @@
1
1
  import { deleteWorkflowRuns, listWorkflowRuns } from "@/lib/workflow-storage"
2
2
 
3
+ // CORS headers - allowing credentials from localhost
4
+ const corsHeaders = {
5
+ "Access-Control-Allow-Origin": "http://localhost:3000",
6
+ "Access-Control-Allow-Methods": "GET, DELETE, OPTIONS",
7
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
8
+ "Access-Control-Allow-Credentials": "true"
9
+ }
10
+
11
+ // Handle OPTIONS preflight request
12
+ export async function OPTIONS() {
13
+ return new Response(null, {
14
+ status: 204,
15
+ headers: corsHeaders
16
+ })
17
+ }
18
+
3
19
  /**
4
20
  * GET /api/workflows
5
21
  * Fetches all workflow runs for a user
@@ -13,7 +29,7 @@ export async function GET(request: Request) {
13
29
  const userId = searchParams.get("userId")
14
30
 
15
31
  if (!userId) {
16
- return Response.json({ error: "userId is required" }, { status: 400 })
32
+ return Response.json({ error: "userId is required" }, { status: 400, headers: corsHeaders })
17
33
  }
18
34
 
19
35
  console.log(`[Workflows API] Fetching runs for user: ${userId}`)
@@ -22,10 +38,13 @@ export async function GET(request: Request) {
22
38
 
23
39
  console.log(`[Workflows API] Found ${runs.length} runs`)
24
40
 
25
- return Response.json({
26
- success: true,
27
- runs
28
- })
41
+ return Response.json(
42
+ {
43
+ success: true,
44
+ runs
45
+ },
46
+ { headers: corsHeaders }
47
+ )
29
48
  } catch (error) {
30
49
  console.error("[Workflows API] Error fetching workflow runs:", error)
31
50
  return Response.json(
@@ -33,7 +52,7 @@ export async function GET(request: Request) {
33
52
  success: false,
34
53
  error: error instanceof Error ? error.message : String(error)
35
54
  },
36
- { status: 500 }
55
+ { status: 500, headers: corsHeaders }
37
56
  )
38
57
  }
39
58
  }
@@ -52,11 +71,11 @@ export async function DELETE(request: Request) {
52
71
  const { userId, runIds } = body
53
72
 
54
73
  if (!userId) {
55
- return Response.json({ error: "userId is required" }, { status: 400 })
74
+ return Response.json({ error: "userId is required" }, { status: 400, headers: corsHeaders })
56
75
  }
57
76
 
58
77
  if (!runIds || !Array.isArray(runIds) || runIds.length === 0) {
59
- return Response.json({ error: "runIds array is required" }, { status: 400 })
78
+ return Response.json({ error: "runIds array is required" }, { status: 400, headers: corsHeaders })
60
79
  }
61
80
 
62
81
  console.log(`[Workflows API] Deleting ${runIds.length} runs for user: ${userId}`)
@@ -65,11 +84,14 @@ export async function DELETE(request: Request) {
65
84
 
66
85
  console.log(`[Workflows API] Deleted ${result.deleted} runs, ${result.errors.length} errors`)
67
86
 
68
- return Response.json({
69
- success: true,
70
- deleted: result.deleted,
71
- errors: result.errors
72
- })
87
+ return Response.json(
88
+ {
89
+ success: true,
90
+ deleted: result.deleted,
91
+ errors: result.errors
92
+ },
93
+ { headers: corsHeaders }
94
+ )
73
95
  } catch (error) {
74
96
  console.error("[Workflows API] Error deleting workflow runs:", error)
75
97
  return Response.json(
@@ -77,7 +99,7 @@ export async function DELETE(request: Request) {
77
99
  success: false,
78
100
  error: error instanceof Error ? error.message : String(error)
79
101
  },
80
- { status: 500 }
102
+ { status: 500, headers: corsHeaders }
81
103
  )
82
104
  }
83
105
  }
@@ -83,6 +83,8 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
83
83
  const [workflowStatus, setWorkflowStatus] = useState<string>("")
84
84
  // biome-ignore lint/suspicious/noExplicitAny: API response type is dynamic
85
85
  const [workflowResult, setWorkflowResult] = useState<any>(null)
86
+ const [activeRunId, setActiveRunId] = useState<string | null>(null)
87
+ const [sandboxUrl, setSandboxUrl] = useState<string | null>(null)
86
88
  const [baseBranch, setBaseBranch] = useState("main")
87
89
  const [autoCreatePR, setAutoCreatePR] = useState(true)
88
90
  const [bypassToken, setBypassToken] = useState("")
@@ -138,6 +140,8 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
138
140
  setTeams([])
139
141
  setWorkflowStatus("")
140
142
  setWorkflowResult(null)
143
+ setActiveRunId(null)
144
+ setSandboxUrl(null)
141
145
  setBaseBranch("main")
142
146
  setAutoCreatePR(true)
143
147
  setBypassToken("")
@@ -197,6 +201,69 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
197
201
  }
198
202
  }, [selectedProject, selectedTeam, step, availableBranches.length, loadingBranches, branchesError])
199
203
 
204
+ // Poll workflow status when running
205
+ // biome-ignore lint/correctness/useExhaustiveDependencies: selectedProject is used for matching but shouldn't re-trigger polling
206
+ useEffect(() => {
207
+ if (!userId || step !== "running") return
208
+
209
+ const pollStatus = async () => {
210
+ try {
211
+ // Use production API for consistent status
212
+ const response = await fetch(`https://d3k-mcp.vercel.sh/api/workflows?userId=${userId}`)
213
+ if (!response.ok) return
214
+
215
+ const data = await response.json()
216
+ if (!data.success || !data.runs) return
217
+
218
+ // Find the run - either by activeRunId or by matching project + running status
219
+ // biome-ignore lint/suspicious/noExplicitAny: API response type is dynamic
220
+ let run: any = null
221
+ if (activeRunId) {
222
+ // biome-ignore lint/suspicious/noExplicitAny: API response type is dynamic
223
+ run = data.runs.find((r: any) => r.id === activeRunId)
224
+ } else if (selectedProject) {
225
+ // Find the most recent running workflow for this project
226
+ // biome-ignore lint/suspicious/noExplicitAny: API response type is dynamic
227
+ run = data.runs.find((r: any) => r.projectName === selectedProject.name && r.status === "running")
228
+ if (run) {
229
+ setActiveRunId(run.id)
230
+ }
231
+ }
232
+ if (!run) return
233
+
234
+ // Update status from real backend data
235
+ if (run.currentStep) {
236
+ setWorkflowStatus(run.currentStep)
237
+ }
238
+ if (run.sandboxUrl) {
239
+ setSandboxUrl(run.sandboxUrl)
240
+ }
241
+
242
+ // Check for completion
243
+ if (run.status === "done") {
244
+ setWorkflowStatus("Workflow completed successfully!")
245
+ setWorkflowResult({
246
+ success: true,
247
+ blobUrl: run.reportBlobUrl,
248
+ runId: run.id,
249
+ pr: run.prUrl ? { prUrl: run.prUrl } : null
250
+ })
251
+ } else if (run.status === "failure") {
252
+ setWorkflowStatus(`Workflow failed: ${run.error || "Unknown error"}`)
253
+ }
254
+ } catch (error) {
255
+ console.error("[Poll Status] Error:", error)
256
+ }
257
+ }
258
+
259
+ // Poll every 3 seconds
260
+ const interval = setInterval(pollStatus, 3000)
261
+ // Also poll immediately
262
+ pollStatus()
263
+
264
+ return () => clearInterval(interval)
265
+ }, [activeRunId, userId, step])
266
+
200
267
  // Check if deployment is protected when project is selected and on options step
201
268
  useEffect(() => {
202
269
  async function checkDeploymentProtection() {
@@ -410,26 +477,8 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
410
477
  body.baseBranch = baseBranch
411
478
  }
412
479
 
413
- // Show step-by-step progress
414
- const steps = [
415
- "Starting workflow...",
416
- repoOwner && repoName ? "Creating development sandbox..." : null,
417
- "Fetching deployment logs...",
418
- "Analyzing errors with AI...",
419
- "Generating fix proposal...",
420
- autoCreatePR ? "Writing code..." : null
421
- ].filter(Boolean) as string[]
422
-
423
- let currentStep = 0
424
- setWorkflowStatus(steps[currentStep])
425
-
426
- // Update status every 3 seconds to show progress
427
- const progressInterval = setInterval(() => {
428
- currentStep++
429
- if (currentStep < steps.length) {
430
- setWorkflowStatus(steps[currentStep])
431
- }
432
- }, 3000)
480
+ // Initial status - will be updated by polling
481
+ setWorkflowStatus("Starting workflow...")
433
482
 
434
483
  // Always use production API endpoint for workflow execution
435
484
  const apiBaseUrl = "https://d3k-mcp.vercel.sh"
@@ -471,7 +520,6 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
471
520
  console.log("[Start Workflow] Fetch completed, status:", response.status)
472
521
 
473
522
  clearTimeout(timeoutId)
474
- clearInterval(progressInterval)
475
523
 
476
524
  if (!response.ok) {
477
525
  const errorText = await response.text()
@@ -480,6 +528,11 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
480
528
 
481
529
  const result = await response.json()
482
530
 
531
+ // Set activeRunId for polling (even if workflow already completed)
532
+ if (result.runId) {
533
+ setActiveRunId(result.runId)
534
+ }
535
+
483
536
  if (result.success) {
484
537
  setWorkflowResult(result)
485
538
  setWorkflowStatus("Workflow completed successfully!")
@@ -488,9 +541,8 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
488
541
  }
489
542
  } catch (fetchError) {
490
543
  clearTimeout(timeoutId)
491
- clearInterval(progressInterval)
492
544
  if (fetchError instanceof Error && fetchError.name === "AbortError") {
493
- throw new Error("Workflow timed out after 5 minutes")
545
+ throw new Error("Workflow timed out after 10 minutes")
494
546
  }
495
547
  throw fetchError
496
548
  }
@@ -851,6 +903,21 @@ export default function NewWorkflowModal({ isOpen, onClose, userId }: NewWorkflo
851
903
  {workflowStatus}
852
904
  </AlertDescription>
853
905
  </Alert>
906
+ {sandboxUrl && !workflowResult && (
907
+ <Alert className="bg-yellow-50 border-yellow-200">
908
+ <AlertDescription className="text-yellow-900">
909
+ <span className="font-medium">Sandbox:</span>{" "}
910
+ <a
911
+ href={sandboxUrl}
912
+ target="_blank"
913
+ rel="noopener noreferrer"
914
+ className="text-blue-600 hover:underline font-mono text-sm"
915
+ >
916
+ {sandboxUrl}
917
+ </a>
918
+ </AlertDescription>
919
+ </Alert>
920
+ )}
854
921
  {workflowResult && (
855
922
  <div className="space-y-3">
856
923
  {workflowResult.blobUrl && workflowResult.runId && (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dev3000",
3
- "version": "0.0.117",
3
+ "version": "0.0.118",
4
4
  "description": "AI-powered development tools with browser monitoring and MCP server integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,3 +0,0 @@
1
- module.exports=[93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},71822,(e,t,r)=>{"use strict";t.exports=e.r(18622)},78169,(e,t,r)=>{"use strict";t.exports=e.r(71822).vendored["react-rsc"].React},19956,(e,t,r)=>{"use strict";var o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i={},l={RequestCookies:()=>x,ResponseCookies:()=>m,parseCookie:()=>c,parseSetCookie:()=>d,stringifyCookie:()=>p};for(var u in l)o(i,u,{get:l[u],enumerable:!0});function p(e){var t;let r=["path"in e&&e.path&&`Path=${e.path}`,"expires"in e&&(e.expires||0===e.expires)&&`Expires=${("number"==typeof e.expires?new Date(e.expires):e.expires).toUTCString()}`,"maxAge"in e&&"number"==typeof e.maxAge&&`Max-Age=${e.maxAge}`,"domain"in e&&e.domain&&`Domain=${e.domain}`,"secure"in e&&e.secure&&"Secure","httpOnly"in e&&e.httpOnly&&"HttpOnly","sameSite"in e&&e.sameSite&&`SameSite=${e.sameSite}`,"partitioned"in e&&e.partitioned&&"Partitioned","priority"in e&&e.priority&&`Priority=${e.priority}`].filter(Boolean),o=`${e.name}=${encodeURIComponent(null!=(t=e.value)?t:"")}`;return 0===r.length?o:`${o}; ${r.join("; ")}`}function c(e){let t=new Map;for(let r of e.split(/; */)){if(!r)continue;let e=r.indexOf("=");if(-1===e){t.set(r,"true");continue}let[o,s]=[r.slice(0,e),r.slice(e+1)];try{t.set(o,decodeURIComponent(null!=s?s:"true"))}catch{}}return t}function d(e){if(!e)return;let[[t,r],...o]=c(e),{domain:s,expires:n,httponly:a,maxage:i,path:l,samesite:u,secure:p,partitioned:d,priority:x}=Object.fromEntries(o.map(([e,t])=>[e.toLowerCase().replace(/-/g,""),t]));{var m,g,w={name:t,value:decodeURIComponent(r),domain:s,...n&&{expires:new Date(n)},...a&&{httpOnly:!0},..."string"==typeof i&&{maxAge:Number(i)},path:l,...u&&{sameSite:f.includes(m=(m=u).toLowerCase())?m:void 0},...p&&{secure:!0},...x&&{priority:h.includes(g=(g=x).toLowerCase())?g:void 0},...d&&{partitioned:!0}};let e={};for(let t in w)w[t]&&(e[t]=w[t]);return e}}t.exports=((e,t,r,i)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let r of n(t))a.call(e,r)||void 0===r||o(e,r,{get:()=>t[r],enumerable:!(i=s(t,r))||i.enumerable});return e})(o({},"__esModule",{value:!0}),i);var f=["strict","lax","none"],h=["low","medium","high"],x=class{constructor(e){this._parsed=new Map,this._headers=e;const t=e.get("cookie");if(t)for(const[e,r]of c(t))this._parsed.set(e,{name:e,value:r})}[Symbol.iterator](){return this._parsed[Symbol.iterator]()}get size(){return this._parsed.size}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed);if(!e.length)return r.map(([e,t])=>t);let o="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(([e])=>e===o).map(([e,t])=>t)}has(e){return this._parsed.has(e)}set(...e){let[t,r]=1===e.length?[e[0].name,e[0].value]:e,o=this._parsed;return o.set(t,{name:t,value:r}),this._headers.set("cookie",Array.from(o).map(([e,t])=>p(t)).join("; ")),this}delete(e){let t=this._parsed,r=Array.isArray(e)?e.map(e=>t.delete(e)):t.delete(e);return this._headers.set("cookie",Array.from(t).map(([e,t])=>p(t)).join("; ")),r}clear(){return this.delete(Array.from(this._parsed.keys())),this}[Symbol.for("edge-runtime.inspect.custom")](){return`RequestCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(e=>`${e.name}=${encodeURIComponent(e.value)}`).join("; ")}},m=class{constructor(e){var t,r,o;this._parsed=new Map,this._headers=e;const s=null!=(o=null!=(r=null==(t=e.getSetCookie)?void 0:t.call(e))?r:e.get("set-cookie"))?o:[];for(const e of Array.isArray(s)?s:function(e){if(!e)return[];var t,r,o,s,n,a=[],i=0;function l(){for(;i<e.length&&/\s/.test(e.charAt(i));)i+=1;return i<e.length}for(;i<e.length;){for(t=i,n=!1;l();)if(","===(r=e.charAt(i))){for(o=i,i+=1,l(),s=i;i<e.length&&"="!==(r=e.charAt(i))&&";"!==r&&","!==r;)i+=1;i<e.length&&"="===e.charAt(i)?(n=!0,i=s,a.push(e.substring(t,o)),t=i):i=o+1}else i+=1;(!n||i>=e.length)&&a.push(e.substring(t,e.length))}return a}(s)){const t=d(e);t&&this._parsed.set(t.name,t)}}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed.values());if(!e.length)return r;let o="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(e=>e.name===o)}has(e){return this._parsed.has(e)}set(...e){let[t,r,o]=1===e.length?[e[0].name,e[0].value,e[0]]:e,s=this._parsed;return s.set(t,function(e={name:"",value:""}){return"number"==typeof e.expires&&(e.expires=new Date(e.expires)),e.maxAge&&(e.expires=new Date(Date.now()+1e3*e.maxAge)),(null===e.path||void 0===e.path)&&(e.path="/"),e}({name:t,value:r,...o})),function(e,t){for(let[,r]of(t.delete("set-cookie"),e)){let e=p(r);t.append("set-cookie",e)}}(s,this._headers),this}delete(...e){let[t,r]="string"==typeof e[0]?[e[0]]:[e[0].name,e[0]];return this.set({...r,name:t,value:"",expires:new Date(0)})}[Symbol.for("edge-runtime.inspect.custom")](){return`ResponseCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(p).join("; ")}}},88947,(e,t,r)=>{t.exports=e.x("stream",()=>require("stream"))},49719,(e,t,r)=>{t.exports=e.x("assert",()=>require("assert"))},874,(e,t,r)=>{t.exports=e.x("buffer",()=>require("buffer"))},6461,(e,t,r)=>{t.exports=e.x("zlib",()=>require("zlib"))},21517,(e,t,r)=>{t.exports=e.x("http",()=>require("http"))},4446,(e,t,r)=>{t.exports=e.x("net",()=>require("net"))},55004,(e,t,r)=>{t.exports=e.x("tls",()=>require("tls"))},92509,(e,t,r)=>{t.exports=e.x("url",()=>require("url"))},10430,(e,t,r)=>{t.exports=e.x("async_hooks",()=>require("async_hooks"))},45706,(e,t,r)=>{t.exports=e.x("querystring",()=>require("querystring"))},63890,(e,t,r)=>{t.exports=e.x("stream/web",()=>require("stream/web"))},37702,(e,t,r)=>{t.exports=e.x("worker_threads",()=>require("worker_threads"))},60438,(e,t,r)=>{t.exports=e.x("perf_hooks",()=>require("perf_hooks"))},78249,(e,t,r)=>{t.exports=e.x("util/types",()=>require("util/types"))},54993,(e,t,r)=>{t.exports=e.x("diagnostics_channel",()=>require("diagnostics_channel"))},25328,(e,t,r)=>{t.exports=e.x("http2",()=>require("http2"))},11913,(e,t,r)=>{t.exports=e.x("console",()=>require("console"))},78500,(e,t,r)=>{t.exports=e.x("node:async_hooks",()=>require("node:async_hooks"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},2157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},60526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},74533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},46786,(e,t,r)=>{t.exports=e.x("os",()=>require("os"))},73939,(e,t,r)=>{"use strict";var o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i={},l={VercelOidcTokenError:()=>p};for(var u in l)o(i,u,{get:l[u],enumerable:!0});t.exports=((e,t,r,i)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let r of n(t))a.call(e,r)||void 0===r||o(e,r,{get:()=>t[r],enumerable:!(i=s(t,r))||i.enumerable});return e})(o({},"__esModule",{value:!0}),i);class p extends Error{constructor(e,t){super(e),this.name="VercelOidcTokenError",this.cause=t}toString(){return this.cause?`${this.name}: ${this.message}: ${this.cause}`:`${this.name}: ${this.message}`}}},66680,(e,t,r)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},99348,(e,t,r)=>{t.exports=e.x("string_decoder",()=>require("string_decoder"))},81111,(e,t,r)=>{t.exports=e.x("node:stream",()=>require("node:stream"))},24361,(e,t,r)=>{t.exports=e.x("util",()=>require("util"))},54799,(e,t,r)=>{t.exports=e.x("crypto",()=>require("crypto"))},27699,(e,t,r)=>{t.exports=e.x("events",()=>require("events"))},12057,(e,t,r)=>{t.exports=e.x("node:util",()=>require("node:util"))},87769,(e,t,r)=>{t.exports=e.x("node:events",()=>require("node:events"))},57764,(e,t,r)=>{t.exports=e.x("node:url",()=>require("node:url"))},10576,e=>{"use strict";e.i(75525),e.s([])},36216,e=>{"use strict";async function t(e){throw Error("You attempted to execute workflow cloudFixWorkflow function directly. To start a workflow, use start(cloudFixWorkflow) from workflow/api")}t.workflowId="workflow//app/api/cloud/fix-workflow/workflow.ts//cloudFixWorkflow",e.s(["cloudFixWorkflow",()=>t])},75990,e=>{"use strict";var t=e.i(80717);async function r(e){let r=`workflows/${e.userId}/${e.timestamp}-${e.projectName}.json`,o=await (0,t.put)(r,JSON.stringify(e,null,2),{access:"public",addRandomSuffix:!1});return console.log(`[Workflow Storage] Saved run to: ${o.url}`),o.url}async function o(e){let r=`workflows/${e}/`,{blobs:o}=await (0,t.list)({prefix:r});return(await Promise.all(o.map(async e=>{try{let t=await fetch(e.url);return await t.json()}catch(t){return console.error(`[Workflow Storage] Failed to fetch ${e.url}:`,t),null}}))).filter(e=>null!==e).sort((e,t)=>new Date(t.timestamp).getTime()-new Date(e.timestamp).getTime())}async function s(e,r){let s=(await o(e)).filter(e=>r.includes(e.id)),n=[],a=0;for(let r of s){let o=[],s=`workflows/${e}/${r.timestamp}-${r.projectName}.json`,{blobs:i}=await (0,t.list)({prefix:s});for(let e of i)o.push(e.url);r.beforeScreenshotUrl&&o.push(r.beforeScreenshotUrl),r.afterScreenshotUrl&&o.push(r.afterScreenshotUrl),r.reportBlobUrl&&o.push(r.reportBlobUrl);try{o.length>0&&(await (0,t.del)(o),console.log(`[Workflow Storage] Deleted ${o.length} blobs for run ${r.id}`)),a++}catch(t){let e=`Failed to delete run ${r.id}: ${t instanceof Error?t.message:String(t)}`;console.error(`[Workflow Storage] ${e}`),n.push(e)}}return{deleted:a,errors:n}}e.s(["deleteWorkflowRuns",()=>s,"listWorkflowRuns",()=>o,"saveWorkflowRun",()=>r])},33443,e=>{"use strict";var t=e.i(63382),r=e.i(64639),o=e.i(9710),s=e.i(54585),n=e.i(55812),a=e.i(18725),i=e.i(94777),l=e.i(19465),u=e.i(59382),p=e.i(75932),c=e.i(22566),d=e.i(91442),f=e.i(77038),h=e.i(94658),x=e.i(16211),m=e.i(93484),g=e.i(93695);e.i(3056);var w=e.i(62863),v=e.i(54799);e.i(10576);var y=e.i(84570),_=e.i(75990),b=e.i(36216);let k={"Access-Control-Allow-Origin":"http://localhost:3000","Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Allow-Credentials":"true"};async function S(){return new Response(null,{status:204,headers:k})}async function R(t){let r,o,s;try{let{cookies:n}=await e.A(33043),a=await n(),i=a.get("access_token")?.value;if(!i){let e=t.headers.get("Authorization");e?.startsWith("Bearer ")&&(i=e.substring(7))}if(!i)return Response.json({success:!1,error:"Not authenticated. Please sign in to use workflows."},{status:401,headers:k});let l=t.headers.get("x-vercel-oidc-token")||process.env.VERCEL_OIDC_TOKEN;console.log(`[Start Fix] VERCEL_OIDC_TOKEN available: ${!!l}`);let u=await t.json(),{devUrl:p,repoOwner:c,repoName:d,baseBranch:f,bypassToken:h,repoUrl:x,repoBranch:m}=u;r=u.userId,o=u.projectName,console.log("[Start Fix] Starting cloud fix workflow..."),console.log(`[Start Fix] Dev URL: ${p}`),console.log(`[Start Fix] Project: ${o}`),console.log(`[Start Fix] User ID: ${r}`),console.log(`[Start Fix] Bypass Token: ${h?"provided":"not provided"}`),x&&(console.log(`[Start Fix] Will create sandbox from: ${x}`),console.log(`[Start Fix] Branch: ${m||"main"}`)),c&&d&&console.log(`[Start Fix] GitHub: ${c}/${d} (base: ${f||"main"})`);let g={devUrl:p,projectName:o,vercelToken:i,vercelOidcToken:l,...c&&{repoOwner:c},...d&&{repoName:d},...f&&{baseBranch:f},...h&&{bypassToken:h},...x&&{repoUrl:x},...m&&{repoBranch:m}};r&&o&&(s=(0,v.randomUUID)(),await (0,_.saveWorkflowRun)({id:s,userId:r,projectName:o,timestamp:new Date().toISOString(),status:"running"}),console.log(`[Start Fix] Saved workflow run metadata (running): ${s}`));let w=await (0,y.start)(b.cloudFixWorkflow,[g]);console.log("[Start Fix] Workflow started, waiting for completion...");let S=await w.returnValue,R=await S.json();return console.log("[Start Fix] Workflow completed successfully"),R.blobUrl&&console.log(`[Start Fix] Fix proposal uploaded to: ${R.blobUrl}`),R.pr?.prUrl&&console.log(`[Start Fix] GitHub PR created: ${R.pr.prUrl}`),r&&o&&s&&(await (0,_.saveWorkflowRun)({id:s,userId:r,projectName:o,timestamp:new Date().toISOString(),status:"done",reportBlobUrl:R.blobUrl,prUrl:R.pr?.prUrl,beforeScreenshotUrl:R.beforeScreenshotUrl||void 0}),console.log(`[Start Fix] Updated workflow run metadata to done: ${s}`)),Response.json({success:!0,message:"Cloud fix workflow completed successfully",projectName:o,runId:s,blobUrl:R.blobUrl,fixProposal:R.fixProposal,pr:R.pr},{headers:k})}catch(e){return console.error("[Start Fix] Error running workflow:",e),r&&o&&s&&(await (0,_.saveWorkflowRun)({id:s,userId:r,projectName:o,timestamp:new Date().toISOString(),status:"failure",error:e instanceof Error?e.message:String(e)}).catch(e=>console.error("[Start Fix] Failed to save error metadata:",e)),console.log(`[Start Fix] Updated workflow run metadata to failure: ${s}`)),Response.json({success:!1,error:e instanceof Error?e.message:String(e)},{status:500,headers:k})}}e.s(["OPTIONS",()=>S,"POST",()=>R,"maxDuration",0,600],50884);var A=e.i(50884);let C=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/cloud/start-fix/route",pathname:"/api/cloud/start-fix",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/mcp-server/app/api/cloud/start-fix/route.ts",nextConfigOutput:"",userland:A}),{workAsyncStorage:O,workUnitAsyncStorage:E,serverHooks:$}=C;function q(){return(0,o.patchFetch)({workAsyncStorage:O,workUnitAsyncStorage:E})}async function j(e,t,o){C.isDev&&(0,s.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/cloud/start-fix/route";v=v.replace(/\/index$/,"")||"/";let y=await C.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!y)return t.statusCode=400,t.end("Bad Request"),null==o.waitUntil||o.waitUntil.call(o,Promise.resolve()),null;let{buildId:_,params:b,nextConfig:k,parsedUrl:S,isDraftMode:R,prerenderManifest:A,routerServerContext:O,isOnDemandRevalidate:E,revalidateOnlyGenerated:$,resolvedPathname:q,clientReferenceManifest:j,serverActionsManifest:P}=y,U=(0,l.normalizeAppPath)(v),T=!!(A.dynamicRoutes[U]||A.routes[q]),N=async()=>((null==O?void 0:O.render404)?await O.render404(e,t,S,!1):t.end("This page could not be found"),null);if(T&&!R){let e=!!A.routes[q],t=A.dynamicRoutes[U];if(t&&!1===t.fallback&&!e){if(k.experimental.adapterPath)return await N();throw new g.NoFallbackError}}let F=null;!T||C.isDev||R||(F="/index"===(F=q)?"/":F);let D=!0===C.isDev||!T,I=T&&!D;P&&j&&(0,a.setReferenceManifestsSingleton)({page:v,clientReferenceManifest:j,serverActionsManifest:P,serverModuleMap:(0,i.createServerModuleMap)({serverActionsManifest:P})});let M=e.method||"GET",H=(0,n.getTracer)(),W=H.getActiveScopeSpan(),B={params:b,prerenderManifest:A,renderOpts:{experimental:{authInterrupts:!!k.experimental.authInterrupts},cacheComponents:!!k.cacheComponents,supportsDynamicResponse:D,incrementalCache:(0,s.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:k.cacheLife,waitUntil:o.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,o,s)=>C.onRequestError(e,t,o,s,O)},sharedContext:{buildId:_}},L=new u.NodeNextRequest(e),K=new u.NodeNextResponse(t),V=p.NextRequestAdapter.fromNodeNextRequest(L,(0,p.signalFromNodeResponse)(t));try{let a=async e=>C.handle(V,B).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=H.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==c.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 o=r.get("next.route");if(o){let t=`${M} ${o}`;e.setAttributes({"next.route":o,"http.route":o,"next.span_name":t}),e.updateName(t)}else e.updateName(`${M} ${v}`)}),i=!!(0,s.getRequestMeta)(e,"minimalMode"),l=async s=>{var n,l;let u=async({previousCacheEntry:r})=>{try{if(!i&&E&&$&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await a(s);e.fetchMetrics=B.renderOpts.fetchMetrics;let l=B.renderOpts.pendingWaitUntil;l&&o.waitUntil&&(o.waitUntil(l),l=void 0);let u=B.renderOpts.collectedTags;if(!T)return await (0,f.sendResponse)(L,K,n,B.renderOpts.pendingWaitUntil),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);u&&(t[m.NEXT_CACHE_TAGS_HEADER]=u),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==B.renderOpts.collectedRevalidate&&!(B.renderOpts.collectedRevalidate>=m.INFINITE_CACHE)&&B.renderOpts.collectedRevalidate,o=void 0===B.renderOpts.collectedExpire||B.renderOpts.collectedExpire>=m.INFINITE_CACHE?void 0:B.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:o}}}}catch(t){throw(null==r?void 0:r.isStale)&&await C.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:I,isOnDemandRevalidate:E})},!1,O),t}},p=await C.handleResponse({req:e,nextConfig:k,cacheKey:F,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:A,isRoutePPREnabled:!1,isOnDemandRevalidate:E,revalidateOnlyGenerated:$,responseGenerator:u,waitUntil:o.waitUntil,isMinimalMode:i});if(!T)return null;if((null==p||null==(n=p.value)?void 0:n.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==p||null==(l=p.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});i||t.setHeader("x-nextjs-cache",E?"REVALIDATED":p.isMiss?"MISS":p.isStale?"STALE":"HIT"),R&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let c=(0,h.fromNodeOutgoingHttpHeaders)(p.value.headers);return i&&T||c.delete(m.NEXT_CACHE_TAGS_HEADER),!p.cacheControl||t.getHeader("Cache-Control")||c.get("Cache-Control")||c.set("Cache-Control",(0,x.getCacheControlHeader)(p.cacheControl)),await (0,f.sendResponse)(L,K,new Response(p.value.body,{headers:c,status:p.value.status||200})),null};W?await l(W):await H.withPropagatedContext(e.headers,()=>H.trace(c.BaseServerSpan.handleRequest,{spanName:`${M} ${v}`,kind:n.SpanKind.SERVER,attributes:{"http.method":M,"http.target":e.url}},l))}catch(t){if(t instanceof g.NoFallbackError||await C.onRequestError(e,t,{routerKind:"App Router",routePath:U,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:I,isOnDemandRevalidate:E})},!1,O),T)throw t;return await (0,f.sendResponse)(L,K,new Response(null,{status:500})),null}}e.s(["handler",()=>j,"patchFetch",()=>q,"routeModule",()=>C,"serverHooks",()=>$,"workAsyncStorage",()=>O,"workUnitAsyncStorage",()=>E],33443)},35726,e=>{e.v(e=>Promise.resolve().then(()=>e(67173)))},16653,e=>{e.v(t=>Promise.all(["server/chunks/[root-of-the-server]__d4c4df71._.js"].map(t=>e.l(t))).then(()=>t(39609)))},92892,e=>{e.v(t=>Promise.all(["server/chunks/[root-of-the-server]__88f7a1e3._.js"].map(t=>e.l(t))).then(()=>t(27791)))},90559,e=>{e.v(t=>Promise.all(["server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js"].map(t=>e.l(t))).then(()=>t(1177)))},33043,e=>{e.v(t=>Promise.all(["server/chunks/2e4a4_next_dist_server_app-render_after-task-async-storage_external_7bcc6304.js","server/chunks/bee4f_next_dist_3372cf42._.js","server/chunks/bee4f_next_dff2a203._.js"].map(t=>e.l(t))).then(()=>t(93408)))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__c1681338._.js.map