c3cdb8007e
Replace the 3s $interval polling of container logs with a live HTTP stream, and stop re-writing already-rendered lines (fixes selection bug). - streamContainerLogs (containers.service.ts): fetch + ReadableStream reader with follow=1, same-origin credentials:'include' (httpOnly JWT cookie; CSRF only guards mutations), agent-target / manager-operation headers replicated for Agent/Edge, AbortSignal-driven lifetime. - containerLogsController: stream instead of poll; append parsed lines into the buffer (push, never replace), cap at 5000 lines trimming from the head; AbortController on pause/destroy/param-change; reconnect with 3s backoff resuming from `since` (dropping tail) on stream end/error; Live toggle pauses/resumes the stream; tail/since/timestamps changes restart the stream. - log-viewer: `track by log.id` (was $index), filtering moved out of the template into the controller (applyFilter via $watchCollection), removed inert force-glue, decoupled auto-scroll from log collection, relabelled "Auto-refresh logs" -> "Live logs", clearer empty states. Backend unchanged (logs already stream transparently through the Docker proxy). Shared task/service log views keep working via the new id'd lines. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>