fix(ai): support Windows Claude Code MCP config

This commit is contained in:
zipg authored and GitHub committed 2026-07-23 12:51:11 +08:00
1 parent 6a81b3261b
commit 590e9042e8
14 files changed
+275 -22

No files matched your search

@@ -1546,7 +1546,7 @@ async function send() {
);
} catch (e: unknown) {
const message = e instanceof Error ? e.message : String(e);
messages.value[assistantIdx].content = `Error: ${message}`;
messages.value[assistantIdx].content = `${t("ai.requestFailed")}\n\n${translateBackendError(t, message)}`;
} finally {
if (assistantDeltaFrame !== null) cancelAnimationFrame(assistantDeltaFrame);
flushAssistantDeltas();
@@ -1948,7 +1948,7 @@ async function openExternalUrl(url: string) {
</div>
<div v-else-if="msg.content || msg.reasoning || msg.isThinking" class="flex">
<div class="max-w-[95%] min-w-0 rounded-lg bg-muted px-3 py-2 text-xs leading-relaxed">
<div class="max-w-[95%] min-w-0 rounded-lg bg-muted px-3 py-2 text-xs leading-relaxed [overflow-wrap:anywhere]">
<div v-if="msg.reasoning || msg.isThinking" class="mb-2">
<button class="flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground transition-colors" @click="toggleReasoning()">
<ChevronRight class="h-3 w-3 transition-transform duration-200" :class="{ 'rotate-90': reasoningExpanded }" />
@@ -3,6 +3,7 @@ import { ref, watch, shallowRef, computed, onMounted, onUnmounted, nextTick } fr
import type { Ref } from "vue";
import type { EditorView as EditorViewType } from "@codemirror/view";
import { useI18n } from "vue-i18n";
import { translateBackendError } from "@/i18n/backend-errors";
import { AlertTriangle, ArrowLeft, Check, CheckCircle2, CircleHelp, Cloud, Copy, Download, ExternalLink, GripVertical, Loader2, Moon, PackageSearch, Pencil, Plus, RefreshCw, RotateCcw, Search, Settings, Sun, SunMoon, Terminal, Trash2, Upload, X } from "@lucide/vue";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
@@ -2675,7 +2676,7 @@ async function aiTestConn() {
aiTestLatency.value = result.latencyMs ?? null;
} catch (e: any) {
aiTestResult.value = "error";
aiTestError.value = e?.message || String(e);
aiTestError.value = translateBackendError(t, e?.message || String(e));
} finally {
aiTesting.value = false;
}
+23
View File
@@ -1,5 +1,18 @@
import type { ComposerTranslation } from "vue-i18n";
const taggedAiCliErrorKeys: Record<string, string> = {
claudeCodeNotInstalled: "ai.cliErrors.claudeCodeNotInstalled",
claudeCodeCliPathInvalid: "ai.cliErrors.claudeCodeCliPathInvalid",
claudeCodeEnvInvalid: "ai.cliErrors.claudeCodeEnvInvalid",
claudeCodeEnvReserved: "ai.cliErrors.claudeCodeEnvReserved",
claudeCodeNotAuthenticated: "ai.cliErrors.claudeCodeNotAuthenticated",
claudeCodeMcpConfigInvalid: "ai.cliErrors.claudeCodeMcpConfigInvalid",
dbxMcpMissing: "ai.cliErrors.dbxMcpMissing",
claudeCodeMcpStartupFailed: "ai.cliErrors.claudeCodeMcpStartupFailed",
claudeCodeCommandLineTooLong: "ai.cliErrors.claudeCodeCommandLineTooLong",
claudeCodeRunFailed: "ai.cliErrors.claudeCodeRunFailed",
};
const patterns: [RegExp, string][] = [
[/^(.+?) driver is not installed\. Please install it from the Driver Manager\.$/, "connection.driverNotInstalled"],
[/^JRE (.+?) runtime is not installed\. Please install it from the Driver Manager\.$/, "connection.jreNotInstalled"],
@@ -49,6 +62,16 @@ const paramNames: Record<string, string> = {
};
export function translateBackendError(t: ComposerTranslation, message: string): string {
const tagged = message.match(/^\[([A-Za-z][A-Za-z0-9]+)\]\s*([\s\S]*)$/);
if (tagged) {
const [, code, rawDetail] = tagged;
const key = taggedAiCliErrorKeys[code];
if (key) {
const detail = rawDetail.trim();
return [t(key), t("ai.cliErrors.code", { code }), t("ai.cliErrors.reportHint"), detail ? `${t("ai.cliErrors.details")}\n${detail}` : ""].filter(Boolean).join("\n\n");
}
}
for (const [regex, key] of patterns) {
const match = message.match(regex);
if (match) {
+16
View File
@@ -1517,6 +1517,7 @@ export default {
apply: "Apply to Editor",
clear: "Clear Chat",
welcome: "Tell me what you'd like to query, and I'll write the SQL",
requestFailed: "AI request failed",
newChat: "New Chat",
thinking: "Thinking...",
reasoningProcess: "Thinking process",
@@ -1618,6 +1619,21 @@ export default {
reasoningLevelHint: "Controls Codex CLI model_reasoning_effort. Default uses your Codex config.",
claudeCodeEffortHint: "Available levels are reported by the selected model through your local Claude Code CLI.",
claudeCodeEffortUnavailable: "The selected model does not report configurable effort levels. Claude Code will use its default.",
cliErrors: {
code: "Error code: {code}",
details: "Diagnostic details:",
reportHint: "When reporting this problem, include the error code and diagnostic details below.",
claudeCodeNotInstalled: "Claude Code CLI was not found. Install Claude Code or set its executable path in Settings > AI.",
claudeCodeCliPathInvalid: "The Claude Code CLI path is invalid. Select only the Claude executable and configure environment variables separately.",
claudeCodeEnvInvalid: "A Claude Code CLI environment variable name is invalid. Use names such as HTTPS_PROXY.",
claudeCodeEnvReserved: "A DBX-managed MCP environment variable was overridden. Remove DBX_MCP_* variables from the provider configuration.",
claudeCodeNotAuthenticated: "Claude Code CLI is not authenticated. Run `claude auth login` in a terminal and try again.",
claudeCodeMcpConfigInvalid: "Claude Code could not read or parse the DBX MCP configuration. Check the Claude Code CLI version and executable path.",
dbxMcpMissing: "A compatible DBX MCP Server installation was not found. Check Settings > MCP, then reinstall or update it.",
claudeCodeMcpStartupFailed: "Claude Code loaded the MCP configuration but could not start DBX MCP Server. Check Settings > MCP and the diagnostics below.",
claudeCodeCommandLineTooLong: "Windows rejected the Claude Code command because it was too long. Update DBX and retry using the generated MCP configuration file.",
claudeCodeRunFailed: "Claude Code CLI exited unexpectedly. Use the error code and diagnostics below to identify the failing executable or CLI output.",
},
actions: {
general: "General",
generate: "Generate SQL",
+16
View File
@@ -1475,6 +1475,21 @@ export default withEnglishFallback({
reasoningLevelHint: "Controla model_reasoning_effort de Codex CLI. Predeterminado usa tu configuración de Codex.",
claudeCodeEffortHint: "Los niveles disponibles los proporciona dinámicamente tu Claude Code CLI local para el modelo seleccionado.",
claudeCodeEffortUnavailable: "El modelo seleccionado no informa niveles de esfuerzo configurables. Claude Code usará su valor predeterminado.",
cliErrors: {
code: "Código de error: {code}",
details: "Detalles de diagnóstico:",
reportHint: "Al informar este problema, incluye el código de error y los detalles de diagnóstico siguientes.",
claudeCodeNotInstalled: "No se encontró Claude Code CLI. Instala Claude Code o configura la ruta del ejecutable en Configuración > AI.",
claudeCodeCliPathInvalid: "La ruta de Claude Code CLI no es válida. Selecciona solo el ejecutable de Claude y configura las variables de entorno por separado.",
claudeCodeEnvInvalid: "El nombre de una variable de entorno de Claude Code CLI no es válido. Usa nombres como HTTPS_PROXY.",
claudeCodeEnvReserved: "Se sobrescribió una variable MCP administrada por DBX. Elimina las variables DBX_MCP_* de la configuración del proveedor.",
claudeCodeNotAuthenticated: "Claude Code CLI no está autenticado. Ejecuta `claude auth login` en una terminal y vuelve a intentarlo.",
claudeCodeMcpConfigInvalid: "Claude Code no pudo leer o analizar la configuración MCP de DBX. Comprueba la versión y la ruta del ejecutable de Claude Code CLI.",
dbxMcpMissing: "No se encontró una instalación compatible de DBX MCP Server. Comprueba Configuración > MCP y vuelve a instalarla o actualizarla.",
claudeCodeMcpStartupFailed: "Claude Code cargó la configuración MCP, pero no pudo iniciar DBX MCP Server. Comprueba Configuración > MCP y los detalles siguientes.",
claudeCodeCommandLineTooLong: "Windows rechazó el comando de Claude Code porque era demasiado largo. Actualiza DBX y vuelve a intentarlo con el archivo MCP generado.",
claudeCodeRunFailed: "Claude Code CLI terminó de forma inesperada. Usa el código de error y los detalles siguientes para identificar el ejecutable o la salida que falló.",
},
run: "Ejecutar",
readingSchema: "Leyendo esquema",
noConnection: "No hay una conexión disponible para esta pestaña",
@@ -1492,6 +1507,7 @@ export default withEnglishFallback({
apply: "Aplicar al editor",
clear: "Limpiar chat",
welcome: "Dime qué quieres consultar y escribiré el SQL",
requestFailed: "La solicitud de AI falló",
newChat: "Nuevo chat",
thinking: "Procesando...",
reasoningProcess: "Proceso de razonamiento",
+16
View File
@@ -1457,6 +1457,7 @@ export default withEnglishFallback({
apply: "Applica all'Editor",
clear: "Cancella Chat",
welcome: "Dimmi cosa vorresti interrogare e io scriverò il codice SQL",
requestFailed: "Richiesta AI non riuscita",
newChat: "Nuova Chat",
thinking: "Riflessione...",
reasoningProcess: "Processo di riflessione",
@@ -1592,6 +1593,21 @@ export default withEnglishFallback({
reasoningLevelHint: "Controlla model_reasoning_effort di Codex CLI. Predefinito usa la configurazione Codex.",
claudeCodeEffortHint: "I livelli disponibili vengono forniti dinamicamente dal Claude Code CLI locale per il modello selezionato.",
claudeCodeEffortUnavailable: "Il modello selezionato non segnala livelli di effort configurabili. Claude Code userà il valore predefinito.",
cliErrors: {
code: "Codice errore: {code}",
details: "Dettagli diagnostici:",
reportHint: "Quando segnali il problema, includi il codice errore e i dettagli diagnostici seguenti.",
claudeCodeNotInstalled: "Claude Code CLI non è stato trovato. Installa Claude Code o imposta il percorso dell'eseguibile in Impostazioni > AI.",
claudeCodeCliPathInvalid: "Il percorso di Claude Code CLI non è valido. Seleziona solo l'eseguibile Claude e configura separatamente le variabili d'ambiente.",
claudeCodeEnvInvalid: "Il nome di una variabile d'ambiente di Claude Code CLI non è valido. Usa nomi come HTTPS_PROXY.",
claudeCodeEnvReserved: "È stata sovrascritta una variabile MCP gestita da DBX. Rimuovi le variabili DBX_MCP_* dalla configurazione del provider.",
claudeCodeNotAuthenticated: "Claude Code CLI non è autenticato. Esegui `claude auth login` in un terminale e riprova.",
claudeCodeMcpConfigInvalid: "Claude Code non ha potuto leggere o analizzare la configurazione MCP di DBX. Controlla la versione e il percorso di Claude Code CLI.",
dbxMcpMissing: "Non è stata trovata un'installazione compatibile di DBX MCP Server. Controlla Impostazioni > MCP, quindi reinstalla o aggiorna.",
claudeCodeMcpStartupFailed: "Claude Code ha caricato la configurazione MCP ma non ha potuto avviare DBX MCP Server. Controlla Impostazioni > MCP e i dettagli seguenti.",
claudeCodeCommandLineTooLong: "Windows ha rifiutato il comando Claude Code perché troppo lungo. Aggiorna DBX e riprova usando il file MCP generato.",
claudeCodeRunFailed: "Claude Code CLI è terminato in modo imprevisto. Usa il codice errore e i dettagli seguenti per identificare l'eseguibile o l'output non riuscito.",
},
actions: {
general: "Generale",
generate: "Genera SQL",
+16
View File
@@ -1479,6 +1479,21 @@ export default withEnglishFallback({
reasoningLevelHint: "Codex CLIのmodel_reasoning_effortを制御します。デフォルトではCodex設定を使用します。",
claudeCodeEffortHint: "利用可能なレベルは、選択したモデルについてローカルのClaude Code CLIから動的に取得されます。",
claudeCodeEffortUnavailable: "選択したモデルは設定可能なeffortレベルを返していません。Claude Codeのデフォルトを使用します。",
cliErrors: {
code: "エラーコード: {code}",
details: "診断詳細:",
reportHint: "この問題を報告する際は、エラーコードと以下の診断詳細を添付してください。",
claudeCodeNotInstalled: "Claude Code CLIが見つかりません。Claude Codeをインストールするか、設定 > AIで実行ファイルのパスを指定してください。",
claudeCodeCliPathInvalid: "Claude Code CLIのパスが無効です。Claudeの実行ファイルのみを選択し、環境変数は別に設定してください。",
claudeCodeEnvInvalid: "Claude Code CLIの環境変数名が無効です。HTTPS_PROXYなどの有効な名前を使用してください。",
claudeCodeEnvReserved: "DBXが管理するMCP環境変数が上書きされています。プロバイダー設定からDBX_MCP_*変数を削除してください。",
claudeCodeNotAuthenticated: "Claude Code CLIにログインしていません。ターミナルで`claude auth login`を実行してから再試行してください。",
claudeCodeMcpConfigInvalid: "Claude CodeがDBXのMCP設定を読み取りまたは解析できません。Claude Code CLIのバージョンと実行ファイルのパスを確認してください。",
dbxMcpMissing: "互換性のあるDBX MCP Serverが見つかりません。設定 > MCPで確認し、再インストールまたは更新してください。",
claudeCodeMcpStartupFailed: "Claude CodeはMCP設定を読み込みましたが、DBX MCP Serverを起動できません。設定 > MCPと以下の診断詳細を確認してください。",
claudeCodeCommandLineTooLong: "Windowsが長すぎるClaude Codeコマンドを拒否しました。DBXを更新し、生成されたMCP設定ファイルで再試行してください。",
claudeCodeRunFailed: "Claude Code CLIが予期せず終了しました。エラーコードと以下の診断詳細から、失敗した実行ファイルまたはCLI出力を確認してください。",
},
run: "実行",
readingSchema: "スキーマを読み取り中",
noConnection: "このタブに利用可能な接続がありません",
@@ -1496,6 +1511,7 @@ export default withEnglishFallback({
apply: "エディタに適用",
clear: "チャットをクリア",
welcome: "クエリしたい内容を教えてください。SQLを作成します",
requestFailed: "AIリクエストに失敗しました",
newChat: "新しいチャット",
thinking: "思考中...",
reasoningProcess: "思考プロセス",
+16
View File
@@ -1477,6 +1477,21 @@ export default withEnglishFallback({
reasoningLevelHint: "Controla model_reasoning_effort do Codex CLI. Padrão usa sua configuração do Codex.",
claudeCodeEffortHint: "Os níveis disponíveis são informados dinamicamente pelo Claude Code CLI local para o modelo selecionado.",
claudeCodeEffortUnavailable: "O modelo selecionado não informa níveis de effort configuráveis. O Claude Code usará o padrão.",
cliErrors: {
code: "Código do erro: {code}",
details: "Detalhes de diagnóstico:",
reportHint: "Ao relatar este problema, inclua o código do erro e os detalhes de diagnóstico abaixo.",
claudeCodeNotInstalled: "Claude Code CLI não foi encontrado. Instale o Claude Code ou defina o caminho do executável em Configurações > AI.",
claudeCodeCliPathInvalid: "O caminho do Claude Code CLI é inválido. Selecione apenas o executável do Claude e configure as variáveis de ambiente separadamente.",
claudeCodeEnvInvalid: "O nome de uma variável de ambiente do Claude Code CLI é inválido. Use nomes como HTTPS_PROXY.",
claudeCodeEnvReserved: "Uma variável MCP gerenciada pelo DBX foi sobrescrita. Remova as variáveis DBX_MCP_* da configuração do provedor.",
claudeCodeNotAuthenticated: "Claude Code CLI não está autenticado. Execute `claude auth login` em um terminal e tente novamente.",
claudeCodeMcpConfigInvalid: "O Claude Code não conseguiu ler ou analisar a configuração MCP do DBX. Verifique a versão e o caminho do executável do Claude Code CLI.",
dbxMcpMissing: "Uma instalação compatível do DBX MCP Server não foi encontrada. Verifique Configurações > MCP e reinstale ou atualize.",
claudeCodeMcpStartupFailed: "O Claude Code carregou a configuração MCP, mas não conseguiu iniciar o DBX MCP Server. Verifique Configurações > MCP e os detalhes abaixo.",
claudeCodeCommandLineTooLong: "O Windows rejeitou o comando do Claude Code porque era muito longo. Atualize o DBX e tente novamente com o arquivo MCP gerado.",
claudeCodeRunFailed: "Claude Code CLI foi encerrado inesperadamente. Use o código do erro e os detalhes abaixo para identificar o executável ou a saída com falha.",
},
run: "Executar",
readingSchema: "Lendo schema",
noConnection: "Nenhuma conexão disponível para esta aba",
@@ -1494,6 +1509,7 @@ export default withEnglishFallback({
apply: "Aplicar ao Editor",
clear: "Limpar Conversa",
welcome: "Diga o que você gostaria de consultar e eu escreverei o SQL",
requestFailed: "Falha na solicitação de AI",
newChat: "Nova Conversa",
thinking: "Pensando...",
reasoningProcess: "Processo de raciocínio",
+16
View File
@@ -1517,6 +1517,7 @@ export default withEnglishFallback({
apply: "应用到编辑器",
clear: "清空对话",
welcome: "聊聊你想查什么,我来写 SQL",
requestFailed: "AI 请求失败",
newChat: "新对话",
thinking: "思考中...",
reasoningProcess: "思考过程",
@@ -1618,6 +1619,21 @@ export default withEnglishFallback({
reasoningLevelHint: "控制 Codex CLI 的 model_reasoning_effort。默认使用你的 Codex 配置。",
claudeCodeEffortHint: "可用级别由本地 Claude Code CLI 根据所选模型动态提供。",
claudeCodeEffortUnavailable: "所选模型未提供可配置的推理级别,将使用 Claude Code 的默认设置。",
cliErrors: {
code: "错误代码:{code}",
details: "诊断详情:",
reportHint: "反馈此问题时,请同时提供错误代码和下方诊断详情。",
claudeCodeNotInstalled: "未找到 Claude Code CLI。请安装 Claude Code,或在 设置 > AI 中填写其可执行文件路径。",
claudeCodeCliPathInvalid: "Claude Code CLI 路径无效。请只选择 Claude 可执行文件,环境变量需单独配置。",
claudeCodeEnvInvalid: "Claude Code CLI 环境变量名称无效。请使用 HTTPS_PROXY 这类合法名称。",
claudeCodeEnvReserved: "配置覆盖了由 DBX 管理的 MCP 环境变量。请从供应商配置中移除 DBX_MCP_* 变量。",
claudeCodeNotAuthenticated: "Claude Code CLI 尚未登录。请在终端执行 `claude auth login` 后重试。",
claudeCodeMcpConfigInvalid: "Claude Code 无法读取或解析 DBX 生成的 MCP 配置。请检查 Claude Code CLI 版本和可执行文件路径。",
dbxMcpMissing: "未找到兼容的 DBX MCP Server。请在 设置 > MCP 中检查并重新安装或更新。",
claudeCodeMcpStartupFailed: "Claude Code 已加载 MCP 配置,但无法启动 DBX MCP Server。请检查 设置 > MCP 和下方诊断详情。",
claudeCodeCommandLineTooLong: "Windows 拒绝了过长的 Claude Code 命令。请更新 DBX,并使用生成的 MCP 配置文件重试。",
claudeCodeRunFailed: "Claude Code CLI 异常退出。请根据错误代码和下方诊断详情确认失败的可执行文件或 CLI 输出。",
},
actions: {
general: "通用问答",
generate: "生成 SQL",
+16
View File
@@ -1459,6 +1459,7 @@ export default withEnglishFallback({
apply: "套用到編輯器",
clear: "清空對話",
welcome: "告訴我你想查詢什麼,我會寫出 SQL",
requestFailed: "AI 請求失敗",
newChat: "新對話",
thinking: "思考中……",
reasoningProcess: "思考過程",
@@ -1594,6 +1595,21 @@ export default withEnglishFallback({
reasoningLevelHint: "控制 Codex CLI 的 model_reasoning_effort。預設會使用你的 Codex 設定。",
claudeCodeEffortHint: "可用層級由本機 Claude Code CLI 根據所選模型動態提供。",
claudeCodeEffortUnavailable: "所選模型未提供可設定的推理層級,將使用 Claude Code 的預設設定。",
cliErrors: {
code: "錯誤代碼:{code}",
details: "診斷詳情:",
reportHint: "回報此問題時,請同時提供錯誤代碼和下方診斷詳情。",
claudeCodeNotInstalled: "找不到 Claude Code CLI。請安裝 Claude Code,或在 設定 > AI 中填寫其可執行檔路徑。",
claudeCodeCliPathInvalid: "Claude Code CLI 路徑無效。請只選擇 Claude 可執行檔,環境變數需另外設定。",
claudeCodeEnvInvalid: "Claude Code CLI 環境變數名稱無效。請使用 HTTPS_PROXY 這類合法名稱。",
claudeCodeEnvReserved: "設定覆寫了由 DBX 管理的 MCP 環境變數。請從供應商設定中移除 DBX_MCP_* 變數。",
claudeCodeNotAuthenticated: "Claude Code CLI 尚未登入。請在終端機執行 `claude auth login` 後重試。",
claudeCodeMcpConfigInvalid: "Claude Code 無法讀取或解析 DBX 產生的 MCP 設定。請檢查 Claude Code CLI 版本和可執行檔路徑。",
dbxMcpMissing: "找不到相容的 DBX MCP Server。請在 設定 > MCP 中檢查並重新安裝或更新。",
claudeCodeMcpStartupFailed: "Claude Code 已載入 MCP 設定,但無法啟動 DBX MCP Server。請檢查 設定 > MCP 和下方診斷詳情。",
claudeCodeCommandLineTooLong: "Windows 拒絕了過長的 Claude Code 命令。請更新 DBX,並使用產生的 MCP 設定檔重試。",
claudeCodeRunFailed: "Claude Code CLI 異常結束。請依據錯誤代碼和下方診斷詳情確認失敗的可執行檔或 CLI 輸出。",
},
actions: {
general: "通用問答",
generate: "產生 SQL",