Event-System in main.ts verdrahtet
EventBus, SessionManager, ContentAnalyzer, alle 5 Collectors und CM6-Extension integriert. Tracking-Lifecycle mit Pause/Resume, Initial-Scan bei fehlendem Baseline, Wartung beim Start. Kommandos für Toggle, Rescan, Wartung und Debug-Info. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
91cc22c3e5
commit
64d43dfab2
1 changed files with 208 additions and 3 deletions
211
src/main.ts
211
src/main.ts
|
|
@ -1,28 +1,122 @@
|
||||||
import { Plugin, FileSystemAdapter, TFile } from 'obsidian';
|
import { Plugin, FileSystemAdapter, TFile, MarkdownView, Notice } from 'obsidian';
|
||||||
import { LogfireSettings, DEFAULT_SETTINGS, deepMerge } from './types';
|
import { LogfireSettings, DEFAULT_SETTINGS, deepMerge } from './types';
|
||||||
import { DatabaseManager } from './core/database';
|
import { DatabaseManager } from './core/database';
|
||||||
|
import { EventBus } from './core/event-bus';
|
||||||
|
import { SessionManager } from './core/session-manager';
|
||||||
|
import { ContentAnalyzer } from './core/content-analyzer';
|
||||||
|
import { FileCollector } from './collectors/file-collector';
|
||||||
|
import { ContentCollector } from './collectors/content-collector';
|
||||||
|
import { NavCollector } from './collectors/nav-collector';
|
||||||
|
import { EditorCollector } from './collectors/editor-collector';
|
||||||
|
import { SystemCollector } from './collectors/system-collector';
|
||||||
import { LogfireSettingTab } from './ui/settings-tab';
|
import { LogfireSettingTab } from './ui/settings-tab';
|
||||||
|
import { InitialScanModal } from './ui/initial-scan-modal';
|
||||||
|
|
||||||
export default class LogfirePlugin extends Plugin {
|
export default class LogfirePlugin extends Plugin {
|
||||||
settings!: LogfireSettings;
|
settings!: LogfireSettings;
|
||||||
db!: DatabaseManager;
|
db!: DatabaseManager;
|
||||||
|
eventBus!: EventBus;
|
||||||
|
sessionManager!: SessionManager;
|
||||||
|
contentAnalyzer!: ContentAnalyzer;
|
||||||
|
|
||||||
|
private fileCollector!: FileCollector;
|
||||||
|
private contentCollector!: ContentCollector;
|
||||||
|
private navCollector!: NavCollector;
|
||||||
|
private editorCollector!: EditorCollector;
|
||||||
|
private systemCollector!: SystemCollector;
|
||||||
|
|
||||||
|
private paused = false;
|
||||||
|
|
||||||
async onload(): Promise<void> {
|
async onload(): Promise<void> {
|
||||||
console.log('[Logfire] Lade Plugin...');
|
console.log('[Logfire] Lade Plugin...');
|
||||||
|
|
||||||
await this.loadSettings();
|
await this.loadSettings();
|
||||||
|
|
||||||
|
// Core infrastructure
|
||||||
const dbPath = this.getDatabasePath();
|
const dbPath = this.getDatabasePath();
|
||||||
this.db = new DatabaseManager(dbPath, this.settings);
|
this.db = new DatabaseManager(dbPath, this.settings);
|
||||||
|
|
||||||
|
this.eventBus = new EventBus(
|
||||||
|
this.db,
|
||||||
|
this.settings.advanced.flushIntervalMs,
|
||||||
|
this.settings.advanced.flushThreshold,
|
||||||
|
);
|
||||||
|
|
||||||
|
const vaultName = this.app.vault.getName();
|
||||||
|
this.sessionManager = new SessionManager(this.eventBus, this.db, vaultName);
|
||||||
|
|
||||||
|
// Content analyzer
|
||||||
|
this.contentAnalyzer = new ContentAnalyzer();
|
||||||
|
if (this.db.hasBaseline()) {
|
||||||
|
this.contentAnalyzer.loadBaseline(this.db.loadBaseline());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collectors
|
||||||
|
const shouldTrack = (path: string) => this.shouldTrack(path);
|
||||||
|
|
||||||
|
this.fileCollector = new FileCollector(
|
||||||
|
this.app, this.eventBus, this.sessionManager, this.settings, shouldTrack,
|
||||||
|
);
|
||||||
|
this.contentCollector = new ContentCollector(
|
||||||
|
this.app, this.eventBus, this.sessionManager, this.settings, this.contentAnalyzer, shouldTrack,
|
||||||
|
);
|
||||||
|
this.navCollector = new NavCollector(
|
||||||
|
this.app, this.eventBus, this.sessionManager, this.settings, shouldTrack,
|
||||||
|
);
|
||||||
|
this.editorCollector = new EditorCollector(
|
||||||
|
this.eventBus, this.sessionManager, this.settings, shouldTrack,
|
||||||
|
() => this.getActiveFilePath(),
|
||||||
|
);
|
||||||
|
this.systemCollector = new SystemCollector(
|
||||||
|
this.app, this.eventBus, this.sessionManager, this.settings,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Register CM6 editor extension
|
||||||
|
this.registerEditorExtension(this.editorCollector.createExtension());
|
||||||
|
|
||||||
|
// UI: Settings tab
|
||||||
this.addSettingTab(new LogfireSettingTab(this.app, this));
|
this.addSettingTab(new LogfireSettingTab(this.app, this));
|
||||||
|
|
||||||
console.log('[Logfire] Plugin geladen.');
|
// Commands
|
||||||
|
this.registerCommands();
|
||||||
|
|
||||||
|
// Start tracking
|
||||||
|
if (!this.settings.general.pauseOnStartup) {
|
||||||
|
this.startTracking();
|
||||||
|
} else {
|
||||||
|
this.paused = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initial scan + maintenance on startup (after layout ready)
|
||||||
|
this.app.workspace.onLayoutReady(() => {
|
||||||
|
if (!this.db.hasBaseline()) {
|
||||||
|
this.runInitialScan();
|
||||||
|
}
|
||||||
|
if (this.settings.advanced.retention.maintenanceOnStartup) {
|
||||||
|
try {
|
||||||
|
this.db.runMaintenance(this.settings.advanced.retention);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('[Logfire] Wartung beim Start fehlgeschlagen:', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('[Logfire] Plugin geladen. Session:', this.sessionManager.currentSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onunload(): Promise<void> {
|
async onunload(): Promise<void> {
|
||||||
console.log('[Logfire] Entlade Plugin...');
|
console.log('[Logfire] Entlade Plugin...');
|
||||||
|
|
||||||
|
this.stopTracking();
|
||||||
|
|
||||||
|
if (this.sessionManager) {
|
||||||
|
this.sessionManager.endSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.eventBus) {
|
||||||
|
this.eventBus.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
if (this.db) {
|
if (this.db) {
|
||||||
this.db.close();
|
this.db.close();
|
||||||
}
|
}
|
||||||
|
|
@ -31,10 +125,65 @@ export default class LogfirePlugin extends Plugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Track filtering (used by collectors in later features)
|
// Tracking lifecycle
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
private startTracking(): void {
|
||||||
|
this.sessionManager.startSession();
|
||||||
|
this.fileCollector.register();
|
||||||
|
this.contentCollector.register();
|
||||||
|
this.navCollector.register();
|
||||||
|
this.systemCollector.register();
|
||||||
|
}
|
||||||
|
|
||||||
|
private stopTracking(): void {
|
||||||
|
this.fileCollector?.unregister();
|
||||||
|
this.contentCollector?.unregister();
|
||||||
|
this.navCollector?.unregister();
|
||||||
|
this.systemCollector?.unregister();
|
||||||
|
}
|
||||||
|
|
||||||
|
isPaused(): boolean {
|
||||||
|
return this.paused;
|
||||||
|
}
|
||||||
|
|
||||||
|
pause(): void {
|
||||||
|
if (!this.paused) {
|
||||||
|
this.paused = true;
|
||||||
|
this.stopTracking();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resume(): void {
|
||||||
|
if (this.paused) {
|
||||||
|
this.paused = false;
|
||||||
|
this.startTracking();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Initial scan
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
private async runInitialScan(): Promise<void> {
|
||||||
|
const modal = new InitialScanModal(
|
||||||
|
this.app,
|
||||||
|
this.settings,
|
||||||
|
this.contentAnalyzer,
|
||||||
|
this.db,
|
||||||
|
this.eventBus,
|
||||||
|
this.sessionManager,
|
||||||
|
(path) => this.shouldTrack(path),
|
||||||
|
);
|
||||||
|
await modal.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Track filtering
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
shouldTrack(path: string): boolean {
|
shouldTrack(path: string): boolean {
|
||||||
|
if (this.paused) return false;
|
||||||
if (!this.settings.general.enabled) return false;
|
if (!this.settings.general.enabled) return false;
|
||||||
|
|
||||||
const logFolder = this.settings.general.logFolder;
|
const logFolder = this.settings.general.logFolder;
|
||||||
|
|
@ -58,6 +207,62 @@ export default class LogfirePlugin extends Plugin {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private getActiveFilePath(): string | null {
|
||||||
|
const view = this.app.workspace.getActiveViewOfType(MarkdownView);
|
||||||
|
return view?.file?.path ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Commands
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
private registerCommands(): void {
|
||||||
|
this.addCommand({
|
||||||
|
id: 'toggle-tracking',
|
||||||
|
name: 'Tracking pausieren/fortsetzen',
|
||||||
|
callback: () => {
|
||||||
|
if (this.paused) {
|
||||||
|
this.resume();
|
||||||
|
new Notice('Logfire: Tracking fortgesetzt.');
|
||||||
|
} else {
|
||||||
|
this.pause();
|
||||||
|
new Notice('Logfire: Tracking pausiert.');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
this.addCommand({
|
||||||
|
id: 'rescan-vault',
|
||||||
|
name: 'Vault erneut scannen',
|
||||||
|
callback: () => this.runInitialScan(),
|
||||||
|
});
|
||||||
|
|
||||||
|
this.addCommand({
|
||||||
|
id: 'run-maintenance',
|
||||||
|
name: 'Wartung ausführen',
|
||||||
|
callback: () => {
|
||||||
|
this.db.runMaintenance(this.settings.advanced.retention);
|
||||||
|
new Notice('Logfire: Wartung abgeschlossen.');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
this.addCommand({
|
||||||
|
id: 'debug-info',
|
||||||
|
name: 'Debug-Info',
|
||||||
|
callback: () => {
|
||||||
|
console.log('[Logfire] Debug-Info:', {
|
||||||
|
paused: this.paused,
|
||||||
|
sessionId: this.sessionManager.currentSessionId,
|
||||||
|
sessionDuration: this.sessionManager.sessionDurationMs,
|
||||||
|
bufferSize: this.eventBus.getBufferSize(),
|
||||||
|
eventCount: this.db.getEventCount(),
|
||||||
|
hasBaseline: this.db.hasBaseline(),
|
||||||
|
dbSize: this.db.getDatabaseSizeBytes(),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Settings
|
// Settings
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue