Add comprehensive logging and enable AI section creation

Features:
- IAs can now create NEW sections if they think they're needed
- Complete document content logging (before/after each modification)
- Detailed AI thinking and reasoning in logs
- Distinguish between 'MODIFIED' and 'CREATED NEW SECTION' actions
- Full round-by-round visibility in logs

This allows AI agents to be more creative and add new architectural
sections when they identify missing requirements or design gaps.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Augustin ROUX 2025-10-18 23:20:29 +02:00
parent c5f7806718
commit 68cf310f0c
2 changed files with 52 additions and 5 deletions

View File

@ -50,6 +50,7 @@ class CollaborativeOrchestrator {
) )
const result = stmt.run(initialPrompt, documentFormat, 'created') const result = stmt.run(initialPrompt, documentFormat, 'created')
const sessionId = result.lastInsertRowid const sessionId = result.lastInsertRowid
console.log(`[Session ${sessionId}] Created with ${agentCount} agents, format: ${documentFormat}`)
// Generate random names for agents // Generate random names for agents
const agentNames = getRandomNames(Math.min(agentCount, 50)) const agentNames = getRandomNames(Math.min(agentCount, 50))
@ -88,7 +89,10 @@ class CollaborativeOrchestrator {
const session = this.activeSessions.get(sessionId) const session = this.activeSessions.get(sessionId)
if (!session || session.started) return if (!session || session.started) return
console.log(`[Session ${sessionId}] Starting session with ${session.agents.length} agents: ${session.agents.join(', ')}`)
const firstAgent = session.agents[0] const firstAgent = session.agents[0]
console.log(`[Session ${sessionId}] ${firstAgent} creating initial document...`)
// Generate initial document // Generate initial document
const initialResponse = await generateAgentResponseSync( const initialResponse = await generateAgentResponseSync(
@ -116,6 +120,11 @@ class CollaborativeOrchestrator {
const updateStmt = db.prepare('UPDATE collaborative_sessions SET status = ? WHERE id = ?') const updateStmt = db.prepare('UPDATE collaborative_sessions SET status = ? WHERE id = ?')
updateStmt.run('ongoing', sessionId) 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 // Broadcast initial document
this.broadcast(sessionId, { this.broadcast(sessionId, {
type: 'initial_document_created', type: 'initial_document_created',
@ -125,6 +134,7 @@ class CollaborativeOrchestrator {
roundNumber: 0 roundNumber: 0
}) })
console.log(`[Session ${sessionId}] Scheduling first round in 2s...`)
// Auto-start first round // Auto-start first round
setTimeout(() => this.runRound(sessionId), 2000) setTimeout(() => this.runRound(sessionId), 2000)
} catch (error) { } catch (error) {
@ -148,10 +158,14 @@ class CollaborativeOrchestrator {
const agentsInRound = session.agents const agentsInRound = session.agents
const modifiedAgents = [] const modifiedAgents = []
console.log(`[Session ${sessionId}] ===== ROUND ${roundNumber} START =====`)
// Each agent reviews the document // Each agent reviews the document
for (let i = 0; i < agentsInRound.length; i++) { for (let i = 0; i < agentsInRound.length; i++) {
const agentName = agentsInRound[i] const agentName = agentsInRound[i]
console.log(`[Session ${sessionId}] Round ${roundNumber}: ${agentName} reviewing...`)
// Broadcast that this agent is working // Broadcast that this agent is working
this.broadcast(sessionId, { this.broadcast(sessionId, {
type: 'agent_working', type: 'agent_working',
@ -169,6 +183,13 @@ class CollaborativeOrchestrator {
const thinking = extractThinking(response) const thinking = extractThinking(response)
const section = extractSection(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 // Broadcast agent's thinking in real-time
this.broadcast(sessionId, { this.broadcast(sessionId, {
type: 'agent_thinking', type: 'agent_thinking',
@ -180,6 +201,7 @@ class CollaborativeOrchestrator {
// Check if agent made changes // Check if agent made changes
if (section !== 'Section is good, no changes needed' && !section.includes('no changes needed')) { if (section !== 'Section is good, no changes needed' && !section.includes('no changes needed')) {
// Merge section into document // Merge section into document
const docBefore = session.currentDocument
const updatedDocument = this.mergeSection(session.currentDocument, section) const updatedDocument = this.mergeSection(session.currentDocument, section)
if (updatedDocument !== session.currentDocument) { if (updatedDocument !== session.currentDocument) {
@ -187,6 +209,19 @@ class CollaborativeOrchestrator {
session.versionNumber++ session.versionNumber++
modifiedAgents.push(agentName) 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 // Save version to DB
const insertStmt = db.prepare( const insertStmt = db.prepare(
'INSERT INTO document_versions (session_id, version_number, content, modified_by, modification_reason, round_number) VALUES (?, ?, ?, ?, ?, ?)' 'INSERT INTO document_versions (session_id, version_number, content, modified_by, modification_reason, round_number) VALUES (?, ?, ?, ?, ?, ?)'
@ -208,7 +243,11 @@ class CollaborativeOrchestrator {
section, section,
roundNumber 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) { } catch (error) {
console.error(`Error with agent ${agentName}:`, error) console.error(`Error with agent ${agentName}:`, error)
@ -222,6 +261,8 @@ class CollaborativeOrchestrator {
session.consecutiveNoChanges = 0 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 // Save round to DB
const roundStmt = db.prepare( const roundStmt = db.prepare(
'INSERT INTO document_rounds (session_id, round_number, agents_in_round, agents_made_changes) VALUES (?, ?, ?, ?)' '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 // Auto-schedule next round if not converged
if (!hasConverged && session.consecutiveNoChanges < session.agentCount) { if (!hasConverged && session.consecutiveNoChanges < session.agentCount) {
console.log(`[Session ${sessionId}] Scheduling round ${roundNumber + 1} in 2s...`)
setTimeout(() => this.runRound(sessionId), 2000) setTimeout(() => this.runRound(sessionId), 2000)
} else if (hasConverged) { } else if (hasConverged) {
console.log(`[Session ${sessionId}] CONVERGED! All ${session.agentCount} agents made no changes in consecutive rounds`)
// All agents agreed, auto-complete // All agents agreed, auto-complete
setTimeout(() => this.completeSession(sessionId), 2000) setTimeout(() => this.completeSession(sessionId), 2000)
} }
@ -308,6 +351,7 @@ class CollaborativeOrchestrator {
const session = this.activeSessions.get(sessionId) const session = this.activeSessions.get(sessionId)
if (session) { if (session) {
stmt.run('completed', session.currentDocument, sessionId) 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, { this.broadcast(sessionId, {

View File

@ -14,23 +14,26 @@ function getAgentPrompt(agentName) {
Your responsibilities: Your responsibilities:
1. Review the current document structure 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 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: IMPORTANT RULES:
- Only modify ONE section header and its content - Work on exactly ONE section only
- Never modify the entire document - Never modify the entire document
- Return only the section you're working on, not the whole 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" - If section is good, respond: "Section is good, no changes needed"
- Think step-by-step about what could be improved - Think step-by-step about what could be improved
- Share your reasoning process - Share your reasoning process
Format your response as: Format your response as:
THINKING: [Your analysis and reasoning] 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: SECTION:
[The modified or confirmed section with header]` [The modified section, new section, or confirmation that all is good]`
} }
/** /**