Skip to content

Commit 2655267

Browse files
workflows integrated
1 parent 969070f commit 2655267

37 files changed

+5910
-839
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ claude.md
2424

2525
.env
2626

27+
.mcp.json
28+
2729
# production
2830
/build
2931

app/api/chat/route.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { LLMModel, LLMModelConfig } from '@/lib/models'
44
import { toPrompt } from '@/lib/prompt'
55
import ratelimit from '@/lib/ratelimit'
66
import { fragmentSchema as schema } from '@/lib/schema'
7-
import { Templates } from '@/lib/templates'
7+
import { TemplateId } from '@/lib/templates'
8+
import templates from '@/lib/templates'
89
import { streamObject, LanguageModel, CoreMessage } from 'ai'
910

1011
export const maxDuration = 60
@@ -28,7 +29,7 @@ export async function POST(req: Request) {
2829
messages: CoreMessage[]
2930
userID: string | undefined
3031
teamID: string | undefined
31-
template: Templates
32+
template: TemplateId
3233
model: LLMModel
3334
config: LLMModelConfig
3435
} = await req.json()
@@ -61,7 +62,7 @@ export async function POST(req: Request) {
6162
const modelClient = getModelClient(model, config)
6263

6364
try {
64-
const systemPrompt = toPrompt(template);
65+
const systemPrompt = toPrompt(templates);
6566

6667
const stream = await streamObject({
6768
model: modelClient as LanguageModel,

app/api/debug/route.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { NextRequest, NextResponse } from 'next/server'
2+
import { createServerClient } from '@/lib/supabase-server'
3+
import { errorAnalyzer } from '@/lib/debugging/error-analyzer'
4+
5+
export const dynamic = 'force-dynamic'
6+
7+
export async function POST(request: NextRequest) {
8+
try {
9+
const supabase = createServerClient()
10+
const { data: { session } } = await supabase.auth.getSession()
11+
12+
if (!session?.user?.id) {
13+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
14+
}
15+
16+
const body = await request.json()
17+
const { error, context, code } = body
18+
19+
if (!error) {
20+
return NextResponse.json(
21+
{ error: 'Error message is required' },
22+
{ status: 400 }
23+
)
24+
}
25+
26+
// Analyze error in background
27+
const errorContext = {
28+
fragment: { code, template: 'code-interpreter-v1' },
29+
template: 'code-interpreter-v1' as any,
30+
executionResult: {} as any,
31+
code,
32+
...(context || {})
33+
}
34+
const analysis = await errorAnalyzer.analyzeError(error, errorContext)
35+
36+
return NextResponse.json(analysis)
37+
} catch (error) {
38+
console.error('Error analyzing error:', error)
39+
return NextResponse.json(
40+
{ error: 'Internal server error' },
41+
{ status: 500 }
42+
)
43+
}
44+
}
45+
46+
// GET /api/debug - Get debug session
47+
export async function GET(request: NextRequest) {
48+
try {
49+
const supabase = createServerClient()
50+
const { data: { session } } = await supabase.auth.getSession()
51+
52+
if (!session?.user?.id) {
53+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
54+
}
55+
56+
const searchParams = request.nextUrl.searchParams
57+
const sessionId = searchParams.get('session_id')
58+
59+
if (sessionId) {
60+
const debugSession = errorAnalyzer.getDebugSession(sessionId)
61+
if (!debugSession) {
62+
return NextResponse.json(
63+
{ error: 'Debug session not found' },
64+
{ status: 404 }
65+
)
66+
}
67+
return NextResponse.json(debugSession)
68+
}
69+
70+
// Return active debug sessions
71+
const sessions = errorAnalyzer.getActiveSessions()
72+
return NextResponse.json({ sessions })
73+
} catch (error) {
74+
console.error('Error fetching debug session:', error)
75+
return NextResponse.json(
76+
{ error: 'Internal server error' },
77+
{ status: 500 }
78+
)
79+
}
80+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { NextRequest, NextResponse } from 'next/server'
2+
import { createServerClient } from '@/lib/supabase-server'
3+
import { deploymentEngine } from '@/lib/deployment/deployment-engine'
4+
5+
export const dynamic = 'force-dynamic'
6+
7+
// POST /api/deployments/[id]/rollback - Rollback deployment
8+
export async function POST(
9+
request: NextRequest,
10+
{ params }: { params: { id: string } }
11+
) {
12+
try {
13+
const supabase = createServerClient()
14+
const { data: { session } } = await supabase.auth.getSession()
15+
16+
if (!session?.user?.id) {
17+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
18+
}
19+
20+
const rolledBack = await deploymentEngine.rollbackDeployment(params.id)
21+
22+
if (!rolledBack) {
23+
return NextResponse.json(
24+
{ error: 'Deployment cannot be rolled back' },
25+
{ status: 400 }
26+
)
27+
}
28+
29+
return NextResponse.json({ success: true, message: 'Deployment rolled back' })
30+
} catch (error) {
31+
console.error('Error rolling back deployment:', error)
32+
return NextResponse.json(
33+
{ error: 'Internal server error' },
34+
{ status: 500 }
35+
)
36+
}
37+
}

app/api/deployments/[id]/route.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { NextRequest, NextResponse } from 'next/server'
2+
import { createServerClient } from '@/lib/supabase-server'
3+
import { deploymentEngine } from '@/lib/deployment/deployment-engine'
4+
5+
export const dynamic = 'force-dynamic'
6+
7+
// GET /api/deployments/[id] - Get deployment status
8+
export async function GET(
9+
request: NextRequest,
10+
{ params }: { params: { id: string } }
11+
) {
12+
try {
13+
const supabase = createServerClient()
14+
const { data: { session } } = await supabase.auth.getSession()
15+
16+
if (!session?.user?.id) {
17+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
18+
}
19+
20+
const status = deploymentEngine.getDeploymentStatus(params.id)
21+
22+
if (!status) {
23+
return NextResponse.json(
24+
{ error: 'Deployment not found' },
25+
{ status: 404 }
26+
)
27+
}
28+
29+
return NextResponse.json(status)
30+
} catch (error) {
31+
console.error('Error fetching deployment status:', error)
32+
return NextResponse.json(
33+
{ error: 'Internal server error' },
34+
{ status: 500 }
35+
)
36+
}
37+
}
38+
39+
// DELETE /api/deployments/[id] - Cancel deployment
40+
export async function DELETE(
41+
request: NextRequest,
42+
{ params }: { params: { id: string } }
43+
) {
44+
try {
45+
const supabase = createServerClient()
46+
const { data: { session } } = await supabase.auth.getSession()
47+
48+
if (!session?.user?.id) {
49+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
50+
}
51+
52+
const cancelled = await deploymentEngine.cancelDeployment(params.id)
53+
54+
if (!cancelled) {
55+
return NextResponse.json(
56+
{ error: 'Deployment cannot be cancelled' },
57+
{ status: 400 }
58+
)
59+
}
60+
61+
return NextResponse.json({ success: true, message: 'Deployment cancelled' })
62+
} catch (error) {
63+
console.error('Error cancelling deployment:', error)
64+
return NextResponse.json(
65+
{ error: 'Internal server error' },
66+
{ status: 500 }
67+
)
68+
}
69+
}

app/api/deployments/route.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { NextRequest, NextResponse } from 'next/server'
2+
import { createServerClient } from '@/lib/supabase-server'
3+
import { deploymentEngine } from '@/lib/deployment/deployment-engine'
4+
import { FragmentSchema } from '@/lib/schema'
5+
6+
export const dynamic = 'force-dynamic'
7+
8+
// POST /api/deployments - Deploy fragment
9+
export async function POST(request: NextRequest) {
10+
try {
11+
const supabase = createServerClient()
12+
const { data: { session } } = await supabase.auth.getSession()
13+
14+
if (!session?.user?.id) {
15+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
16+
}
17+
18+
const body = await request.json()
19+
const { fragment, config } = body
20+
21+
if (!fragment || !config) {
22+
return NextResponse.json(
23+
{ error: 'Fragment and config are required' },
24+
{ status: 400 }
25+
)
26+
}
27+
28+
// Validate fragment schema
29+
const fragmentData = fragment as FragmentSchema
30+
if (!fragmentData.template || !fragmentData.code) {
31+
return NextResponse.json(
32+
{ error: 'Fragment must have template and code' },
33+
{ status: 400 }
34+
)
35+
}
36+
37+
// Start deployment in background
38+
const deploymentResult = await deploymentEngine.deployFragment(fragmentData, config)
39+
40+
return NextResponse.json(deploymentResult)
41+
} catch (error) {
42+
console.error('Error deploying fragment:', error)
43+
return NextResponse.json(
44+
{ error: 'Internal server error' },
45+
{ status: 500 }
46+
)
47+
}
48+
}
49+
50+
// GET /api/deployments - List deployments
51+
export async function GET(request: NextRequest) {
52+
try {
53+
const supabase = createServerClient()
54+
const { data: { session } } = await supabase.auth.getSession()
55+
56+
if (!session?.user?.id) {
57+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
58+
}
59+
60+
const searchParams = request.nextUrl.searchParams
61+
const fragmentId = searchParams.get('fragment_id')
62+
63+
if (fragmentId) {
64+
const history = deploymentEngine.getDeploymentHistory(fragmentId)
65+
return NextResponse.json({ deployments: history })
66+
}
67+
68+
// For now, return empty array since we don't have user-specific deployment tracking
69+
return NextResponse.json({ deployments: [] })
70+
} catch (error) {
71+
console.error('Error listing deployments:', error)
72+
return NextResponse.json(
73+
{ error: 'Internal server error' },
74+
{ status: 500 }
75+
)
76+
}
77+
}

0 commit comments

Comments
 (0)