mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-08-01 00:27:35 +02:00
Add files via upload
This commit is contained in:
@@ -10767,6 +10767,11 @@ html[data-theme="dark"] .robot-binding-service-hint-icon {
|
||||
background: rgba(239, 68, 68, 0.1);
|
||||
}
|
||||
|
||||
.mcp-stats-kpi__chip.is-neutral {
|
||||
color: #475569;
|
||||
background: rgba(100, 116, 139, 0.12);
|
||||
}
|
||||
|
||||
.mcp-stats-kpi__status {
|
||||
font-size: 0.75rem;
|
||||
font-weight: 500;
|
||||
|
||||
@@ -210,6 +210,7 @@
|
||||
"toolsCountLabel_other": "{{count}} tools",
|
||||
"failedNCalls_one": "{{count}} failed",
|
||||
"failedNCalls_other": "{{count}} failed",
|
||||
"noCompletedYet": "No completed outcomes yet",
|
||||
"noCallYet": "No calls yet",
|
||||
"allClear": "No new risks",
|
||||
"allIdle": "System idle",
|
||||
@@ -2170,6 +2171,7 @@
|
||||
"lastCall": "Last call",
|
||||
"lastRefreshTime": "Last refresh",
|
||||
"noCallsYet": "No calls yet",
|
||||
"noCompletedYet": "No completed outcomes yet",
|
||||
"unknownTool": "Unknown tool",
|
||||
"successFailedRate": "Success {{success}} / Failed {{failed}} · {{rate}}% success rate",
|
||||
"topToolsTitle": "Top {{n}} tools by calls",
|
||||
@@ -2192,6 +2194,7 @@
|
||||
"clearToolFilter": "Clear tool filter",
|
||||
"successCount": "Success {{n}}",
|
||||
"failedCount": "Failed {{n}}",
|
||||
"neutralCount": "Stopped {{n}}",
|
||||
"rateHealthy": "Running smoothly",
|
||||
"rateWarning": "Some failures detected",
|
||||
"rateCritical": "High failure rate",
|
||||
|
||||
@@ -207,6 +207,7 @@
|
||||
"highCountLabel": "高危 {{count}}",
|
||||
"toolsCountLabel": "{{count}} 个工具",
|
||||
"failedNCalls": "{{count}} 次失败",
|
||||
"noCompletedYet": "暂无有效完成",
|
||||
"noCallYet": "暂无调用",
|
||||
"allClear": "暂无新增风险",
|
||||
"allIdle": "系统空闲",
|
||||
@@ -2158,6 +2159,7 @@
|
||||
"lastCall": "最近一次调用",
|
||||
"lastRefreshTime": "最后刷新时间",
|
||||
"noCallsYet": "暂无调用",
|
||||
"noCompletedYet": "暂无有效完成",
|
||||
"unknownTool": "未知工具",
|
||||
"successFailedRate": "成功 {{success}} / 失败 {{failed}} · 成功率 {{rate}}%",
|
||||
"topToolsTitle": "工具调用 Top {{n}}",
|
||||
@@ -2180,6 +2182,7 @@
|
||||
"clearToolFilter": "清除工具筛选",
|
||||
"successCount": "成功 {{n}}",
|
||||
"failedCount": "失败 {{n}}",
|
||||
"neutralCount": "终止 {{n}}",
|
||||
"rateHealthy": "运行平稳",
|
||||
"rateWarning": "存在失败调用",
|
||||
"rateCritical": "失败率偏高",
|
||||
|
||||
@@ -295,14 +295,18 @@ async function refreshDashboard() {
|
||||
toolsTotalCalls = s.totalCalls || 0;
|
||||
toolsFailedCount = s.failedCalls || 0;
|
||||
const totalSuccess = s.successCalls || 0;
|
||||
const effectiveToolCalls = totalSuccess + toolsFailedCount;
|
||||
setEl('dashboard-kpi-tools-calls', formatNumber(toolsTotalCalls));
|
||||
setKpiSubText('dashboard-kpi-tools-sub-text',
|
||||
dt('dashboard.toolsCountLabel', { count: toolsCount }, toolsCount + ' 个工具'));
|
||||
if (toolsTotalCalls > 0) {
|
||||
toolsSuccessRate = (totalSuccess / toolsTotalCalls) * 100;
|
||||
if (effectiveToolCalls > 0) {
|
||||
toolsSuccessRate = (totalSuccess / effectiveToolCalls) * 100;
|
||||
const rateStr = toolsSuccessRate.toFixed(1) + '%';
|
||||
setEl('dashboard-kpi-success-rate', rateStr);
|
||||
setKpiRateBadge('dashboard-kpi-rate-sub-text', toolsSuccessRate, toolsFailedCount);
|
||||
} else if (toolsTotalCalls > 0) {
|
||||
setEl('dashboard-kpi-success-rate', '-');
|
||||
setKpiSubText('dashboard-kpi-rate-sub-text', dt('dashboard.noCompletedYet', null, '暂无有效完成'));
|
||||
} else {
|
||||
setEl('dashboard-kpi-success-rate', '-');
|
||||
setKpiSubText('dashboard-kpi-rate-sub-text', dt('dashboard.noCallYet', null, '暂无调用'));
|
||||
@@ -1500,19 +1504,19 @@ function renderVulnStatusPanel(byStatus, total) {
|
||||
setEl('dashboard-status-fp', formatNumber(fp));
|
||||
setEl('dashboard-status-ignored', formatNumber(ignored));
|
||||
|
||||
// 修复率:fixed / total(不计入 false_positive 时也可,按 total 维持一致)
|
||||
var t = Number(total || 0);
|
||||
var rate = t > 0 ? (fixed / t) * 100 : 0;
|
||||
var rateStr = t > 0 ? rate.toFixed(rate >= 100 ? 0 : 1) + '%' : '-';
|
||||
// 修复率只按需要处置的有效漏洞计算;误报/已忽略属于中性闭环,不拉低修复率。
|
||||
var actionableTotal = open + confirmed + fixed;
|
||||
var rate = actionableTotal > 0 ? (fixed / actionableTotal) * 100 : 0;
|
||||
var rateStr = actionableTotal > 0 ? rate.toFixed(rate >= 100 ? 0 : 1) + '%' : '-';
|
||||
setEl('dashboard-fix-rate', rateStr);
|
||||
|
||||
var detailEl = document.getElementById('dashboard-fix-detail');
|
||||
if (detailEl) {
|
||||
detailEl.textContent = '(' + formatNumber(fixed) + ' / ' + formatNumber(t) + ')';
|
||||
detailEl.textContent = '(' + formatNumber(fixed) + ' / ' + formatNumber(actionableTotal) + ')';
|
||||
}
|
||||
|
||||
var fixedPct = t > 0 ? (fixed / t) * 100 : 0;
|
||||
var confirmedPct = t > 0 ? (confirmed / t) * 100 : 0;
|
||||
var fixedPct = actionableTotal > 0 ? (fixed / actionableTotal) * 100 : 0;
|
||||
var confirmedPct = actionableTotal > 0 ? (confirmed / actionableTotal) * 100 : 0;
|
||||
var fixedBar = document.getElementById('dashboard-fix-progress-fixed');
|
||||
var confirmedBar = document.getElementById('dashboard-fix-progress-confirmed');
|
||||
if (fixedBar) fixedBar.style.width = fixedPct.toFixed(2) + '%';
|
||||
|
||||
@@ -5293,10 +5293,14 @@ function getMcpMonitorTimelineRange() {
|
||||
|
||||
function buildMonitorTotals(summary) {
|
||||
const s = summary && typeof summary === 'object' ? summary : {};
|
||||
const total = s.totalCalls || 0;
|
||||
const success = s.successCalls || 0;
|
||||
const failed = s.failedCalls || 0;
|
||||
return {
|
||||
total: s.totalCalls || 0,
|
||||
success: s.successCalls || 0,
|
||||
failed: s.failedCalls || 0,
|
||||
total,
|
||||
success,
|
||||
failed,
|
||||
neutral: Math.max(0, total - success - failed),
|
||||
lastCallTime: s.lastCallTime ? new Date(s.lastCallTime) : null,
|
||||
};
|
||||
}
|
||||
@@ -6193,7 +6197,11 @@ function renderMcpStatsMetricsBar(totals, successRate, rateTone, rateSubText, la
|
||||
const lastCallLabel = mcpMonitorT('lastCall') || monitorFallback('最近一次调用', 'Last call');
|
||||
const successPill = mcpMonitorT('successCount', { n: totals.success }) || monitorFallback(`成功 ${totals.success}`, `Success ${totals.success}`);
|
||||
const failedPill = mcpMonitorT('failedCount', { n: totals.failed }) || monitorFallback(`失败 ${totals.failed}`, `Failed ${totals.failed}`);
|
||||
const neutralPill = mcpMonitorT('neutralCount', { n: totals.neutral }) || monitorFallback(`终止 ${totals.neutral}`, `Stopped ${totals.neutral}`);
|
||||
const rateValue = hasCalls ? `${successRate}%` : successRate;
|
||||
const neutralChip = totals.neutral > 0
|
||||
? `<span class="mcp-stats-kpi__chip is-neutral">${escapeHtml(neutralPill)}</span>`
|
||||
: '';
|
||||
|
||||
return `
|
||||
<div class="mcp-stats-kpi" role="group" aria-label="${escapeHtml(totalCallsLabel)}">
|
||||
@@ -6205,6 +6213,7 @@ function renderMcpStatsMetricsBar(totals, successRate, rateTone, rateSubText, la
|
||||
<div class="mcp-stats-kpi__meta">
|
||||
<span class="mcp-stats-kpi__chip is-ok">${escapeHtml(successPill)}</span>
|
||||
<span class="mcp-stats-kpi__chip is-fail">${escapeHtml(failedPill)}</span>
|
||||
${neutralChip}
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
@@ -6240,7 +6249,8 @@ function renderMcpStatsToolTable(topTools, totals, activeToolFilter = '') {
|
||||
const total = tool.totalCalls || 0;
|
||||
const success = tool.successCalls || 0;
|
||||
const failed = tool.failedCalls || 0;
|
||||
const toolRateNum = total > 0 ? (success / total) * 100 : 0;
|
||||
const effectiveTotal = success + failed;
|
||||
const toolRateNum = effectiveTotal > 0 ? (success / effectiveTotal) * 100 : 0;
|
||||
const toolRate = toolRateNum.toFixed(1);
|
||||
const sharePct = totals.total > 0 ? ((total / totals.total) * 100).toFixed(1) : '0.0';
|
||||
const dotColor = MCP_STATS_DIST_COLORS[index % MCP_STATS_DIST_COLORS.length];
|
||||
@@ -6318,7 +6328,8 @@ function renderMcpStatsToolsPanel(topTools, totals, activeToolFilter = '') {
|
||||
const total = tool.totalCalls || 0;
|
||||
const success = tool.successCalls || 0;
|
||||
const failed = tool.failedCalls || 0;
|
||||
const toolRateNum = total > 0 ? (success / total) * 100 : 0;
|
||||
const effectiveTotal = success + failed;
|
||||
const toolRateNum = effectiveTotal > 0 ? (success / effectiveTotal) * 100 : 0;
|
||||
const toolRate = toolRateNum.toFixed(1);
|
||||
const sharePct = totals.total > 0 ? ((total / totals.total) * 100).toFixed(1) : '0.0';
|
||||
const color = MCP_STATS_DIST_COLORS[index % MCP_STATS_DIST_COLORS.length];
|
||||
@@ -6453,17 +6464,19 @@ function renderMonitorStats(summary = null, topTools = [], lastFetchedAt = null)
|
||||
return;
|
||||
}
|
||||
|
||||
const hasCalls = totals.total > 0;
|
||||
const successRateNum = hasCalls ? (totals.success / totals.total) * 100 : 0;
|
||||
const effectiveTotal = totals.success + totals.failed;
|
||||
const hasCalls = effectiveTotal > 0;
|
||||
const successRateNum = hasCalls ? (totals.success / effectiveTotal) * 100 : 0;
|
||||
const successRate = hasCalls ? successRateNum.toFixed(1) : '-';
|
||||
const locale = (typeof window.__locale === 'string' && window.__locale.startsWith('zh')) ? 'zh-CN' : 'en-US';
|
||||
const noCallsYet = mcpMonitorT('noCallsYet') || monitorFallback('暂无调用', 'No calls yet');
|
||||
const noCompletedYet = mcpMonitorT('noCompletedYet') || monitorFallback('暂无有效完成', 'No completed outcomes yet');
|
||||
const lastCallText = totals.lastCallTime
|
||||
? (totals.lastCallTime.toLocaleString ? totals.lastCallTime.toLocaleString(locale) : String(totals.lastCallTime))
|
||||
: noCallsYet;
|
||||
|
||||
const rateTone = hasCalls ? getMcpStatsRateTone(successRateNum) : 'is-muted';
|
||||
let rateSubText = noCallsYet;
|
||||
let rateSubText = totals.total > 0 ? noCompletedYet : noCallsYet;
|
||||
if (hasCalls) {
|
||||
rateSubText = mcpMonitorT('rateHealthy') || monitorFallback('运行平稳', 'Running smoothly');
|
||||
if (successRateNum < 80) rateSubText = mcpMonitorT('rateCritical') || monitorFallback('失败率偏高', 'High failure rate');
|
||||
|
||||
Reference in New Issue
Block a user