Add files via upload

This commit is contained in:
公明
2025-11-19 19:46:41 +08:00
committed by GitHub
parent 1624632ea1
commit 16a4d7480d
2 changed files with 48 additions and 5 deletions
+16 -3
View File
@@ -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) {
// 防止重复点击 // 防止重复点击
+32 -2
View File
@@ -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';