Workers screen shows each agent's version and protocol, and who is behind

The hello carries the fluksio-worker version. An agent refused for an older
protocol stays listed as Needs upgrade until it attaches again. Docs gain an
Upgrading workers section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WgBfkm4rCmtd1T4vHWjEPx
This commit is contained in:
2026-10-15 11:09:54 +02:00
co-authored by Claude Opus 5.5
parent 5f05d3f8b4
commit a6736bf484
7 changed files with 124 additions and 16 deletions
+15
View File
@@ -4677,6 +4677,21 @@ export const WorkerInfoSchema = {
}
],
title: 'Ram Mb'
},
protocol: {
type: 'integer',
title: 'Protocol',
default: 0
},
version: {
type: 'string',
title: 'Version',
default: ''
},
behind: {
type: 'boolean',
title: 'Behind',
default: false
}
},
type: 'object',
+3
View File
@@ -1534,6 +1534,9 @@ export type WorkerInfo = {
cpus?: number;
gpus?: number;
ram_mb?: (number | null);
protocol?: number;
version?: string;
behind?: boolean;
};
/**
+32 -8
View File
@@ -9,6 +9,7 @@ import {
FlavorsService,
WorkersService,
} from "@/client"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
Dialog,
@@ -172,15 +173,38 @@ function Attached() {
</span>
) : null}
</span>
<span className="pl-6 font-mono text-xs text-muted-foreground">
{worker.cpus} cpu
{worker.gpus ? ` · ${worker.gpus} gpu` : ""}
{worker.ram_mb ? ` · ${Math.round(worker.ram_mb / 1024)} GB` : ""}{" "}
· {worker.in_flight}/{worker.max_parallel} in flight
</span>
{worker.behind ? (
<span className="pl-6 text-xs text-muted-foreground">
Refused for an older protocol. Upgrade it with{" "}
<code className="font-mono">pip install -U fluksio-worker</code>
</span>
) : (
<span className="pl-6 font-mono text-xs text-muted-foreground">
{worker.cpus} cpu
{worker.gpus ? ` · ${worker.gpus} gpu` : ""}
{worker.ram_mb
? ` · ${Math.round(worker.ram_mb / 1024)} GB`
: ""}{" "}
· {worker.in_flight}/{worker.max_parallel} in flight
</span>
)}
</span>
<span className="text-xs text-muted-foreground">
seen {ago(worker.last_seen ?? 0)}
<span className="flex items-center gap-3 text-xs text-muted-foreground">
{worker.behind ? (
<Badge
variant="outline"
className="border-transparent bg-destructive/15 text-destructive"
>
Needs upgrade
</Badge>
) : null}
<span className="font-mono">
{worker.version ? `v${worker.version} · ` : ""}protocol{" "}
{worker.protocol}
</span>
<span>
{worker.behind ? "refused" : "seen"} {ago(worker.last_seen ?? 0)}
</span>
</span>
</div>
))}