mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-08-17 16:37:18 +02:00
Add files via upload
This commit is contained in:
+16
-3
@@ -711,9 +711,18 @@ function addAttackChainButton(conversationId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (conversationId) {
|
if (conversationId) {
|
||||||
attackChainBtn.disabled = false;
|
const isRunning = typeof isConversationTaskRunning === 'function'
|
||||||
attackChainBtn.title = '查看当前对话的攻击链';
|
? isConversationTaskRunning(conversationId)
|
||||||
attackChainBtn.onclick = () => showAttackChain(conversationId);
|
: false;
|
||||||
|
if (isRunning) {
|
||||||
|
attackChainBtn.disabled = true;
|
||||||
|
attackChainBtn.title = '当前对话正在执行,请稍后再生成攻击链';
|
||||||
|
attackChainBtn.onclick = null;
|
||||||
|
} else {
|
||||||
|
attackChainBtn.disabled = false;
|
||||||
|
attackChainBtn.title = '查看当前对话的攻击链';
|
||||||
|
attackChainBtn.onclick = () => showAttackChain(conversationId);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
attackChainBtn.disabled = true;
|
attackChainBtn.disabled = true;
|
||||||
attackChainBtn.title = '请选择一个对话以查看攻击链';
|
attackChainBtn.title = '请选择一个对话以查看攻击链';
|
||||||
@@ -721,6 +730,10 @@ function addAttackChainButton(conversationId) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateAttackChainAvailability() {
|
||||||
|
addAttackChainButton(currentConversationId);
|
||||||
|
}
|
||||||
|
|
||||||
// 显示攻击链模态框
|
// 显示攻击链模态框
|
||||||
async function showAttackChain(conversationId) {
|
async function showAttackChain(conversationId) {
|
||||||
// 防止重复点击
|
// 防止重复点击
|
||||||
|
|||||||
@@ -1,6 +1,30 @@
|
|||||||
const progressTaskState = new Map();
|
const progressTaskState = new Map();
|
||||||
let activeTaskInterval = null;
|
let activeTaskInterval = null;
|
||||||
const ACTIVE_TASK_REFRESH_INTERVAL = 10000; // 10秒检查一次
|
const ACTIVE_TASK_REFRESH_INTERVAL = 10000; // 10秒检查一次
|
||||||
|
const TASK_FINAL_STATUSES = new Set(['failed', 'timeout', 'cancelled', 'completed']);
|
||||||
|
|
||||||
|
const conversationExecutionTracker = {
|
||||||
|
activeConversations: new Set(),
|
||||||
|
update(tasks = []) {
|
||||||
|
this.activeConversations.clear();
|
||||||
|
tasks.forEach(task => {
|
||||||
|
if (
|
||||||
|
task &&
|
||||||
|
task.conversationId &&
|
||||||
|
!TASK_FINAL_STATUSES.has(task.status)
|
||||||
|
) {
|
||||||
|
this.activeConversations.add(task.conversationId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
isRunning(conversationId) {
|
||||||
|
return !!conversationId && this.activeConversations.has(conversationId);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function isConversationTaskRunning(conversationId) {
|
||||||
|
return conversationExecutionTracker.isRunning(conversationId);
|
||||||
|
}
|
||||||
|
|
||||||
function registerProgressTask(progressId, conversationId = null) {
|
function registerProgressTask(progressId, conversationId = null) {
|
||||||
const state = progressTaskState.get(progressId) || {};
|
const state = progressTaskState.get(progressId) || {};
|
||||||
@@ -793,7 +817,13 @@ function renderActiveTasks(tasks) {
|
|||||||
const bar = document.getElementById('active-tasks-bar');
|
const bar = document.getElementById('active-tasks-bar');
|
||||||
if (!bar) return;
|
if (!bar) return;
|
||||||
|
|
||||||
if (!tasks || tasks.length === 0) {
|
const normalizedTasks = Array.isArray(tasks) ? tasks : [];
|
||||||
|
conversationExecutionTracker.update(normalizedTasks);
|
||||||
|
if (typeof updateAttackChainAvailability === 'function') {
|
||||||
|
updateAttackChainAvailability();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (normalizedTasks.length === 0) {
|
||||||
bar.style.display = 'none';
|
bar.style.display = 'none';
|
||||||
bar.innerHTML = '';
|
bar.innerHTML = '';
|
||||||
return;
|
return;
|
||||||
@@ -802,7 +832,7 @@ function renderActiveTasks(tasks) {
|
|||||||
bar.style.display = 'flex';
|
bar.style.display = 'flex';
|
||||||
bar.innerHTML = '';
|
bar.innerHTML = '';
|
||||||
|
|
||||||
tasks.forEach(task => {
|
normalizedTasks.forEach(task => {
|
||||||
const item = document.createElement('div');
|
const item = document.createElement('div');
|
||||||
item.className = 'active-task-item';
|
item.className = 'active-task-item';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user