-
+
-
cleanupFailedMutation.mutate()}
- loading={cleanupFailedMutation.isPending}
- disabled={cleanupFailedMutation.isPending || qdrantOffline}
- >
- Clean Up Failed
-
+
+ cleanupFailedMutation.mutate()}
+ loading={cleanupFailedMutation.isPending}
+ disabled={cleanupFailedMutation.isPending || qdrantOffline}
+ >
+ Clean Up Failed
+
+ {/* Not gated on qdrantOffline: clearing stuck jobs must work during
+ a Qdrant/Ollama outage, which is exactly when they wedge. */}
+
+ Cancel All Jobs
+
+
diff --git a/admin/inertia/lib/api.ts b/admin/inertia/lib/api.ts
index f15138b..9782e9e 100644
--- a/admin/inertia/lib/api.ts
+++ b/admin/inertia/lib/api.ts
@@ -479,6 +479,13 @@ class API {
})()
}
+ async cancelAllEmbedJobs(): Promise<{ message: string; cancelled: number; filesDeleted: number } | undefined> {
+ return catchInternal(async () => {
+ const response = await this.client.delete<{ message: string; cancelled: number; filesDeleted: number }>('/rag/jobs')
+ return response.data
+ })()
+ }
+
async checkRAGHealth() {
return catchInternal(async () => {
const response = await this.client.get<{ online: boolean; message?: string }>('/rag/health')
diff --git a/admin/start/routes.ts b/admin/start/routes.ts
index 6c19135..ca068cc 100644
--- a/admin/start/routes.ts
+++ b/admin/start/routes.ts
@@ -153,6 +153,7 @@ router
router.get('/active-jobs', [RagController, 'getActiveJobs'])
router.get('/failed-jobs', [RagController, 'getFailedJobs'])
router.delete('/failed-jobs', [RagController, 'cleanupFailedJobs'])
+ router.delete('/jobs', [RagController, 'cancelAllJobs'])
router.get('/job-status', [RagController, 'getJobStatus'])
router.post('/sync', [RagController, 'scanAndSync'])
router.post('/re-embed-all', [RagController, 'reembedAll'])