// Manual trigger scripts for both schedulers import { fetchAndStoreSessionsForAllCompanies } from "../lib/csvFetcher.js"; import { processAllUnparsedTranscripts } from "../lib/transcriptParser.js"; import { PrismaClient } from "@prisma/client"; import fetch from "node-fetch"; const prisma = new PrismaClient(); /** * Manually trigger the session refresh scheduler */ async function triggerSessionRefresh() { console.log("=== Manual Session Refresh Trigger ==="); try { await fetchAndStoreSessionsForAllCompanies(); console.log("✅ Session refresh completed successfully"); } catch (error) { console.error("❌ Session refresh failed:", error); } } /** * Manually trigger the processing scheduler */ async function triggerProcessingScheduler() { console.log("=== Manual Processing Scheduler Trigger ==="); const OPENAI_API_KEY = process.env.OPENAI_API_KEY; if (!OPENAI_API_KEY) { console.error("❌ OPENAI_API_KEY environment variable is not set"); return; } try { // Find sessions that need processing const sessionsToProcess = await prisma.session.findMany({ where: { AND: [ { messages: { some: {} } }, { processed: { not: true } }, // Either false or null ], }, select: { id: true, processed: true, }, take: 5, // Process 5 sessions for manual testing }); console.log(`Found ${sessionsToProcess.length} sessions to process:`); sessionsToProcess.forEach(session => { console.log(`- Session ${session.id}: processed=${session.processed}`); }); if (sessionsToProcess.length === 0) { console.log("✅ No sessions found requiring processing"); return; } // Import and run the processing function const { processUnprocessedSessions } = await import("../lib/processingScheduler.js"); await processUnprocessedSessions(); console.log("✅ Processing scheduler completed"); } catch (error) { console.error("❌ Processing scheduler failed:", error); } } /** * Manually trigger transcript parsing */ async function triggerTranscriptParsing() { console.log("=== Manual Transcript Parsing Trigger ==="); try { const result = await processAllUnparsedTranscripts(); console.log(`✅ Transcript parsing completed: ${result.processed} processed, ${result.errors} errors`); } catch (error) { console.error("❌ Transcript parsing failed:", error); } } /** * Show current processing status */ async function showProcessingStatus() { console.log("=== Processing Status ==="); try { const totalSessions = await prisma.session.count(); const processedSessions = await prisma.session.count({ where: { processed: true } }); const unprocessedSessions = await prisma.session.count({ where: { processed: { not: true } } }); const withMessages = await prisma.session.count({ where: { messages: { some: {} } } }); const readyForProcessing = await prisma.session.count({ where: { AND: [ { messages: { some: {} } }, { processed: { not: true } } ] } }); console.log(`📊 Total sessions: ${totalSessions}`); console.log(`✅ Processed sessions: ${processedSessions}`); console.log(`⏳ Unprocessed sessions: ${unprocessedSessions}`); console.log(`📄 Sessions with messages: ${withMessages}`); console.log(`🔄 Ready for processing: ${readyForProcessing}`); // Show some examples of unprocessed sessions if (readyForProcessing > 0) { console.log("\n📋 Sample unprocessed sessions:"); const samples = await prisma.session.findMany({ where: { AND: [ { messages: { some: {} } }, { processed: { not: true } } ] }, select: { id: true, processed: true, startTime: true, }, take: 3 }); samples.forEach(session => { console.log(`- ${session.id} (${session.startTime.toISOString()}) - processed: ${session.processed}`); }); } } catch (error) { console.error("❌ Failed to get processing status:", error); } } // Main execution based on command line argument const command = process.argv[2]; switch (command) { case 'refresh': await triggerSessionRefresh(); break; case 'process': await triggerProcessingScheduler(); break; case 'parse': await triggerTranscriptParsing(); break; case 'status': await showProcessingStatus(); break; case 'both': await triggerSessionRefresh(); console.log("\n" + "=".repeat(50) + "\n"); await triggerProcessingScheduler(); break; case 'all': await triggerSessionRefresh(); console.log("\n" + "=".repeat(50) + "\n"); await triggerTranscriptParsing(); console.log("\n" + "=".repeat(50) + "\n"); await triggerProcessingScheduler(); break; default: console.log("Usage: node scripts/manual-triggers.js [command]"); console.log("Commands:"); console.log(" refresh - Trigger session refresh (fetch new sessions from CSV)"); console.log(" parse - Parse transcripts into structured messages"); console.log(" process - Trigger processing scheduler (process unprocessed sessions)"); console.log(" status - Show current processing status"); console.log(" both - Run both refresh and processing"); console.log(" all - Run refresh, parse, and processing in sequence"); break; } await prisma.$disconnect();