feat(reviewer): add Tier 1 reviewer agent role with auto-channel notifications

Reviewer workflow in agent-prompts.ts (8-step process), Rust auto-post
to #review-queue on task->review transition, reviewQueueDepth in
attention scoring (10pts/task cap 50), Tasks tab for reviewer in
ProjectBox with 10s queue polling. 7 vitest + 4 cargo tests.
This commit is contained in:
Hibryda 2026-03-12 00:54:43 +01:00
parent 61f01e22b8
commit 323bb1b040
9 changed files with 397 additions and 0 deletions

View file

@ -22,6 +22,8 @@
import { ProjectId, type AgentId, type GroupId } from '../../types/ids';
import { notify, dismissNotification } from '../../stores/notifications.svelte';
import { registerManager, unregisterManager, updateManagerConfig } from '../../stores/wake-scheduler.svelte';
import { setReviewQueueDepth } from '../../stores/health.svelte';
import { reviewQueueCount } from '../../adapters/bttask-bridge';
interface Props {
project: ProjectConfig;
@ -93,6 +95,23 @@
};
});
// Poll review queue depth for reviewer agents (feeds into attention scoring)
$effect(() => {
if (!(project.isAgent && project.agentRole === 'reviewer')) return;
const groupId = activeGroup?.id;
if (!groupId) return;
const pollReviewQueue = () => {
reviewQueueCount(groupId)
.then(count => setReviewQueueDepth(project.id, count))
.catch(() => {}); // best-effort
};
pollReviewQueue(); // immediate first poll
const timer = setInterval(pollReviewQueue, 10_000); // 10s poll
return () => clearInterval(timer);
});
// S-1 Phase 2: start filesystem watcher for this project's CWD
$effect(() => {
const cwd = project.cwd;
@ -195,6 +214,9 @@
{#if isAgent && agentRole === 'architect'}
<button class="ptab ptab-role" class:active={activeTab === 'architecture'} onclick={() => switchTab('architecture')}>Arch</button>
{/if}
{#if isAgent && agentRole === 'reviewer'}
<button class="ptab ptab-role" class:active={activeTab === 'tasks'} onclick={() => switchTab('tasks')}>Tasks</button>
{/if}
{#if isAgent && agentRole === 'tester'}
<button class="ptab ptab-role" class:active={activeTab === 'selenium'} onclick={() => switchTab('selenium')}>Selenium</button>
<button class="ptab ptab-role" class:active={activeTab === 'tests'} onclick={() => switchTab('tests')}>Tests</button>