# State Machine Documentation for Frontend Chat Workflow ## Overview Die Chat-Workflow-Frontend-Logik implementiert eine State Machine, die Benutzerinteraktionen, Datei-Uploads und die Kommunikation mit dem Backend orchestriert. Die State Machine steuert die UI, das Polling und die Statusübergänge und sorgt für eine robuste, reaktive Multi-Agent-Chat-Erfahrung. ## Core Objects ### Frontend Workflow State Object ```json { "status": "string", // null, "running", "completed", "failed", "stopped" "workflowId": "string", // null oder eindeutige Workflow-ID "logs": [], // Log-Einträge "chatMessages": [], // Chat-Nachrichten "lastPolledLogId": "string", // ID des letzten abgeholten Logs "lastPolledMessageId": "string", // ID der letzten abgeholten Nachricht "dataStats": { "bytesSent": int, "bytesReceived": int, "tokensUsed": float, "processingTime": float }, "pollFailCount": int, // Zähler für Polling-Fehler "pollActive": boolean, // Steuert, ob Polling aktiv ist "sessionId": "string" // Session-Isolation } ``` ### User Input State Object ```json { "promptText": "string", // Aktueller Benutzereingabetext "additionalFiles": [ /* File-Objekte, nicht nur IDs! */ ], "domElements": {}, // Referenzen auf UI-DOM-Elemente "sessionId": "string" } ``` ### Log Entry Object ```json { "id": "log_timestamp", "message": "string", "progress": int, // Optional, 0-100 "type": "string", // info, warning, error "timestamp": "ISO-datetime", "agentName": "string", // Name des Agents "waiting": boolean, // Zeigt Wartedots-Animation "highlighted": boolean // Für visuelles Highlighting } ``` ### Chat Message Object ```json { "id": "msg_type_timestamp", "role": "string", // user, assistant "agentName": "string", "content": "string", "documents": [], // Liste von File-Objekten "timestamp": "ISO-datetime", "status": "string" // first, step, last } ``` ### File Object ```json { "id": "number|string", // numerisch oder UUID "name": "fileName.ext", "size": int, "mimeType": "string", // MIME-Type (z.B. application/pdf) "base64Encoded": boolean, // optional "content": "string", // optional, für Preview "isExtracted": boolean // optional, Parsing-Status } ``` ## State Machine Workflow ### 1. Initial State - **State**: `null` (Kein Workflow aktiv) - **UI**: Leerer Chat, Eingabefeld aktiv, Start-Button aktiv, Stop-Button ausgeblendet, File-Upload aktiv, leeres Logpanel - **Aktionen**: Prompt eingeben, Dateien anhängen, Start klicken - **API**: Keine ### 2. Prompt Preparation - **State**: `null` (Übergang zu `running`) - **Trigger**: Eingabe im Promptfeld, Datei-Upload, Prompt-Auswahl - **Prozess**: Dateien werden via `api.uploadFile` hochgeladen, erscheinen als File-Objekte in `userInputState.additionalFiles` - **API**: `POST /api/files/upload` pro Datei ### 3. Workflow Initialization - **State**: `running` - **Trigger**: Start-Button oder Enter - **Prozess**: Validierung, UI-Ladezustand, Prompt und Files an Backend, Workflow-ID empfangen - **State-Änderungen**: `status` → `running`, `workflowId` gesetzt, Files und Prompt zurückgesetzt - **API**: `POST /api/workflows/start` (bzw. mit ID für Fortsetzung) ### 4. Polling for Updates - **State**: `running` - **Prozess**: Polling für Status, Logs, Messages (nur wenn `pollActive` true) - **Polling-Details**: - Status: alle 2000ms - Logs: alle 1000ms - Messages: alle 1000ms - Polling stoppt sofort bei `failed` oder `stopped`, bei `completed` erst nach Message mit `status: last` - Exponentielles Backoff bei Fehlern (`pollFailCount`) - **API**: `GET /api/workflows/{workflowId}/status|logs|messages` ### 5. Workflow Running - **State**: `running` - **Prozess**: Backend verarbeitet, Frontend pollt, Logs und Messages werden angezeigt - **UI**: Stop-Button sichtbar, Eingabe gesperrt, Logpanel zeigt Fortschritt, Chat zeigt Agenten-Antworten - **Aktionen**: Stop möglich, File-Previews, Downloads - **API**: wie oben, Stop: `POST /api/workflows/{workflowId}/stop` ### 6. Workflow Completion - **State**: `completed` - **Trigger**: Backend gibt Status "completed" oder Message mit `status: last` - **Prozess**: Finalmessage, Eingabe wieder aktiv, Polling stoppt - **API**: keine bis neue Eingabe ### 7. Workflow Failure - **State**: `failed` - **Trigger**: Backend gibt Status "failed" - **Prozess**: Fehlermeldung, Retry möglich, Polling stoppt - **API**: keine bis Retry ### 8. Workflow Stopped - **State**: `stopped` - **Trigger**: Stop-Button oder Backend gibt "stopped" - **Prozess**: Verarbeitung gestoppt, Polling stoppt - **API**: keine bis Fortsetzung oder Reset ### 9. User Input Requested - **State**: variiert - **Trigger**: Message mit `status: last` oder Workflow nicht mehr `running` - **Prozess**: Log "Waiting for user input", Eingabe aktiv - **API**: keine bis neue Eingabe ### 10. Continuation Preparation - **State**: `completed`, `failed`, `stopped` (Übergang zu `running`) - **Trigger**: Neue Eingabe nach vorherigem Zyklus - **Prozess**: Fortsetzung mit bestehender Workflow-ID, Files können ergänzt werden - **API**: wie Prompt Preparation ### 11. Workflow Resumption - **State**: `running` - **Trigger**: Fortsetzung nach Stop/Fehler/Abschluss - **Prozess**: Neue Eingabe mit bestehender Workflow-ID, Polling startet erneut - **API**: `POST /api/workflows/start?id={workflowId}` ### 12. Workflow Reset - **State**: `null` - **Trigger**: Reset-Button - **Prozess**: Alle State-Daten gelöscht, UI zurückgesetzt - **API**: Optional `DELETE /api/workflows/{workflowId}` ## API Interaction Details ### Polling Implementation - Polling läuft nur, wenn `pollActive` true ist - Nach Statuswechsel zu `failed` oder `stopped` wird Polling sofort gestoppt - Bei `completed` läuft Polling weiter, bis eine Message mit `status: last` kommt - Exponentielles Backoff bei Fehlern (`pollFailCount`) - Events wie `workflowStatusChanged`, `chatMessagesUpdated`, etc. synchronisieren die UI ### API Endpoints Used | Frontend Function | Backend Endpoint | Parameters | Description | |--------------------------|--------------------------------------------------|------------------------------------|---------------------------------------------| | `startWorkflow()` | `POST /api/workflows/start` | `{ prompt: string, fileIds: [] }` | Startet neuen Workflow | | `continueWorkflow()` | `POST /api/workflows/start?id={workflowId}` | `{ prompt: string, fileIds: [] }` | Setzt bestehenden Workflow fort | | `pollWorkflowStatus()` | `GET /api/workflows/{workflowId}/status` | None | Holt aktuellen Workflow-Status | | `pollWorkflowLogs()` | `GET /api/workflows/{workflowId}/logs?id={lastLogId}` | Optional log ID | Holt neue Logs | | `pollWorkflowMessages()` | `GET /api/workflows/{workflowId}/messages?id={lastMessageId}` | Optional message ID | Holt neue Nachrichten | | `stopWorkflow()` | `POST /api/workflows/{workflowId}/stop` | None | Stoppt laufenden Workflow | | `resetWorkflow()` | `DELETE /api/workflows/{workflowId}` | None | Löscht Workflow-Ressourcen | | `uploadFile()` | `POST /api/files/upload` | FormData mit Datei | Lädt Datei hoch und gibt File-Objekt zurück | | `deleteMessage()` | `DELETE /api/workflows/{workflowId}/messages/{messageId}` | None | Entfernt Nachricht aus Workflow | | `removeFileFromMessage()`| `DELETE /api/workflows/{workflowId}/messages/{messageId}/files/{fileId}` | None | Entfernt Datei aus Nachricht | ## Special Features ### File Handling - File-Uploads liefern vollständige File-Objekte (siehe oben) - File-Previews, Download, Copy werden unterstützt - Jedes File kann einzeln entfernt werden ### Chat Message Rendering - User- und Agenten-Nachrichten, Markdown, File-Attachments, Zeitstempel, Collapsible Content ### Log Panel Features - Info/Warning/Error, Progress, Waiting-Animation, Highlighting, Collapsible Details, Timestamps ### Waiting States - Dots-Animation in Logs, Spinner im Send-Button, Progress in Agent-Logs - State-Management über `waiting`-Flag, `waitingDotsInterval`, `setLoadingState()` ## State Transitions ``` [null] → [running] // Initial prompt submission [running] → [running] // Ongoing polling updates [running] → [completed] // Workflow completes successfully [running] → [stopped] // User manually stops workflow [running] → [failed] // Error occurs during workflow [completed] → [running] // User continues workflow with new input [stopped] → [running] // User continues after manual stop [failed] → [running] // User retries workflow despite error [any] → [null] // User resets workflow ``` ## Error Handling ### Client-side Errors - Retry-Mechanismus im Polling (`pollFailCount`) - Exponentielles Backoff - Fehlerlogs und Toasts ### Backend Communication Errors - Fehlerlogging, User-Feedback, Retry-Option, Toasts ### Data Inconsistencies - Fallbacks bei ID-Matching, File-Referenzen, Content Extraction ## Implementation Notes 1. **Module Structure:** - `workflow.js`: Main initialization and coordination - `workflowCoordination.js`: State management - `workflowData.js`: Backend communication - `workflowUi.js`: UI rendering - `workflowUtils.js`: Helper functions 2. **Key Functions:** - `initWorkflowModule()`: Entry point for initialization - `updateWorkflowStatus()`: Core state transition function - `pollWorkflowStatus()`: Main update loop - `sendUserResponse()`: Handles user input submission - `renderLogs()` und `renderChatMessages()`: UI update functions 3. **Performance Optimizations:** - Selektive DOM-Updates - Scroll-Position-Preservation - Datenmengen-Schätzung für Statistik - Bedingtes Re-Rendering