@@ -351,6 +409,47 @@ const CodeToolsPage: FC = () => {
{t('code.env_vars_help')}
+ {/* 终端选择 (macOS 和 Windows) */}
+ {(isMac || isWin) && availableTerminals.length > 0 && (
+
+ {t('code.terminal')}
+
+
+ {isWin &&
+ selectedTerminal &&
+ selectedTerminal !== terminalApps.cmd &&
+ selectedTerminal !== terminalApps.powershell &&
+ selectedTerminal !== terminalApps.windowsTerminal && (
+
+ {terminalCustomPaths[selectedTerminal]
+ ? `${t('code.custom_path')}: ${terminalCustomPaths[selectedTerminal]}`
+ : t('code.custom_path_required')}
+
+ )}
+
+ )}
+
{t('code.update_options')}
setAutoUpdateToLatest(e.target.checked)}>
diff --git a/src/renderer/src/services/AssistantService.ts b/src/renderer/src/services/AssistantService.ts
index cb005d6126..226928c652 100644
--- a/src/renderer/src/services/AssistantService.ts
+++ b/src/renderer/src/services/AssistantService.ts
@@ -7,7 +7,6 @@ import {
MAX_CONTEXT_COUNT,
UNLIMITED_CONTEXT_COUNT
} from '@renderer/config/constant'
-import { isQwenMTModel } from '@renderer/config/models'
import { UNKNOWN } from '@renderer/config/translate'
import i18n from '@renderer/i18n'
import store from '@renderer/store'
@@ -74,22 +73,16 @@ export async function getDefaultTranslateAssistant(
temperature: 0.7
}
- let prompt: string
- let content: string
- if (isQwenMTModel(model)) {
- content = text
- prompt = ''
- } else {
- content = 'follow system instruction'
- const translateModelPrompt = await preferenceService.get('feature.translate.model_prompt')
- prompt = translateModelPrompt.replaceAll('{{target_language}}', targetLanguage.value).replaceAll('{{text}}', text)
- }
+ const translateModelPrompt = await preferenceService.get('feature.translate.model_prompt')
+ const content = translateModelPrompt
+ .replaceAll('{{target_language}}', targetLanguage.value)
+ .replaceAll('{{text}}', text)
const translateAssistant = {
...assistant,
model,
settings,
- prompt,
+ prompt: '',
targetLanguage,
content
} satisfies TranslateAssistant
diff --git a/src/renderer/src/store/codeTools.ts b/src/renderer/src/store/codeTools.ts
index a07ae7ef2b..1797c63dd5 100644
--- a/src/renderer/src/store/codeTools.ts
+++ b/src/renderer/src/store/codeTools.ts
@@ -1,7 +1,7 @@
import type { PayloadAction } from '@reduxjs/toolkit'
import { createSlice } from '@reduxjs/toolkit'
import type { Model } from '@renderer/types'
-import { codeTools } from '@shared/config/constant'
+import { codeTools, terminalApps } from '@shared/config/constant'
// 常量定义
const MAX_DIRECTORIES = 10 // 最多保存10个目录
@@ -17,6 +17,8 @@ export interface CodeToolsState {
directories: string[]
// 当前选择的目录
currentDirectory: string
+ // 选择的终端 ( macOS 和 Windows)
+ selectedTerminal: string
}
export const initialState: CodeToolsState = {
@@ -33,7 +35,8 @@ export const initialState: CodeToolsState = {
'gemini-cli': ''
},
directories: [],
- currentDirectory: ''
+ currentDirectory: '',
+ selectedTerminal: terminalApps.systemDefault
}
const codeToolsSlice = createSlice({
@@ -45,6 +48,11 @@ const codeToolsSlice = createSlice({
state.selectedCliTool = action.payload
},
+ // 设置选择的终端
+ setSelectedTerminal: (state, action: PayloadAction) => {
+ state.selectedTerminal = action.payload
+ },
+
// 设置选择的模型(为当前 CLI 工具设置)
setSelectedModel: (state, action: PayloadAction) => {
state.selectedModels[state.selectedCliTool] = action.payload
@@ -114,12 +122,14 @@ const codeToolsSlice = createSlice({
state.environmentVariables = initialState.environmentVariables
state.directories = initialState.directories
state.currentDirectory = initialState.currentDirectory
+ state.selectedTerminal = initialState.selectedTerminal
}
}
})
export const {
setSelectedCliTool,
+ setSelectedTerminal,
setSelectedModel,
setEnvironmentVariables,
addDirectory,
diff --git a/src/renderer/src/utils/__tests__/api.test.ts b/src/renderer/src/utils/__tests__/api.test.ts
index ee91e2ad2b..f25ac2e68f 100644
--- a/src/renderer/src/utils/__tests__/api.test.ts
+++ b/src/renderer/src/utils/__tests__/api.test.ts
@@ -25,7 +25,7 @@ describe('api', () => {
})
it('should handle empty string gracefully', () => {
- expect(formatApiHost('')).toBe('/v1/')
+ expect(formatApiHost('')).toBe('')
})
})
diff --git a/src/renderer/src/utils/api.ts b/src/renderer/src/utils/api.ts
index 5e9b8f91a6..62d0db5623 100644
--- a/src/renderer/src/utils/api.ts
+++ b/src/renderer/src/utils/api.ts
@@ -20,6 +20,10 @@ export function formatApiKeys(value: string): string {
* @returns {string} 格式化后的 API 主机地址。
*/
export function formatApiHost(host: string, apiVersion: string = 'v1'): string {
+ if (!host) {
+ return ''
+ }
+
const forceUseOriginalHost = () => {
if (host.endsWith('/')) {
return true
diff --git a/src/renderer/src/windows/mini/MiniWindowApp.tsx b/src/renderer/src/windows/mini/MiniWindowApp.tsx
index 00fff29fa0..da9bad816c 100644
--- a/src/renderer/src/windows/mini/MiniWindowApp.tsx
+++ b/src/renderer/src/windows/mini/MiniWindowApp.tsx
@@ -1,10 +1,10 @@
import '@renderer/databases'
import { usePreference } from '@data/hooks/usePreference'
-import { HeroUIProvider } from '@heroui/react'
import { ErrorBoundary } from '@renderer/components/ErrorBoundary'
import { ToastPortal } from '@renderer/components/ToastPortal'
import { getToastUtilities } from '@renderer/components/TopView/toast'
+import { HeroUIProvider } from '@renderer/context/HeroUIProvider'
import store, { persistor } from '@renderer/store'
import { useEffect } from 'react'
import { Provider } from 'react-redux'
diff --git a/src/renderer/src/windows/selection/action/entryPoint.tsx b/src/renderer/src/windows/selection/action/entryPoint.tsx
index adff4b1515..39e15bfe89 100644
--- a/src/renderer/src/windows/selection/action/entryPoint.tsx
+++ b/src/renderer/src/windows/selection/action/entryPoint.tsx
@@ -3,13 +3,13 @@ import '@renderer/assets/styles/tailwind.css'
import '@ant-design/v5-patch-for-react-19'
import { preferenceService } from '@data/PreferenceService'
-import { HeroUIProvider } from '@heroui/react'
import KeyvStorage from '@kangfenmao/keyv-storage'
import { loggerService } from '@logger'
import { ToastPortal } from '@renderer/components/ToastPortal'
import { getToastUtilities } from '@renderer/components/TopView/toast'
import AntdProvider from '@renderer/context/AntdProvider'
import { CodeStyleProvider } from '@renderer/context/CodeStyleProvider'
+import { HeroUIProvider } from '@renderer/context/HeroUIProvider'
import { ThemeProvider } from '@renderer/context/ThemeProvider'
import storeSyncService from '@renderer/services/StoreSyncService'
import store, { persistor } from '@renderer/store'
diff --git a/yarn.lock b/yarn.lock
index f7049003da..18ed0cd83d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2404,7 +2404,7 @@ __metadata:
languageName: node
linkType: hard
-"@cherrystudio/ai-core@workspace:^1.0.0-alpha.17, @cherrystudio/ai-core@workspace:packages/aiCore":
+"@cherrystudio/ai-core@workspace:^1.0.0-alpha.18, @cherrystudio/ai-core@workspace:packages/aiCore":
version: 0.0.0-use.local
resolution: "@cherrystudio/ai-core@workspace:packages/aiCore"
dependencies:
@@ -14922,7 +14922,7 @@ __metadata:
"@aws-sdk/client-bedrock-runtime": "npm:^3.840.0"
"@aws-sdk/client-s3": "npm:^3.840.0"
"@biomejs/biome": "npm:2.2.4"
- "@cherrystudio/ai-core": "workspace:^1.0.0-alpha.17"
+ "@cherrystudio/ai-core": "workspace:^1.0.0-alpha.18"
"@cherrystudio/embedjs": "npm:^0.1.31"
"@cherrystudio/embedjs-libsql": "npm:^0.1.31"
"@cherrystudio/embedjs-loader-csv": "npm:^0.1.31"