import React, { useEffect, useState } from 'react'; import { approvePendingApproval, denyPendingApproval, loadAllRuntimeState } from '../services/runtimeApi'; const AUTO_REFRESH_MS = 5000; const STATUS_LABELS = { idle: '空闲', registered: '已注册', initializing: '初始化中', ready: '就绪', running: '运行中', analysis_in_progress: '分析中', risk_review_in_progress: '风控处理中', discussion_in_progress: '会商中', decision_in_progress: '决策中', execution_in_progress: '执行中', settlement_in_progress: '结算中', reflection_in_progress: '复盘中', waiting_approval: '等待审批', approved: '已批准', denied: '已拒绝', completed: '已完成', error: '异常', stopped: '已停止' }; const EVENT_FILTER_OPTIONS = [ { value: 'all', label: '全部事件' }, { value: 'cycle', label: '运行周期' }, { value: 'approval', label: '审批事件' } ]; const SR_ONLY_STYLE = { position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0, 0, 0, 0)', whiteSpace: 'nowrap', border: 0 }; function metricCard(label, value, accent, helper = null) { return (
{label}
{value}
{helper && (
{helper}
)}
); } function resolveApprovalTone(approval) { const findings = Array.isArray(approval.findings) ? approval.findings : []; const levels = findings.map((item) => item?.severity).filter(Boolean); if (levels.includes('critical')) { return { border: '#7F1D1D', bg: '#FEF2F2', text: '#991B1B', badgeBg: '#FECACA' }; } if (levels.includes('high')) { return { border: '#9A3412', bg: '#FFF7ED', text: '#C2410C', badgeBg: '#FED7AA' }; } if (levels.includes('medium')) { return { border: '#92400E', bg: '#FFFBEB', text: '#B45309', badgeBg: '#FDE68A' }; } return { border: '#D1D5DB', bg: '#FCFCFC', text: '#374151', badgeBg: '#E5E7EB' }; } // 评估指标配置 const METRICS_CONFIG = { hit_rate: { label: '命中率', icon: '◎', goodThreshold: 0.7, warnThreshold: 0.5 }, risk_violation: { label: '风控违例', icon: '⚠', goodThreshold: 0.1, warnThreshold: 0.3, inverted: true // 值越小越好 }, decision_latency: { label: '决策延迟', icon: '◷', goodThreshold: 5000, warnThreshold: 10000, inverted: true, unit: 'ms' }, signal_consistency: { label: '信号一致性', icon: '≡', goodThreshold: 0.8, warnThreshold: 0.6 } }; function getMetricColor(value, config) { if (value === null || value === undefined || isNaN(value)) { return { color: '#9CA3AF', bg: '#F9FAFB', arrow: '-' }; } const isInverted = config.inverted; const effectiveValue = isInverted ? value : value; const effectiveGood = isInverted ? config.goodThreshold : config.goodThreshold; const effectiveWarn = isInverted ? config.warnThreshold : config.warnThreshold; if (effectiveValue <= effectiveGood) { return { color: '#059669', bg: '#ECFDF5', arrow: '↑' }; } else if (effectiveValue <= effectiveWarn) { return { color: '#D97706', bg: '#FFFBEB', arrow: '→' }; } else { return { color: '#DC2626', bg: '#FEF2F2', arrow: '↓' }; } } function MetricBadge({ metricKey, value }) { const config = METRICS_CONFIG[metricKey]; if (!config) return null; const displayValue = value !== null && value !== undefined && !isNaN(value) ? (config.unit === 'ms' ? `${Math.round(value)}${config.unit}` : `${(value * 100).toFixed(1)}%`) : '-'; const { color, bg, arrow } = getMetricColor(value, config); return (
{config.icon} {displayValue} {arrow}
); } function AgentMetricsPanel({ agent }) { const extensions = agent.extensions || {}; const metrics = [ { key: 'hit_rate', value: extensions.hit_rate }, { key: 'risk_violation', value: extensions.risk_violation }, { key: 'decision_latency', value: extensions.decision_latency }, { key: 'signal_consistency', value: extensions.signal_consistency } ]; const hasMetrics = metrics.some(m => m.value !== null && m.value !== undefined && !isNaN(m.value)); if (!hasMetrics) return null; return (
{metrics.map(({ key, value }) => ( ))}
); } function sectionTitle(label, action = null) { return (
{label}
{action}
); } function formatStatusLabel(status) { if (!status) { return '-'; } return STATUS_LABELS[status] || status.replace(/_/g, ' '); } function formatSessionLabel(sessionId) { return sessionId || '无会话'; } function formatApprovalScopeLabel(approval) { const runId = approval?.run_id || approval?.workspace_id || '-'; const agentId = approval?.agent_id || '-'; return `${agentId} · 运行 ${runId} · ${formatSessionLabel(approval?.session_id)}`; } function formatEventLabel(eventName) { if (!eventName) { return '-'; } const [group, action] = String(eventName).split(':'); if (group === 'cycle') { if (action === 'start') return '周期开始'; if (action === 'complete') return '周期完成'; if (action === 'error') return '周期异常'; return '运行周期'; } if (group === 'approval') { if (action === 'created') return '创建审批'; if (action === 'approved') return '审批通过'; if (action === 'denied') return '审批拒绝'; if (action === 'expired') return '审批超时'; return '审批事件'; } if (group === 'agent') { if (action === 'status') return '状态更新'; if (action === 'registered') return '注册 Agent'; return 'Agent 事件'; } return String(eventName).replace(/_/g, ' '); } export default function RuntimeView() { const [runtimeState, setRuntimeState] = useState(null); const [runtimeError, setRuntimeError] = useState(null); const [isRuntimeLoading, setIsRuntimeLoading] = useState(false); const [approvalActionId, setApprovalActionId] = useState(null); const [autoRefreshEnabled, setAutoRefreshEnabled] = useState(true); const [eventFilter, setEventFilter] = useState('all'); const refreshRuntimeState = () => { setIsRuntimeLoading(true); loadAllRuntimeState( (state) => { setRuntimeState(state); setRuntimeError(null); setIsRuntimeLoading(false); }, (error) => { setRuntimeError(error.message || '无法加载运行状态'); setIsRuntimeLoading(false); } ); }; useEffect(() => { refreshRuntimeState(); }, []); useEffect(() => { if (!autoRefreshEnabled) { return undefined; } const timer = window.setInterval(() => { refreshRuntimeState(); }, AUTO_REFRESH_MS); return () => window.clearInterval(timer); }, [autoRefreshEnabled]); const handleApprovalAction = async (approvalId, action) => { setApprovalActionId(approvalId); try { if (action === 'approve') { await approvePendingApproval(approvalId); } else { await denyPendingApproval(approvalId); } refreshRuntimeState(); } catch (error) { setRuntimeError(error.message || '审批操作失败'); setIsRuntimeLoading(false); } finally { setApprovalActionId(null); } }; const agents = runtimeState?.agents || []; const approvals = runtimeState?.approvals || []; const events = runtimeState?.events || []; const activeAgentsCount = agents.filter((agent) => agent.status && agent.status !== 'idle').length; const visibleEvents = events .filter((event) => eventFilter === 'all' || event.event.startsWith(eventFilter)) .slice() .reverse(); return (
运行态控制台
查看当前运行上下文、分析师状态、待审批请求与近期事件。这里是监控面板,不再和运行设置挤在同一个小弹层里。
{metricCard('活跃 Agent', activeAgentsCount, '#2563EB', `共 ${agents.length} 个 agent 已注册`)} {metricCard('待审批', approvals.length, approvals.length > 0 ? '#C2410C' : '#059669', approvals.length > 0 ? '需要人工处理' : '当前无待处理审批')} {metricCard('运行事件', events.length, '#111111', '最近运行阶段和状态变化')}
自动刷新
{runtimeError && (
{runtimeError}
)}
{sectionTitle('运行上下文')} {runtimeState?.context ? (
配置名
{runtimeState.context.config_name}
运行目录
{runtimeState.context.run_dir}
启动参数
                  {JSON.stringify(runtimeState.context.bootstrap_values || {}, null, 2)}
                
) : (
暂无运行上下文
)}
{sectionTitle('团队协作状态')}
{/* 自动广播状态 */}
📣 自动广播
{(runtimeState?.context?.auto_broadcast || runtimeState?.context?.team_config?.auto_broadcast) ? '已启用' : '已关闭'}
{/* Fan-out Pipeline */}
👥 Fan-out Pipeline
{runtimeState?.context?.fanout_pipeline?.length || 0} Agents
{/* 活跃分析师列表 */}
📈 活跃分析师
{(() => { const activeAnalysts = (runtimeState?.agents || []).filter( (agent) => agent.status && agent.status !== 'idle' && agent.status !== 'stopped' ); if (activeAnalysts.length === 0) { return (
当前无活跃分析师
); } return (
{activeAnalysts.map((agent) => ( {agent.agent_id} ))}
); })()}
{/* 团队配置详情 */} {runtimeState?.context?.team_config && (
团队配置
                  {JSON.stringify(runtimeState.context.team_config, null, 2)}
                
)}
{sectionTitle('待审批请求')}
{approvals.length ? approvals.map((approval) => { const tone = resolveApprovalTone(approval); return (
{approval.tool_name}
{formatStatusLabel(approval.status)}
{formatApprovalScopeLabel(approval)}
{approval.tool_input && (
                    {JSON.stringify(approval.tool_input, null, 2)}
                  
)} {approval.findings?.length > 0 && (
{approval.findings.map((finding, index) => ( {finding.severity}: {finding.message} ))}
)}
)}) : (
当前无待审批请求
)}
{sectionTitle('Agent 状态')}
{runtimeState?.agents?.length ? runtimeState.agents.map((agent) => (
{agent.agent_id} {formatStatusLabel(agent.status)}
会话: {formatSessionLabel(agent.last_session)}
更新时间: {agent.last_updated}
)) : (
暂无 agent 状态
)}
{sectionTitle( '近期事件', )}
{visibleEvents.length ? visibleEvents.map((event, index) => (
{formatEventLabel(event.event)} {formatSessionLabel(event.session)}
{event.timestamp}
{event.details && Object.keys(event.details).length > 0 && (
                    {JSON.stringify(event.details, null, 2)}
                  
)}
)) : (
当前筛选条件下暂无运行事件
)}
); }