refactor(heartbeat): config-driven checks, channel delivery, remove hardcoded values
Heartbeat system overhaul: - Fix email/calendar checks to parse JSON output correctly - Add per-check cooldowns and quiet hours config - Send findings to Discord channel instead of just logging - Auto-reindex KB when stale files detected - Claude CLI called only if HEARTBEAT.md has extra instructions - All settings configurable via config.json heartbeat section Move hardcoded values to config.json: - allowed_tools list (claude_session.py) - Ollama URL/model (memory_search.py now reads ollama.url from config) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -14,16 +14,53 @@ import httpx
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
OLLAMA_URL = "http://10.0.20.161:11434/api/embeddings"
|
||||
OLLAMA_MODEL = "all-minilm"
|
||||
EMBEDDING_DIM = 384
|
||||
DB_PATH = Path(__file__).resolve().parent.parent / "memory" / "echo.sqlite"
|
||||
MEMORY_DIR = Path(__file__).resolve().parent.parent / "memory"
|
||||
PROJECT_ROOT = Path(__file__).resolve().parent.parent
|
||||
DB_PATH = PROJECT_ROOT / "memory" / "echo.sqlite"
|
||||
MEMORY_DIR = PROJECT_ROOT / "memory"
|
||||
|
||||
# Defaults — overridable via config.json ollama/memory sections
|
||||
_OLLAMA_BASE_URL = "http://localhost:11434"
|
||||
_OLLAMA_MODEL = "all-minilm"
|
||||
_EMBEDDING_DIM = 384
|
||||
_CHUNK_TARGET = 500
|
||||
_CHUNK_MAX = 1000
|
||||
_CHUNK_MIN = 100
|
||||
|
||||
# Runtime config (populated by init_config)
|
||||
OLLAMA_URL = f"{_OLLAMA_BASE_URL}/api/embeddings"
|
||||
OLLAMA_MODEL = _OLLAMA_MODEL
|
||||
EMBEDDING_DIM = _EMBEDDING_DIM
|
||||
|
||||
|
||||
def init_config(config=None) -> None:
|
||||
"""Load settings from config object. Call once at startup."""
|
||||
global OLLAMA_URL, OLLAMA_MODEL, EMBEDDING_DIM
|
||||
if config is None:
|
||||
# Try loading from config.json directly
|
||||
config_file = PROJECT_ROOT / "config.json"
|
||||
if config_file.exists():
|
||||
import json
|
||||
try:
|
||||
with open(config_file, encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
base_url = data.get("ollama", {}).get("url", _OLLAMA_BASE_URL)
|
||||
OLLAMA_URL = f"{base_url.rstrip('/')}/api/embeddings"
|
||||
OLLAMA_MODEL = data.get("ollama", {}).get("model", _OLLAMA_MODEL)
|
||||
EMBEDDING_DIM = data.get("ollama", {}).get("embedding_dim", _EMBEDDING_DIM)
|
||||
except (json.JSONDecodeError, OSError):
|
||||
pass
|
||||
return
|
||||
|
||||
# Config object with .get() method
|
||||
base_url = config.get("ollama.url", _OLLAMA_BASE_URL)
|
||||
OLLAMA_URL = f"{base_url.rstrip('/')}/api/embeddings"
|
||||
OLLAMA_MODEL = config.get("ollama.model", _OLLAMA_MODEL)
|
||||
EMBEDDING_DIM = config.get("ollama.embedding_dim", _EMBEDDING_DIM)
|
||||
|
||||
|
||||
# Auto-init from config.json on import
|
||||
init_config()
|
||||
|
||||
|
||||
def get_db() -> sqlite3.Connection:
|
||||
"""Get SQLite connection, create table if needed."""
|
||||
|
||||
Reference in New Issue
Block a user