From 0b86dc64775d8f1419dee267f3395af6077ac37e Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 5 Feb 2026 11:34:32 +0100 Subject: [PATCH] Add detailed logging for AI tagging progress - Log each project being processed with timing - Log progress every 10 projects with time estimates - Log final completion stats Co-Authored-By: Claude Opus 4.5 --- src/server/services/ai-tagging.ts | 46 +++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/server/services/ai-tagging.ts b/src/server/services/ai-tagging.ts index 477251b..4b327cc 100644 --- a/src/server/services/ai-tagging.ts +++ b/src/server/services/ai-tagging.ts @@ -503,23 +503,44 @@ export async function batchTagProjects( let failed = 0 const errors: string[] = [] + console.log(`[AI Tagging] Starting batch processing of ${untaggedProjects.length} projects in round...`) + const startTime = Date.now() + for (let i = 0; i < untaggedProjects.length; i++) { const project = untaggedProjects[i] + const projectStartTime = Date.now() + console.log(`[AI Tagging] Processing project ${i + 1}/${untaggedProjects.length}: "${project.title.substring(0, 50)}..."`) + try { const result = await tagProject(project.id, userId) results.push(result) processed++ + const elapsed = ((Date.now() - projectStartTime) / 1000).toFixed(1) + console.log(`[AI Tagging] ✓ Tagged "${project.title.substring(0, 30)}..." with ${result.applied.length} tags (${elapsed}s)`) } catch (error) { failed++ - errors.push(`${project.title}: ${error instanceof Error ? error.message : 'Unknown error'}`) + const errorMsg = error instanceof Error ? error.message : 'Unknown error' + errors.push(`${project.title}: ${errorMsg}`) + console.error(`[AI Tagging] ✗ Failed "${project.title.substring(0, 30)}...": ${errorMsg}`) } // Report progress if (onProgress) { onProgress(i + 1, untaggedProjects.length) } + + // Log progress every 10 projects + if ((i + 1) % 10 === 0) { + const elapsed = ((Date.now() - startTime) / 1000).toFixed(0) + const avgTime = (Date.now() - startTime) / (i + 1) / 1000 + const remaining = avgTime * (untaggedProjects.length - i - 1) + console.log(`[AI Tagging] Progress: ${i + 1}/${untaggedProjects.length} (${elapsed}s elapsed, ~${remaining.toFixed(0)}s remaining)`) + } } + const totalTime = ((Date.now() - startTime) / 1000).toFixed(1) + console.log(`[AI Tagging] Batch complete: ${processed} tagged, ${failed} failed, ${alreadyTaggedCount} skipped in ${totalTime}s`) + return { processed, failed, @@ -586,23 +607,44 @@ export async function batchTagProgramProjects( let failed = 0 const errors: string[] = [] + console.log(`[AI Tagging] Starting batch processing of ${untaggedProjects.length} projects...`) + const startTime = Date.now() + for (let i = 0; i < untaggedProjects.length; i++) { const project = untaggedProjects[i] + const projectStartTime = Date.now() + console.log(`[AI Tagging] Processing project ${i + 1}/${untaggedProjects.length}: "${project.title.substring(0, 50)}..."`) + try { const result = await tagProject(project.id, userId) results.push(result) processed++ + const elapsed = ((Date.now() - projectStartTime) / 1000).toFixed(1) + console.log(`[AI Tagging] ✓ Tagged "${project.title.substring(0, 30)}..." with ${result.applied.length} tags (${elapsed}s)`) } catch (error) { failed++ - errors.push(`${project.title}: ${error instanceof Error ? error.message : 'Unknown error'}`) + const errorMsg = error instanceof Error ? error.message : 'Unknown error' + errors.push(`${project.title}: ${errorMsg}`) + console.error(`[AI Tagging] ✗ Failed "${project.title.substring(0, 30)}...": ${errorMsg}`) } // Report progress if (onProgress) { onProgress(i + 1, untaggedProjects.length) } + + // Log progress every 10 projects + if ((i + 1) % 10 === 0) { + const elapsed = ((Date.now() - startTime) / 1000).toFixed(0) + const avgTime = (Date.now() - startTime) / (i + 1) / 1000 + const remaining = avgTime * (untaggedProjects.length - i - 1) + console.log(`[AI Tagging] Progress: ${i + 1}/${untaggedProjects.length} (${elapsed}s elapsed, ~${remaining.toFixed(0)}s remaining)`) + } } + const totalTime = ((Date.now() - startTime) / 1000).toFixed(1) + console.log(`[AI Tagging] Batch complete: ${processed} tagged, ${failed} failed, ${alreadyTaggedCount} skipped in ${totalTime}s`) + return { processed, failed,