feat(core,cli): add debug logging infrastructure (M0-M2)

Implement debug logfile foundation for routing internal diagnostics
to a per-session log file instead of polluting the terminal.

Core changes:
- Add DebugLogger interface and createDebugLogger() in debugLogger.ts
- Add Storage.getGlobalDebugDir() and getDebugLogPath() for log paths
- Add Config.getDebugLogger() method with session-scoped logger
- Track write failures via isDebugLoggingDegraded()

CLI changes:
- Add DebugModeNotification component for interactive startup notice
- Add non-interactive debug notice to stderr in gemini.tsx

Log files are written to ~/.qwen/debug/<sessionId>.txt with format:
2026-01-24T10:30:00.000Z [LEVEL] [TAG] message

Debug logging is always-on; debug mode only controls the startup notice.
This commit is contained in:
tanzhenxin 2026-01-25 09:23:18 +08:00
parent 829ba9c431
commit ba2824b0b0
8 changed files with 409 additions and 6 deletions

View file

@ -16,6 +16,7 @@ const TMP_DIR_NAME = 'tmp';
const BIN_DIR_NAME = 'bin';
const PROJECT_DIR_NAME = 'projects';
const IDE_DIR_NAME = 'ide';
const DEBUG_DIR_NAME = 'debug';
export class Storage {
private readonly targetDir: string;
@ -60,6 +61,14 @@ export class Storage {
return path.join(Storage.getGlobalQwenDir(), TMP_DIR_NAME);
}
static getGlobalDebugDir(): string {
return path.join(Storage.getGlobalQwenDir(), DEBUG_DIR_NAME);
}
static getDebugLogPath(sessionId: string): string {
return path.join(Storage.getGlobalDebugDir(), `${sessionId}.txt`);
}
static getGlobalIdeDir(): string {
return path.join(Storage.getGlobalQwenDir(), IDE_DIR_NAME);
}