fix+docs: Bug-Fixes, vollstaendige Dokumentation v8

Bug-Fixes:
- hermes_agent.py: asyncio.get_event_loop() → get_running_loop() (Python 3.10+)
- routers/hermes.py: Thread-Lock fuer Whisper-Init, HERMES_WINDOWS_USER Import,
  Piper stderr logging, __import__ Anti-Pattern entfernt
- routers/memory.py: SQLite WAL-Mode, Kategorie-Enum-Validierung (user/instruction/stable/versioned/ephemeral)
- HermesPanel.svelte: findLast() → reverse().find() (Browser-Kompatibilitaet)
- ConnectPanel.svelte: Hardcoded Username durch Platzhalter ersetzt

Docs:
- CLAUDE.md: komplett aktualisiert (v7+v8, Hermes, Memory, alle Env-Vars)
- ROADMAP.md: v7+v8 als erledigt, naechste Features (v8.1-v9.1)
- README.md: komplett neu geschrieben (Agentic OS Konzept, alle Features)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-23 14:48:22 +02:00
parent 5881a21d9a
commit 8539999627
9 changed files with 269 additions and 313 deletions
+12 -2
View File
@@ -9,6 +9,7 @@ Alle MCP-Tools teilen denselben Speicher via mcp_memory.py-Wrapper.
import sqlite3
import uuid
from datetime import datetime, timezone
from enum import Enum
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException
@@ -28,6 +29,7 @@ def _db() -> sqlite3.Connection:
MEMORY_DB.parent.mkdir(parents=True, exist_ok=True)
_db_conn = sqlite3.connect(str(MEMORY_DB), check_same_thread=False)
_db_conn.row_factory = sqlite3.Row
_db_conn.execute("PRAGMA journal_mode=WAL") # sicherer bei concurrent FastAPI-Threads
_db_conn.execute("""
CREATE TABLE IF NOT EXISTS memories (
id TEXT PRIMARY KEY,
@@ -47,15 +49,23 @@ def _db() -> sqlite3.Connection:
return _db_conn
class _MemCategory(str, Enum):
user = "user"
instruction = "instruction"
stable = "stable"
versioned = "versioned"
ephemeral = "ephemeral"
class _MemIn(BaseModel):
content: str
category: str = "stable" # stable | versioned | ephemeral
category: _MemCategory = _MemCategory.stable
source: str = "manual"
class _MemUp(BaseModel):
content: Optional[str] = None
category: Optional[str] = None
category: Optional[_MemCategory] = None
def _row(r: sqlite3.Row) -> dict: