Backend efficiency & consistency pass

- Rewrite get_all_tags() with SQL unnest instead of loading all notes
- Consolidate convert_note_to_task/convert_task_to_note to single-session ops
- Add search_notes_for_context() with single OR-keyword query for build_context()
- Drop selectinload from list_conversations(), use correlated subquery for message_count
- Add set_settings_batch() for single-transaction multi-setting upserts
- Extract get_installed_models() shared helper into services/llm.py
- Delete services/tasks.py pass-through wrapper; routes/tasks.py imports from services.notes
- Add B-tree indexes on notes.title and conversations.updated_at (migration 0007)
- Add logging to services/notes.py, services/chat.py, services/settings.py
- Safe Conversation.to_dict() when messages relationship is not loaded

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-11 08:27:11 -05:00
parent fb18d2c41d
commit db01106714
12 changed files with 225 additions and 174 deletions
+2 -2
View File
@@ -29,7 +29,7 @@ async def list_conversations_route():
offset = request.args.get("offset", 0, type=int)
conversations, total = await list_conversations(limit=limit, offset=offset)
return jsonify({
"conversations": [c.to_dict() for c in conversations],
"conversations": conversations,
"total": total,
})
@@ -180,7 +180,7 @@ async def chat_status_route():
resp.raise_for_status()
result["ollama"] = "available"
data = resp.json()
model_names = [m["name"] for m in data.get("models", [])]
model_names = {m["name"] for m in data.get("models", [])}
# Match with or without :latest tag
if default_model in model_names or f"{default_model}:latest" in model_names:
result["model"] = "ready"