Changes before error encountered

Co-authored-by: Kenearos <86194771+Kenearos@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-03-12 15:00:09 +00:00
parent 3be3cb73b6
commit d4cfb34423
17 changed files with 1128 additions and 0 deletions

View file

@ -0,0 +1,66 @@
# Story 4.2: WebSocket-Agent-Events integrieren
<!-- 🏃 Prepared by BMAD SM Skill — Agent: Bob (Scrum Master) -->
<!-- Skill Command: /bmad-agent-bmm-sm → [CS] Context Story -->
Status: done
## Story
Als **Frontend**,
möchte ich **WebSocket-Events vom Backend**,
so dass **der aktive Node im Canvas in Echtzeit pulsiert**.
## Acceptance Criteria
1. Backend sendet `{"event": "node_active", "node": "master_agent", ...}` bei Node-Eintritt
2. Backend sendet `{"event": "run_complete", "final_draft": "..."}` nach Abschluss
3. Backend sendet `{"event": "run_paused", "next_nodes": [...]}` bei God-Mode-Pause
4. Frontend `useCouncilWebSocket` Hook verbindet sich mit `WS /ws/council/{run_id}`
5. `markNodeActive(nodeName)` setzt `isActive = true` für den entsprechenden Canvas-Node
6. Bei WS-Verbindungsabbruch: Graceful-Handling ohne Crash
## Tasks / Subtasks
- [x] Task 1: `api/websocket.py` WebSocket-Endpoint (AC: 13)
- [x] Subtask 1.1: `_connections` Dict für aktive WS-Sessions
- [x] Subtask 1.2: `broadcast_event(run_id, event)` Funktion
- [x] Subtask 1.3: `WS /ws/council/{run_id}` Route
- [x] Task 2: `hooks/useCouncilWebSocket.ts` (AC: 46)
- [x] Subtask 2.1: `onComplete`, `onError`, `onPaused`, `onResumed` Callbacks
- [x] Subtask 2.2: Event-Dispatching per `event.type`
- [x] Subtask 2.3: Cleanup bei Unmount / Verbindungsabbruch
- [x] Task 3: Store-Integration: `markNodeActive(nodeName)` (AC: 5)
- [x] Task 4: WS-Router in `main.py` registrieren (AC: 1)
## Dev Notes
- `broadcast_event()` bereinigt tote Verbindungen automatisch (disconnected-Liste)
- Frontend: `useRef(null)` für WS-Instanz → sicheres Cleanup in useEffect-Return
- Event-Typen: `node_active`, `run_complete`, `run_paused`, `run_failed`
### Project Structure Notes
- `backend/api/websocket.py`
- `frontend/app/hooks/useCouncilWebSocket.ts`
### References
- [Source: _bmad-output/planning-artifacts/architecture.md#ADR-003]
- [Source: _bmad-output/planning-artifacts/architecture.md#WebSocket]
## Dev Agent Record
### Agent Model Used
Amelia (💻 BMAD Dev Agent)
### Completion Notes List
- WebSocket-Verbindungen werden per `run_id` isoliert — kein Cross-Event zwischen Runs.
- `try/except` in `broadcast_event()` verhindert, dass ein einzelner WS-Fehler alle Clients betrifft.
### File List
- `backend/api/websocket.py`
- `frontend/app/hooks/useCouncilWebSocket.ts`