const fs = require('fs'); const path = require('path'); const { marked } = require('marked'); const LOG_DIR = path.join(__dirname, 'llm_log'); const OUTPUT_FILE = path.join(__dirname, 'index.html'); function readDirSafe(dir) { if (!fs.existsSync(dir)) return []; const items = fs.readdirSync(dir); return items .filter(f => f.endsWith('.md')) .map(f => path.join(dir, f)) .filter(f => fs.statSync(f).isFile()); } function readFileSafe(filePath) { try { const stat = fs.statSync(filePath); if (stat.size === 0) return null; return fs.readFileSync(filePath, 'utf-8'); } catch { return null; } } function parseMarkdown(content) { if (!content) return ''; marked.setOptions({ gfm: true, breaks: false, }); return marked.parse(content); } const htmlTemplate = ` LLM Log Dashboard

日志记录

`; function buildHtml(logs) { let content = ''; if (logs.length === 0) { content = '

暂无日志记录

'; } else { content = logs.map(({ date, html }) => `
${date}
${html}
`).join('\n'); } return htmlTemplate.replace('
', `
\n ${content}\n `); } function main() { console.log('Reading llm_log directory...'); const files = readDirSafe(LOG_DIR); if (files.length === 0) { console.log('No markdown files found in llm_log directory.'); const emptyHtml = htmlTemplate.replace('

加载中...

', '

暂无日志记录

'); fs.writeFileSync(OUTPUT_FILE, emptyHtml); console.log(`Generated: ${OUTPUT_FILE}`); return; } const logs = files .map(filePath => { const content = readFileSafe(filePath); if (!content) { console.warn(`Skipping empty or unreadable file: ${filePath}`); return null; } const date = path.basename(filePath, '.md'); const html = parseMarkdown(content); return { date, html }; }) .filter(Boolean); logs.sort((a, b) => a.date.localeCompare(b.date)); const html = buildHtml(logs); fs.writeFileSync(OUTPUT_FILE, html); console.log(`Generated: ${OUTPUT_FILE}`); console.log(`Processed ${logs.length} log files.`); } main();