authorgravatar for maria@kuuro.netmaria <maria@kuuro.net> 2026-09-06 19:54:32-03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-06 19:54:32-03:00
log2d6a3799978659e349faf8ff4297098ffb782ebb
treeee3fcb67186ab0b0bb34d1ba3589fcc1ad26952c
parente15ffb9c0f73425dd9a1965070f01a07c9065761
signature Signed by PGP key B5690EEEBB952194

fix(web): only show auto balance errors after failed checks (#10407)


3 files changed, 16 insertions(+), 9 deletions(-)

apps/web/src/components/ChatView.tsx+3-1
...@@ -3331,7 +3331,9 @@ export default function ChatView(props: ChatViewProps) {...@@ -3331,7 +3331,9 @@ export default function ChatView(props: ChatViewProps) {
3331 ? "Auto balance"3331 ? "Auto balance"
3332 : loadBalancing.pending3332 : loadBalancing.pending
3333 ? "Checking machines…"3333 ? "Checking machines…"
3334 : "Auto balance unavailable"3334 : loadBalancing.failed
3335 ? "Auto balance unavailable"
3336 : "Auto balance"
3335 : undefined;3337 : undefined;
33363338
3337 // Handle environment change for draft threads. When the user picks a3339 // Handle environment change for draft threads. When the user picks a
apps/web/src/hooks/useLoadBalancedEnvironment.ts+12-8
...@@ -30,21 +30,25 @@ export function useLoadBalancedEnvironment(...@@ -30,21 +30,25 @@ export function useLoadBalancedEnvironment(
30 resources: result._tag === "Success" ? result.value : null,30 resources: result._tag === "Success" ? result.value : null,
31 receivedAt: result._tag === "Success" ? result.timestamp : 0,31 receivedAt: result._tag === "Success" ? result.timestamp : 0,
32 pending: result._tag === "Initial" || result.waiting,32 pending: result._tag === "Initial" || result.waiting,
33 failed: result._tag === "Failure",
33 };34 };
34 }),35 }),
35 ),36 ),
36 [environmentIds],37 [environmentIds],
37 );38 );
38 const resources = useAtomValue(resourcesAtom);39 const resources = useAtomValue(resourcesAtom);
40 const pending = resources.some((resource) => resource.pending);
41 const environmentId = chooseLoadBalancedEnvironment(
42 resources.map((resource) => ({
43 ...resource,
44 weight: weights[resource.environmentId] ?? 50,
45 })),
46 Date.now(),
47 ) as EnvironmentId | null;
39 return {48 return {
40 refresh,49 refresh,
41 pending: resources.some((resource) => resource.pending),50 pending,
42 environmentId: chooseLoadBalancedEnvironment(51 environmentId,
43 resources.map((resource) => ({52 failed: !pending && environmentId === null && resources.some((resource) => resource.failed),
44 ...resource,
45 weight: weights[resource.environmentId] ?? 50,
46 })),
47 Date.now(),
48 ) as EnvironmentId | null,
49 };53 };
50}54}
packages/client-runtime/src/state/server.ts+1
...@@ -1021,6 +1021,7 @@ export function createServerEnvironmentAtoms<R, E>(...@@ -1021,6 +1021,7 @@ export function createServerEnvironmentAtoms<R, E>(
1021 }),1021 }),
1022 hostResources: createEnvironmentQueryAtomFamily(runtime, {1022 hostResources: createEnvironmentQueryAtomFamily(runtime, {
1023 label: "environment-data:server:host-resources",1023 label: "environment-data:server:host-resources",
1024 idleTtlMs: 0,
1024 staleTimeMs: 5_000,1025 staleTimeMs: 5_000,
1025 execute: (input: EnvironmentRpcInput<typeof WS_METHODS.serverGetHostResources>) =>1026 execute: (input: EnvironmentRpcInput<typeof WS_METHODS.serverGetHostResources>) =>
1026 request(WS_METHODS.serverGetHostResources, input).pipe(Effect.timeout("5 seconds")),1027 request(WS_METHODS.serverGetHostResources, input).pipe(Effect.timeout("5 seconds")),