VIBN Frontend for Coolify deployment

This commit is contained in:
2026-02-15 19:25:52 -08:00
commit 40bf8428cd
398 changed files with 76513 additions and 0 deletions

View File

@@ -0,0 +1,110 @@
import { NextRequest, NextResponse } from 'next/server';
import admin from '@/lib/firebase/admin';
/**
* Extract vision answers from chat history and save to project
* This is a helper endpoint to migrate from AI chat-based vision collection
* to the structured visionAnswers field
*/
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ projectId: string }> }
) {
try {
const { projectId } = await params;
const db = admin.firestore();
console.log(`[Extract Vision] Extracting vision answers from chat for project ${projectId}`);
// Get chat messages
const conversationRef = db
.collection('projects')
.doc(projectId)
.collection('conversations')
.doc('ai_chat');
const messagesSnapshot = await conversationRef
.collection('messages')
.orderBy('createdAt', 'asc')
.get();
if (messagesSnapshot.empty) {
return NextResponse.json(
{ error: 'No chat messages found' },
{ status: 404 }
);
}
const messages = messagesSnapshot.docs.map(doc => ({
id: doc.id,
...doc.data()
}));
console.log(`[Extract Vision] Found ${messages.length} total messages`);
// Extract user messages (answers to the 3 vision questions)
const userMessages = messages.filter((m: any) => m.role === 'user');
console.log(`[Extract Vision] Found ${userMessages.length} user messages`);
if (userMessages.length < 3) {
return NextResponse.json(
{
error: 'Not enough answers found',
details: `Found ${userMessages.length} answers, need 3`,
userMessages: userMessages.map((m: any) => m.content?.substring(0, 100))
},
{ status: 400 }
);
}
// The first 3 user messages should be the answers to Q1, Q2, Q3
const visionAnswers = {
q1: userMessages[0].content,
q2: userMessages[1].content,
q3: userMessages[2].content,
allAnswered: true,
updatedAt: new Date().toISOString(),
};
console.log(`[Extract Vision] Extracted vision answers:`, {
q1: visionAnswers.q1.substring(0, 50) + '...',
q2: visionAnswers.q2.substring(0, 50) + '...',
q3: visionAnswers.q3.substring(0, 50) + '...',
});
// Save to project
await db.collection('projects').doc(projectId).set(
{
visionAnswers,
readyForMVP: true,
currentPhase: 'mvp',
phaseStatus: 'ready',
},
{ merge: true }
);
console.log(`[Extract Vision] ✅ Vision answers saved for project ${projectId}`);
return NextResponse.json({
success: true,
message: 'Vision answers extracted and saved',
visionAnswers: {
q1: visionAnswers.q1.substring(0, 100) + '...',
q2: visionAnswers.q2.substring(0, 100) + '...',
q3: visionAnswers.q3.substring(0, 100) + '...',
}
});
} catch (error) {
console.error('[Extract Vision] Error:', error);
return NextResponse.json(
{
error: 'Failed to extract vision answers',
details: error instanceof Error ? error.message : String(error),
},
{ status: 500 }
);
}
}