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 (
);
}
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)}
)}
)) : (
当前筛选条件下暂无运行事件
)}
);
}