|
|
@@ -68,6 +68,7 @@
|
|
|
@ask-user-cancel="handleAskUserCancel"
|
|
|
@agent-detail-click="handleAgentDetailClick"
|
|
|
@open-markdown-tab="openMarkdownPreviewTab"
|
|
|
+ @delete-message="handleDeleteMessage"
|
|
|
/>
|
|
|
|
|
|
<!-- 任务进度条 -->
|
|
|
@@ -156,6 +157,7 @@
|
|
|
getHistoryList,
|
|
|
getDetail,
|
|
|
deleteSession,
|
|
|
+ deleteMessage,
|
|
|
pinSession,
|
|
|
editSessionTitle,
|
|
|
getContext,
|
|
|
@@ -913,6 +915,7 @@
|
|
|
|
|
|
const transformHistoryToMessages = (
|
|
|
data: Array<{
|
|
|
+ id?: number;
|
|
|
role?: string;
|
|
|
type?: string;
|
|
|
content: string;
|
|
|
@@ -931,9 +934,9 @@
|
|
|
|
|
|
// 新格式:role 字段 (user/assistant)
|
|
|
if (item.role === 'user') {
|
|
|
- messages.push({ type: 'user', content: normalizedContent, time, createdAt });
|
|
|
+ messages.push({ id: item.id, type: 'user', content: normalizedContent, time, createdAt });
|
|
|
} else if (item.role === 'assistant') {
|
|
|
- const msg: Message = { type: 'ai', content: normalizedContent, time, createdAt };
|
|
|
+ const msg: Message = { id: item.id, type: 'ai', content: normalizedContent, time, createdAt };
|
|
|
if (item.report_url && item.report_filename) {
|
|
|
msg.downloadFiles = [{ url: item.report_url, filename: item.report_filename }];
|
|
|
}
|
|
|
@@ -950,7 +953,7 @@
|
|
|
}
|
|
|
// 兼容旧格式:type 字段
|
|
|
else if (item.type === 'user_message') {
|
|
|
- messages.push({ type: 'user', content: normalizedContent, time, createdAt });
|
|
|
+ messages.push({ id: item.id, type: 'user', content: normalizedContent, time, createdAt });
|
|
|
} else if (item.type === 'model_thinking') {
|
|
|
const lastAiMsg = messages[messages.length - 1];
|
|
|
if (lastAiMsg && lastAiMsg.type === 'ai') {
|
|
|
@@ -1072,6 +1075,31 @@
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ // 删除单条消息:先删数据库行,后端再清空该会话内存线程,下轮从数据库重建上下文
|
|
|
+ const handleDeleteMessage = (msg: Message) => {
|
|
|
+ if (!msg.id) return;
|
|
|
+ Modal.confirm({
|
|
|
+ title: '提示',
|
|
|
+ content: '删除后该消息将不再进入模型上下文,是否继续?',
|
|
|
+ okText: '确认',
|
|
|
+ cancelText: '取消',
|
|
|
+ wrapClassName: 'delete-task-confirm-modal',
|
|
|
+ onOk: async () => {
|
|
|
+ try {
|
|
|
+ await deleteMessage(msg.id!);
|
|
|
+ message.success('消息已删除');
|
|
|
+ messages.value = messages.value.filter((m) => m !== msg);
|
|
|
+ const task = currentTask.value;
|
|
|
+ if (task) {
|
|
|
+ task.messages = task.messages.filter((m) => m !== msg);
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ message.error('删除失败');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
// 在右侧面板新建标签页展示 Markdown 代码块渲染效果(相同内容复用同一标签)
|
|
|
const openMarkdownPreviewTab = (payload: { title: string; content: string }) => {
|
|
|
let hash = 0;
|