Fix bridge compression history handling (#726)

* feat(bridge): refactor compression to use DB history and add structured logging

- Extract buildDbHistory() to share message loading between buildCompressedHistory and forceCompressBridgeHistory
- forceCompressBridgeHistory now reads from local DB instead of using Python-provided messages, ensuring consistency with api_server path
- Pass sessionId to compressor for snapshot-aware compression
- Add force_compress flag to bridge chat requests
- Add bridgeLogger structured logging for compression lifecycle
- Simplify schemas, session-sync, and providers

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix bridge compression history handling

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-05-14 21:02:59 +08:00
committed by GitHub
parent 7420f7aad5
commit d0f1e7d1f2
19 changed files with 576 additions and 638 deletions
+19 -5
View File
@@ -10,22 +10,28 @@ const logDir = resolve(homedir(), '.hermes-web-ui', 'logs')
mkdirSync(logDir, { recursive: true })
const logFile = resolve(logDir, 'server.log')
const bridgeLogFile = resolve(logDir, 'bridge.log')
function rotateIfNeeded() {
function rotateFileIfNeeded(file: string) {
try {
const stat = statSync(logFile)
const stat = statSync(file)
if (stat.size > MAX_LOG_SIZE) {
const keepSize = Math.floor(MAX_LOG_SIZE / 2)
const fd = openSync(logFile, 'r')
const fd = openSync(file, 'r')
const buf = Buffer.alloc(keepSize)
readSync(fd, buf, 0, keepSize, stat.size - keepSize)
closeSync(fd)
truncateSync(logFile, 0)
writeFileSync(logFile, buf)
truncateSync(file, 0)
writeFileSync(file, buf)
}
} catch { }
}
function rotateIfNeeded() {
rotateFileIfNeeded(logFile)
rotateFileIfNeeded(bridgeLogFile)
}
// Rotate on startup
rotateIfNeeded()
@@ -38,3 +44,11 @@ export const logger = pino({
dest: logFile,
sync: true,
}))
export const bridgeLogger = pino({
level: process.env.BRIDGE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
name: 'bridge',
}, pino.destination({
dest: bridgeLogFile,
sync: true,
}))