From ef5f22386324924669ee96ad5e44c040c1eb334e Mon Sep 17 00:00:00 2001 From: pptx704 Date: Sun, 3 May 2026 04:47:10 +0600 Subject: [PATCH] fix: improve error feedback for terminal disconnects and host unavailability Show "[session disconnected]" in terminal when PTY websocket closes cleanly. Map scheduler and agent unavailability errors to 503 with user-friendly message instead of leaking internal details. --- frontend/src/lib/components/TerminalTab.svelte | 1 + internal/api/middleware.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/frontend/src/lib/components/TerminalTab.svelte b/frontend/src/lib/components/TerminalTab.svelte index e7eadf4..f1e9637 100644 --- a/frontend/src/lib/components/TerminalTab.svelte +++ b/frontend/src/lib/components/TerminalTab.svelte @@ -332,6 +332,7 @@ if (s.state === 'connected') { updateSession(id, { state: 'disconnected' }); + int.term.write('\r\n\x1b[38;2;107;104;98m[session disconnected]\x1b[0m\r\n'); } }; diff --git a/internal/api/middleware.go b/internal/api/middleware.go index b1c9f00..6e80136 100644 --- a/internal/api/middleware.go +++ b/internal/api/middleware.go @@ -54,6 +54,8 @@ func agentErrToHTTP(err error) (int, string, string) { return http.StatusConflict, "conflict", err.Error() case connect.CodePermissionDenied: return http.StatusForbidden, "forbidden", err.Error() + case connect.CodeUnavailable: + return http.StatusServiceUnavailable, "no_hosts_available", "no servers available — try again later" case connect.CodeUnimplemented: return http.StatusNotImplemented, "agent_error", err.Error() default: @@ -108,6 +110,9 @@ func serviceErrToHTTP(err error) (int, string, string) { return http.StatusForbidden, "forbidden", "forbidden" case strings.Contains(msg, "invalid or expired"): return http.StatusUnauthorized, "unauthorized", "invalid or expired credentials" + case strings.Contains(msg, "no online") && strings.Contains(msg, "hosts available"), + strings.Contains(msg, "no host has sufficient resources"): + return http.StatusServiceUnavailable, "no_hosts_available", "no servers available — try again later" case strings.Contains(msg, "invalid"): return http.StatusBadRequest, "invalid_request", "invalid request" default: