+ {/* Pausing indicator */}
+ {status === 'pausing' && (
+
+
+ Pausing...
+
)}
-
+
+ {/* Paused indicator + Resume button */}
+ {status === 'paused_graceful' && (
+ <>
+
+ Paused
+
+
+ >
+ )}
+
+ {/* Graceful pause button (only when running normally) */}
+ {status === 'running' && (
+
+ )}
+
+ {/* Stop button (always available) */}
+
+
)}
{/* Clock button to open schedule modal */}
diff --git a/ui/src/components/OrchestratorStatusCard.tsx b/ui/src/components/OrchestratorStatusCard.tsx
index dedeaa94..860abfd7 100644
--- a/ui/src/components/OrchestratorStatusCard.tsx
+++ b/ui/src/components/OrchestratorStatusCard.tsx
@@ -25,6 +25,10 @@ function getStateText(state: OrchestratorState): string {
return 'Watching progress...'
case 'complete':
return 'Mission accomplished!'
+ case 'draining':
+ return 'Draining agents...'
+ case 'paused':
+ return 'Paused'
default:
return 'Orchestrating...'
}
@@ -42,6 +46,10 @@ function getStateColor(state: OrchestratorState): string {
return 'text-primary'
case 'initializing':
return 'text-yellow-600 dark:text-yellow-400'
+ case 'draining':
+ return 'text-amber-600 dark:text-amber-400'
+ case 'paused':
+ return 'text-muted-foreground'
default:
return 'text-muted-foreground'
}
diff --git a/ui/src/hooks/useProjects.ts b/ui/src/hooks/useProjects.ts
index f69d90f9..4ed44364 100644
--- a/ui/src/hooks/useProjects.ts
+++ b/ui/src/hooks/useProjects.ts
@@ -197,6 +197,28 @@ export function useResumeAgent(projectName: string) {
})
}
+export function useGracefulPauseAgent(projectName: string) {
+ const queryClient = useQueryClient()
+
+ return useMutation({
+ mutationFn: () => api.gracefulPauseAgent(projectName),
+ onSuccess: () => {
+ queryClient.invalidateQueries({ queryKey: ['agent-status', projectName] })
+ },
+ })
+}
+
+export function useGracefulResumeAgent(projectName: string) {
+ const queryClient = useQueryClient()
+
+ return useMutation({
+ mutationFn: () => api.gracefulResumeAgent(projectName),
+ onSuccess: () => {
+ queryClient.invalidateQueries({ queryKey: ['agent-status', projectName] })
+ },
+ })
+}
+
// ============================================================================
// Setup
// ============================================================================
diff --git a/ui/src/lib/api.ts b/ui/src/lib/api.ts
index 23e9973f..739d5ff8 100644
--- a/ui/src/lib/api.ts
+++ b/ui/src/lib/api.ts
@@ -271,6 +271,18 @@ export async function resumeAgent(projectName: string): Promise