import React, { useEffect, useState } from 'react' import { useParams, Link } from 'react-router-dom' interface FileSummary { id: string name: string description?: string contract_phase?: string } interface TaskSummary { id: string name: string status: string is_supervisor?: boolean is_red_team?: boolean } interface ContractRepository { id: string name: string source_type: string is_primary: boolean } interface Contract { id: string name: string description?: string contract_type: string phase: string status: string version: number created_at: string red_team_enabled?: boolean red_team_prompt?: string } interface RedTeamNotification { id: string contract_id: string red_team_task_id: string related_task_id?: string message: string severity: 'info' | 'warning' | 'critical' file_path?: string context?: string delivered: boolean delivered_at?: string acknowledged: boolean acknowledged_at?: string created_at: string } interface ContractWithRelations { contract: Contract repositories: ContractRepository[] files: FileSummary[] tasks: TaskSummary[] } type Tab = 'overview' | 'files' | 'tasks' | 'repositories' | 'red-team' export function ContractDetail() { const { id } = useParams<{ id: string }>() const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [activeTab, setActiveTab] = useState('overview') const [notifications, setNotifications] = useState([]) const [notificationsLoading, setNotificationsLoading] = useState(false) useEffect(() => { async function fetchContract() { if (!id) return try { setLoading(true) const response = await fetch(`/api/v1/contracts/${id}`) if (!response.ok) { throw new Error(`Failed to fetch contract: ${response.statusText}`) } const contractData = await response.json() setData(contractData) } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error') } finally { setLoading(false) } } fetchContract() }, [id]) // Fetch red team notifications when viewing red-team tab useEffect(() => { async function fetchNotifications() { if (!id || activeTab !== 'red-team' || !data?.contract.red_team_enabled) return try { setNotificationsLoading(true) const response = await fetch(`/api/v1/contracts/${id}/red-team/notifications`) if (response.ok) { const notificationData = await response.json() setNotifications(notificationData.notifications || []) } } catch (err) { console.error('Failed to fetch red team notifications:', err) } finally { setNotificationsLoading(false) } } fetchNotifications() }, [id, activeTab, data?.contract.red_team_enabled]) if (loading) { return (
Loading contract...
) } if (error) { return (
Error: {error}
Back to Contracts
) } if (!data) { return (
Contract not found
Back to Contracts
) } const { contract, repositories, files, tasks } = data return (
Back to Contracts

{contract.name} {contract.red_team_enabled && ( đŸ›Ąī¸ Red Team )}

{contract.description && (

{contract.description}

)}
Phase: {contract.phase} Status: {contract.status} Version: {contract.version}
{contract.red_team_enabled && ( )}
{activeTab === 'overview' && (

Contract Overview

Type
{contract.contract_type}
Phase
{contract.phase}
Status
{contract.status}
Created
{new Date(contract.created_at).toLocaleString()}
)} {activeTab === 'files' && (

Files

{files.length === 0 ? (

No files in this contract

) : (
    {files.map((file) => (
  • {file.name}

    {file.description &&

    {file.description}

    } {file.contract_phase && ( Phase: {file.contract_phase} )}
  • ))}
)}
)} {activeTab === 'tasks' && (

Tasks

{tasks.length === 0 ? (

No tasks in this contract

) : (
    {tasks.map((task) => (
  • {task.is_red_team && đŸ›Ąī¸} {task.is_supervisor && 👔} {task.name}

    {task.status}
  • ))}
)}
)} {activeTab === 'repositories' && (

Repositories

{repositories.length === 0 ? (

No repositories linked to this contract

) : (
    {repositories.map((repo) => (
  • {repo.name} {repo.is_primary && Primary}

    {repo.source_type}
  • ))}
)}
)} {activeTab === 'red-team' && contract.red_team_enabled && (

đŸ›Ąī¸ Red Team Monitoring

{contract.red_team_prompt && (

Review Criteria

{contract.red_team_prompt}

)}

Red Team Task

{(() => { const redTeamTask = tasks.find(t => t.is_red_team) if (redTeamTask) { return (
{redTeamTask.name} {redTeamTask.status}
) } return

Red team task not yet spawned

})()}

Alerts ({notifications.length})

{notificationsLoading ? (

Loading notifications...

) : notifications.length === 0 ? (

No alerts from red team

) : (
    {notifications.map((notification) => (
  • {notification.severity === 'critical' && '🚨'} {notification.severity === 'warning' && 'âš ī¸'} {notification.severity === 'info' && 'â„šī¸'} {notification.severity.toUpperCase()} {new Date(notification.created_at).toLocaleString()}

    {notification.message}

    {notification.file_path && ( File: {notification.file_path} )} {notification.context && (
    {notification.context}
    )}
  • ))}
)}
)}
) }