diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f22c84..72adafb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [0.9.48] - 2026-09-01 + +### Added +- **Queue/TaskStore integration for webhook-triggered reviews**: MR reviews triggered by GitLab webhooks are now visible in the live queue and history. Each webhook creates a task entry that tracks `pending` → `running` → `completed`/`failed`, broadcasts SSE events, and surfaces on the Queue Monitor and Recent Reviews dashboard. (`src/server/state.rs`, `src/server/gitlab/hooks.rs`, `src/server/task_queue.rs`, `src/server/api/dashboard.rs`, `src/server/api/queue.rs`) +- **System hook verification fallback for single platforms**: when a GitLab System Hook payload carries no URL, or its URL does not match any configured platform, verification succeeds if exactly one platform has webhook credentials. This handles the GitLab "Test" button and payloads from instances with a single reachable endpoint. (`src/server/gitlab/handler.rs`) + +### Fixed +- **Queue Monitor no longer appears blank when only completed tasks exist**: completed tasks are now shown under a "Recently completed" section, and the empty-state check counts all tasks instead of only active ones. (`frontend/src/views/QueueMonitor.vue`) + ## [0.9.47] - 2026-09-01 ### Added diff --git a/Cargo.lock b/Cargo.lock index a1dc2a0..2bfa3c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1840,7 +1840,7 @@ dependencies = [ [[package]] name = "review-engine" -version = "0.9.47" +version = "0.9.48" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 0506cf8..aabe854 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "review-engine" -version = "0.9.47" +version = "0.9.48" license = "Apache-2.0" edition = "2021" diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index bd75990..9ac3c21 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -293,6 +293,7 @@ export default { queued: 'Queued Tasks', failed: 'Failed Tasks', cancelled: 'Cancelled Tasks', + completed: 'Recently Completed Tasks', }, empty: 'No tasks in queue', emptyHint: 'The queue is currently empty. New tasks will appear here.', diff --git a/frontend/src/i18n/locales/fr.ts b/frontend/src/i18n/locales/fr.ts index 806dcf0..cf677ac 100644 --- a/frontend/src/i18n/locales/fr.ts +++ b/frontend/src/i18n/locales/fr.ts @@ -285,6 +285,7 @@ export default { queued: 'Tâches en file', failed: 'Tâches en échec', cancelled: 'Tâches annulées', + completed: 'Tâches récemment terminées', }, empty: 'Aucune tâche dans la file', emptyHint: 'La file est actuellement vide. Les nouvelles tâches apparaîtront ici.', diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts index 0d2ac0d..065ac09 100644 --- a/frontend/src/i18n/locales/ja.ts +++ b/frontend/src/i18n/locales/ja.ts @@ -284,6 +284,7 @@ export default { queued: '待機タスク', failed: '失敗タスク', cancelled: 'キャンセル済みタスク', + completed: '最近完了タスク', }, empty: 'キューにタスクがありません', emptyHint: 'キューは現在空です。新しいタスクはここに表示されます。', diff --git a/frontend/src/i18n/locales/ko.ts b/frontend/src/i18n/locales/ko.ts index 03c5ad2..3f9def8 100644 --- a/frontend/src/i18n/locales/ko.ts +++ b/frontend/src/i18n/locales/ko.ts @@ -283,6 +283,7 @@ export default { queued: '대기 중 태스크', failed: '실패한 태스크', cancelled: '취소된 태스크', + completed: '최근 완료된 태스크', }, empty: '대기열에 태스크가 없습니다', emptyHint: '대기열이 비어 있습니다. 새 태스크가 여기에 표시됩니다.', diff --git a/frontend/src/i18n/locales/zh-CN.ts b/frontend/src/i18n/locales/zh-CN.ts index ae9cd06..0829315 100644 --- a/frontend/src/i18n/locales/zh-CN.ts +++ b/frontend/src/i18n/locales/zh-CN.ts @@ -279,6 +279,7 @@ export default { queued: '排队任务', failed: '失败任务', cancelled: '已取消任务', + completed: '最近完成任务', }, empty: '队列中没有任务', emptyHint: '队列当前为空。新任务将显示在这里。', diff --git a/frontend/src/i18n/locales/zh-TW.ts b/frontend/src/i18n/locales/zh-TW.ts index b49b869..042558c 100644 --- a/frontend/src/i18n/locales/zh-TW.ts +++ b/frontend/src/i18n/locales/zh-TW.ts @@ -279,6 +279,7 @@ export default { queued: '排隊任務', failed: '失敗任務', cancelled: '已取消任務', + completed: '最近完成任務', }, empty: '佇列中沒有任務', emptyHint: '佇列目前為空。新任務會顯示在這裡。', diff --git a/frontend/src/views/QueueMonitor.vue b/frontend/src/views/QueueMonitor.vue index 386b0f5..4a4ba53 100644 --- a/frontend/src/views/QueueMonitor.vue +++ b/frontend/src/views/QueueMonitor.vue @@ -59,7 +59,13 @@ const activeTasks = computed(() => queue.items.value.filter((t: QueueTask) => t. const queuedTasks = computed(() => queue.items.value.filter((t: QueueTask) => t.status === 'queued')) const failedTasks = computed(() => queue.items.value.filter((t: QueueTask) => t.status === 'failed')) const cancelledTasks = computed(() => queue.items.value.filter((t: QueueTask) => t.status === 'cancelled')) -const allTasks = computed(() => queue.items.value) +const completedTasks = computed(() => queue.items.value.filter((t: QueueTask) => t.status === 'completed')) +// The backend returns every status (including `completed`) when no status +// filter is passed. Completed tasks are rendered in their own section below, +// so the "no tasks" placeholder must cover the full list — otherwise a +// completed-only result suppresses the placeholder while the four active +// sections stay empty, leaving a blank page. +const hasAnyTasks = computed(() => queue.items.value.length > 0) // --- Load queue data --- const loadQueueData = async () => { @@ -461,8 +467,33 @@ onUnmounted(() => { + +
+
+
+ {{ $t('queue.sections.completed') }} + +
+
+ + + +
+ -
+