LocalAI/core/http
LocalAI [bot] 11d5bd0cc3
fix(react-ui/chat): stop wiping selection on every /api/operations poll (#9904) (#9917)
useOperations() was calling setOperations() with a fresh array on every
1s poll, even when the payload was identical. In React 19 the DOM diff
no longer short-circuits dangerouslySetInnerHTML on equal __html, so the
forced Chat re-render re-assigned innerHTML on every assistant message
once per second — wiping any text the user had selected.

Skip the state update when the serialised operations payload is
unchanged, and switch loading/error to functional setters so they also
short-circuit at the source.

Also fixes the chat copy button on plain HTTP: navigator.clipboard is
undefined in non-secure contexts (a common LXC+Docker deployment), but
the previous code called it unconditionally and showed a success toast
regardless. Routed Chat, AgentChat and CanvasPanel through a new
copyToClipboard() helper that uses navigator.clipboard when available
and falls back to a hidden-textarea + execCommand('copy') trick that
browsers still honour outside secure contexts. The fallback preserves
the user's existing selection.

Regression coverage in e2e/chat-polling-selection.spec.js: a
MutationObserver counts mutations on the assistant content node across
3s of polling (must be 0); the copy test stubs out navigator.clipboard
and asserts that execCommand('copy') is invoked.


Assisted-by: claude-opus-4-7-1m

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
2026-05-21 12:17:51 +02:00
..
auth chore: Security hardening (#9719) 2026-05-08 16:25:45 +02:00
endpoints realtime: honor output_modalities to skip TTS in text-only mode (#9838) 2026-05-15 12:39:47 +02:00
middleware fix(middleware): parse OpenAI-spec tool_choice in /v1/chat/completions (#9559) 2026-05-14 00:14:38 +02:00
react-ui fix(react-ui/chat): stop wiping selection on every /api/operations poll (#9904) (#9917) 2026-05-21 12:17:51 +02:00
routes feat(realtime): Add Liquid Audio s2s model and assistant mode on talk page (#9801) 2026-05-13 21:57:27 +02:00
static fix(streaming): comply with OpenAI usage / stream_options spec (#9815) 2026-05-14 08:53:46 +02:00
views feat(realtime): WebRTC support (#8790) 2026-03-13 21:37:15 +01:00
app.go fix(http): honor X-Forwarded-Prefix when proxy strips the prefix (#9614) 2026-05-13 21:59:33 +02:00
app_test.go fix(http): honor X-Forwarded-Prefix when proxy strips the prefix (#9614) 2026-05-13 21:59:33 +02:00
csrf_multipart_test.go chore: Security hardening (#9719) 2026-05-08 16:25:45 +02:00
explorer.go chore(refactor): move logging to common package based on slog (#7668) 2025-12-21 19:33:13 +01:00
http_suite_test.go refactor(tests): split app_test.go, move real-backend coverage to e2e-backends 2026-04-27 23:09:20 +00:00
openresponses_test.go feat: add distributed mode (#9124) 2026-03-30 00:47:27 +02:00
render.go feat: add distributed mode (#9124) 2026-03-30 00:47:27 +02:00
route_coverage_test.go chore: Security hardening (#9719) 2026-05-08 16:25:45 +02:00