diff --git a/web/frontend/src/locales/en.json b/web/frontend/src/locales/en.json index 9190ad4..bc034c1 100644 --- a/web/frontend/src/locales/en.json +++ b/web/frontend/src/locales/en.json @@ -176,7 +176,9 @@ "acceptance_criteria_label": "Acceptance criteria", "acceptance_criteria_placeholder": "What should the output be? What result counts as success?", "create_followup": "🔗 Create Follow-up", - "generating_followup": "Generating..." + "generating_followup": "Generating...", + "review_required": "Review required:", + "banner_auto_mode": "🔓 Auto mode" }, "projectView": { "tasks_tab": "Tasks", diff --git a/web/frontend/src/locales/ru.json b/web/frontend/src/locales/ru.json index 64b0893..a4967a7 100644 --- a/web/frontend/src/locales/ru.json +++ b/web/frontend/src/locales/ru.json @@ -176,7 +176,9 @@ "acceptance_criteria_label": "Критерии приёмки", "acceptance_criteria_placeholder": "Что должно быть на выходе? Какой результат считается успешным?", "create_followup": "🔗 Создать зависимости", - "generating_followup": "Создаём..." + "generating_followup": "Создаём...", + "review_required": "Требует проверки:", + "banner_auto_mode": "🔓 Авто режим" }, "projectView": { "tasks_tab": "Задачи", diff --git a/web/frontend/src/views/TaskDetail.vue b/web/frontend/src/views/TaskDetail.vue index 1fd783f..0743912 100644 --- a/web/frontend/src/views/TaskDetail.vue +++ b/web/frontend/src/views/TaskDetail.vue @@ -283,6 +283,24 @@ async function runPipeline() { const hasSteps = computed(() => (task.value?.pipeline_steps?.length ?? 0) > 0) const isRunning = computed(() => task.value?.status === 'in_progress') const isManualEscalation = computed(() => task.value?.brief?.task_type === 'manual_escalation') +const useVerticalPipeline = computed(() => (task.value?.pipeline_steps?.length ?? 0) > 5) + +const expandedSteps = ref>({}) +function toggleStepExpand(id: number) { + expandedSteps.value = { ...expandedSteps.value, [id]: !expandedSteps.value[id] } +} + +function verticalStepIcon(step: PipelineStep) { + if (step.success === true || step.success === 1) return '\u2713' + if (step.success === false || step.success === 0) return '\u2717' + return '\u25CF' +} + +function verticalStepIconColor(step: PipelineStep) { + if (step.success === true || step.success === 1) return 'text-green-400' + if (step.success === false || step.success === 0) return 'text-red-400' + return 'text-blue-400' +} const resolvingManually = ref(false) @@ -482,13 +500,36 @@ async function saveEdit() { + +
+ {{ t('taskDetail.review_required') }} + + + + +
+

{{ t('taskDetail.pipeline') }} {{ t('taskDetail.running') }}

-
+ +
+ + +
+
+
+ {{ verticalStepIcon(step) }} + {{ roleIcons[step.agent_role] || '\u{1F916}' }} + {{ step.agent_role }} + {{ step.duration_seconds }}s + ${{ step.cost_usd?.toFixed(3) }} + {{ expandedSteps[step.id] ? '▲' : '▼' }} +
+
+ + +
+
+