9a41cce99b
Backend:
- backend/services/ideen.py: neue Funktion log_of(task_id)
- ruft 'hermes kanban log <id>'
- validiert task_id mit _TASK_ID_RX
- strippt ANSI-Steuerzeichen (\x1b\[[0-9;]*m)
- gibt letzte ~120 Zeilen zurück
- kurzer Cache (~4s)
- auf Windows/available=False leer zurück, nie crashen
- backend/routers/ideen.py: GET /api/ideen/{id}/log -> ideen.log_of(id)
Frontend:
- frontend/src/views/AuftragsbuchView.tsx: IdeenSection
- Ideen mit status 'triage' oder 'running' per Klick aufklappbar
- im aufgeklappten Zustand /api/ideen/{id}/log alle ~4s pollen
- Log monospace/<pre> in scrollbaren, höhenbegrenztem Kasten
- vorhandenes api()-Muster + react-query nutzen
- frontend/dist mitgebaut und committet
Branch: feature/live-log-blick
45 lines
1.0 KiB
Python
45 lines
1.0 KiB
Python
"""Ideen-Queue-Endpoints — dünner REST-Layer über services/ideen.py (natives Hermes-Kanban).
|
|
LAN-only wie alle MC2-Endpoints; das Mensch-Gate bleibt die Karte im Auftragsbuch."""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
|
|
from services import ideen
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
class IdeeIn(BaseModel):
|
|
titel: str
|
|
notiz: str = ""
|
|
|
|
|
|
class TaskIn(BaseModel):
|
|
id: str
|
|
|
|
|
|
@router.get("/ideen")
|
|
def list_queue() -> dict:
|
|
return ideen.list_queue()
|
|
|
|
|
|
@router.post("/ideen")
|
|
def add_idea(body: IdeeIn) -> dict:
|
|
res = ideen.add_idea(body.titel, body.notiz)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Idee konnte nicht angelegt werden."))
|
|
return res
|
|
|
|
|
|
@router.post("/ideen/archivieren")
|
|
def archive(body: TaskIn) -> dict:
|
|
res = ideen.archive_task(body.id)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Archivieren fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.get("/ideen/{id}/log")
|
|
def get_log(id: str) -> dict:
|
|
return ideen.log_of(id)
|