Datei: index-3.html + agent_tasks_api.py
Du bist Claude Code. Deine Aufgabe ist Task 7 von 7: Implementiere die clientseitige Sync-Routine, die Notion-Agent-Task-Status periodisch abruft und in Kanban-Stories sowie Sessions spiegelt.
VORAUSSETZUNG: Task 1-6 muessen implementiert sein. agent_tasks_api.py laeuft auf Port 8001.
AUFGABEN:
async function syncFromNotion() { try { const res = await fetch('/api/agent-tasks'); if (!res.ok) return; const data = await res.json(); const notionTasks = data.tasks || [];
let changed = false;
notionTasks.forEach(nt => {
// Kanban-Story per notionPageId matchen
const task = kanbanData.tasks.find(t => t.notionPageId === nt.id);
if (!task) return;
const newNotionStatus = nt.status || 'Neu';
if (task.notionStatus !== newNotionStatus) {
task.notionStatus = newNotionStatus;
changed = true;
}
// Kanban-Status via Mapping aktualisieren
const sessionStatus = notionStatusToSessionStatus(newNotionStatus);
const kanbanStatus = sessionStatusToKanbanStatus(sessionStatus);
if (task.status !== kanbanStatus) {
task.status = kanbanStatus;
changed = true;
}
// Zugehoerige Session synchronisieren
if (task.sessionId != null) {
const session = sessions.find(s => s.id === task.sessionId);
if (session && session.status !== sessionStatus) {
session.status = sessionStatus;
changed = true;
}
}
});
if (changed) {
saveState();
renderAll();
console.log('[syncFromNotion] Aenderungen uebernommen:', new Date().toLocaleTimeString());
}
} catch (err) { console.warn('[syncFromNotion] Fehler:', err.message); } }
// Initial-Sync nach 2s (Backend-Warmup abwarten) setTimeout(syncFromNotion, 2000); // Danach alle 30s pollen setInterval(syncFromNotion, 30000);
MANUELLER SYNC-BUTTON (optional, empfohlen): Im Dashboard-Header einen kleinen Button hinzufuegen: <button onclick="syncFromNotion()" class="sync-btn" title="Notion sync">↻ Sync</button> CSS: .sync-btn { background: transparent; border: 1px solid #444; border-radius: 4px; color: #aaa; padding: 3px 8px; font-size: 11px; cursor: pointer; } .sync-btn:hover { border-color: #666; color: #fff; }
NOTION-URL IN KANBAN-CARD ANZEIGEN: Im Rendering der Kanban-Task-Cards: Falls task.notionPageId gesetzt ist, zeige ein kleines Icon-Link an: // HTML-Snippet in der Task-Card: // ${task.notionPageId ? '<a href="https://notion.so/'+task.notionPageId+'" // target="_blank" class="notion-link" title="In Notion oeffnen">N↗</a>' : ''} CSS: .notion-link { color: #666; font-size: 10px; text-decoration: none; } .notion-link:hover { color: #999; }
AGENT-TASKS API: GET-ENDPOINT FUER EINZELNE TASK (agent_tasks_api.py ergaenzen): @app.get("/api/agent-tasks/{page_id}") def get_agent_task(page_id: str): try:
data = synctasks() task = next((t for t in data.get("tasks", []) if t["id"] == page_id), None) if not task: raise HTTPException(status_code=404, detail="Task not found") return task except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e))
ERWARTETES ERGEBNIS:
DATEIEN: index-3.html (Sync-Funktion + Polling + Button + Card-Link), agent_tasks_api.py (GET /{page_id} Endpoint)