dev3000 0.0.121 → 0.0.124
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/cli.js +19 -0
- package/dist/cli.js.map +1 -1
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +11 -0
- package/dist/dev-environment.js.map +1 -1
- package/dist/utils/log-filename.d.ts.map +1 -1
- package/dist/utils/log-filename.js +8 -3
- package/dist/utils/log-filename.js.map +1 -1
- package/mcp-server/app/mcp/route.ts +81 -7
- package/mcp-server/app/mcp/tools.ts +33 -3
- package/mcp-server/next-env.d.ts +1 -1
- package/mcp-server/package.json +0 -12
- package/package.json +6 -7
- package/mcp-server/.next/build/chunks/[root-of-the-server]__25374c4f._.js +0 -500
- package/mcp-server/.next/build/chunks/[root-of-the-server]__25374c4f._.js.map +0 -11
- package/mcp-server/.next/build/chunks/[root-of-the-server]__6e020478._.js +0 -441
- package/mcp-server/.next/build/chunks/[root-of-the-server]__6e020478._.js.map +0 -7
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js +0 -205
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js.map +0 -8
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c7ae8543._.js +0 -500
- package/mcp-server/.next/build/chunks/[root-of-the-server]__c7ae8543._.js.map +0 -11
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_80bff36f._.js +0 -13
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_80bff36f._.js.map +0 -5
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_webpack-loaders_ts_c84aa21a._.js +0 -12
- package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_webpack-loaders_ts_c84aa21a._.js.map +0 -5
- package/mcp-server/.next/build/chunks/[turbopack]_runtime.js +0 -770
- package/mcp-server/.next/build/chunks/[turbopack]_runtime.js.map +0 -10
- package/mcp-server/.next/build/chunks/node_modules__pnpm_806d01c0._.js +0 -6758
- package/mcp-server/.next/build/chunks/node_modules__pnpm_806d01c0._.js.map +0 -47
- package/mcp-server/.next/build/package.json +0 -1
- package/mcp-server/.next/build/postcss.js +0 -6
- package/mcp-server/.next/build/postcss.js.map +0 -5
- package/mcp-server/.next/build/webpack-loaders.js +0 -6
- package/mcp-server/.next/build/webpack-loaders.js.map +0 -5
- package/mcp-server/.next/package.json +0 -1
- package/mcp-server/app/api/auth/authorize/route.ts +0 -52
- package/mcp-server/app/api/auth/callback/route.ts +0 -128
- package/mcp-server/app/api/auth/signout/route.ts +0 -34
- package/mcp-server/app/api/auth/token/route.ts +0 -16
- package/mcp-server/app/api/cloud/check-pr/route.ts +0 -53
- package/mcp-server/app/api/cloud/check-pr/steps.ts +0 -458
- package/mcp-server/app/api/cloud/check-pr/workflow.ts +0 -109
- package/mcp-server/app/api/cloud/fix-workflow/health/route.ts +0 -10
- package/mcp-server/app/api/cloud/fix-workflow/route.ts +0 -50
- package/mcp-server/app/api/cloud/fix-workflow/steps.ts +0 -2091
- package/mcp-server/app/api/cloud/fix-workflow/workflow.ts +0 -296
- package/mcp-server/app/api/cloud/start-fix/route.ts +0 -192
- package/mcp-server/app/api/integration/webhook/route.ts +0 -290
- package/mcp-server/app/api/projects/[projectId]/bypass-token/route.ts +0 -48
- package/mcp-server/app/api/projects/branches/route.ts +0 -115
- package/mcp-server/app/api/projects/check-protection/route.ts +0 -33
- package/mcp-server/app/api/projects/route.ts +0 -97
- package/mcp-server/app/api/workflows/route.ts +0 -105
- package/mcp-server/app/auth/error/page.tsx +0 -47
- package/mcp-server/app/signin/page.tsx +0 -37
- package/mcp-server/app/workflows/[id]/report/agent-analysis.tsx +0 -7
- package/mcp-server/app/workflows/[id]/report/page.tsx +0 -199
- package/mcp-server/app/workflows/new/new-workflow-client.tsx +0 -32
- package/mcp-server/app/workflows/new/page.tsx +0 -13
- package/mcp-server/app/workflows/new-workflow-modal.tsx +0 -973
- package/mcp-server/app/workflows/page.tsx +0 -16
- package/mcp-server/app/workflows/workflows-client.tsx +0 -290
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"type": "commonjs"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
var R=require("./chunks/[turbopack]_runtime.js")("postcss.js")
|
|
2
|
-
R.c("chunks/[turbopack-node]_transforms_postcss_ts_80bff36f._.js")
|
|
3
|
-
R.c("chunks/[root-of-the-server]__25374c4f._.js")
|
|
4
|
-
R.m("[turbopack-node]/globals.ts [postcss] (ecmascript)")
|
|
5
|
-
R.m("[turbopack-node]/ipc/evaluate.ts/evaluate.js { INNER => \"[turbopack-node]/transforms/postcss.ts { CONFIG => \\\"[project]/mcp-server/postcss.config.mjs [postcss] (ecmascript)\\\" } [postcss] (ecmascript)\", RUNTIME => \"[turbopack-node]/ipc/evaluate.ts [postcss] (ecmascript)\" } [postcss] (ecmascript)")
|
|
6
|
-
module.exports=R.m("[turbopack-node]/ipc/evaluate.ts/evaluate.js { INNER => \"[turbopack-node]/transforms/postcss.ts { CONFIG => \\\"[project]/mcp-server/postcss.config.mjs [postcss] (ecmascript)\\\" } [postcss] (ecmascript)\", RUNTIME => \"[turbopack-node]/ipc/evaluate.ts [postcss] (ecmascript)\" } [postcss] (ecmascript)").exports
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
var R=require("./chunks/[turbopack]_runtime.js")("webpack-loaders.js")
|
|
2
|
-
R.c("chunks/[turbopack-node]_transforms_webpack-loaders_ts_c84aa21a._.js")
|
|
3
|
-
R.c("chunks/[root-of-the-server]__c7ae8543._.js")
|
|
4
|
-
R.m("[turbopack-node]/globals.ts [webpack_loaders] (ecmascript)")
|
|
5
|
-
R.m("[turbopack-node]/ipc/evaluate.ts/evaluate.js { INNER => \"[turbopack-node]/transforms/webpack-loaders.ts [webpack_loaders] (ecmascript)\", RUNTIME => \"[turbopack-node]/ipc/evaluate.ts [webpack_loaders] (ecmascript)\" } [webpack_loaders] (ecmascript)")
|
|
6
|
-
module.exports=R.m("[turbopack-node]/ipc/evaluate.ts/evaluate.js { INNER => \"[turbopack-node]/transforms/webpack-loaders.ts [webpack_loaders] (ecmascript)\", RUNTIME => \"[turbopack-node]/ipc/evaluate.ts [webpack_loaders] (ecmascript)\" } [webpack_loaders] (ecmascript)").exports
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"type": "commonjs"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto"
|
|
2
|
-
import { cookies } from "next/headers"
|
|
3
|
-
import { type NextRequest, NextResponse } from "next/server"
|
|
4
|
-
|
|
5
|
-
function generateSecureRandomString(length: number) {
|
|
6
|
-
return crypto
|
|
7
|
-
.randomBytes(Math.ceil(length / 2))
|
|
8
|
-
.toString("hex")
|
|
9
|
-
.substring(0, length)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function GET(req: NextRequest) {
|
|
13
|
-
const state = generateSecureRandomString(43)
|
|
14
|
-
const nonce = generateSecureRandomString(43)
|
|
15
|
-
const code_verifier = generateSecureRandomString(43)
|
|
16
|
-
const code_challenge = crypto.createHash("sha256").update(code_verifier).digest("base64url")
|
|
17
|
-
const cookieStore = await cookies()
|
|
18
|
-
|
|
19
|
-
cookieStore.set("oauth_state", state, {
|
|
20
|
-
maxAge: 10 * 60, // 10 minutes
|
|
21
|
-
secure: true,
|
|
22
|
-
httpOnly: true,
|
|
23
|
-
sameSite: "lax"
|
|
24
|
-
})
|
|
25
|
-
cookieStore.set("oauth_nonce", nonce, {
|
|
26
|
-
maxAge: 10 * 60, // 10 minutes
|
|
27
|
-
secure: true,
|
|
28
|
-
httpOnly: true,
|
|
29
|
-
sameSite: "lax"
|
|
30
|
-
})
|
|
31
|
-
cookieStore.set("oauth_code_verifier", code_verifier, {
|
|
32
|
-
maxAge: 10 * 60, // 10 minutes
|
|
33
|
-
secure: true,
|
|
34
|
-
httpOnly: true,
|
|
35
|
-
sameSite: "lax"
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
const queryParams = new URLSearchParams({
|
|
39
|
-
client_id: process.env.NEXT_PUBLIC_CLIENT_ID as string,
|
|
40
|
-
redirect_uri: `${req.nextUrl.origin}/api/auth/callback`,
|
|
41
|
-
state,
|
|
42
|
-
nonce,
|
|
43
|
-
code_challenge,
|
|
44
|
-
code_challenge_method: "S256",
|
|
45
|
-
response_type: "code",
|
|
46
|
-
scope: "openid email profile offline_access user team project deployment",
|
|
47
|
-
prompt: "consent"
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
const authorizationUrl = `https://vercel.com/oauth/authorize?${queryParams.toString()}`
|
|
51
|
-
return NextResponse.redirect(authorizationUrl)
|
|
52
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { cookies } from "next/headers"
|
|
2
|
-
import type { NextRequest } from "next/server"
|
|
3
|
-
|
|
4
|
-
interface TokenData {
|
|
5
|
-
access_token: string
|
|
6
|
-
token_type: string
|
|
7
|
-
id_token: string
|
|
8
|
-
expires_in: number
|
|
9
|
-
scope: string
|
|
10
|
-
refresh_token: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export async function GET(request: NextRequest) {
|
|
14
|
-
try {
|
|
15
|
-
const url = new URL(request.url)
|
|
16
|
-
const code = url.searchParams.get("code")
|
|
17
|
-
const state = url.searchParams.get("state")
|
|
18
|
-
const error = url.searchParams.get("error")
|
|
19
|
-
const errorDescription = url.searchParams.get("error_description")
|
|
20
|
-
|
|
21
|
-
// Handle OAuth errors from the provider
|
|
22
|
-
if (error) {
|
|
23
|
-
const errorUrl = new URL("/auth/error", request.url)
|
|
24
|
-
errorUrl.searchParams.set("error", error)
|
|
25
|
-
if (errorDescription) {
|
|
26
|
-
errorUrl.searchParams.set("error_description", errorDescription)
|
|
27
|
-
}
|
|
28
|
-
return Response.redirect(errorUrl)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (!code) {
|
|
32
|
-
throw new Error("Authorization code is required")
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const storedState = request.cookies.get("oauth_state")?.value
|
|
36
|
-
const storedNonce = request.cookies.get("oauth_nonce")?.value
|
|
37
|
-
const codeVerifier = request.cookies.get("oauth_code_verifier")?.value
|
|
38
|
-
|
|
39
|
-
if (!validate(state, storedState)) {
|
|
40
|
-
throw new Error("State mismatch")
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const tokenData = await exchangeCodeForToken(code, codeVerifier, request.nextUrl.origin)
|
|
44
|
-
const decodedNonce = decodeNonce(tokenData.id_token)
|
|
45
|
-
|
|
46
|
-
if (!validate(decodedNonce, storedNonce)) {
|
|
47
|
-
throw new Error("Nonce mismatch")
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
await setAuthCookies(tokenData)
|
|
51
|
-
|
|
52
|
-
const cookieStore = await cookies()
|
|
53
|
-
|
|
54
|
-
// Clear the state, nonce, and oauth_code_verifier cookies
|
|
55
|
-
cookieStore.set("oauth_state", "", { maxAge: 0 })
|
|
56
|
-
cookieStore.set("oauth_nonce", "", { maxAge: 0 })
|
|
57
|
-
cookieStore.set("oauth_code_verifier", "", { maxAge: 0 })
|
|
58
|
-
|
|
59
|
-
return Response.redirect(new URL("/workflows", request.url))
|
|
60
|
-
} catch (error) {
|
|
61
|
-
console.error("OAuth callback error:", error)
|
|
62
|
-
return Response.redirect(new URL("/auth/error", request.url))
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function validate(value: string | null, storedValue: string | undefined): boolean {
|
|
67
|
-
if (!value || !storedValue) {
|
|
68
|
-
return false
|
|
69
|
-
}
|
|
70
|
-
return value === storedValue
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function decodeNonce(idToken: string): string {
|
|
74
|
-
const payload = idToken.split(".")[1]
|
|
75
|
-
const decodedPayload = Buffer.from(payload, "base64").toString("utf-8")
|
|
76
|
-
const nonceMatch = decodedPayload.match(/"nonce":"([^"]+)"/)
|
|
77
|
-
return nonceMatch ? nonceMatch[1] : ""
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async function exchangeCodeForToken(
|
|
81
|
-
code: string,
|
|
82
|
-
code_verifier: string | undefined,
|
|
83
|
-
requestOrigin: string
|
|
84
|
-
): Promise<TokenData> {
|
|
85
|
-
const params = new URLSearchParams({
|
|
86
|
-
grant_type: "authorization_code",
|
|
87
|
-
client_id: process.env.NEXT_PUBLIC_CLIENT_ID as string,
|
|
88
|
-
client_secret: process.env.CLIENT_SECRET as string,
|
|
89
|
-
code: code,
|
|
90
|
-
code_verifier: code_verifier || "",
|
|
91
|
-
redirect_uri: `${requestOrigin}/api/auth/callback`
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
const response = await fetch("https://vercel.com/api/login/oauth/token", {
|
|
95
|
-
method: "POST",
|
|
96
|
-
headers: {
|
|
97
|
-
"Content-Type": "application/x-www-form-urlencoded"
|
|
98
|
-
},
|
|
99
|
-
body: params.toString()
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
if (!response.ok) {
|
|
103
|
-
const errorData = await response.json()
|
|
104
|
-
throw new Error(`Failed to exchange code for token: ${JSON.stringify(errorData)}`)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const tokenData = await response.json()
|
|
108
|
-
console.log("Token exchange response - scope:", tokenData.scope)
|
|
109
|
-
return tokenData
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async function setAuthCookies(tokenData: TokenData) {
|
|
113
|
-
const cookieStore = await cookies()
|
|
114
|
-
|
|
115
|
-
cookieStore.set("access_token", tokenData.access_token, {
|
|
116
|
-
httpOnly: true,
|
|
117
|
-
secure: process.env.NODE_ENV === "production",
|
|
118
|
-
sameSite: "lax",
|
|
119
|
-
maxAge: tokenData.expires_in
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
cookieStore.set("refresh_token", tokenData.refresh_token, {
|
|
123
|
-
httpOnly: true,
|
|
124
|
-
secure: process.env.NODE_ENV === "production",
|
|
125
|
-
sameSite: "lax",
|
|
126
|
-
maxAge: 60 * 60 * 24 * 30 // 30 days
|
|
127
|
-
})
|
|
128
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { cookies } from "next/headers"
|
|
2
|
-
|
|
3
|
-
export async function POST() {
|
|
4
|
-
const cookieStore = await cookies()
|
|
5
|
-
const accessToken = cookieStore.get("access_token")?.value
|
|
6
|
-
|
|
7
|
-
if (!accessToken) {
|
|
8
|
-
return Response.json({ error: "No access token found" }, { status: 401 })
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const credentials = `${process.env.NEXT_PUBLIC_CLIENT_ID}:${process.env.CLIENT_SECRET}`
|
|
12
|
-
|
|
13
|
-
const response = await fetch("https://vercel.com/api/login/oauth/token/revoke", {
|
|
14
|
-
method: "POST",
|
|
15
|
-
headers: {
|
|
16
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
17
|
-
Authorization: `Basic ${Buffer.from(credentials).toString("base64")}`
|
|
18
|
-
},
|
|
19
|
-
body: new URLSearchParams({
|
|
20
|
-
token: accessToken
|
|
21
|
-
})
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
if (!response.ok) {
|
|
25
|
-
const errorData = await response.json()
|
|
26
|
-
console.error("Error revoking token:", errorData)
|
|
27
|
-
return Response.json({ error: "Failed to revoke access token" }, { status: response.status })
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
cookieStore.set("access_token", "", { maxAge: 0 })
|
|
31
|
-
cookieStore.set("refresh_token", "", { maxAge: 0 })
|
|
32
|
-
|
|
33
|
-
return Response.json({}, { status: response.status })
|
|
34
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { cookies } from "next/headers"
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Get the current access token from cookies
|
|
5
|
-
* This allows the client to retrieve the token for cross-origin API calls
|
|
6
|
-
*/
|
|
7
|
-
export async function GET() {
|
|
8
|
-
const cookieStore = await cookies()
|
|
9
|
-
const accessToken = cookieStore.get("access_token")?.value
|
|
10
|
-
|
|
11
|
-
if (!accessToken) {
|
|
12
|
-
return Response.json({ error: "Not authenticated" }, { status: 401 })
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return Response.json({ accessToken })
|
|
16
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { start } from "workflow/api"
|
|
2
|
-
import { cloudCheckPRWorkflow } from "./workflow"
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* POST /api/cloud/check-pr
|
|
6
|
-
* HTTP endpoint that starts the workflow
|
|
7
|
-
*/
|
|
8
|
-
export async function POST(request: Request) {
|
|
9
|
-
try {
|
|
10
|
-
const body = await request.json()
|
|
11
|
-
|
|
12
|
-
const { previewUrl, prTitle, prBody, changedFiles, repoOwner, repoName, prNumber } = body
|
|
13
|
-
|
|
14
|
-
// Validate required fields
|
|
15
|
-
if (!previewUrl || !prTitle || !repoOwner || !repoName || !prNumber) {
|
|
16
|
-
return Response.json({ error: "Missing required fields" }, { status: 400 })
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
console.log(`[API] Starting PR check for ${repoOwner}/${repoName}#${prNumber}`)
|
|
20
|
-
|
|
21
|
-
// Start the workflow
|
|
22
|
-
// @ts-expect-error - Workflow SDK types are incomplete
|
|
23
|
-
const workflowRun = await start(cloudCheckPRWorkflow, {
|
|
24
|
-
previewUrl,
|
|
25
|
-
prTitle,
|
|
26
|
-
prBody: prBody || "",
|
|
27
|
-
changedFiles: changedFiles || [],
|
|
28
|
-
repoOwner,
|
|
29
|
-
repoName,
|
|
30
|
-
prNumber: String(prNumber)
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
// @ts-expect-error - Workflow SDK types are incomplete
|
|
34
|
-
console.log(`[API] Workflow started: ${workflowRun.id}`)
|
|
35
|
-
|
|
36
|
-
// Wait for workflow to complete (workflows are durable and will continue even if this times out)
|
|
37
|
-
// @ts-expect-error - Workflow SDK types are incomplete
|
|
38
|
-
const result = await workflowRun.result()
|
|
39
|
-
|
|
40
|
-
console.log(`[API] Workflow completed: ${result.status}`)
|
|
41
|
-
|
|
42
|
-
return result
|
|
43
|
-
} catch (error) {
|
|
44
|
-
console.error("[API] Error starting workflow:", error)
|
|
45
|
-
return Response.json(
|
|
46
|
-
{
|
|
47
|
-
error: error instanceof Error ? error.message : "Unknown error",
|
|
48
|
-
details: error instanceof Error ? error.stack : undefined
|
|
49
|
-
},
|
|
50
|
-
{ status: 500 }
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
}
|