dev3000 0.0.116 → 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.
- package/dist/cdp-monitor.d.ts +1 -0
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +11 -2
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +45 -4
- package/dist/dev-environment.js.map +1 -1
- package/mcp-server/.next/BUILD_ID +1 -1
- package/mcp-server/.next/build-manifest.json +2 -2
- package/mcp-server/.next/fallback-build-manifest.json +2 -2
- package/mcp-server/.next/prerender-manifest.json +3 -3
- package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js +1 -1
- package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_global-error.html +2 -2
- package/mcp-server/.next/server/app/_global-error.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_not-found.html +1 -1
- package/mcp-server/.next/server/app/_not-found.rsc +2 -2
- package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js +1 -1
- package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/cloud/start-fix/route.js +1 -1
- package/mcp-server/.next/server/app/api/cloud/start-fix/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/jank/[session]/route.js +1 -1
- package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/auth/error/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/auth/error.html +1 -1
- package/mcp-server/.next/server/app/auth/error.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/_full.segment.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/auth/error.segments/_index.segment.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/auth/error/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/auth/error.segments/auth/error.segment.rsc +1 -1
- package/mcp-server/.next/server/app/auth/error.segments/auth.segment.rsc +1 -1
- package/mcp-server/.next/server/app/index.html +1 -1
- package/mcp-server/.next/server/app/index.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/mcp/route.js +1 -1
- package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/signin/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/workflows/[id]/report/page.js +1 -1
- package/mcp-server/.next/server/app/workflows/[id]/report/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/workflows/[id]/report/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/workflows/new/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__ec6a1335._.js → [root-of-the-server]__1095b0eb._.js} +2 -2
- package/mcp-server/.next/server/chunks/[root-of-the-server]__1095b0eb._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js +3 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js.map +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__18ce35ee._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__18ce35ee._.js.map +1 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__2920484d._.js → [root-of-the-server]__29c39fca._.js} +2 -2
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__2920484d._.js.map → [root-of-the-server]__29c39fca._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__55642730._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__55642730._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js.map +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__ece7a7f7._.js → [root-of-the-server]__951b3108._.js} +2 -2
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__bcb77a22._.js → [root-of-the-server]__fd11bb92._.js} +2 -2
- package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js +34 -4
- package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js.map +1 -1
- package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js +19 -19
- package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js.map +1 -1
- package/mcp-server/.next/server/chunks/mcp-server_lib_workflow-storage_ts_30ca7761._.js +3 -0
- package/mcp-server/.next/server/chunks/mcp-server_lib_workflow-storage_ts_30ca7761._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__bb161645._.js → [root-of-the-server]__34cc4876._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/_cd4dc25e._.js.map +1 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js +1 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js.map +1 -1
- package/mcp-server/.next/server/server-reference-manifest.js +1 -1
- package/mcp-server/.next/server/server-reference-manifest.json +1 -1
- package/mcp-server/.next/static/chunks/{93db5737a327ab0c.js → 7b9a23e7f572d8a7.js} +1 -1
- package/mcp-server/.next/static/chunks/98585d170d82e3e8.css +1 -0
- package/mcp-server/app/api/cloud/fix-workflow/steps.ts +35 -4
- package/mcp-server/app/api/cloud/fix-workflow/workflow.ts +53 -1
- package/mcp-server/app/api/cloud/start-fix/route.ts +11 -2
- package/mcp-server/app/api/workflows/route.ts +36 -14
- package/mcp-server/app/workflows/new-workflow-modal.tsx +90 -23
- package/package.json +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ec6a1335._.js.map +0 -1
- package/mcp-server/.next/static/chunks/000849a6a897f531.css +0 -1
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__ece7a7f7._.js.map → [root-of-the-server]__951b3108._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__bcb77a22._.js.map → [root-of-the-server]__fd11bb92._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__bb161645._.js.map → [root-of-the-server]__34cc4876._.js.map} +0 -0
- /package/mcp-server/.next/static/{G5taiQ-Jp0B_MdvkQuoIT → GVm-012A2JbRg9oviNAqV}/_buildManifest.js +0 -0
- /package/mcp-server/.next/static/{G5taiQ-Jp0B_MdvkQuoIT → GVm-012A2JbRg9oviNAqV}/_clientMiddlewareManifest.json +0 -0
- /package/mcp-server/.next/static/{G5taiQ-Jp0B_MdvkQuoIT → 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
//
|
|
414
|
-
|
|
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
|
|
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,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
|