From 14d4c832f2a09a322504b43fe0945b33102c6c2d Mon Sep 17 00:00:00 2001 From: Hemil-Sangani Date: Thu, 4 Jun 2026 10:01:52 +0530 Subject: [PATCH] feat(task): add download functionality for task output --- admin/backend/views/tasks.py | 21 +++++++++++++++++++++ admin/frontend/src/pages/TaskDetail.vue | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/admin/backend/views/tasks.py b/admin/backend/views/tasks.py index 30cb07c..7aa60f0 100644 --- a/admin/backend/views/tasks.py +++ b/admin/backend/views/tasks.py @@ -124,3 +124,24 @@ def rerun_task(task_id: str): return jsonify({"ok": False, "error": str(error)}), 500 return jsonify({"ok": True, "task_id": new_task_id}) + + +@tasks_bp.route("//output/download") +def download_task_output(task_id: str): + bench_root = current_app.config["BENCH_ROOT"] + try: + task = TaskReader(bench_root).read_task(task_id) + except TaskNotFoundError as error: + return jsonify({"error": str(error)}), 404 + except Exception as error: + return jsonify({"error": str(error)}), 500 + + output_path = task.output_path + if not output_path.exists(): + return jsonify({"error": "No output file found"}), 404 + + return Response( + output_path.read_bytes(), + mimetype="text/plain", + headers={"Content-Disposition": f'attachment; filename="{task_id}_output.log"'}, + ) diff --git a/admin/frontend/src/pages/TaskDetail.vue b/admin/frontend/src/pages/TaskDetail.vue index 635cbc0..6690108 100644 --- a/admin/frontend/src/pages/TaskDetail.vue +++ b/admin/frontend/src/pages/TaskDetail.vue @@ -4,6 +4,7 @@ import { useRoute, useRouter } from 'vue-router' import { Button, Badge, Dialog, LoadingText, ErrorMessage } from 'frappe-ui' import TerminalOutput from '../components/TerminalOutput.vue' import { processLine } from '../utils/ansi.js' +import LucideDownload from '~icons/lucide/download' const route = useRoute() const router = useRouter() @@ -131,6 +132,9 @@ onUnmounted(() => { if (es) { es.close(); es = null } }) {{ fmtDuration(task.duration_seconds) }}