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:

  1. SYNC-FUNKTION syncFromNotion IMPLEMENTIEREN (index-3.html, globaler JS-Block):

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); } }

  1. POLLING STARTEN (nach dem initialen renderAll()-Aufruf beim Page-Load):

// Initial-Sync nach 2s (Backend-Warmup abwarten) setTimeout(syncFromNotion, 2000); // Danach alle 30s pollen setInterval(syncFromNotion, 30000);

  1. 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; }

  2. 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; }

  3. 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:

    Nutze synctasks() und filtere nach ID

    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)