agent-Specialization/static/src/app/methods/taskPolling/goal.ts
JOJO f661dc6456 refactor(server,modules,utils,frontend): split oversized modules into packages and fix regressions
- Split server/chat.py, server/status.py, server/tasks.py into sub-packages
- Split utils/context_manager.py, utils/conversation_manager.py into mixin packages
- Split modules/file_manager.py, persistent_terminal.py, terminal_ops.py, mcp_client_manager.py into packages
- Split core/main_terminal_parts/context.py into base + mixins
- Split static/src/app/methods/{ui,message,upload,taskPolling,conversation} into sub-modules
- Fix flattened method exports, dynamic import paths, missing cross-module imports
- Add missing permission/network/execution mode constants and _PERMISSION_MODE_LABEL
- Update AGENTS.md, CLAUDE.md and project memories to reflect new structure
2026-06-20 15:54:48 +08:00

108 lines
4.2 KiB
TypeScript

// @ts-nocheck
import { debugLog } from '../common';
import { useTaskStore } from '../../../stores/task';
import { getMessageVisibility, messageStartsWork } from '../../../utils/messageVisibility';
import {
debugNotifyLog,
keyNotifyLog,
jsonDebug,
userMDebug,
isRestoreDebugEnabled,
restoreDebugLog,
isSystemAutoUserMessagePayload,
isRuntimeModeNoticePayload,
resolveUserMessageSource,
resolveUserMessageMetadata,
isEmptyAssistantPlaceholderMessage,
getOptimisticUserEchoTarget,
findRecentMatchingUserMessage,
} from './shared';
export const goalMethods = {
handleGoalProgress(data: any) {
// 安全检查:确保目标事件属于当前对话,防止切换对话后旧任务事件污染
if (data?.conversation_id && this.currentConversationId && data.conversation_id !== this.currentConversationId) {
debugLog('[Goal] 忽略不匹配对话的目标进度事件', { eventCid: data.conversation_id, currentCid: this.currentConversationId });
return;
}
debugLog('[Goal] 目标进度更新', data);
const status = String(data?.status || 'running').toLowerCase();
this.goalRunning = status === 'running';
this.goalModeArmed = false;
this.goalProgress = {
...(data || {}),
goal: data?.goal || this.goalProgress?.goal || '',
status,
turn_count: Number(data?.turn_count ?? 0),
tokens_used: Number(data?.tokens_used ?? 0),
tool_calls: Number(data?.tool_calls ?? 0),
duration_seconds: Number(data?.duration_seconds ?? 0)
};
},
handleGoalReviewProgress(data: any) {
const progress = data?.progress || data || {};
if (!progress || typeof progress !== 'object') {
return;
}
if (!Array.isArray(this.autoApprovalFeedLines)) {
this.autoApprovalFeedLines = [];
}
this.autoApprovalTitle = '目标审批';
if (progress.stage === 'start') {
this.autoApprovalFeedLines = ['开始审核'];
this.autoApprovalFinalMessage = '';
} else if (progress.stage === 'model_call') {
this.autoApprovalFeedLines.push(String(progress.message || `审核轮次 ${progress.round || ''}`).trim());
} else if (progress.stage === 'run_command' && progress.command) {
this.autoApprovalFeedLines.push(String(progress.command));
} else if (progress.message) {
this.autoApprovalFeedLines.push(String(progress.message));
}
this.autoApprovalFeedLines = this.autoApprovalFeedLines.slice(-20);
this.$forceUpdate();
},
scheduleGoalApprovalPanelAutoClose() {
if (this.isMobileViewport || this.autoApprovalTitle !== '目标审批') {
return;
}
if (this.approvalAutoCloseTimer) {
clearTimeout(this.approvalAutoCloseTimer);
}
this.approvalAutoCloseTimer = setTimeout(() => {
this.rightCollapsed = true;
}, 3000);
},
handleGoalCompleted(data: any) {
// 安全检查:确保目标事件属于当前对话
if (data?.conversation_id && this.currentConversationId && data.conversation_id !== this.currentConversationId) {
debugLog('[Goal] 忽略不匹配对话的目标完成事件', { eventCid: data.conversation_id, currentCid: this.currentConversationId });
return;
}
debugLog('[Goal] 目标已达成', data);
this.goalRunning = false;
this.goalModeArmed = false;
this.goalProgress = { ...(data || {}), status: 'done' };
this.goalDialogOpen = true;
this.scheduleGoalApprovalPanelAutoClose?.();
},
handleGoalStopped(data: any) {
// 安全检查:确保目标事件属于当前对话
if (data?.conversation_id && this.currentConversationId && data.conversation_id !== this.currentConversationId) {
debugLog('[Goal] 忽略不匹配对话的目标停止事件', { eventCid: data.conversation_id, currentCid: this.currentConversationId });
return;
}
debugLog('[Goal] 目标已停止', data);
this.goalRunning = false;
this.goalModeArmed = false;
if (String(data?.stopped_reason || '').toLowerCase() === 'user_cancel') {
this.goalProgress = null;
this.goalDialogOpen = false;
return;
}
this.goalProgress = { ...(data || {}), status: 'stopped' };
// 停止也弹一次窗,告知用户原因与进度
this.goalDialogOpen = true;
this.scheduleGoalApprovalPanelAutoClose?.();
}
};