diff --git a/packages/node-runtime/src/ai/conversations.ts b/packages/node-runtime/src/ai/conversations.ts index 17b3df9b..98dd8b48 100644 --- a/packages/node-runtime/src/ai/conversations.ts +++ b/packages/node-runtime/src/ai/conversations.ts @@ -738,10 +738,15 @@ export class AIConversationManager { if (childRow) { db.prepare('UPDATE ai_message SET parent_id = ? WHERE id = ?').run(id, childRow.id) + db.prepare('UPDATE ai_conversation SET updated_at = ? WHERE id = ?').run(now, conversationId) + } else { + db.prepare('UPDATE ai_conversation SET active_message_id = ?, updated_at = ? WHERE id = ?').run( + id, + now, + conversationId + ) } - db.prepare('UPDATE ai_conversation SET updated_at = ? WHERE id = ?').run(now, conversationId) - return { id, conversationId, diff --git a/src/stores/aiChat.ts b/src/stores/aiChat.ts index 424d488f..f058f842 100644 --- a/src/stores/aiChat.ts +++ b/src/stores/aiChat.ts @@ -1205,6 +1205,17 @@ export const useAIChatStore = defineStore('aiChatRuntime', () => { content: string ): Promise { try { + const hasConfig = await window.llmApi.hasConfig() + if (!hasConfig) { + return { success: false, reason: 'no_config' } + } + if (state.isAborted) { + return { success: false, reason: 'aborted' } + } + if (state.isAIThinking || activeTask.value) { + return { success: false, reason: 'busy', activeTask: activeTask.value } + } + await useAIService().deleteMessagesFrom(state.currentConversationId!, originalMessage.id) targetBuffer.messages.splice(editIndex, targetBuffer.messages.length - editIndex) return sendMessage(chatKey, content) @@ -1300,11 +1311,6 @@ export const useAIChatStore = defineStore('aiChatRuntime', () => { return { success: false, reason: 'busy', activeTask: activeTask.value } } - await useAIService().updateMessageContent(originalMessage.id, content) - if (hasOldAiResponse) { - await useAIService().deleteAndRelinkMessage(state.currentConversationId!, oldAiResponse.id) - } - const context = { sessionId: state.sessionId, conversationId: state.currentConversationId!, @@ -1407,6 +1413,16 @@ export const useAIChatStore = defineStore('aiChatRuntime', () => { updateAIMessage({ contentBlocks: [...blocks], isStreaming: false }) } + if (!result.success) { + restoreOriginal() + return { success: false, reason: 'error' } + } + + await useAIService().updateMessageContent(originalMessage.id, content) + if (hasOldAiResponse) { + await useAIService().deleteAndRelinkMessage(state.currentConversationId!, oldAiResponse.id) + } + const serializableContentBlocks = targetBuffer.messages[aiMessageIndex].contentBlocks ? JSON.parse(JSON.stringify(targetBuffer.messages[aiMessageIndex].contentBlocks)) : undefined @@ -1428,6 +1444,14 @@ export const useAIChatStore = defineStore('aiChatRuntime', () => { content, } + const nextMsgIndex = aiMessageIndex + 1 + if (nextMsgIndex < targetBuffer.messages.length) { + targetBuffer.messages[nextMsgIndex] = { + ...targetBuffer.messages[nextMsgIndex], + parentId: savedAiMsg.id, + } + } + targetBuffer.sessionTokenUsage = await useAIService().getConversationTokenUsage(state.currentConversationId!) state.sessionTokenUsage = { ...targetBuffer.sessionTokenUsage } return { success: true }