"use client"; import { useState, useCallback, useRef } from "react"; import { ReactFlowProvider } from "@xyflow/react"; import { Play, Square, Upload, Shield, Zap } from "lucide-react"; import { ArchitectCanvas } from "@/app/components/ArchitectCanvas"; import { GodModePanel } from "@/app/components/panels/GodModePanel"; import { useCouncilWebSocket, PauseInfo } from "@/app/hooks/useCouncilWebSocket"; import { useCouncilStore } from "@/app/store/council-store"; import { runApi, pdfApi } from "@/app/utils/api-client"; import { ExecutionMode, GodModeAction } from "@/app/types/council"; export default function KonferenzzimmerPage() { const [topic, setTopic] = useState(""); const [runId, setRunId] = useState(null); const [result, setResult] = useState(null); const [error, setError] = useState(null); const [isRunning, setIsRunning] = useState(false); const [executionMode, setExecutionMode] = useState("auto-pilot"); const [pauseInfo, setPauseInfo] = useState(null); const [isResuming, setIsResuming] = useState(false); const fileInputRef = useRef(null); const setActiveRun = useCouncilStore((s) => s.setActiveRun); const clearActiveNode = useCouncilStore((s) => s.clearActiveNode); const onComplete = useCallback((res: string) => { setResult(res); setIsRunning(false); setRunId(null); setPauseInfo(null); }, []); const onError = useCallback((err: string) => { setError(err); setIsRunning(false); setRunId(null); setPauseInfo(null); }, []); const onPaused = useCallback((info: PauseInfo) => { setPauseInfo(info); setIsResuming(false); }, []); const onResumed = useCallback(() => { setPauseInfo(null); setIsResuming(false); }, []); useCouncilWebSocket({ run_id: runId, onComplete, onError, onPaused, onResumed }); const handleStart = async () => { if (!topic.trim()) return; setResult(null); setError(null); setIsRunning(true); setPauseInfo(null); clearActiveNode(); try { const godMode = executionMode === "god-mode"; const run = await runApi.start(topic, godMode); setActiveRun(run); setRunId(run.run_id); } catch (e) { setError("Fehler beim Starten: " + (e as Error).message); setIsRunning(false); } }; const handleStop = () => { setRunId(null); setIsRunning(false); clearActiveNode(); setActiveRun(null); setPauseInfo(null); }; const handleGodModeAction = async (action: GodModeAction, modifiedDraft?: string) => { if (!runId) return; setIsResuming(true); try { const modified_state = modifiedDraft ? { current_draft: modifiedDraft } : undefined; await runApi.approve(runId, action, modified_state); if (action === "reject") { setError("Vom Benutzer im God Mode abgelehnt."); setIsRunning(false); setRunId(null); setPauseInfo(null); } } catch (e) { setError("Fehler bei God Mode Aktion: " + (e as Error).message); setIsResuming(false); } }; const handlePdfUpload = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; try { const res = await pdfApi.upload(file); setTopic((prev) => prev ? `${prev}\n\n[PDF hochgeladen: ${res.filename} — ${res.chunks_ingested} Abschnitte]` : `[PDF hochgeladen: ${res.filename} — ${res.chunks_ingested} Abschnitte]` ); } catch (e) { setError("PDF-Upload fehlgeschlagen: " + (e as Error).message); } // Reset the input if (fileInputRef.current) fileInputRef.current.value = ""; }; return (
{/* Control bar */}