diff --git a/backend/app.py b/backend/app.py index 07aa630..487627a 100644 --- a/backend/app.py +++ b/backend/app.py @@ -33,11 +33,11 @@ from routers import ( maintenance, models, routing, + skills, system, voice, wissen, zeitmaschine, - skills, ) from routers import reminders as reminders_router from services import metrics_history, reminders, sentry, warmer diff --git a/backend/routers/skills.py b/backend/routers/skills.py index 2058136..ededd85 100644 --- a/backend/routers/skills.py +++ b/backend/routers/skills.py @@ -1,8 +1,9 @@ -from fastapi import APIRouter -from pydantic import BaseModel import os import subprocess +from fastapi import APIRouter +from pydantic import BaseModel + router = APIRouter(prefix="/api") class RunSkillRequest(BaseModel): diff --git a/backend/services/auftragsbuch.py b/backend/services/auftragsbuch.py index 8e993c2..629a8f0 100644 --- a/backend/services/auftragsbuch.py +++ b/backend/services/auftragsbuch.py @@ -64,6 +64,24 @@ _FETCH_EVERY = 30.0 # s — Gitea nicht bei jedem UI-Poll anfragen _CI_CACHE: dict = {} # { (repo, branch, head_sha): {"status": "success", "ts": time} } def _gitea_creds() -> tuple | None: + # 1. Fallback: Versuch via git credential manager (zukunftsfähig & plattformübergreifend) + try: + import subprocess + p = subprocess.run( + ["git", "credential", "fill"], + input=b"protocol=https\nhost=git.tobisniceshomelab.ddnsfree.com\n", + capture_output=True, + check=True + ) + out = p.stdout.decode(errors="replace") + u_match = re.search(r"username=(.+)", out) + p_match = re.search(r"password=(.+)", out) + if u_match and p_match: + return u_match.group(1).strip(), p_match.group(1).strip() + except Exception: + pass + + # 2. Fallback: Datei (hauptsächlich auf der AI-Box genutzt) try: cred = Path("~/.git-credentials").expanduser() for line in cred.read_text(encoding="utf-8").splitlines(): diff --git a/mcp/mcp_mc.py b/mcp/mcp_mc.py index 3e87fe8..c3385c3 100644 --- a/mcp/mcp_mc.py +++ b/mcp/mcp_mc.py @@ -278,18 +278,38 @@ def apply_update(kind: str) -> str: def get_ci_status() -> str: """Prüft den letzten CI-Build-Status auf der AI-Box via Gitea API. Nützlich, um nach einem Push zu verifizieren, ob das Frontend und Backend grün gebaut haben.""" - token_path = os.path.expanduser("~/.git-credentials") + token = "" + # 1. Fallback: Versuch via git credential manager (zukunftsfähig & plattformübergreifend) try: - with open(token_path, "r") as f: - creds = f.read() - import re - m = re.search(r'https://[^:]+:([^@]+)@git\.tobisniceshomelab', creds) - token = m.group(1) if m else "" + import subprocess + p = subprocess.run( + ["git", "credential", "fill"], + input=b"protocol=https\nhost=git.tobisniceshomelab.ddnsfree.com\n", + capture_output=True, + check=True + ) + out = p.stdout.decode(errors="replace") + import re + p_match = re.search(r"password=(.+)", out) + if p_match: + token = p_match.group(1).strip() except Exception: - token = "" + pass + + # 2. Fallback: Datei (hauptsächlich auf der AI-Box genutzt) + if not token: + token_path = os.path.expanduser("~/.git-credentials") + try: + with open(token_path, "r") as f: + creds = f.read() + import re + m = re.search(r'https://[^:]+:([^@]+)@git\.tobisniceshomelab', creds) + token = m.group(1) if m else "" + except Exception: + token = "" if not token: - return "❌ Gitea Token in ~/.git-credentials nicht gefunden. CI Status kann nicht geprüft werden." + return "❌ Gitea Token konnte nicht via 'git credential' oder ~/.git-credentials geladen werden. CI Status kann nicht geprüft werden." # Gitea URL von der Box aus intern erreichbar repo_url = "http://192.168.178.153:3000/api/v1/repos/Hitonabi/mission-control-v2/actions/runs?limit=1" @@ -312,7 +332,7 @@ def get_ci_status() -> str: else: return f"ℹ️ CI-Build ({name} @ {sha}) Status: {status}" except Exception as e: - return f"❌ Fehler bei der Gitea-API Abfrage: {str(e)}" + return f"❌ Fehler bei der Gitea-API Abfrage: {e!s}" # ── Erinnerungen & Routinen (A3): die Box sagt dem Commander zur Zeit aktiv Bescheid ───────── @mcp.tool()