mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-07-10 06:18:37 +02:00
Add files via upload
This commit is contained in:
+30
-26
@@ -83,6 +83,21 @@ function batchQueueAllowsSubtaskMutation(queue) {
|
||||
return queue.status === 'pending' || queue.status === 'paused' || queue.status === 'completed' || queue.status === 'cancelled';
|
||||
}
|
||||
|
||||
/** 是否允许对指定子任务发起单条执行(与后端 queueAllowsSingleTaskRunLocked 对齐) */
|
||||
function batchQueueCanRunSingleTask(queue, task) {
|
||||
if (!queue || !task) return false;
|
||||
if (task.status === 'running') return false;
|
||||
if (queue.status === 'running') return false;
|
||||
return queue.status === 'pending' || queue.status === 'paused' || queue.status === 'completed' || queue.status === 'cancelled';
|
||||
}
|
||||
|
||||
function batchQueueRunSingleTaskDisabledReason(queue, task) {
|
||||
if (!queue || !task) return _t('tasks.runSingleTaskUnavailable');
|
||||
if (task.status === 'running') return _t('tasks.runSingleTaskUnavailableSelf');
|
||||
if (queue.status === 'running') return _t('tasks.runSingleTaskUnavailableQueue');
|
||||
return _t('tasks.runSingleTaskUnavailable');
|
||||
}
|
||||
|
||||
// HTML转义函数(如果未定义)
|
||||
if (typeof escapeHtml === 'undefined') {
|
||||
function escapeHtml(text) {
|
||||
@@ -1497,6 +1512,8 @@ async function showBatchQueueDetail(queueId) {
|
||||
${queue.tasks.map((task, index) => {
|
||||
const taskStatus = taskStatusMap[task.status] || { text: task.status, class: 'batch-task-status-unknown' };
|
||||
const canEdit = allowSubtaskMutation && task.status !== 'running';
|
||||
const canRunSingle = batchQueueCanRunSingleTask(queue, task);
|
||||
const runSingleUnavailableTitle = escapeHtml(batchQueueRunSingleTaskDisabledReason(queue, task));
|
||||
const taskMessageEscaped = escapeHtml(task.message).replace(/'/g, "'").replace(/"/g, """).replace(/\n/g, "\\n");
|
||||
return `
|
||||
<div class="batch-task-item ${task.status === 'running' ? 'batch-task-item-active' : ''}" data-queue-id="${queue.id}" data-task-id="${task.id}" data-task-message="${taskMessageEscaped}">
|
||||
@@ -1504,10 +1521,10 @@ async function showBatchQueueDetail(queueId) {
|
||||
<span class="batch-task-index">#${index + 1}</span>
|
||||
<span class="batch-task-status ${taskStatus.class}">${taskStatus.text}</span>
|
||||
<span class="batch-task-message" title="${escapeHtml(task.message)}">${escapeHtml(task.message)}</span>
|
||||
<button class="btn-secondary btn-small batch-task-run-btn" ${canRunSingle ? `onclick="runSingleBatchTask('${queue.id}', '${task.id}'); event.stopPropagation();"` : `disabled title="${runSingleUnavailableTitle}"`}>` + _t('tasks.runSingleTask') + `</button>
|
||||
${task.conversationId ? `<button class="btn-secondary btn-small" onclick="viewBatchTaskConversation('${task.conversationId}'); event.stopPropagation();">` + _t('tasks.viewConversation') + `</button>` : ''}
|
||||
${canEdit ? `<button class="btn-secondary btn-small batch-task-edit-btn" onclick="editBatchTaskFromElement(this); event.stopPropagation();">` + _t('common.edit') + `</button>` : ''}
|
||||
${canEdit ? `<button class="btn-secondary btn-small btn-danger batch-task-delete-btn" onclick="deleteBatchTaskFromElement(this); event.stopPropagation();">` + _t('common.delete') + `</button>` : ''}
|
||||
${allowSubtaskMutation && task.status === 'failed' ? `<button class="btn-secondary btn-small" onclick="retryBatchTask('${queue.id}', '${task.id}'); event.stopPropagation();">` + _t('tasks.retryTask') + `</button>` : ''}
|
||||
${task.conversationId ? `<button class="btn-secondary btn-small" onclick="viewBatchTaskConversation('${task.conversationId}'); event.stopPropagation();">` + _t('tasks.viewConversation') + `</button>` : ''}
|
||||
</div>
|
||||
${task.startedAt ? `<div class="batch-task-time">` + _t('batchQueueDetailModal.startLabel') + `: ${new Date(task.startedAt).toLocaleString()}</div>` : ''}
|
||||
${task.completedAt ? `<div class="batch-task-time">` + _t('batchQueueDetailModal.completeLabel') + `: ${new Date(task.completedAt).toLocaleString()}</div>` : ''}
|
||||
@@ -2270,38 +2287,25 @@ async function saveInlineAgentMode() {
|
||||
}
|
||||
}
|
||||
|
||||
// --- 重试失败任务 ---
|
||||
async function retryBatchTask(queueId, taskId) {
|
||||
// --- 单条执行 ---
|
||||
async function runSingleBatchTask(queueId, taskId) {
|
||||
if (!queueId || !taskId) return;
|
||||
if (!confirm(_t('tasks.confirmRunSingleTask'))) return;
|
||||
try {
|
||||
// 获取任务消息
|
||||
const detailResp = await apiFetch(`/api/batch-tasks/${queueId}`);
|
||||
if (!detailResp.ok) throw new Error(_t('tasks.getQueueDetailFailed'));
|
||||
const detail = await detailResp.json();
|
||||
const task = detail.queue.tasks.find(t => t.id === taskId);
|
||||
if (!task) throw new Error(_t('tasks.taskNotFound') || 'Task not found');
|
||||
const message = task.message;
|
||||
|
||||
// 先添加新任务(pending),再删除旧任务 — 避免先删后加失败导致任务丢失
|
||||
const addResp = await apiFetch(`/api/batch-tasks/${queueId}/tasks`, {
|
||||
const response = await apiFetch(`/api/batch-tasks/${queueId}/tasks/${taskId}/run`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ message }),
|
||||
});
|
||||
if (!addResp.ok) {
|
||||
const r = await addResp.json().catch(() => ({}));
|
||||
throw new Error(r.error || _t('tasks.addTaskFailed'));
|
||||
const result = await response.json().catch(() => ({}));
|
||||
if (!response.ok) {
|
||||
throw new Error(result.error || _t('tasks.runSingleTaskFailed'));
|
||||
}
|
||||
// 新任务添加成功后才删除旧任务
|
||||
const delResp = await apiFetch(`/api/batch-tasks/${queueId}/tasks/${taskId}`, { method: 'DELETE' });
|
||||
if (!delResp.ok) {
|
||||
// 删除失败不阻塞(新任务已添加,旧任务保留也不影响)
|
||||
console.warn('删除旧任务失败,但新任务已添加');
|
||||
if (result.autoStarted === false && result.message) {
|
||||
alert(result.message);
|
||||
}
|
||||
showBatchQueueDetail(queueId);
|
||||
refreshBatchQueues();
|
||||
} catch (e) {
|
||||
console.error('重试任务失败:', e);
|
||||
console.error('单条执行失败:', e);
|
||||
alert(e.message);
|
||||
}
|
||||
}
|
||||
@@ -2437,7 +2441,7 @@ window.startInlineEditRole = startInlineEditRole;
|
||||
window.saveInlineRole = saveInlineRole;
|
||||
window.startInlineEditAgentMode = startInlineEditAgentMode;
|
||||
window.saveInlineAgentMode = saveInlineAgentMode;
|
||||
window.retryBatchTask = retryBatchTask;
|
||||
window.runSingleBatchTask = runSingleBatchTask;
|
||||
window.startInlineEditSchedule = startInlineEditSchedule;
|
||||
window.toggleInlineScheduleCron = toggleInlineScheduleCron;
|
||||
window.saveInlineSchedule = saveInlineSchedule;
|
||||
|
||||
Reference in New Issue
Block a user