From f031fe85aee31bc7d08683e2ff75b687d0fdd064 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Fri, 15 May 2026 19:53:32 +0800 Subject: [PATCH] feat(history): add AI analysis action --- src/App.vue | 35 +++++++++++++++- src/components/editor/QueryHistory.vue | 32 ++++++++++---- src/i18n/locales/en.ts | 6 +++ src/i18n/locales/es.ts | 6 +++ src/i18n/locales/zh-CN.ts | 6 +++ src/lib/historyAiAnalysis.ts | 58 ++++++++++++++++++++++++++ tests/historyAiAnalysis.test.ts | 54 ++++++++++++++++++++++++ 7 files changed, 188 insertions(+), 9 deletions(-) create mode 100644 src/lib/historyAiAnalysis.ts create mode 100644 tests/historyAiAnalysis.test.ts diff --git a/src/App.vue b/src/App.vue index 26da7da5a..39d471650 100644 --- a/src/App.vue +++ b/src/App.vue @@ -46,6 +46,7 @@ import { import { isPreviewTab } from "@/lib/tabPresentation"; import { supportsSqlFileExecution } from "@/lib/databaseCapabilities"; import { classifyAiSqlExecution } from "@/lib/aiSqlExecutionPolicy"; +import { buildHistoryAiAnalysisPrompt } from "@/lib/historyAiAnalysis"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -191,6 +192,34 @@ function fixWithAi(errorMessage: string) { nextTick(() => aiAssistantRef.value?.triggerAction("fix", errorMessage)); } +function openAiPanel() { + if (!showAiPanel.value) { + showAiPanel.value = true; + localStorage.setItem("dbx-ai-panel-open", "true"); + } +} + +function analyzeHistoryWithAi(entry: HistoryEntry) { + const connectionId = entry.connection_id || activeTab.value?.connectionId; + if (!connectionId) { + toast(t("history.aiAnalyzeNoConnection"), 5000); + return; + } + + const config = connectionStore.getConfig(connectionId); + if (!config) { + toast(t("history.aiAnalyzeNoConnection"), 5000); + return; + } + + openAiPanel(); + const database = entry.database || activeTab.value?.database || resolveDefaultDatabase(config, []); + const title = t("history.aiAnalysisTab"); + const tabId = queryStore.createTab(connectionId, database || "", title, "query"); + queryStore.updateSql(tabId, entry.sql); + nextTick(() => aiAssistantRef.value?.triggerAction("explain", buildHistoryAiAnalysisPrompt(entry))); +} + function formatActiveSql() { const tab = activeTab.value; if (!tab || tab.mode !== "query" || !tab.sql.trim()) return; @@ -780,7 +809,11 @@ onUnmounted(() => { :style="{ width: historyWidth + 'px' }" >
-