Improve USB policy responsiveness and reliability

- Reduce USB policy polling from 60s to 15s for faster response
- Add retry with exponential backoff (2s, 4s, 8s) on report failures
- Add APPLYING state for real-time progress bar feedback
- Check if policy is already applied locally before re-applying
- Fix API schema to accept APPLYING status
- Update agent to v0.1.9

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
esdrasrenan 2025-12-06 17:51:57 -03:00
parent 23e7cf58ae
commit b60255fe03
6 changed files with 115 additions and 14 deletions

View file

@ -73,6 +73,13 @@ function getStatusBadge(status: string | undefined | null) {
Pendente
</Badge>
)
case "APPLYING":
return (
<Badge variant="outline" className="gap-1 border-blue-200 bg-blue-50 text-blue-700">
<Loader2 className="size-3 animate-spin" />
Aplicando
</Badge>
)
case "APPLIED":
return (
<Badge variant="outline" className="gap-1 border-emerald-200 bg-emerald-50 text-emerald-700">
@ -92,6 +99,36 @@ function getStatusBadge(status: string | undefined | null) {
}
}
function getProgressValue(status: string | undefined | null): number {
switch (status) {
case "PENDING":
return 33
case "APPLYING":
return 66
case "APPLIED":
return 100
case "FAILED":
return 100
default:
return 0
}
}
function getProgressColor(status: string | undefined | null): string {
switch (status) {
case "PENDING":
return "bg-amber-500"
case "APPLYING":
return "bg-blue-500"
case "APPLIED":
return "bg-emerald-500"
case "FAILED":
return "bg-red-500"
default:
return "bg-neutral-300"
}
}
interface UsbPolicyControlProps {
machineId: string
machineName?: string
@ -168,11 +205,27 @@ export function UsbPolicyControl({
const content = (
<div className="space-y-4">
{/* Status atual no topo */}
{/* Status atual com progress bar real */}
{usbPolicy?.status && (
<div className="flex items-center justify-between rounded-lg border bg-slate-50 p-3">
<span className="text-sm font-medium text-slate-600">Status da política</span>
{getStatusBadge(usbPolicy.status)}
<div className="space-y-2 rounded-lg border bg-slate-50 p-3">
<div className="flex items-center justify-between">
<span className="text-sm font-medium text-slate-600">Status da política</span>
{getStatusBadge(usbPolicy.status)}
</div>
{/* Progress bar real baseada no estado */}
{(usbPolicy.status === "PENDING" || usbPolicy.status === "APPLYING") && (
<div className="space-y-1">
<div className="h-2 w-full overflow-hidden rounded-full bg-slate-200">
<div
className={`h-full transition-all duration-500 ease-out ${getProgressColor(usbPolicy.status)}`}
style={{ width: `${getProgressValue(usbPolicy.status)}%` }}
/>
</div>
<p className="text-xs text-muted-foreground">
{usbPolicy.status === "PENDING" ? "Aguardando agente..." : "Agente aplicando política..."}
</p>
</div>
)}
</div>
)}