| 577 | let flushInProgress = false; |
| 578 | |
| 579 | async function flushBuffers() { |
| 580 | if (flushInProgress) return; // Guard against concurrent flush |
| 581 | flushInProgress = true; |
| 582 | |
| 583 | try { |
| 584 | // Console buffer |
| 585 | const newConsoleCount = consoleBuffer.totalAdded - lastConsoleFlushed; |
| 586 | if (newConsoleCount > 0) { |
| 587 | const entries = consoleBuffer.last(Math.min(newConsoleCount, consoleBuffer.length)); |
| 588 | const lines = entries.map(e => |
| 589 | `[${new Date(e.timestamp).toISOString()}] [${e.level}] ${e.text}` |
| 590 | ).join('\n') + '\n'; |
| 591 | fs.appendFileSync(CONSOLE_LOG_PATH, lines); |
| 592 | lastConsoleFlushed = consoleBuffer.totalAdded; |
| 593 | } |
| 594 | |
| 595 | // Network buffer |
| 596 | const newNetworkCount = networkBuffer.totalAdded - lastNetworkFlushed; |
| 597 | if (newNetworkCount > 0) { |
| 598 | const entries = networkBuffer.last(Math.min(newNetworkCount, networkBuffer.length)); |
| 599 | const lines = entries.map(e => |
| 600 | `[${new Date(e.timestamp).toISOString()}] ${e.method} ${e.url} → ${e.status || 'pending'} (${e.duration || '?'}ms, ${e.size || '?'}B)` |
| 601 | ).join('\n') + '\n'; |
| 602 | fs.appendFileSync(NETWORK_LOG_PATH, lines); |
| 603 | lastNetworkFlushed = networkBuffer.totalAdded; |
| 604 | } |
| 605 | |
| 606 | // Dialog buffer |
| 607 | const newDialogCount = dialogBuffer.totalAdded - lastDialogFlushed; |
| 608 | if (newDialogCount > 0) { |
| 609 | const entries = dialogBuffer.last(Math.min(newDialogCount, dialogBuffer.length)); |
| 610 | const lines = entries.map(e => |
| 611 | `[${new Date(e.timestamp).toISOString()}] [${e.type}] "${e.message}" → ${e.action}${e.response ? ` "${e.response}"` : ''}` |
| 612 | ).join('\n') + '\n'; |
| 613 | fs.appendFileSync(DIALOG_LOG_PATH, lines); |
| 614 | lastDialogFlushed = dialogBuffer.totalAdded; |
| 615 | } |
| 616 | } catch (err: any) { |
| 617 | console.error('[browse] Buffer flush failed:', err.message); |
| 618 | } finally { |
| 619 | flushInProgress = false; |
| 620 | } |
| 621 | } |
| 622 | |
| 623 | // Flush every 1 second |
| 624 | const flushInterval = setInterval(flushBuffers, 1000); |