diff --git a/backend/src/services/collaborativeOrchestrator.js b/backend/src/services/collaborativeOrchestrator.js index 6e33ece..0ec0307 100644 --- a/backend/src/services/collaborativeOrchestrator.js +++ b/backend/src/services/collaborativeOrchestrator.js @@ -50,6 +50,7 @@ class CollaborativeOrchestrator { ) const result = stmt.run(initialPrompt, documentFormat, 'created') const sessionId = result.lastInsertRowid + console.log(`[Session ${sessionId}] Created with ${agentCount} agents, format: ${documentFormat}`) // Generate random names for agents const agentNames = getRandomNames(Math.min(agentCount, 50)) @@ -88,7 +89,10 @@ class CollaborativeOrchestrator { const session = this.activeSessions.get(sessionId) if (!session || session.started) return + console.log(`[Session ${sessionId}] Starting session with ${session.agents.length} agents: ${session.agents.join(', ')}`) + const firstAgent = session.agents[0] + console.log(`[Session ${sessionId}] ${firstAgent} creating initial document...`) // Generate initial document const initialResponse = await generateAgentResponseSync( @@ -116,6 +120,11 @@ class CollaborativeOrchestrator { const updateStmt = db.prepare('UPDATE collaborative_sessions SET status = ? WHERE id = ?') updateStmt.run('ongoing', sessionId) + console.log(`[Session ${sessionId}] Initial document created (${initialDocument.length} chars)`) + console.log(`[Session ${sessionId}] ===== INITIAL DOCUMENT =====`) + console.log(initialDocument) + console.log(`[Session ${sessionId}] ===== END INITIAL DOCUMENT =====`) + // Broadcast initial document this.broadcast(sessionId, { type: 'initial_document_created', @@ -125,6 +134,7 @@ class CollaborativeOrchestrator { roundNumber: 0 }) + console.log(`[Session ${sessionId}] Scheduling first round in 2s...`) // Auto-start first round setTimeout(() => this.runRound(sessionId), 2000) } catch (error) { @@ -148,10 +158,14 @@ class CollaborativeOrchestrator { const agentsInRound = session.agents const modifiedAgents = [] + console.log(`[Session ${sessionId}] ===== ROUND ${roundNumber} START =====`) + // Each agent reviews the document for (let i = 0; i < agentsInRound.length; i++) { const agentName = agentsInRound[i] + console.log(`[Session ${sessionId}] Round ${roundNumber}: ${agentName} reviewing...`) + // Broadcast that this agent is working this.broadcast(sessionId, { type: 'agent_working', @@ -169,6 +183,13 @@ class CollaborativeOrchestrator { const thinking = extractThinking(response) const section = extractSection(response) + console.log(`[Session ${sessionId}] Round ${roundNumber}: ${agentName} response received (${response.length} chars)`) + console.log(`[Session ${sessionId}] --- THINKING ---`) + console.log(thinking) + console.log(`[Session ${sessionId}] --- SECTION ---`) + console.log(section) + console.log(`[Session ${sessionId}] --- END RESPONSE ---`) + // Broadcast agent's thinking in real-time this.broadcast(sessionId, { type: 'agent_thinking', @@ -180,6 +201,7 @@ class CollaborativeOrchestrator { // Check if agent made changes if (section !== 'Section is good, no changes needed' && !section.includes('no changes needed')) { // Merge section into document + const docBefore = session.currentDocument const updatedDocument = this.mergeSection(session.currentDocument, section) if (updatedDocument !== session.currentDocument) { @@ -187,6 +209,19 @@ class CollaborativeOrchestrator { session.versionNumber++ modifiedAgents.push(agentName) + // Check if it's a new section or modification + const sectionHeader = section.match(/^(#+)\s+(.+)/m) + const headerText = sectionHeader ? sectionHeader[2] : 'Unknown' + const isNewSection = !docBefore.includes(headerText) + const action = isNewSection ? 'CREATED NEW SECTION' : 'MODIFIED' + + console.log(`[Session ${sessionId}] Round ${roundNumber}: ${agentName} ${action}: "${headerText}" (v${session.versionNumber})`) + console.log(`[Session ${sessionId}] ===== DOCUMENT BEFORE (v${session.versionNumber - 1}) =====`) + console.log(docBefore) + console.log(`[Session ${sessionId}] ===== DOCUMENT AFTER (v${session.versionNumber}) =====`) + console.log(updatedDocument) + console.log(`[Session ${sessionId}] ===== END DOCUMENT =====`) + // Save version to DB const insertStmt = db.prepare( 'INSERT INTO document_versions (session_id, version_number, content, modified_by, modification_reason, round_number) VALUES (?, ?, ?, ?, ?, ?)' @@ -208,7 +243,11 @@ class CollaborativeOrchestrator { section, roundNumber }) + } else { + console.log(`[Session ${sessionId}] Round ${roundNumber}: ${agentName} - section proposed but no actual changes merged`) } + } else { + console.log(`[Session ${sessionId}] Round ${roundNumber}: ${agentName} - no changes needed`) } } catch (error) { console.error(`Error with agent ${agentName}:`, error) @@ -222,6 +261,8 @@ class CollaborativeOrchestrator { session.consecutiveNoChanges = 0 } + console.log(`[Session ${sessionId}] Round ${roundNumber} complete: ${modifiedAgents.length}/${agentsInRound.length} agents modified (consecutive no-change: ${session.consecutiveNoChanges}/${session.agentCount})`) + // Save round to DB const roundStmt = db.prepare( 'INSERT INTO document_rounds (session_id, round_number, agents_in_round, agents_made_changes) VALUES (?, ?, ?, ?)' @@ -252,8 +293,10 @@ class CollaborativeOrchestrator { // Auto-schedule next round if not converged if (!hasConverged && session.consecutiveNoChanges < session.agentCount) { + console.log(`[Session ${sessionId}] Scheduling round ${roundNumber + 1} in 2s...`) setTimeout(() => this.runRound(sessionId), 2000) } else if (hasConverged) { + console.log(`[Session ${sessionId}] CONVERGED! All ${session.agentCount} agents made no changes in consecutive rounds`) // All agents agreed, auto-complete setTimeout(() => this.completeSession(sessionId), 2000) } @@ -308,6 +351,7 @@ class CollaborativeOrchestrator { const session = this.activeSessions.get(sessionId) if (session) { stmt.run('completed', session.currentDocument, sessionId) + console.log(`[Session ${sessionId}] SESSION COMPLETED - Final document: ${session.currentDocument.length} chars, ${session.versionNumber} versions, ${session.conversationHistory.length} rounds`) } this.broadcast(sessionId, { diff --git a/backend/src/services/mistralClient.js b/backend/src/services/mistralClient.js index 9e35a16..9daf011 100644 --- a/backend/src/services/mistralClient.js +++ b/backend/src/services/mistralClient.js @@ -14,23 +14,26 @@ function getAgentPrompt(agentName) { Your responsibilities: 1. Review the current document structure -2. Select ONE section to improve or modify (identified by #, ##, ###, #### headers) +2. Either: + a) Modify ONE existing section (identified by #, ##, ###, #### headers), OR + b) Create a NEW section if you think it's needed 3. Provide your thinking process and reasoning -4. Return ONLY the modified section with its header, or confirm it's good as-is +4. Return ONLY the section (modified or new) with its header, or confirm it's good as-is IMPORTANT RULES: -- Only modify ONE section header and its content +- Work on exactly ONE section only - Never modify the entire document - Return only the section you're working on, not the whole document +- You CAN create a new section if you think the document is missing important content - If section is good, respond: "Section is good, no changes needed" - Think step-by-step about what could be improved - Share your reasoning process Format your response as: THINKING: [Your analysis and reasoning] -DECISION: [What you'll modify or if keeping as-is] +DECISION: [What you'll modify, create, or if keeping as-is] SECTION: -[The modified or confirmed section with header]` +[The modified section, new section, or confirmation that all is good]` } /**