Wissensdatenbank: Markdown, FTS5-Suche, Sanitizing, UX

- Markdown-Rendering fuer Notizen (fett, kursiv, Ueberschriften, Listen, Code, Links)
- HTML-Sanitizing im Frontend und Backend (XSS-Schutz)
- FTS5 Volltextindex fuer schnelle Suche mit Ranking
- Kategorie-Loeschung zeigt Anzahl betroffener Eintraege

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Server Deploy
2026-03-19 19:38:43 +01:00
Ursprung 5c87254e97
Commit 48c917eb28
6 geänderte Dateien mit 277 neuen und 23 gelöschten Zeilen

Datei anzeigen

@@ -552,6 +552,43 @@ function createTables() {
)
`);
// Wissensmanagement - FTS5 Volltextsuche
try {
db.exec(`
CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_fts USING fts5(
title, notes, content=knowledge_entries, content_rowid=id
)
`);
// Trigger: INSERT synchronisieren
db.exec(`
CREATE TRIGGER IF NOT EXISTS knowledge_fts_insert AFTER INSERT ON knowledge_entries BEGIN
INSERT INTO knowledge_fts(rowid, title, notes) VALUES (NEW.id, NEW.title, NEW.notes);
END
`);
// Trigger: DELETE synchronisieren
db.exec(`
CREATE TRIGGER IF NOT EXISTS knowledge_fts_delete AFTER DELETE ON knowledge_entries BEGIN
INSERT INTO knowledge_fts(knowledge_fts, rowid, title, notes) VALUES('delete', OLD.id, OLD.title, OLD.notes);
END
`);
// Trigger: UPDATE synchronisieren
db.exec(`
CREATE TRIGGER IF NOT EXISTS knowledge_fts_update AFTER UPDATE ON knowledge_entries BEGIN
INSERT INTO knowledge_fts(knowledge_fts, rowid, title, notes) VALUES('delete', OLD.id, OLD.title, OLD.notes);
INSERT INTO knowledge_fts(rowid, title, notes) VALUES (NEW.id, NEW.title, NEW.notes);
END
`);
// Initiales Befuellen der FTS-Tabelle
db.exec(`INSERT INTO knowledge_fts(knowledge_fts) VALUES('rebuild')`);
logger.info('Knowledge FTS5 Volltextindex erstellt/aktualisiert');
} catch (ftsError) {
logger.warn('FTS5 konnte nicht erstellt werden (evtl. nicht unterstuetzt):', ftsError.message);
}
// Wissensmanagement - Anhänge
db.exec(`
CREATE TABLE IF NOT EXISTS knowledge_attachments (