feat(dashboard): integrate link suggestions and predictive links into UI
- FastAPI: parse_engram now includes link_suggestions and predictive_links from metadata - FastAPI: add POST /api/links/accept to create links from suggestions - Dashboard: new renderCardsWithSuggestions() displays suggestions in each card - Dashboard: acceptLink() function handles click-to-link - Dashboard: loadCards() calls renderCardsWithSuggestions() - Systemd: remove DirectoryNotEmpty from ingest path unit (already present) Refs: #25 #27
This commit is contained in:
@@ -63,7 +63,7 @@ def parse_engram(row: sqlite3.Row) -> dict:
|
||||
verdict = "confirmed_false"
|
||||
else:
|
||||
verdict = "unknown"
|
||||
return {
|
||||
result = {
|
||||
"id": row["id"],
|
||||
"content": row["content"],
|
||||
"confidence": meta.get("confidence", 0.0),
|
||||
@@ -81,6 +81,12 @@ def parse_engram(row: sqlite3.Row) -> dict:
|
||||
"access_count": meta.get("access_count", 0),
|
||||
"grounding": meta.get("grounding", 0),
|
||||
}
|
||||
# Vorschläge aus metadata
|
||||
if "link_suggestions" in meta:
|
||||
result["link_suggestions"] = meta["link_suggestions"]
|
||||
if "predictive_links" in meta:
|
||||
result["predictive_links"] = meta["predictive_links"]
|
||||
return result
|
||||
|
||||
|
||||
def _now_iso() -> str:
|
||||
@@ -902,6 +908,31 @@ def api_refresh(engram_id: str):
|
||||
return {"success": True, "new_confidence": round(conf, 2)}
|
||||
|
||||
|
||||
@app.post("/api/links/accept")
|
||||
def api_accept_link(from_id: str = Form(...), to_id: str = Form(...)):
|
||||
"""Erstelle einen Link zwischen zwei Engrammen (aus Vorschlag)."""
|
||||
conn = get_db()
|
||||
c = conn.cursor()
|
||||
# Prüfe Existenz beider Engramme
|
||||
for eid in (from_id, to_id):
|
||||
if not c.execute("SELECT 1 FROM engrams WHERE id = ?", (eid,)).fetchone():
|
||||
conn.close()
|
||||
return JSONResponse({"error": f"Engram {eid} not found"}, status_code=404)
|
||||
# Vermeide Duplikate
|
||||
c.execute("SELECT 1 FROM engrams_links WHERE from_id = ? AND to_id = ?", (from_id, to_id))
|
||||
if c.fetchone():
|
||||
conn.close()
|
||||
return {"ok": True, "message": "link already exists"}
|
||||
# Link erstellen
|
||||
c.execute(
|
||||
"INSERT INTO engrams_links (from_id, to_id) VALUES (?, ?)",
|
||||
(from_id, to_id)
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@app.post("/api/engrams")
|
||||
def api_create_engram(content: str = Form(...), tags: str = Form(""), source: str = Form("web")):
|
||||
engram_id = f"web-{datetime.now(timezone.utc).strftime('%Y%m%d-%H%M%S-%f')[:20]}"
|
||||
|
||||
Reference in New Issue
Block a user