From 09e6b9741eade167f89cb3bd55de6c68668eb57e Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat Date: Thu, 30 Oct 2025 16:14:04 +0800 Subject: [PATCH 01/83] fix: update GlobTool to count lines instead of files in output (#11036) --- .../pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx index c057b3f8d1..d9e151567e 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx @@ -6,7 +6,7 @@ import type { GlobToolInput as GlobToolInputType, GlobToolOutput as GlobToolOutp export function GlobTool({ input, output }: { input: GlobToolInputType; output?: GlobToolOutputType }) { // 如果有输出,计算文件数量 - const fileCount = output ? output.split('\n').filter((line) => line.trim()).length : 0 + const lineCount = output ? output.split('\n').filter((line) => line.trim()).length : 0 return ( } label="Glob" params={input.pattern} - stats={output ? `${fileCount} found` : undefined} + stats={output ? `${lineCount} of output` : undefined} /> }>
{output}
From dd8690b59281817071db9aab93350e9efb29528f Mon Sep 17 00:00:00 2001 From: SuYao Date: Thu, 30 Oct 2025 16:41:07 +0800 Subject: [PATCH 02/83] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E6=87=92=E5=8A=A0=E8=BD=BD=E7=BB=84=E4=BB=B6=E4=BB=A5?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B5=E9=9D=A2=E5=8A=A0=E8=BD=BD=E6=80=A7?= =?UTF-8?q?=E8=83=BD=20(#11042)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/Router.tsx | 64 +++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/src/renderer/src/Router.tsx b/src/renderer/src/Router.tsx index edaebfa144..61a376285f 100644 --- a/src/renderer/src/Router.tsx +++ b/src/renderer/src/Router.tsx @@ -1,6 +1,7 @@ import '@renderer/databases' -import { FC, useMemo } from 'react' +import { Spinner } from '@heroui/react' +import { FC, lazy, Suspense, useMemo } from 'react' import { HashRouter, Route, Routes } from 'react-router-dom' import Sidebar from './components/app/Sidebar' @@ -8,18 +9,25 @@ import { ErrorBoundary } from './components/ErrorBoundary' import TabsContainer from './components/Tab/TabContainer' import NavigationHandler from './handler/NavigationHandler' import { useNavbarPosition } from './hooks/useSettings' -import CodeToolsPage from './pages/code/CodeToolsPage' -import FilesPage from './pages/files/FilesPage' -import HomePage from './pages/home/HomePage' -import KnowledgePage from './pages/knowledge/KnowledgePage' -import LaunchpadPage from './pages/launchpad/LaunchpadPage' -import MinAppPage from './pages/minapps/MinAppPage' -import MinAppsPage from './pages/minapps/MinAppsPage' -import NotesPage from './pages/notes/NotesPage' -import PaintingsRoutePage from './pages/paintings/PaintingsRoutePage' -import SettingsPage from './pages/settings/SettingsPage' -import AssistantPresetsPage from './pages/store/assistants/presets/AssistantPresetsPage' -import TranslatePage from './pages/translate/TranslatePage' + +const HomePage = lazy(() => import('./pages/home/HomePage')) +const AssistantPresetsPage = lazy(() => import('./pages/store/assistants/presets/AssistantPresetsPage')) +const PaintingsRoutePage = lazy(() => import('./pages/paintings/PaintingsRoutePage')) +const TranslatePage = lazy(() => import('./pages/translate/TranslatePage')) +const FilesPage = lazy(() => import('./pages/files/FilesPage')) +const NotesPage = lazy(() => import('./pages/notes/NotesPage')) +const KnowledgePage = lazy(() => import('./pages/knowledge/KnowledgePage')) +const MinAppPage = lazy(() => import('./pages/minapps/MinAppPage')) +const MinAppsPage = lazy(() => import('./pages/minapps/MinAppsPage')) +const CodeToolsPage = lazy(() => import('./pages/code/CodeToolsPage')) +const SettingsPage = lazy(() => import('./pages/settings/SettingsPage')) +const LaunchpadPage = lazy(() => import('./pages/launchpad/LaunchpadPage')) + +const RouterFallback: FC = () => ( +
+ +
+) const Router: FC = () => { const { navbarPosition } = useNavbarPosition() @@ -27,20 +35,22 @@ const Router: FC = () => { const routes = useMemo(() => { return ( - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - + }> + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + ) }, []) From fa2ec69fa9b60f4040158e9234539f939f946d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?George=C2=B7Dong?= <98630204+GeorgeDong32@users.noreply.github.com> Date: Thu, 30 Oct 2025 20:15:35 +0800 Subject: [PATCH 03/83] fix(SettingsTab): Context slider inconsistent (#10943) * fix(i18n): standardize "max" translation to indicate unlimited * feat(SettingsTab): add current context * feat(settings): show proper "max" label for context count * fix(settings): simplify contextCount value expression * feat(settings): make context count editable with number input --- .../src/components/EditableNumber/index.tsx | 6 ++- src/renderer/src/i18n/locales/en-us.json | 3 +- src/renderer/src/i18n/locales/zh-cn.json | 1 + src/renderer/src/i18n/locales/zh-tw.json | 3 +- src/renderer/src/i18n/translate/de-de.json | 1 + src/renderer/src/i18n/translate/el-gr.json | 3 +- src/renderer/src/i18n/translate/es-es.json | 1 + src/renderer/src/i18n/translate/fr-fr.json | 1 + src/renderer/src/i18n/translate/ja-jp.json | 3 +- src/renderer/src/i18n/translate/pt-pt.json | 1 + src/renderer/src/i18n/translate/ru-ru.json | 3 +- .../src/pages/home/Tabs/SettingsTab.tsx | 41 +++++++++++++++---- .../AssistantModelSettings.tsx | 3 +- 13 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/renderer/src/components/EditableNumber/index.tsx b/src/renderer/src/components/EditableNumber/index.tsx index 220cf5fb57..a428dfc04c 100644 --- a/src/renderer/src/components/EditableNumber/index.tsx +++ b/src/renderer/src/components/EditableNumber/index.tsx @@ -19,6 +19,7 @@ export interface EditableNumberProps { suffix?: string prefix?: string align?: 'start' | 'center' | 'end' + formatter?: (value: number | null) => string | number } const EditableNumber: FC = ({ @@ -35,7 +36,8 @@ const EditableNumber: FC = ({ style, className, size = 'middle', - align = 'end' + align = 'end', + formatter }) => { const [isEditing, setIsEditing] = useState(false) const [inputValue, setInputValue] = useState(value) @@ -89,7 +91,7 @@ const EditableNumber: FC = ({ changeOnBlur={changeOnBlur} /> - {value ?? placeholder} + {formatter ? formatter(value ?? null) : (value ?? placeholder)} ) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 3a47ff3070..a416aeb005 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -838,7 +838,7 @@ "label": "Context", "tip": "The number of previous messages to keep in the context." }, - "max": "Max", + "max": "Unlimited", "max_tokens": { "confirm": "Set max tokens", "confirm_content": "Set the maximum number of tokens the model can generate. Need to consider the context limit of the model, otherwise an error will be reported", @@ -1051,6 +1051,7 @@ "copied": "Copied", "copy": "Copy", "copy_failed": "Copy failed", + "current": "Current", "cut": "Cut", "default": "Default", "delete": "Delete", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index de528ee8ab..b45f4d772d 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1051,6 +1051,7 @@ "copied": "已复制", "copy": "复制", "copy_failed": "复制失败", + "current": "当前", "cut": "剪切", "default": "默认", "delete": "删除", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 50293536e1..9179f18042 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -838,7 +838,7 @@ "label": "上下文", "tip": "在上下文中保留的前幾則訊息" }, - "max": "最大", + "max": "不限", "max_tokens": { "confirm": "設置最大 Token 數", "confirm_content": "設置單次交互所用的最大 Token 數,會影響返回結果的長度。要根據模型上下文限制來設定,否則會發生錯誤", @@ -1051,6 +1051,7 @@ "copied": "已複製", "copy": "複製", "copy_failed": "複製失敗", + "current": "当前", "cut": "剪下", "default": "預設", "delete": "刪除", diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index b2c0e21544..1691144860 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -1051,6 +1051,7 @@ "copied": "Kopiert", "copy": "Kopieren", "copy_failed": "Kopieren fehlgeschlagen", + "current": "Aktuell", "cut": "Ausschneiden", "default": "Standard", "delete": "Löschen", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index 01773b480d..88fade4b2b 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -838,7 +838,7 @@ "label": "Πλήθος ενδιάμεσων", "tip": "Πλήθος των μηνυμάτων που θα παραμείνουν στα ενδιάμεσα, όσο μεγαλύτερο είναι το αριθμός, τόσο μεγαλύτερο είναι το μήκος του ενδιάμεσου και τόσο περισσότερα tokens χρησιμοποιούνται. Συνομιλία συνήθως συνιστάται μεταξύ 5-10" }, - "max": "Όχι ορισμένο", + "max": "άπειρος", "max_tokens": { "confirm": "Ενεργοποίηση περιορισμού μήκους μηνύματος", "confirm_content": "Μετά την ενεργοποίηση του περιορισμού μήκους μηνύματος, ο μέγιστος αριθμός των tokens που χρησιμοποιούνται κάθε φορά, θα επηρεάζει το μήκος της απάντησης. Πρέπει να το ρυθμίζετε βάσει των περιορισμών του πλαισίου του μοντέλου, διαφορετικά θα σφάλλεται.", @@ -1051,6 +1051,7 @@ "copied": "Αντιγράφηκε", "copy": "Αντιγραφή", "copy_failed": "Αποτυχία αντιγραφής", + "current": "Τρέχων", "cut": "Κοπή", "default": "Προεπιλογή", "delete": "Διαγραφή", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 4bf1daa0eb..9e5a5d75e3 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -1051,6 +1051,7 @@ "copied": "Copiado", "copy": "Copiar", "copy_failed": "Error al copiar", + "current": "Actual", "cut": "Cortar", "default": "Predeterminado", "delete": "Eliminar", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index 0f2895581b..35f48bd35d 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -1051,6 +1051,7 @@ "copied": "Copié", "copy": "Copier", "copy_failed": "Échec de la copie", + "current": "Actuel", "cut": "Couper", "default": "Défaut", "delete": "Supprimer", diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index 8d5c342b2a..2196c03724 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -838,7 +838,7 @@ "label": "コンテキスト", "tip": "コンテキストに保持する以前のメッセージの数" }, - "max": "最大", + "max": "制限なし", "max_tokens": { "confirm": "最大トークン数", "confirm_content": "最大トークン数を設定すると、モデルが生成できる最大トークン数が制限されます。これにより、返される結果の長さに影響が出る可能性があります。モデルのコンテキスト制限に基づいて設定する必要があります。そうしないとエラーが発生します", @@ -1051,6 +1051,7 @@ "copied": "コピーされました", "copy": "コピー", "copy_failed": "コピーに失敗しました", + "current": "現在", "cut": "切り取り", "default": "デフォルト", "delete": "削除", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index 7e1a85af73..aee876b559 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -1051,6 +1051,7 @@ "copied": "Copiado", "copy": "Copiar", "copy_failed": "Falha ao copiar", + "current": "Atual", "cut": "Cortar", "default": "Padrão", "delete": "Excluir", diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index 82ff1287e6..ea9b78b716 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -838,7 +838,7 @@ "label": "Контекст", "tip": "Количество предыдущих сообщений, которые нужно сохранить в контексте." }, - "max": "Максимум", + "max": "без ограничений", "max_tokens": { "confirm": "Максимальное количество токенов", "confirm_content": "Установить максимальное количество токенов, влияет на длину результата. Нужно учитывать контекст модели, иначе будет ошибка", @@ -1051,6 +1051,7 @@ "copied": "Скопировано", "copy": "Копировать", "copy_failed": "Не удалось скопировать", + "current": "Текущий", "cut": "Вырезать", "default": "По умолчанию", "delete": "Удалить", diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index f56357cc4e..9aca265c40 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -3,7 +3,12 @@ import { HStack } from '@renderer/components/Layout' import Scrollbar from '@renderer/components/Scrollbar' import Selector from '@renderer/components/Selector' import { HelpTooltip } from '@renderer/components/TooltipIcons' -import { DEFAULT_CONTEXTCOUNT, DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE } from '@renderer/config/constant' +import { + DEFAULT_CONTEXTCOUNT, + DEFAULT_MAX_TOKENS, + DEFAULT_TEMPERATURE, + MAX_CONTEXT_COUNT +} from '@renderer/config/constant' import { isOpenAIModel } from '@renderer/config/models' import { UNKNOWN } from '@renderer/config/translate' import { useCodeStyle } from '@renderer/context/CodeStyleProvider' @@ -172,9 +177,6 @@ const SettingsTab: FC = (props) => { setStreamOutput(assistant?.settings?.streamOutput ?? true) }, [assistant]) - const assistantContextCount = assistant?.settings?.contextCount || 20 - const maxContextCount = assistantContextCount > 20 ? assistantContextCount : 20 - const model = assistant.model || getDefaultModel() const isOpenAI = isOpenAIModel(model) @@ -227,21 +229,44 @@ const SettingsTab: FC = (props) => { ) : ( )} - + {t('chat.settings.context_count.label')} + + { + if (value !== null && value >= 0 && value <= 20) { + setContextCount(value) + onContextCountChange(value) + } + }} + formatter={(value) => (value === MAX_CONTEXT_COUNT ? t('chat.settings.max') : (value ?? ''))} + style={{ width: '100%' }} + /> + - + diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index a2efdf387d..d340b6a673 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -359,6 +359,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA setTimeoutTimer('contextCount_onChange', () => updateAssistantSettings({ contextCount: value }), 500) } }} + formatter={(value) => (value === MAX_CONTEXT_COUNT ? t('chat.settings.max') : (value ?? ''))} style={{ width: '100%' }} /> @@ -373,7 +374,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA value={typeof contextCount === 'number' ? contextCount : 0} marks={{ 0: '0', 25: '25', 50: '50', 75: '75', 100: t('chat.settings.max') }} step={1} - tooltip={{ formatter: formatSliderTooltip }} + tooltip={{ formatter: formatSliderTooltip, open: false }} /> From b586e1796e5db0935cfd011a24b86657e4e1b86f Mon Sep 17 00:00:00 2001 From: Pleasure1234 <3196812536@qq.com> Date: Fri, 31 Oct 2025 03:21:10 +0000 Subject: [PATCH 04/83] fix: sort grouped items by saved tags order from Redux (#11065) Updated useUnifiedGrouping to sort grouped items by the tags order saved in the Redux store, falling back to untagged first. This improves consistency with user-defined tag ordering. --- .../home/Tabs/hooks/useUnifiedGrouping.ts | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts index 8ea07f57e1..90d2601f63 100644 --- a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts +++ b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts @@ -1,4 +1,5 @@ -import { useAppDispatch } from '@renderer/store' +import { createSelector } from '@reduxjs/toolkit' +import { RootState, useAppDispatch, useAppSelector } from '@renderer/store' import { setUnifiedListOrder } from '@renderer/store/assistants' import { AgentEntity, Assistant } from '@renderer/types' import { useCallback, useMemo } from 'react' @@ -21,6 +22,13 @@ export const useUnifiedGrouping = (options: UseUnifiedGroupingOptions) => { const { t } = useTranslation() const dispatch = useAppDispatch() + // Selector to get tagsOrder from Redux store + const selectTagsOrder = useMemo( + () => createSelector([(state: RootState) => state.assistants], (assistants) => assistants.tagsOrder ?? []), + [] + ) + const savedTagsOrder = useAppSelector(selectTagsOrder) + // Group unified items by tags const groupedUnifiedItems = useMemo(() => { const groups = new Map() @@ -45,16 +53,30 @@ export const useUnifiedGrouping = (options: UseUnifiedGroupingOptions) => { } }) - // Sort groups: untagged first, then tagged groups + // Sort groups: untagged first, then by savedTagsOrder const untaggedKey = t('assistants.tags.untagged') const sortedGroups = Array.from(groups.entries()).sort(([tagA], [tagB]) => { if (tagA === untaggedKey) return -1 if (tagB === untaggedKey) return 1 + + if (savedTagsOrder.length > 0) { + const indexA = savedTagsOrder.indexOf(tagA) + const indexB = savedTagsOrder.indexOf(tagB) + + if (indexA !== -1 && indexB !== -1) { + return indexA - indexB + } + + if (indexA !== -1) return -1 + + if (indexB !== -1) return 1 + } + return 0 }) return sortedGroups.map(([tag, items]) => ({ tag, items })) - }, [unifiedItems, t]) + }, [unifiedItems, t, savedTagsOrder]) const handleUnifiedGroupReorder = useCallback( (tag: string, newGroupList: UnifiedItem[]) => { From aa810a7ead772ba3b6a3f136a93eaac8b7e95573 Mon Sep 17 00:00:00 2001 From: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Fri, 31 Oct 2025 12:13:59 +0800 Subject: [PATCH 05/83] fix: notify renderer when api server ready (#11049) * fix: notify renderer when api server ready * chore: minor comment update Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: minor ui change to reflect server loading state --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/shared/IpcChannel.ts | 1 + src/main/apiServer/server.ts | 9 +++++++++ src/preload/index.ts | 11 ++++++++++- src/renderer/src/hooks/agents/useAgents.ts | 6 +++++- src/renderer/src/hooks/useApiServer.ts | 14 ++++++++++++-- src/renderer/src/pages/home/Tabs/AssistantsTab.tsx | 6 +++--- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/shared/IpcChannel.ts b/packages/shared/IpcChannel.ts index a8421354f4..9a3866d480 100644 --- a/packages/shared/IpcChannel.ts +++ b/packages/shared/IpcChannel.ts @@ -322,6 +322,7 @@ export enum IpcChannel { ApiServer_Stop = 'api-server:stop', ApiServer_Restart = 'api-server:restart', ApiServer_GetStatus = 'api-server:get-status', + ApiServer_Ready = 'api-server:ready', // NOTE: This api is not be used. ApiServer_GetConfig = 'api-server:get-config', diff --git a/src/main/apiServer/server.ts b/src/main/apiServer/server.ts index 3cb81f4124..9b15e56da0 100644 --- a/src/main/apiServer/server.ts +++ b/src/main/apiServer/server.ts @@ -1,8 +1,10 @@ import { createServer } from 'node:http' import { loggerService } from '@logger' +import { IpcChannel } from '@shared/IpcChannel' import { agentService } from '../services/agents' +import { windowService } from '../services/WindowService' import { app } from './app' import { config } from './config' @@ -43,6 +45,13 @@ export class ApiServer { return new Promise((resolve, reject) => { this.server!.listen(port, host, () => { logger.info('API server started', { host, port }) + + // Notify renderer that API server is ready + const mainWindow = windowService.getMainWindow() + if (mainWindow && !mainWindow.isDestroyed()) { + mainWindow.webContents.send(IpcChannel.ApiServer_Ready) + } + resolve() }) diff --git a/src/preload/index.ts b/src/preload/index.ts index 12aa9fd3b2..fa39ac6987 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -525,7 +525,16 @@ const api = { getStatus: (): Promise => ipcRenderer.invoke(IpcChannel.ApiServer_GetStatus), start: (): Promise => ipcRenderer.invoke(IpcChannel.ApiServer_Start), restart: (): Promise => ipcRenderer.invoke(IpcChannel.ApiServer_Restart), - stop: (): Promise => ipcRenderer.invoke(IpcChannel.ApiServer_Stop) + stop: (): Promise => ipcRenderer.invoke(IpcChannel.ApiServer_Stop), + onReady: (callback: () => void): (() => void) => { + const listener = () => { + callback() + } + ipcRenderer.on(IpcChannel.ApiServer_Ready, listener) + return () => { + ipcRenderer.removeListener(IpcChannel.ApiServer_Ready, listener) + } + } }, claudeCodePlugin: { listAvailable: (): Promise> => diff --git a/src/renderer/src/hooks/agents/useAgents.ts b/src/renderer/src/hooks/agents/useAgents.ts index f14b893519..3f5dcb6e35 100644 --- a/src/renderer/src/hooks/agents/useAgents.ts +++ b/src/renderer/src/hooks/agents/useAgents.ts @@ -25,6 +25,10 @@ export const useAgents = () => { const client = useAgentClient() const key = client.agentPaths.base const { apiServerConfig, apiServerRunning } = useApiServer() + + // Disable SWR fetching when server is not running by setting key to null + const swrKey = apiServerRunning ? key : null + const fetcher = useCallback(async () => { // API server will start on startup if enabled OR there are agents if (!apiServerConfig.enabled && !apiServerRunning) { @@ -37,7 +41,7 @@ export const useAgents = () => { // NOTE: We only use the array for now. useUpdateAgent depends on this behavior. return result.data }, [apiServerConfig.enabled, apiServerRunning, client, t]) - const { data, error, isLoading, mutate } = useSWR(key, fetcher) + const { data, error, isLoading, mutate } = useSWR(swrKey, fetcher) const { chat } = useRuntime() const { activeAgentId } = chat const dispatch = useAppDispatch() diff --git a/src/renderer/src/hooks/useApiServer.ts b/src/renderer/src/hooks/useApiServer.ts index ae418f6cc0..38f6fa64d7 100644 --- a/src/renderer/src/hooks/useApiServer.ts +++ b/src/renderer/src/hooks/useApiServer.ts @@ -14,8 +14,8 @@ export const useApiServer = () => { const apiServerConfig = useAppSelector((state) => state.settings.apiServer) const dispatch = useAppDispatch() - // Optimistic initial state. - const [apiServerRunning, setApiServerRunning] = useState(apiServerConfig.enabled) + // Initial state - no longer optimistic, wait for actual status + const [apiServerRunning, setApiServerRunning] = useState(false) const [apiServerLoading, setApiServerLoading] = useState(true) const setApiServerEnabled = useCallback( @@ -99,6 +99,16 @@ export const useApiServer = () => { checkApiServerStatus() }, [checkApiServerStatus]) + // Listen for API server ready event + useEffect(() => { + const cleanup = window.api.apiServer.onReady(() => { + logger.info('API server ready event received, checking status') + checkApiServerStatus() + }) + + return cleanup + }, [checkApiServerStatus]) + return { apiServerConfig, apiServerRunning, diff --git a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx index b0c9018513..8fc439b7b5 100644 --- a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx @@ -36,7 +36,7 @@ const AssistantsTab: FC = (props) => { const { activeAssistant, setActiveAssistant, onCreateAssistant, onCreateDefaultAssistant } = props const containerRef = useRef(null) const { t } = useTranslation() - const { apiServerConfig, apiServerRunning } = useApiServer() + const { apiServerConfig, apiServerRunning, apiServerLoading } = useApiServer() const apiServerEnabled = apiServerConfig.enabled const { iknow, chat } = useRuntime() const dispatch = useAppDispatch() @@ -113,8 +113,8 @@ const AssistantsTab: FC = (props) => { /> )} - {agentsLoading && } - {apiServerConfig.enabled && !apiServerRunning && ( + {(agentsLoading || apiServerLoading) && } + {apiServerConfig.enabled && !apiServerLoading && !apiServerRunning && ( )} {apiServerRunning && agentsError && ( From f8a599322f00c56f4d56b742dee1e1acccd6fd31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=A2=E5=A5=8B=E7=8C=AB?= Date: Fri, 31 Oct 2025 13:35:27 +0800 Subject: [PATCH 06/83] =?UTF-8?q?feat(useAppInit):=20implement=20automatic?= =?UTF-8?q?=20update=20checks=20with=20interval=20sup=E2=80=A6=20(#11063)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat(useAppInit): implement automatic update checks with interval support - Added a function to check for updates, which is called initially and set to run every 6 hours if the app is packaged and auto-update is enabled. - Refactored the initial update check to utilize the new function for better code organization and clarity. --- src/renderer/src/hooks/useAppInit.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/hooks/useAppInit.ts b/src/renderer/src/hooks/useAppInit.ts index 28fc6a958c..3ecbdf7621 100644 --- a/src/renderer/src/hooks/useAppInit.ts +++ b/src/renderer/src/hooks/useAppInit.ts @@ -83,14 +83,31 @@ export function useAppInit() { }, [avatar, dispatch]) useEffect(() => { + const checkForUpdates = async () => { + const { isPackaged } = await window.api.getAppInfo() + + if (!isPackaged || !autoCheckUpdate) { + return + } + + const { updateInfo } = await window.api.checkForUpdate() + dispatch(setUpdateState({ info: updateInfo })) + } + + // Initial check with delay runAsyncFunction(async () => { const { isPackaged } = await window.api.getAppInfo() if (isPackaged && autoCheckUpdate) { await delay(2) - const { updateInfo } = await window.api.checkForUpdate() - dispatch(setUpdateState({ info: updateInfo })) + await checkForUpdates() } }) + + // Set up 4-hour interval check + const FOUR_HOURS = 4 * 60 * 60 * 1000 + const intervalId = setInterval(checkForUpdates, FOUR_HOURS) + + return () => clearInterval(intervalId) }, [dispatch, autoCheckUpdate]) useEffect(() => { From d792bf7fe07416bf0bfc7c12101a0bd08c322ee1 Mon Sep 17 00:00:00 2001 From: LiuVaayne <10231735+vaayne@users.noreply.github.com> Date: Fri, 31 Oct 2025 14:30:50 +0800 Subject: [PATCH 07/83] =?UTF-8?q?=F0=9F=90=9B=20fix:=20resolve=20tool=20ap?= =?UTF-8?q?proval=20UI=20and=20shared=20workspace=20plugin=20inconsistency?= =?UTF-8?q?=20(#11043)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(ToolPermissionRequestCard): simplify button rendering by removing suggestion handling * ✨ feat: add CachedPluginsDataSchema for plugin cache file - Add Zod schema for .claude/plugins.json cache file format - Schema includes version, lastUpdated timestamp, and plugins array - Reuses existing InstalledPluginSchema for type safety - Cache will store metadata for all installed plugins * ✨ feat: add cache management methods to PluginService - Add readCacheFile() to read .claude/plugins.json - Add writeCacheFile() for atomic cache writes (temp + rename) - Add rebuildCache() to scan filesystem and rebuild cache - Add listInstalledFromCache() to load plugins from cache with fallback - Add updateCache() helper for transactional cache updates - All methods handle missing/corrupt cache gracefully - Cache auto-regenerates from filesystem if needed * ✨ feat: integrate cache loading in AgentService.getAgent() - Add installed_plugins field to GetAgentResponseSchema - Load plugins from cache via PluginService.listInstalledFromCache() - Gracefully handle errors by returning empty array - Use loggerService for error logging * 🐛 fix: break circular dependency causing infinite loop in cache methods - Change cache method signatures from agentId to workdir parameter - Update listInstalledFromCache(workdir) to accept workdir directly - Update rebuildCache(workdir) to accept workdir directly - Update updateCache(workdir, updater) to accept workdir directly - AgentService.getAgent() now passes accessible_paths[0] to cache methods - Removes AgentService.getAgent() calls from PluginService methods - Fixes infinite recursion bug where methods called each other endlessly Breaking the circular dependency: BEFORE: AgentService.getAgent() → PluginService.listInstalledFromCache(id) → AgentService.getAgent(id) [INFINITE LOOP] AFTER: AgentService.getAgent() → PluginService.listInstalledFromCache(workdir) [NO MORE RECURSION] * 🐛 fix: update listInstalled() to use agent.installed_plugins - Change from agent.configuration.installed_plugins (old DB location) - To agent.installed_plugins (new top-level field from cache) - Simplify validation logic to use existing plugin structure - Fixes UI not showing installed plugins correctly This was causing the UI to show empty plugin lists even though plugins were correctly loaded in the cache by AgentService.getAgent(). * ♻️ refactor: remove unused updateCache helper * ♻️ refactor: centralize plugin directory helpers * feat: Implement Plugin Management System - Added PluginCacheStore for managing plugin metadata and caching. - Introduced PluginInstaller for handling installation and uninstallation of plugins. - Created PluginService to manage plugin lifecycle, including installation, uninstallation, and listing of available plugins. - Enhanced AgentService to integrate with PluginService for loading installed plugins. - Implemented validation and sanitization for plugin file names and paths to prevent security issues. - Added support for skills as a new plugin type, including installation and management. - Introduced caching mechanism for available plugins to improve performance. * ♻️ refactor: simplify PluginInstaller and PluginService by removing agent dependency and updating plugin handling --- src/main/ipc.ts | 2 +- src/main/services/PluginService.ts | 1171 ----------------- .../agents/plugins/PluginCacheStore.ts | 426 ++++++ .../agents/plugins/PluginInstaller.ts | 149 +++ .../services/agents/plugins/PluginService.ts | 614 +++++++++ .../services/agents/services/AgentService.ts | 22 + .../Tools/ToolPermissionRequestCard.tsx | 44 +- src/renderer/src/types/agent.ts | 30 +- src/renderer/src/types/plugin.ts | 9 + 9 files changed, 1236 insertions(+), 1231 deletions(-) delete mode 100644 src/main/services/PluginService.ts create mode 100644 src/main/services/agents/plugins/PluginCacheStore.ts create mode 100644 src/main/services/agents/plugins/PluginInstaller.ts create mode 100644 src/main/services/agents/plugins/PluginService.ts diff --git a/src/main/ipc.ts b/src/main/ipc.ts index cf0892f935..94f8556d13 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -27,6 +27,7 @@ import { BrowserWindow, dialog, ipcMain, ProxyConfig, session, shell, systemPref import fontList from 'font-list' import { agentMessageRepository } from './services/agents/database' +import { PluginService } from './services/agents/plugins/PluginService' import { apiServerService } from './services/ApiServerService' import appService from './services/AppService' import AppUpdater from './services/AppUpdater' @@ -47,7 +48,6 @@ import * as NutstoreService from './services/NutstoreService' import ObsidianVaultService from './services/ObsidianVaultService' import { ocrService } from './services/ocr/OcrService' import OvmsManager from './services/OvmsManager' -import { PluginService } from './services/PluginService' import { proxyManager } from './services/ProxyManager' import { pythonService } from './services/PythonService' import { FileServiceManager } from './services/remotefile/FileServiceManager' diff --git a/src/main/services/PluginService.ts b/src/main/services/PluginService.ts deleted file mode 100644 index 8ff1820208..0000000000 --- a/src/main/services/PluginService.ts +++ /dev/null @@ -1,1171 +0,0 @@ -import { loggerService } from '@logger' -import { copyDirectoryRecursive, deleteDirectoryRecursive } from '@main/utils/fileOperations' -import { findAllSkillDirectories, parsePluginMetadata, parseSkillMetadata } from '@main/utils/markdownParser' -import type { - AgentEntity, - InstalledPlugin, - InstallPluginOptions, - ListAvailablePluginsResult, - PluginError, - PluginMetadata, - PluginType, - UninstallPluginOptions -} from '@types' -import * as crypto from 'crypto' -import { app } from 'electron' -import * as fs from 'fs' -import * as path from 'path' - -import { AgentService } from './agents/services/AgentService' - -const logger = loggerService.withContext('PluginService') - -interface PluginServiceConfig { - maxFileSize: number // bytes - cacheTimeout: number // milliseconds -} - -/** - * PluginService manages agent and command plugins from resources directory. - * - * Features: - * - Singleton pattern for consistent state management - * - Caching of available plugins for performance - * - Security validation (path traversal, file size, extensions) - * - Transactional install/uninstall operations - * - Integration with AgentService for metadata persistence - */ -export class PluginService { - private static instance: PluginService | null = null - - private availablePluginsCache: ListAvailablePluginsResult | null = null - private cacheTimestamp = 0 - private config: PluginServiceConfig - - private readonly ALLOWED_EXTENSIONS = ['.md', '.markdown'] - - private constructor(config?: Partial) { - this.config = { - maxFileSize: config?.maxFileSize ?? 1024 * 1024, // 1MB default - cacheTimeout: config?.cacheTimeout ?? 5 * 60 * 1000 // 5 minutes default - } - - logger.info('PluginService initialized', { - maxFileSize: this.config.maxFileSize, - cacheTimeout: this.config.cacheTimeout - }) - } - - /** - * Get singleton instance - */ - static getInstance(config?: Partial): PluginService { - if (!PluginService.instance) { - PluginService.instance = new PluginService(config) - } - return PluginService.instance - } - - /** - * List all available plugins from resources directory (with caching) - */ - async listAvailable(): Promise { - const now = Date.now() - - // Return cached data if still valid - if (this.availablePluginsCache && now - this.cacheTimestamp < this.config.cacheTimeout) { - logger.debug('Returning cached plugin list', { - cacheAge: now - this.cacheTimestamp - }) - return this.availablePluginsCache - } - - logger.info('Scanning available plugins') - - // Scan all plugin types - const [agents, commands, skills] = await Promise.all([ - this.scanPluginDirectory('agent'), - this.scanPluginDirectory('command'), - this.scanSkillDirectory() - ]) - - const result: ListAvailablePluginsResult = { - agents, - commands, - skills, // NEW: include skills - total: agents.length + commands.length + skills.length - } - - // Update cache - this.availablePluginsCache = result - this.cacheTimestamp = now - - logger.info('Available plugins scanned', { - agentsCount: agents.length, - commandsCount: commands.length, - skillsCount: skills.length, - total: result.total - }) - - return result - } - - /** - * Install plugin with validation and transactional safety - */ - async install(options: InstallPluginOptions): Promise { - logger.info('Installing plugin', options) - - // Validate source path - this.validateSourcePath(options.sourcePath) - - // Get agent and validate - const agent = await AgentService.getInstance().getAgent(options.agentId) - if (!agent) { - throw { - type: 'INVALID_WORKDIR', - agentId: options.agentId, - workdir: '', - message: 'Agent not found' - } as PluginError - } - - const workdir = agent.accessible_paths?.[0] - if (!workdir) { - throw { - type: 'INVALID_WORKDIR', - agentId: options.agentId, - workdir: '', - message: 'Agent has no accessible paths' - } as PluginError - } - - await this.validateWorkdir(workdir, options.agentId) - - // Get absolute source path - const basePath = this.getPluginsBasePath() - const sourceAbsolutePath = path.join(basePath, options.sourcePath) - - // BRANCH: Handle skills differently than files - if (options.type === 'skill') { - // Validate skill folder exists and is a directory - try { - const stats = await fs.promises.stat(sourceAbsolutePath) - if (!stats.isDirectory()) { - throw { - type: 'INVALID_METADATA', - reason: 'Skill source is not a directory', - path: options.sourcePath - } as PluginError - } - } catch (error) { - throw { - type: 'FILE_NOT_FOUND', - path: sourceAbsolutePath - } as PluginError - } - - // Parse metadata from SKILL.md - const metadata = await parseSkillMetadata(sourceAbsolutePath, options.sourcePath, 'skills') - - // Sanitize folder name (different rules than file names) - const sanitizedFolderName = this.sanitizeFolderName(metadata.filename) - - // Ensure .claude/skills directory exists - await this.ensureClaudeDirectory(workdir, 'skill') - - // Construct destination path (folder, not file) - const destPath = path.join(workdir, '.claude', 'skills', sanitizedFolderName) - - // Update metadata with sanitized folder name - metadata.filename = sanitizedFolderName - - // Execute skill-specific install - await this.installSkill(agent, sourceAbsolutePath, destPath, metadata) - - logger.info('Skill installed successfully', { - agentId: options.agentId, - sourcePath: options.sourcePath, - folderName: sanitizedFolderName - }) - - return { - ...metadata, - installedAt: Date.now() - } - } - - // EXISTING LOGIC for agents/commands (unchanged) - // Files go through existing validation and sanitization - await this.validatePluginFile(sourceAbsolutePath) - - // Parse metadata - const category = path.basename(path.dirname(options.sourcePath)) - const metadata = await parsePluginMetadata(sourceAbsolutePath, options.sourcePath, category, options.type) - - // Sanitize filename - const sanitizedFilename = this.sanitizeFilename(metadata.filename) - - // Ensure .claude directory exists - await this.ensureClaudeDirectory(workdir, options.type) - - // Get destination path - const destDir = path.join(workdir, '.claude', options.type === 'agent' ? 'agents' : 'commands') - const destPath = path.join(destDir, sanitizedFilename) - - // Check for duplicate and auto-uninstall if exists - const existingPlugins = agent.configuration?.installed_plugins || [] - const existingPlugin = existingPlugins.find((p) => p.filename === sanitizedFilename && p.type === options.type) - - if (existingPlugin) { - logger.info('Plugin already installed, auto-uninstalling old version', { - filename: sanitizedFilename - }) - await this.uninstallTransaction(agent, sanitizedFilename, options.type) - - // Re-fetch agent after uninstall - const updatedAgent = await AgentService.getInstance().getAgent(options.agentId) - if (!updatedAgent) { - throw { - type: 'TRANSACTION_FAILED', - operation: 'install', - reason: 'Agent not found after uninstall' - } as PluginError - } - - await this.installTransaction(updatedAgent, sourceAbsolutePath, destPath, metadata) - } else { - await this.installTransaction(agent, sourceAbsolutePath, destPath, metadata) - } - - logger.info('Plugin installed successfully', { - agentId: options.agentId, - filename: sanitizedFilename, - type: options.type - }) - - return { - ...metadata, - filename: sanitizedFilename, - installedAt: Date.now() - } - } - - /** - * Uninstall plugin with cleanup - */ - async uninstall(options: UninstallPluginOptions): Promise { - logger.info('Uninstalling plugin', options) - - // Get agent - const agent = await AgentService.getInstance().getAgent(options.agentId) - if (!agent) { - throw { - type: 'INVALID_WORKDIR', - agentId: options.agentId, - workdir: '', - message: 'Agent not found' - } as PluginError - } - - // BRANCH: Handle skills differently than files - if (options.type === 'skill') { - // For skills, filename is the folder name (no extension) - // Use sanitizeFolderName to ensure consistency - const sanitizedFolderName = this.sanitizeFolderName(options.filename) - await this.uninstallSkill(agent, sanitizedFolderName) - - logger.info('Skill uninstalled successfully', { - agentId: options.agentId, - folderName: sanitizedFolderName - }) - - return - } - - // EXISTING LOGIC for agents/commands (unchanged) - // For files, filename includes .md extension - const sanitizedFilename = this.sanitizeFilename(options.filename) - await this.uninstallTransaction(agent, sanitizedFilename, options.type) - - logger.info('Plugin uninstalled successfully', { - agentId: options.agentId, - filename: sanitizedFilename, - type: options.type - }) - } - - /** - * List installed plugins for an agent (from database + filesystem validation) - */ - async listInstalled(agentId: string): Promise { - logger.debug('Listing installed plugins', { agentId }) - - // Get agent - const agent = await AgentService.getInstance().getAgent(agentId) - if (!agent) { - throw { - type: 'INVALID_WORKDIR', - agentId, - workdir: '', - message: 'Agent not found' - } as PluginError - } - - const installedPlugins = agent.configuration?.installed_plugins || [] - const workdir = agent.accessible_paths?.[0] - - if (!workdir) { - logger.warn('Agent has no accessible paths', { agentId }) - return [] - } - - // Validate each plugin still exists on filesystem - const validatedPlugins: InstalledPlugin[] = [] - - for (const plugin of installedPlugins) { - // Get plugin path based on type - let pluginPath: string - if (plugin.type === 'skill') { - pluginPath = path.join(workdir, '.claude', 'skills', plugin.filename) - } else { - pluginPath = path.join(workdir, '.claude', plugin.type === 'agent' ? 'agents' : 'commands', plugin.filename) - } - - try { - const stats = await fs.promises.stat(pluginPath) - - // For files (agents/commands), verify file hash if stored - if (plugin.type !== 'skill' && plugin.contentHash) { - const currentHash = await this.calculateFileHash(pluginPath) - if (currentHash !== plugin.contentHash) { - logger.warn('Plugin file hash mismatch', { - filename: plugin.filename, - expected: plugin.contentHash, - actual: currentHash - }) - } - } - - // For skills, stats.size is folder size (handled differently) - // For files, stats.size is file size - validatedPlugins.push({ - filename: plugin.filename, - type: plugin.type, - metadata: { - sourcePath: plugin.sourcePath, - filename: plugin.filename, - name: plugin.name, - description: plugin.description, - allowed_tools: plugin.allowed_tools, - tools: plugin.tools, - category: plugin.category || '', - type: plugin.type, - tags: plugin.tags, - version: plugin.version, - author: plugin.author, - size: stats.size, - contentHash: plugin.contentHash, - installedAt: plugin.installedAt, - updatedAt: plugin.updatedAt - } - }) - } catch (error) { - logger.warn('Plugin not found on filesystem', { - filename: plugin.filename, - path: pluginPath, - error: error instanceof Error ? error.message : String(error) - }) - } - } - - logger.debug('Listed installed plugins', { - agentId, - count: validatedPlugins.length - }) - - return validatedPlugins - } - - /** - * Invalidate plugin cache (for development/testing) - */ - invalidateCache(): void { - this.availablePluginsCache = null - this.cacheTimestamp = 0 - logger.info('Plugin cache invalidated') - } - - /** - * Read plugin content from source (resources directory) - */ - async readContent(sourcePath: string): Promise { - logger.info('Reading plugin content', { sourcePath }) - - // Validate source path - this.validateSourcePath(sourcePath) - - // Get absolute path - const basePath = this.getPluginsBasePath() - const absolutePath = path.join(basePath, sourcePath) - - // Validate file exists and is accessible - try { - await fs.promises.access(absolutePath, fs.constants.R_OK) - } catch (error) { - throw { - type: 'FILE_NOT_FOUND', - path: sourcePath - } as PluginError - } - - // Read content - try { - const content = await fs.promises.readFile(absolutePath, 'utf8') - logger.debug('Plugin content read successfully', { - sourcePath, - size: content.length - }) - return content - } catch (error) { - throw { - type: 'READ_FAILED', - path: sourcePath, - reason: error instanceof Error ? error.message : String(error) - } as PluginError - } - } - - /** - * Write plugin content to installed plugin (in agent's .claude directory) - * Note: Only works for file-based plugins (agents/commands), not skills - */ - async writeContent(agentId: string, filename: string, type: PluginType, content: string): Promise { - logger.info('Writing plugin content', { agentId, filename, type }) - - // Get agent - const agent = await AgentService.getInstance().getAgent(agentId) - if (!agent) { - throw { - type: 'INVALID_WORKDIR', - agentId, - workdir: '', - message: 'Agent not found' - } as PluginError - } - - const workdir = agent.accessible_paths?.[0] - if (!workdir) { - throw { - type: 'INVALID_WORKDIR', - agentId, - workdir: '', - message: 'Agent has no accessible paths' - } as PluginError - } - - // Check if plugin is installed - const installedPlugins = agent.configuration?.installed_plugins || [] - const installedPlugin = installedPlugins.find((p) => p.filename === filename && p.type === type) - - if (!installedPlugin) { - throw { - type: 'PLUGIN_NOT_INSTALLED', - filename, - agentId - } as PluginError - } - - // Get file path - const filePath = path.join(workdir, '.claude', type === 'agent' ? 'agents' : 'commands', filename) - - // Verify file exists - try { - await fs.promises.access(filePath, fs.constants.W_OK) - } catch (error) { - throw { - type: 'FILE_NOT_FOUND', - path: filePath - } as PluginError - } - - // Write content - try { - await fs.promises.writeFile(filePath, content, 'utf8') - logger.debug('Plugin content written successfully', { - filePath, - size: content.length - }) - - // Update content hash in database - const newContentHash = crypto.createHash('sha256').update(content).digest('hex') - const updatedPlugins = installedPlugins.map((p) => { - if (p.filename === filename && p.type === type) { - return { - ...p, - contentHash: newContentHash, - updatedAt: Date.now() - } - } - return p - }) - - await AgentService.getInstance().updateAgent(agentId, { - configuration: { - permission_mode: 'default', - max_turns: 100, - ...agent.configuration, - installed_plugins: updatedPlugins - } - }) - - logger.info('Plugin content updated successfully', { - agentId, - filename, - type, - newContentHash - }) - } catch (error) { - throw { - type: 'WRITE_FAILED', - path: filePath, - reason: error instanceof Error ? error.message : String(error) - } as PluginError - } - } - - // ============================================================================ - // Private Helper Methods - // ============================================================================ - - /** - * Get absolute path to plugins directory (handles packaged vs dev) - */ - private getPluginsBasePath(): string { - // Use the utility function which handles both dev and production correctly - if (app.isPackaged) { - return path.join(process.resourcesPath, 'claude-code-plugins') - } - return path.join(__dirname, '../../node_modules/claude-code-plugins/plugins') - } - - /** - * Scan plugin directory and return metadata for all plugins - */ - private async scanPluginDirectory(type: 'agent' | 'command'): Promise { - const basePath = this.getPluginsBasePath() - const typeDir = path.join(basePath, type === 'agent' ? 'agents' : 'commands') - - try { - await fs.promises.access(typeDir, fs.constants.R_OK) - } catch (error) { - logger.warn(`Plugin directory not accessible: ${typeDir}`, { - error: error instanceof Error ? error.message : String(error) - }) - return [] - } - - const plugins: PluginMetadata[] = [] - const categories = await fs.promises.readdir(typeDir, { withFileTypes: true }) - - for (const categoryEntry of categories) { - if (!categoryEntry.isDirectory()) { - continue - } - - const category = categoryEntry.name - const categoryPath = path.join(typeDir, category) - const files = await fs.promises.readdir(categoryPath, { withFileTypes: true }) - - for (const file of files) { - if (!file.isFile()) { - continue - } - - const ext = path.extname(file.name).toLowerCase() - if (!this.ALLOWED_EXTENSIONS.includes(ext)) { - continue - } - - try { - const filePath = path.join(categoryPath, file.name) - const sourcePath = path.join(type === 'agent' ? 'agents' : 'commands', category, file.name) - - const metadata = await parsePluginMetadata(filePath, sourcePath, category, type) - plugins.push(metadata) - } catch (error) { - logger.warn(`Failed to parse plugin: ${file.name}`, { - category, - error: error instanceof Error ? error.message : String(error) - }) - } - } - } - - return plugins - } - - /** - * Scan skills directory for skill folders (recursively) - */ - private async scanSkillDirectory(): Promise { - const basePath = this.getPluginsBasePath() - const skillsPath = path.join(basePath, 'skills') - - const skills: PluginMetadata[] = [] - - try { - // Check if skills directory exists - try { - await fs.promises.access(skillsPath) - } catch { - logger.warn('Skills directory not found', { skillsPath }) - return [] - } - - // Recursively find all directories containing SKILL.md - const skillDirectories = await findAllSkillDirectories(skillsPath, basePath) - - logger.info(`Found ${skillDirectories.length} skill directories`, { skillsPath }) - - // Parse metadata for each skill directory - for (const { folderPath, sourcePath } of skillDirectories) { - try { - const metadata = await parseSkillMetadata(folderPath, sourcePath, 'skills') - skills.push(metadata) - } catch (error) { - logger.warn(`Failed to parse skill folder: ${sourcePath}`, { - folderPath, - error: error instanceof Error ? error.message : String(error) - }) - // Continue with other skills - } - } - } catch (error) { - logger.error('Failed to scan skill directory', { skillsPath, error }) - // Return empty array on error - } - - return skills - } - - /** - * Validate source path to prevent path traversal attacks - */ - private validateSourcePath(sourcePath: string): void { - // Remove any path traversal attempts - const normalized = path.normalize(sourcePath) - - // Ensure no parent directory access - if (normalized.includes('..')) { - throw { - type: 'PATH_TRAVERSAL', - message: 'Path traversal detected', - path: sourcePath - } as PluginError - } - - // Ensure path is within plugins directory - const basePath = this.getPluginsBasePath() - const absolutePath = path.join(basePath, normalized) - const resolvedPath = path.resolve(absolutePath) - - if (!resolvedPath.startsWith(path.resolve(basePath))) { - throw { - type: 'PATH_TRAVERSAL', - message: 'Path outside plugins directory', - path: sourcePath - } as PluginError - } - } - - /** - * Validate workdir against agent's accessible paths - */ - private async validateWorkdir(workdir: string, agentId: string): Promise { - // Get agent from database - const agent = await AgentService.getInstance().getAgent(agentId) - - if (!agent) { - throw { - type: 'INVALID_WORKDIR', - workdir, - agentId, - message: 'Agent not found' - } as PluginError - } - - // Verify workdir is in agent's accessible_paths - if (!agent.accessible_paths?.includes(workdir)) { - throw { - type: 'INVALID_WORKDIR', - workdir, - agentId, - message: 'Workdir not in agent accessible paths' - } as PluginError - } - - // Verify workdir exists and is accessible - try { - await fs.promises.access(workdir, fs.constants.R_OK | fs.constants.W_OK) - } catch (error) { - throw { - type: 'WORKDIR_NOT_FOUND', - workdir, - message: 'Workdir does not exist or is not accessible' - } as PluginError - } - } - - /** - * Sanitize filename to remove unsafe characters (for agents/commands) - */ - private sanitizeFilename(filename: string): string { - // Remove path separators - let sanitized = filename.replace(/[/\\]/g, '_') - // Remove null bytes using String method to avoid control-regex lint error - sanitized = sanitized.replace(new RegExp(String.fromCharCode(0), 'g'), '') - // Limit to safe characters (alphanumeric, dash, underscore, dot) - sanitized = sanitized.replace(/[^a-zA-Z0-9._-]/g, '_') - - // Ensure .md extension - if (!sanitized.endsWith('.md') && !sanitized.endsWith('.markdown')) { - sanitized += '.md' - } - - return sanitized - } - - /** - * Sanitize folder name for skills (different rules than file names) - * NO dots allowed to avoid confusion with file extensions - */ - private sanitizeFolderName(folderName: string): string { - // Remove path separators - let sanitized = folderName.replace(/[/\\]/g, '_') - // Remove null bytes using String method to avoid control-regex lint error - sanitized = sanitized.replace(new RegExp(String.fromCharCode(0), 'g'), '') - // Limit to safe characters (alphanumeric, dash, underscore) - // NOTE: No dots allowed to avoid confusion with file extensions - sanitized = sanitized.replace(/[^a-zA-Z0-9_-]/g, '_') - - // Validate no extension was provided - if (folderName.includes('.')) { - logger.warn('Skill folder name contained dots, sanitized', { - original: folderName, - sanitized - }) - } - - return sanitized - } - - /** - * Validate plugin file (size, extension, frontmatter) - */ - private async validatePluginFile(filePath: string): Promise { - // Check file exists - let stats: fs.Stats - try { - stats = await fs.promises.stat(filePath) - } catch (error) { - throw { - type: 'FILE_NOT_FOUND', - path: filePath - } as PluginError - } - - // Check file size - if (stats.size > this.config.maxFileSize) { - throw { - type: 'FILE_TOO_LARGE', - size: stats.size, - max: this.config.maxFileSize - } as PluginError - } - - // Check file extension - const ext = path.extname(filePath).toLowerCase() - if (!this.ALLOWED_EXTENSIONS.includes(ext)) { - throw { - type: 'INVALID_FILE_TYPE', - extension: ext - } as PluginError - } - - // Validate frontmatter can be parsed safely - // This is handled by parsePluginMetadata which uses FAILSAFE_SCHEMA - try { - const category = path.basename(path.dirname(filePath)) - const sourcePath = path.relative(this.getPluginsBasePath(), filePath) - const type = sourcePath.startsWith('agents') ? 'agent' : 'command' - - await parsePluginMetadata(filePath, sourcePath, category, type) - } catch (error) { - throw { - type: 'INVALID_METADATA', - reason: 'Failed to parse frontmatter', - path: filePath - } as PluginError - } - } - - /** - * Calculate SHA-256 hash of file - */ - private async calculateFileHash(filePath: string): Promise { - const content = await fs.promises.readFile(filePath, 'utf8') - return crypto.createHash('sha256').update(content).digest('hex') - } - - /** - * Ensure .claude subdirectory exists for the given plugin type - */ - private async ensureClaudeDirectory(workdir: string, type: PluginType): Promise { - const claudeDir = path.join(workdir, '.claude') - - let subDir: string - if (type === 'agent') { - subDir = 'agents' - } else if (type === 'command') { - subDir = 'commands' - } else if (type === 'skill') { - subDir = 'skills' - } else { - throw new Error(`Unknown plugin type: ${type}`) - } - - const typeDir = path.join(claudeDir, subDir) - - try { - await fs.promises.mkdir(typeDir, { recursive: true }) - logger.debug('Ensured directory exists', { typeDir }) - } catch (error) { - logger.error('Failed to create directory', { - typeDir, - error: error instanceof Error ? error.message : String(error) - }) - throw { - type: 'PERMISSION_DENIED', - path: typeDir - } as PluginError - } - } - - /** - * Transactional install operation - * Steps: - * 1. Copy to temp location - * 2. Update database - * 3. Move to final location (atomic) - * Rollback on error - */ - private async installTransaction( - agent: AgentEntity, - sourceAbsolutePath: string, - destPath: string, - metadata: PluginMetadata - ): Promise { - const tempPath = `${destPath}.tmp` - let fileCopied = false - - try { - // Step 1: Copy file to temporary location - await fs.promises.copyFile(sourceAbsolutePath, tempPath) - fileCopied = true - logger.debug('File copied to temp location', { tempPath }) - - // Step 2: Update agent configuration in database - const existingPlugins = agent.configuration?.installed_plugins || [] - const updatedPlugins = [ - ...existingPlugins, - { - sourcePath: metadata.sourcePath, - filename: metadata.filename, - type: metadata.type, - name: metadata.name, - description: metadata.description, - allowed_tools: metadata.allowed_tools, - tools: metadata.tools, - category: metadata.category, - tags: metadata.tags, - version: metadata.version, - author: metadata.author, - contentHash: metadata.contentHash, - installedAt: Date.now() - } - ] - - await AgentService.getInstance().updateAgent(agent.id, { - configuration: { - permission_mode: 'default', - max_turns: 100, - ...agent.configuration, - installed_plugins: updatedPlugins - } - }) - - logger.debug('Agent configuration updated', { agentId: agent.id }) - - // Step 3: Move temp file to final location (atomic on same filesystem) - await fs.promises.rename(tempPath, destPath) - logger.debug('File moved to final location', { destPath }) - } catch (error) { - // Rollback: delete temp file if it exists - if (fileCopied) { - try { - await fs.promises.unlink(tempPath) - logger.debug('Rolled back temp file', { tempPath }) - } catch (unlinkError) { - logger.error('Failed to rollback temp file', { - tempPath, - error: unlinkError instanceof Error ? unlinkError.message : String(unlinkError) - }) - } - } - - throw { - type: 'TRANSACTION_FAILED', - operation: 'install', - reason: error instanceof Error ? error.message : String(error) - } as PluginError - } - } - - /** - * Transactional uninstall operation - * Steps: - * 1. Update database - * 2. Delete file - * Rollback database on error - */ - private async uninstallTransaction(agent: AgentEntity, filename: string, type: 'agent' | 'command'): Promise { - const workdir = agent.accessible_paths?.[0] - if (!workdir) { - throw { - type: 'INVALID_WORKDIR', - agentId: agent.id, - workdir: '', - message: 'Agent has no accessible paths' - } as PluginError - } - - const filePath = path.join(workdir, '.claude', type === 'agent' ? 'agents' : 'commands', filename) - - // Step 1: Update database first (easier to rollback file operations) - const originalPlugins = agent.configuration?.installed_plugins || [] - const updatedPlugins = originalPlugins.filter((p) => !(p.filename === filename && p.type === type)) - - let dbUpdated = false - - try { - await AgentService.getInstance().updateAgent(agent.id, { - configuration: { - permission_mode: 'default', - max_turns: 100, - ...agent.configuration, - installed_plugins: updatedPlugins - } - }) - dbUpdated = true - logger.debug('Agent configuration updated', { agentId: agent.id }) - - // Step 2: Delete file - try { - await fs.promises.unlink(filePath) - logger.debug('Plugin file deleted', { filePath }) - } catch (error) { - const nodeError = error as NodeJS.ErrnoException - if (nodeError.code !== 'ENOENT') { - throw error // File should exist, re-throw if not ENOENT - } - logger.warn('Plugin file already deleted', { filePath }) - } - } catch (error) { - // Rollback: restore database if file deletion failed - if (dbUpdated) { - try { - await AgentService.getInstance().updateAgent(agent.id, { - configuration: { - permission_mode: 'default', - max_turns: 100, - ...agent.configuration, - installed_plugins: originalPlugins - } - }) - logger.debug('Rolled back database update', { agentId: agent.id }) - } catch (rollbackError) { - logger.error('Failed to rollback database', { - agentId: agent.id, - error: rollbackError instanceof Error ? rollbackError.message : String(rollbackError) - }) - } - } - - throw { - type: 'TRANSACTION_FAILED', - operation: 'uninstall', - reason: error instanceof Error ? error.message : String(error) - } as PluginError - } - } - - /** - * Install a skill (copy entire folder) - */ - private async installSkill( - agent: AgentEntity, - sourceAbsolutePath: string, - destPath: string, - metadata: PluginMetadata - ): Promise { - const logContext = logger.withContext('installSkill') - - // Step 1: If destination exists, remove it first (overwrite behavior) - try { - await fs.promises.access(destPath) - // Exists - remove it - await deleteDirectoryRecursive(destPath) - logContext.info('Removed existing skill folder', { destPath }) - } catch { - // Doesn't exist - nothing to remove - } - - // Step 2: Copy folder to temporary location - const tempPath = `${destPath}.tmp` - let folderCopied = false - - try { - // Copy to temp location - await copyDirectoryRecursive(sourceAbsolutePath, tempPath) - folderCopied = true - logContext.info('Skill folder copied to temp location', { tempPath }) - - // Step 3: Update agent configuration in database - const updatedPlugins = [ - ...(agent.configuration?.installed_plugins || []).filter( - (p) => !(p.filename === metadata.filename && p.type === 'skill') - ), - { - sourcePath: metadata.sourcePath, - filename: metadata.filename, // Folder name, no extension - type: metadata.type, - name: metadata.name, - description: metadata.description, - tools: metadata.tools, - category: metadata.category, - tags: metadata.tags, - version: metadata.version, - author: metadata.author, - contentHash: metadata.contentHash, - installedAt: Date.now() - } - ] - - await AgentService.getInstance().updateAgent(agent.id, { - configuration: { - permission_mode: 'default', - max_turns: 100, - ...agent.configuration, - installed_plugins: updatedPlugins - } - }) - - logContext.info('Agent configuration updated', { agentId: agent.id }) - - // Step 4: Move temp folder to final location (atomic on same filesystem) - await fs.promises.rename(tempPath, destPath) - logContext.info('Skill folder moved to final location', { destPath }) - } catch (error) { - // Rollback: delete temp folder if it exists - if (folderCopied) { - try { - await deleteDirectoryRecursive(tempPath) - logContext.info('Rolled back temp folder', { tempPath }) - } catch (unlinkError) { - logContext.error('Failed to rollback temp folder', { tempPath, error: unlinkError }) - } - } - - throw { - type: 'TRANSACTION_FAILED', - operation: 'install-skill', - reason: error instanceof Error ? error.message : String(error) - } as PluginError - } - } - - /** - * Uninstall a skill (remove entire folder) - */ - private async uninstallSkill(agent: AgentEntity, folderName: string): Promise { - const logContext = logger.withContext('uninstallSkill') - const workdir = agent.accessible_paths?.[0] - - if (!workdir) { - throw { - type: 'INVALID_WORKDIR', - agentId: agent.id, - workdir: '', - message: 'Agent has no accessible paths' - } as PluginError - } - - const skillPath = path.join(workdir, '.claude', 'skills', folderName) - - // Step 1: Update database first - const originalPlugins = agent.configuration?.installed_plugins || [] - const updatedPlugins = originalPlugins.filter((p) => !(p.filename === folderName && p.type === 'skill')) - - let dbUpdated = false - - try { - await AgentService.getInstance().updateAgent(agent.id, { - configuration: { - permission_mode: 'default', - max_turns: 100, - ...agent.configuration, - installed_plugins: updatedPlugins - } - }) - dbUpdated = true - logContext.info('Agent configuration updated', { agentId: agent.id }) - - // Step 2: Delete folder - try { - await deleteDirectoryRecursive(skillPath) - logContext.info('Skill folder deleted', { skillPath }) - } catch (error) { - if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { - throw error // Folder should exist, re-throw if not ENOENT - } - logContext.warn('Skill folder already deleted', { skillPath }) - } - } catch (error) { - // Rollback: restore database if folder deletion failed - if (dbUpdated) { - try { - await AgentService.getInstance().updateAgent(agent.id, { - configuration: { - permission_mode: 'default', - max_turns: 100, - ...agent.configuration, - installed_plugins: originalPlugins - } - }) - logContext.info('Rolled back database update', { agentId: agent.id }) - } catch (rollbackError) { - logContext.error('Failed to rollback database', { agentId: agent.id, error: rollbackError }) - } - } - - throw { - type: 'TRANSACTION_FAILED', - operation: 'uninstall-skill', - reason: error instanceof Error ? error.message : String(error) - } as PluginError - } - } -} - -export const pluginService = PluginService.getInstance() diff --git a/src/main/services/agents/plugins/PluginCacheStore.ts b/src/main/services/agents/plugins/PluginCacheStore.ts new file mode 100644 index 0000000000..77b427f4e8 --- /dev/null +++ b/src/main/services/agents/plugins/PluginCacheStore.ts @@ -0,0 +1,426 @@ +import { loggerService } from '@logger' +import { findAllSkillDirectories, parsePluginMetadata, parseSkillMetadata } from '@main/utils/markdownParser' +import type { CachedPluginsData, InstalledPlugin, PluginError, PluginMetadata, PluginType } from '@types' +import { CachedPluginsDataSchema } from '@types' +import * as fs from 'fs' +import * as path from 'path' + +const logger = loggerService.withContext('PluginCacheStore') + +interface PluginCacheStoreDeps { + allowedExtensions: string[] + getPluginDirectoryName: (type: PluginType) => 'agents' | 'commands' | 'skills' + getClaudeBasePath: (workdir: string) => string + getClaudePluginDirectory: (workdir: string, type: PluginType) => string + getPluginsBasePath: () => string +} + +export class PluginCacheStore { + constructor(private readonly deps: PluginCacheStoreDeps) {} + + async listAvailableFilePlugins(type: 'agent' | 'command'): Promise { + const basePath = this.deps.getPluginsBasePath() + const directory = path.join(basePath, this.deps.getPluginDirectoryName(type)) + + try { + await fs.promises.access(directory, fs.constants.R_OK) + } catch (error) { + logger.warn(`Plugin directory not accessible: ${directory}`, { + error: error instanceof Error ? error.message : String(error) + }) + return [] + } + + const plugins: PluginMetadata[] = [] + const categories = await fs.promises.readdir(directory, { withFileTypes: true }) + + for (const categoryEntry of categories) { + if (!categoryEntry.isDirectory()) { + continue + } + + const category = categoryEntry.name + const categoryPath = path.join(directory, category) + const files = await fs.promises.readdir(categoryPath, { withFileTypes: true }) + + for (const file of files) { + if (!file.isFile()) { + continue + } + + const ext = path.extname(file.name).toLowerCase() + if (!this.deps.allowedExtensions.includes(ext)) { + continue + } + + try { + const filePath = path.join(categoryPath, file.name) + const sourcePath = path.join(this.deps.getPluginDirectoryName(type), category, file.name) + const metadata = await parsePluginMetadata(filePath, sourcePath, category, type) + plugins.push(metadata) + } catch (error) { + logger.warn(`Failed to parse plugin: ${file.name}`, { + category, + error: error instanceof Error ? error.message : String(error) + }) + } + } + } + + return plugins + } + + async listAvailableSkills(): Promise { + const basePath = this.deps.getPluginsBasePath() + const skillsPath = path.join(basePath, this.deps.getPluginDirectoryName('skill')) + const skills: PluginMetadata[] = [] + + try { + await fs.promises.access(skillsPath) + } catch { + logger.warn('Skills directory not found', { skillsPath }) + return [] + } + + try { + const skillDirectories = await findAllSkillDirectories(skillsPath, basePath) + logger.info(`Found ${skillDirectories.length} skill directories`, { skillsPath }) + + for (const { folderPath, sourcePath } of skillDirectories) { + try { + const metadata = await parseSkillMetadata(folderPath, sourcePath, 'skills') + skills.push(metadata) + } catch (error) { + logger.warn(`Failed to parse skill folder: ${sourcePath}`, { + folderPath, + error: error instanceof Error ? error.message : String(error) + }) + } + } + } catch (error) { + logger.error('Failed to scan skill directory', { + skillsPath, + error: error instanceof Error ? error.message : String(error) + }) + } + + return skills + } + + async readSourceContent(sourcePath: string): Promise { + const absolutePath = this.resolveSourcePath(sourcePath) + + try { + await fs.promises.access(absolutePath, fs.constants.R_OK) + } catch { + throw { + type: 'FILE_NOT_FOUND', + path: sourcePath + } as PluginError + } + + try { + return await fs.promises.readFile(absolutePath, 'utf-8') + } catch (error) { + throw { + type: 'READ_FAILED', + path: sourcePath, + reason: error instanceof Error ? error.message : String(error) + } as PluginError + } + } + + resolveSourcePath(sourcePath: string): string { + const normalized = path.normalize(sourcePath) + + if (normalized.includes('..')) { + throw { + type: 'PATH_TRAVERSAL', + message: 'Path traversal detected', + path: sourcePath + } as PluginError + } + + const basePath = this.deps.getPluginsBasePath() + const absolutePath = path.join(basePath, normalized) + const resolvedPath = path.resolve(absolutePath) + + if (!resolvedPath.startsWith(path.resolve(basePath))) { + throw { + type: 'PATH_TRAVERSAL', + message: 'Path outside plugins directory', + path: sourcePath + } as PluginError + } + + return resolvedPath + } + + async ensureSkillSourceDirectory(sourceAbsolutePath: string, sourcePath: string): Promise { + let stats: fs.Stats + try { + stats = await fs.promises.stat(sourceAbsolutePath) + } catch { + throw { + type: 'FILE_NOT_FOUND', + path: sourceAbsolutePath + } as PluginError + } + + if (!stats.isDirectory()) { + throw { + type: 'INVALID_METADATA', + reason: 'Skill source is not a directory', + path: sourcePath + } as PluginError + } + } + + async validatePluginFile(filePath: string, maxFileSize: number): Promise { + let stats: fs.Stats + try { + stats = await fs.promises.stat(filePath) + } catch { + throw { + type: 'FILE_NOT_FOUND', + path: filePath + } as PluginError + } + + if (stats.size > maxFileSize) { + throw { + type: 'FILE_TOO_LARGE', + size: stats.size, + max: maxFileSize + } as PluginError + } + + const ext = path.extname(filePath).toLowerCase() + if (!this.deps.allowedExtensions.includes(ext)) { + throw { + type: 'INVALID_FILE_TYPE', + extension: ext + } as PluginError + } + + try { + const basePath = this.deps.getPluginsBasePath() + const relativeSourcePath = path.relative(basePath, filePath) + const segments = relativeSourcePath.split(path.sep) + const rootDir = segments[0] + const agentDir = this.deps.getPluginDirectoryName('agent') + const type: 'agent' | 'command' = rootDir === agentDir ? 'agent' : 'command' + const category = path.basename(path.dirname(filePath)) + + await parsePluginMetadata(filePath, relativeSourcePath, category, type) + } catch (error) { + throw { + type: 'INVALID_METADATA', + reason: 'Failed to parse frontmatter', + path: filePath + } as PluginError + } + } + + async listInstalled(workdir: string): Promise { + const claudePath = this.deps.getClaudeBasePath(workdir) + const cacheData = await this.readCacheFile(claudePath) + + if (cacheData) { + logger.debug(`Loaded ${cacheData.plugins.length} plugins from cache`, { workdir }) + return cacheData.plugins + } + + logger.info('Cache read failed, rebuilding from filesystem', { workdir }) + return await this.rebuild(workdir) + } + + async upsert(workdir: string, plugin: InstalledPlugin): Promise { + const claudePath = this.deps.getClaudeBasePath(workdir) + let cacheData = await this.readCacheFile(claudePath) + let plugins = cacheData?.plugins + + if (!plugins) { + plugins = await this.rebuild(workdir) + cacheData = { + version: 1, + lastUpdated: Date.now(), + plugins + } + } + + const updatedPlugin: InstalledPlugin = { + ...plugin, + metadata: { + ...plugin.metadata, + installedAt: plugin.metadata.installedAt ?? Date.now() + } + } + + const index = plugins.findIndex((p) => p.filename === updatedPlugin.filename && p.type === updatedPlugin.type) + if (index >= 0) { + plugins[index] = updatedPlugin + } else { + plugins.push(updatedPlugin) + } + + const data: CachedPluginsData = { + version: cacheData?.version ?? 1, + lastUpdated: Date.now(), + plugins + } + + await fs.promises.mkdir(claudePath, { recursive: true }) + await this.writeCacheFile(claudePath, data) + } + + async remove(workdir: string, filename: string, type: PluginType): Promise { + const claudePath = this.deps.getClaudeBasePath(workdir) + let cacheData = await this.readCacheFile(claudePath) + let plugins = cacheData?.plugins + + if (!plugins) { + plugins = await this.rebuild(workdir) + cacheData = { + version: 1, + lastUpdated: Date.now(), + plugins + } + } + + const filtered = plugins.filter((p) => !(p.filename === filename && p.type === type)) + + const data: CachedPluginsData = { + version: cacheData?.version ?? 1, + lastUpdated: Date.now(), + plugins: filtered + } + + await fs.promises.mkdir(claudePath, { recursive: true }) + await this.writeCacheFile(claudePath, data) + } + + async rebuild(workdir: string): Promise { + logger.info('Rebuilding plugin cache from filesystem', { workdir }) + + const claudePath = this.deps.getClaudeBasePath(workdir) + + try { + await fs.promises.access(claudePath, fs.constants.R_OK) + } catch { + logger.warn('.claude directory not found, returning empty plugin list', { claudePath }) + return [] + } + + const plugins: InstalledPlugin[] = [] + + await Promise.all([ + this.collectFilePlugins(workdir, 'agent', plugins), + this.collectFilePlugins(workdir, 'command', plugins), + this.collectSkillPlugins(workdir, plugins) + ]) + + try { + const cacheData: CachedPluginsData = { + version: 1, + lastUpdated: Date.now(), + plugins + } + await this.writeCacheFile(claudePath, cacheData) + logger.info(`Rebuilt cache with ${plugins.length} plugins`, { workdir }) + } catch (error) { + logger.error('Failed to write cache file after rebuild', { + error: error instanceof Error ? error.message : String(error) + }) + } + + return plugins + } + + private async collectFilePlugins( + workdir: string, + type: Exclude, + plugins: InstalledPlugin[] + ): Promise { + const directory = this.deps.getClaudePluginDirectory(workdir, type) + + try { + await fs.promises.access(directory, fs.constants.R_OK) + } catch { + logger.debug(`${type} directory not found or not accessible`, { directory }) + return + } + + const files = await fs.promises.readdir(directory, { withFileTypes: true }) + + for (const file of files) { + if (!file.isFile()) { + continue + } + + const ext = path.extname(file.name).toLowerCase() + if (!this.deps.allowedExtensions.includes(ext)) { + continue + } + + try { + const filePath = path.join(directory, file.name) + const sourcePath = path.join(this.deps.getPluginDirectoryName(type), file.name) + const metadata = await parsePluginMetadata(filePath, sourcePath, this.deps.getPluginDirectoryName(type), type) + plugins.push({ filename: file.name, type, metadata }) + } catch (error) { + logger.warn(`Failed to parse ${type} plugin: ${file.name}`, { + error: error instanceof Error ? error.message : String(error) + }) + } + } + } + + private async collectSkillPlugins(workdir: string, plugins: InstalledPlugin[]): Promise { + const skillsPath = this.deps.getClaudePluginDirectory(workdir, 'skill') + const claudePath = this.deps.getClaudeBasePath(workdir) + + try { + await fs.promises.access(skillsPath, fs.constants.R_OK) + } catch { + logger.debug('Skills directory not found or not accessible', { skillsPath }) + return + } + + const skillDirectories = await findAllSkillDirectories(skillsPath, claudePath) + + for (const { folderPath, sourcePath } of skillDirectories) { + try { + const metadata = await parseSkillMetadata(folderPath, sourcePath, 'skills') + plugins.push({ filename: metadata.filename, type: 'skill', metadata }) + } catch (error) { + logger.warn(`Failed to parse skill plugin: ${sourcePath}`, { + error: error instanceof Error ? error.message : String(error) + }) + } + } + } + + private async readCacheFile(claudePath: string): Promise { + const cachePath = path.join(claudePath, 'plugins.json') + try { + const content = await fs.promises.readFile(cachePath, 'utf-8') + const data = JSON.parse(content) + return CachedPluginsDataSchema.parse(data) + } catch (err) { + logger.warn(`Failed to read cache file at ${cachePath}`, { + error: err instanceof Error ? err.message : String(err) + }) + return null + } + } + + private async writeCacheFile(claudePath: string, data: CachedPluginsData): Promise { + const cachePath = path.join(claudePath, 'plugins.json') + const tempPath = `${cachePath}.tmp` + + const content = JSON.stringify(data, null, 2) + await fs.promises.writeFile(tempPath, content, 'utf-8') + await fs.promises.rename(tempPath, cachePath) + } +} diff --git a/src/main/services/agents/plugins/PluginInstaller.ts b/src/main/services/agents/plugins/PluginInstaller.ts new file mode 100644 index 0000000000..75acfc211f --- /dev/null +++ b/src/main/services/agents/plugins/PluginInstaller.ts @@ -0,0 +1,149 @@ +import { loggerService } from '@logger' +import { copyDirectoryRecursive, deleteDirectoryRecursive } from '@main/utils/fileOperations' +import type { PluginError } from '@types' +import * as crypto from 'crypto' +import * as fs from 'fs' + +const logger = loggerService.withContext('PluginInstaller') + +export class PluginInstaller { + async installFilePlugin(agentId: string, sourceAbsolutePath: string, destPath: string): Promise { + const tempPath = `${destPath}.tmp` + let fileCopied = false + + try { + await fs.promises.copyFile(sourceAbsolutePath, tempPath) + fileCopied = true + logger.debug('File copied to temp location', { agentId, tempPath }) + + await fs.promises.rename(tempPath, destPath) + logger.debug('File moved to final location', { agentId, destPath }) + } catch (error) { + if (fileCopied) { + await this.safeUnlink(tempPath, 'temp file') + } + throw this.toPluginError('install', error) + } + } + + async uninstallFilePlugin( + agentId: string, + filename: string, + type: 'agent' | 'command', + filePath: string + ): Promise { + try { + await fs.promises.unlink(filePath) + logger.debug('Plugin file deleted', { agentId, filename, type, filePath }) + } catch (error) { + const nodeError = error as NodeJS.ErrnoException + if (nodeError.code !== 'ENOENT') { + throw this.toPluginError('uninstall', error) + } + logger.warn('Plugin file already deleted', { agentId, filename, type, filePath }) + } + } + + async updateFilePluginContent(agentId: string, filePath: string, content: string): Promise { + try { + await fs.promises.access(filePath, fs.constants.W_OK) + } catch { + throw { + type: 'FILE_NOT_FOUND', + path: filePath + } as PluginError + } + + try { + await fs.promises.writeFile(filePath, content, 'utf8') + logger.debug('Plugin content written successfully', { + agentId, + filePath, + size: Buffer.byteLength(content, 'utf8') + }) + } catch (error) { + throw { + type: 'WRITE_FAILED', + path: filePath, + reason: error instanceof Error ? error.message : String(error) + } as PluginError + } + + return crypto.createHash('sha256').update(content).digest('hex') + } + + async installSkill(agentId: string, sourceAbsolutePath: string, destPath: string): Promise { + const logContext = logger.withContext('installSkill') + let folderCopied = false + const tempPath = `${destPath}.tmp` + + try { + try { + await fs.promises.access(destPath) + await deleteDirectoryRecursive(destPath) + logContext.info('Removed existing skill folder', { agentId, destPath }) + } catch { + // No existing folder + } + + await copyDirectoryRecursive(sourceAbsolutePath, tempPath) + folderCopied = true + logContext.info('Skill folder copied to temp location', { agentId, tempPath }) + + await fs.promises.rename(tempPath, destPath) + logContext.info('Skill folder moved to final location', { agentId, destPath }) + } catch (error) { + if (folderCopied) { + await this.safeRemoveDirectory(tempPath, 'temp folder') + } + throw this.toPluginError('install-skill', error) + } + } + + async uninstallSkill(agentId: string, folderName: string, skillPath: string): Promise { + const logContext = logger.withContext('uninstallSkill') + + try { + await deleteDirectoryRecursive(skillPath) + logContext.info('Skill folder deleted', { agentId, folderName, skillPath }) + } catch (error) { + const nodeError = error as NodeJS.ErrnoException + if (nodeError.code !== 'ENOENT') { + throw this.toPluginError('uninstall-skill', error) + } + logContext.warn('Skill folder already deleted', { agentId, folderName, skillPath }) + } + } + + private toPluginError(operation: string, error: unknown): PluginError { + return { + type: 'TRANSACTION_FAILED', + operation, + reason: error instanceof Error ? error.message : String(error) + } + } + + private async safeUnlink(targetPath: string, label: string): Promise { + try { + await fs.promises.unlink(targetPath) + logger.debug(`Rolled back ${label}`, { targetPath }) + } catch (unlinkError) { + logger.error(`Failed to rollback ${label}`, { + targetPath, + error: unlinkError instanceof Error ? unlinkError.message : String(unlinkError) + }) + } + } + + private async safeRemoveDirectory(targetPath: string, label: string): Promise { + try { + await deleteDirectoryRecursive(targetPath) + logger.info(`Rolled back ${label}`, { targetPath }) + } catch (unlinkError) { + logger.error(`Failed to rollback ${label}`, { + targetPath, + error: unlinkError instanceof Error ? unlinkError.message : String(unlinkError) + }) + } + } +} diff --git a/src/main/services/agents/plugins/PluginService.ts b/src/main/services/agents/plugins/PluginService.ts new file mode 100644 index 0000000000..3076522a26 --- /dev/null +++ b/src/main/services/agents/plugins/PluginService.ts @@ -0,0 +1,614 @@ +import { loggerService } from '@logger' +import { parsePluginMetadata, parseSkillMetadata } from '@main/utils/markdownParser' +import type { + GetAgentResponse, + InstalledPlugin, + InstallPluginOptions, + ListAvailablePluginsResult, + PluginError, + PluginMetadata, + PluginType, + UninstallPluginOptions +} from '@types' +import { app } from 'electron' +import * as fs from 'fs' +import * as path from 'path' + +import { AgentService } from '../services/AgentService' +import { PluginCacheStore } from './PluginCacheStore' +import { PluginInstaller } from './PluginInstaller' + +const logger = loggerService.withContext('PluginService') + +interface PluginServiceConfig { + maxFileSize: number // bytes + cacheTimeout: number // milliseconds +} + +/** + * PluginService manages agent and command plugins from resources directory. + * + * Features: + * - Singleton pattern for consistent state management + * - Caching of available plugins for performance + * - Security validation (path traversal, file size, extensions) + * - Transactional install/uninstall operations + * - Integration with AgentService for metadata persistence + */ +export class PluginService { + private static instance: PluginService | null = null + + private availablePluginsCache: ListAvailablePluginsResult | null = null + private cacheTimestamp = 0 + private config: PluginServiceConfig + private readonly cacheStore: PluginCacheStore + private readonly installer: PluginInstaller + private readonly agentService: AgentService + + private readonly ALLOWED_EXTENSIONS = ['.md', '.markdown'] + + private constructor(config?: Partial) { + this.config = { + maxFileSize: config?.maxFileSize ?? 1024 * 1024, // 1MB default + cacheTimeout: config?.cacheTimeout ?? 5 * 60 * 1000 // 5 minutes default + } + this.agentService = AgentService.getInstance() + this.cacheStore = new PluginCacheStore({ + allowedExtensions: this.ALLOWED_EXTENSIONS, + getPluginDirectoryName: this.getPluginDirectoryName.bind(this), + getClaudeBasePath: this.getClaudeBasePath.bind(this), + getClaudePluginDirectory: this.getClaudePluginDirectory.bind(this), + getPluginsBasePath: this.getPluginsBasePath.bind(this) + }) + this.installer = new PluginInstaller() + + logger.info('PluginService initialized', { + maxFileSize: this.config.maxFileSize, + cacheTimeout: this.config.cacheTimeout + }) + } + + /** + * Get singleton instance + */ + static getInstance(config?: Partial): PluginService { + if (!PluginService.instance) { + PluginService.instance = new PluginService(config) + } + return PluginService.instance + } + + /** + * List all available plugins from resources directory (with caching) + */ + async listAvailable(): Promise { + const now = Date.now() + + // Return cached data if still valid + if (this.availablePluginsCache && now - this.cacheTimestamp < this.config.cacheTimeout) { + logger.debug('Returning cached plugin list', { + cacheAge: now - this.cacheTimestamp + }) + return this.availablePluginsCache + } + + logger.info('Scanning available plugins') + + // Scan all plugin types + const [agents, commands, skills] = await Promise.all([ + this.cacheStore.listAvailableFilePlugins('agent'), + this.cacheStore.listAvailableFilePlugins('command'), + this.cacheStore.listAvailableSkills() + ]) + + const result: ListAvailablePluginsResult = { + agents, + commands, + skills, // NEW: include skills + total: agents.length + commands.length + skills.length + } + + // Update cache + this.availablePluginsCache = result + this.cacheTimestamp = now + + logger.info('Available plugins scanned', { + agentsCount: agents.length, + commandsCount: commands.length, + skillsCount: skills.length, + total: result.total + }) + + return result + } + + /** + * Install plugin with validation and transactional safety + */ + async install(options: InstallPluginOptions): Promise { + logger.info('Installing plugin', options) + + const context = await this.prepareInstallContext(options) + + if (options.type === 'skill') { + return await this.installSkillPlugin(options, context) + } + + return await this.installFilePlugin(options, context) + } + + private async prepareInstallContext(options: InstallPluginOptions): Promise<{ + agent: GetAgentResponse + workdir: string + sourceAbsolutePath: string + }> { + const agent = await this.getAgentOrThrow(options.agentId) + const workdir = this.getWorkdirOrThrow(agent, options.agentId) + + await this.validateWorkdir(agent, workdir) + + const sourceAbsolutePath = this.cacheStore.resolveSourcePath(options.sourcePath) + + return { agent, workdir, sourceAbsolutePath } + } + + private async installSkillPlugin( + options: InstallPluginOptions, + context: { + agent: GetAgentResponse + workdir: string + sourceAbsolutePath: string + } + ): Promise { + const { agent, workdir, sourceAbsolutePath } = context + + await this.cacheStore.ensureSkillSourceDirectory(sourceAbsolutePath, options.sourcePath) + + const metadata = await parseSkillMetadata(sourceAbsolutePath, options.sourcePath, 'skills') + const sanitizedFolderName = this.sanitizeFolderName(metadata.filename) + + await this.ensureClaudeDirectory(workdir, 'skill') + const destPath = this.getClaudePluginPath(workdir, 'skill', sanitizedFolderName) + + metadata.filename = sanitizedFolderName + + await this.installer.installSkill(agent.id, sourceAbsolutePath, destPath) + + const installedAt = Date.now() + const metadataWithInstall: PluginMetadata = { + ...metadata, + filename: sanitizedFolderName, + installedAt, + updatedAt: metadata.updatedAt ?? installedAt, + type: 'skill' + } + const installedPlugin: InstalledPlugin = { + filename: sanitizedFolderName, + type: 'skill', + metadata: metadataWithInstall + } + + await this.cacheStore.upsert(workdir, installedPlugin) + this.upsertAgentPlugin(agent, installedPlugin) + + logger.info('Skill installed successfully', { + agentId: options.agentId, + sourcePath: options.sourcePath, + folderName: sanitizedFolderName + }) + + return metadataWithInstall + } + + private async installFilePlugin( + options: InstallPluginOptions, + context: { + agent: GetAgentResponse + workdir: string + sourceAbsolutePath: string + } + ): Promise { + const { agent, workdir, sourceAbsolutePath } = context + + if (options.type === 'skill') { + throw { + type: 'INVALID_FILE_TYPE', + extension: options.type + } as PluginError + } + + const filePluginType: 'agent' | 'command' = options.type + + await this.cacheStore.validatePluginFile(sourceAbsolutePath, this.config.maxFileSize) + + const category = path.basename(path.dirname(options.sourcePath)) + const metadata = await parsePluginMetadata(sourceAbsolutePath, options.sourcePath, category, filePluginType) + + const sanitizedFilename = this.sanitizeFilename(metadata.filename) + metadata.filename = sanitizedFilename + + await this.ensureClaudeDirectory(workdir, filePluginType) + const destPath = this.getClaudePluginPath(workdir, filePluginType, sanitizedFilename) + + await this.installer.installFilePlugin(agent.id, sourceAbsolutePath, destPath) + + const installedAt = Date.now() + const metadataWithInstall: PluginMetadata = { + ...metadata, + filename: sanitizedFilename, + installedAt, + updatedAt: metadata.updatedAt ?? installedAt, + type: filePluginType + } + const installedPlugin: InstalledPlugin = { + filename: sanitizedFilename, + type: filePluginType, + metadata: metadataWithInstall + } + + await this.cacheStore.upsert(workdir, installedPlugin) + this.upsertAgentPlugin(agent, installedPlugin) + + logger.info('Plugin installed successfully', { + agentId: options.agentId, + filename: sanitizedFilename, + type: filePluginType + }) + + return metadataWithInstall + } + + /** + * Uninstall plugin with cleanup + */ + async uninstall(options: UninstallPluginOptions): Promise { + logger.info('Uninstalling plugin', options) + + const agent = await this.getAgentOrThrow(options.agentId) + const workdir = this.getWorkdirOrThrow(agent, options.agentId) + + await this.validateWorkdir(agent, workdir) + + if (options.type === 'skill') { + const sanitizedFolderName = this.sanitizeFolderName(options.filename) + const skillPath = this.getClaudePluginPath(workdir, 'skill', sanitizedFolderName) + + await this.installer.uninstallSkill(agent.id, sanitizedFolderName, skillPath) + await this.cacheStore.remove(workdir, sanitizedFolderName, 'skill') + this.removeAgentPlugin(agent, sanitizedFolderName, 'skill') + + logger.info('Skill uninstalled successfully', { + agentId: options.agentId, + folderName: sanitizedFolderName + }) + + return + } + + const sanitizedFilename = this.sanitizeFilename(options.filename) + const filePath = this.getClaudePluginPath(workdir, options.type, sanitizedFilename) + + await this.installer.uninstallFilePlugin(agent.id, sanitizedFilename, options.type, filePath) + await this.cacheStore.remove(workdir, sanitizedFilename, options.type) + this.removeAgentPlugin(agent, sanitizedFilename, options.type) + + logger.info('Plugin uninstalled successfully', { + agentId: options.agentId, + filename: sanitizedFilename, + type: options.type + }) + } + + /** + * List installed plugins for an agent (from database + filesystem validation) + */ + async listInstalled(agentId: string): Promise { + logger.debug('Listing installed plugins', { agentId }) + + const agent = await this.getAgentOrThrow(agentId) + + const workdir = agent.accessible_paths?.[0] + + if (!workdir) { + logger.warn('Agent has no accessible paths', { agentId }) + return [] + } + + const plugins = await this.listInstalledFromCache(workdir) + + logger.debug('Listed installed plugins from cache', { + agentId, + count: plugins.length + }) + + return plugins + } + + /** + * Invalidate plugin cache (for development/testing) + */ + invalidateCache(): void { + this.availablePluginsCache = null + this.cacheTimestamp = 0 + logger.info('Plugin cache invalidated') + } + + // ============================================================================ + // Cache File Management (for installed plugins) + // ============================================================================ + + /** + * Read cache file from .claude/plugins.json + * Returns null if cache doesn't exist or is invalid + */ + + /** + * List installed plugins from cache file + * Falls back to filesystem scan if cache is missing or corrupt + */ + async listInstalledFromCache(workdir: string): Promise { + logger.debug('Listing installed plugins from cache', { workdir }) + return await this.cacheStore.listInstalled(workdir) + } + + /** + * Read plugin content from source (resources directory) + */ + async readContent(sourcePath: string): Promise { + logger.info('Reading plugin content', { sourcePath }) + const content = await this.cacheStore.readSourceContent(sourcePath) + logger.debug('Plugin content read successfully', { + sourcePath, + size: content.length + }) + return content + } + + /** + * Write plugin content to installed plugin (in agent's .claude directory) + * Note: Only works for file-based plugins (agents/commands), not skills + */ + async writeContent(agentId: string, filename: string, type: PluginType, content: string): Promise { + logger.info('Writing plugin content', { agentId, filename, type }) + + const agent = await this.getAgentOrThrow(agentId) + const workdir = this.getWorkdirOrThrow(agent, agentId) + + await this.validateWorkdir(agent, workdir) + + // Check if plugin is installed + let installedPlugins = agent.installed_plugins ?? [] + if (installedPlugins.length === 0) { + installedPlugins = await this.cacheStore.listInstalled(workdir) + agent.installed_plugins = installedPlugins + } + const installedPlugin = installedPlugins.find((p) => p.filename === filename && p.type === type) + + if (!installedPlugin) { + throw { + type: 'PLUGIN_NOT_INSTALLED', + filename, + agentId + } as PluginError + } + + if (type === 'skill') { + throw { + type: 'INVALID_FILE_TYPE', + extension: type + } as PluginError + } + + const filePluginType = type as 'agent' | 'command' + const filePath = this.getClaudePluginPath(workdir, filePluginType, filename) + const newContentHash = await this.installer.updateFilePluginContent(agent.id, filePath, content) + + const updatedMetadata: PluginMetadata = { + ...installedPlugin.metadata, + contentHash: newContentHash, + size: Buffer.byteLength(content, 'utf8'), + updatedAt: Date.now(), + filename, + type: filePluginType + } + const updatedPlugin: InstalledPlugin = { + filename, + type: filePluginType, + metadata: updatedMetadata + } + + await this.cacheStore.upsert(workdir, updatedPlugin) + this.upsertAgentPlugin(agent, updatedPlugin) + + logger.info('Plugin content updated successfully', { + agentId, + filename, + type: filePluginType, + newContentHash + }) + } + + // ============================================================================ + // Private Helper Methods + // ============================================================================ + + /** + * Resolve plugin type to directory name under .claude + */ + private getPluginDirectoryName(type: PluginType): 'agents' | 'commands' | 'skills' { + if (type === 'agent') { + return 'agents' + } + if (type === 'command') { + return 'commands' + } + return 'skills' + } + + /** + * Get the base .claude directory for a workdir + */ + private getClaudeBasePath(workdir: string): string { + return path.join(workdir, '.claude') + } + + /** + * Get the directory for a specific plugin type inside .claude + */ + private getClaudePluginDirectory(workdir: string, type: PluginType): string { + return path.join(this.getClaudeBasePath(workdir), this.getPluginDirectoryName(type)) + } + + /** + * Get the absolute path for a plugin file/folder inside .claude + */ + private getClaudePluginPath(workdir: string, type: PluginType, filename: string): string { + return path.join(this.getClaudePluginDirectory(workdir, type), filename) + } + + /** + * Get absolute path to plugins directory (handles packaged vs dev) + */ + private getPluginsBasePath(): string { + // Use the utility function which handles both dev and production correctly + if (app.isPackaged) { + return path.join(process.resourcesPath, 'claude-code-plugins') + } + return path.join(__dirname, '../../node_modules/claude-code-plugins/plugins') + } + + /** + * Validate source path to prevent path traversal attacks + */ + private async getAgentOrThrow(agentId: string): Promise { + const agent = await this.agentService.getAgent(agentId) + if (!agent) { + throw { + type: 'INVALID_WORKDIR', + agentId, + workdir: '', + message: 'Agent not found' + } as PluginError + } + return agent + } + + private getWorkdirOrThrow(agent: GetAgentResponse, agentId: string): string { + const workdir = agent.accessible_paths?.[0] + if (!workdir) { + throw { + type: 'INVALID_WORKDIR', + agentId, + workdir: '', + message: 'Agent has no accessible paths' + } as PluginError + } + return workdir + } + + /** + * Validate workdir against agent's accessible paths + */ + private async validateWorkdir(agent: GetAgentResponse, workdir: string): Promise { + // Verify workdir is in agent's accessible_paths + if (!agent.accessible_paths?.includes(workdir)) { + throw { + type: 'INVALID_WORKDIR', + workdir, + agentId: agent.id, + message: 'Workdir not in agent accessible paths' + } as PluginError + } + + // Verify workdir exists and is accessible + try { + await fs.promises.access(workdir, fs.constants.R_OK | fs.constants.W_OK) + } catch (error) { + throw { + type: 'WORKDIR_NOT_FOUND', + workdir, + message: 'Workdir does not exist or is not accessible' + } as PluginError + } + } + + private upsertAgentPlugin(agent: GetAgentResponse, plugin: InstalledPlugin): void { + const existing = agent.installed_plugins ?? [] + const filtered = existing.filter((p) => !(p.filename === plugin.filename && p.type === plugin.type)) + agent.installed_plugins = [...filtered, plugin] + } + + private removeAgentPlugin(agent: GetAgentResponse, filename: string, type: PluginType): void { + if (!agent.installed_plugins) { + agent.installed_plugins = [] + return + } + agent.installed_plugins = agent.installed_plugins.filter((p) => !(p.filename === filename && p.type === type)) + } + + /** + * Sanitize filename to remove unsafe characters (for agents/commands) + */ + private sanitizeFilename(filename: string): string { + // Remove path separators + let sanitized = filename.replace(/[/\\]/g, '_') + // Remove null bytes using String method to avoid control-regex lint error + sanitized = sanitized.replace(new RegExp(String.fromCharCode(0), 'g'), '') + // Limit to safe characters (alphanumeric, dash, underscore, dot) + sanitized = sanitized.replace(/[^a-zA-Z0-9._-]/g, '_') + + // Ensure .md extension + if (!sanitized.endsWith('.md') && !sanitized.endsWith('.markdown')) { + sanitized += '.md' + } + + return sanitized + } + + /** + * Sanitize folder name for skills (different rules than file names) + * NO dots allowed to avoid confusion with file extensions + */ + private sanitizeFolderName(folderName: string): string { + // Remove path separators + let sanitized = folderName.replace(/[/\\]/g, '_') + // Remove null bytes using String method to avoid control-regex lint error + sanitized = sanitized.replace(new RegExp(String.fromCharCode(0), 'g'), '') + // Limit to safe characters (alphanumeric, dash, underscore) + // NOTE: No dots allowed to avoid confusion with file extensions + sanitized = sanitized.replace(/[^a-zA-Z0-9_-]/g, '_') + + // Validate no extension was provided + if (folderName.includes('.')) { + logger.warn('Skill folder name contained dots, sanitized', { + original: folderName, + sanitized + }) + } + + return sanitized + } + + /** + * Ensure .claude subdirectory exists for the given plugin type + */ + private async ensureClaudeDirectory(workdir: string, type: PluginType): Promise { + const typeDir = this.getClaudePluginDirectory(workdir, type) + + try { + await fs.promises.mkdir(typeDir, { recursive: true }) + logger.debug('Ensured directory exists', { typeDir }) + } catch (error) { + logger.error('Failed to create directory', { + typeDir, + error: error instanceof Error ? error.message : String(error) + }) + throw { + type: 'PERMISSION_DENIED', + path: typeDir + } as PluginError + } + } +} + +export const pluginService = PluginService.getInstance() diff --git a/src/main/services/agents/services/AgentService.ts b/src/main/services/agents/services/AgentService.ts index 53af37f670..c3ae2fb794 100644 --- a/src/main/services/agents/services/AgentService.ts +++ b/src/main/services/agents/services/AgentService.ts @@ -1,5 +1,7 @@ import path from 'node:path' +import { loggerService } from '@logger' +import { pluginService } from '@main/services/agents/plugins/PluginService' import { getDataPath } from '@main/utils' import { AgentBaseSchema, @@ -17,6 +19,8 @@ import { BaseService } from '../BaseService' import { type AgentRow, agentsTable, type InsertAgentRow } from '../database/schema' import { AgentModelField } from '../errors' +const logger = loggerService.withContext('AgentService') + export class AgentService extends BaseService { private static instance: AgentService | null = null private readonly modelFields: AgentModelField[] = ['model', 'plan_model', 'small_model'] @@ -92,6 +96,24 @@ export class AgentService extends BaseService { const agent = this.deserializeJsonFields(result[0]) as GetAgentResponse agent.tools = await this.listMcpTools(agent.type, agent.mcps) + + // Load installed_plugins from cache file instead of database + const workdir = agent.accessible_paths?.[0] + if (workdir) { + try { + agent.installed_plugins = await pluginService.listInstalledFromCache(workdir) + } catch (error) { + // Log error but don't fail the request + logger.warn(`Failed to load installed plugins for agent ${id}`, { + workdir, + error: error instanceof Error ? error.message : String(error) + }) + agent.installed_plugins = [] + } + } else { + agent.installed_plugins = [] + } + return agent } diff --git a/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx b/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx index 4d51ce06f3..1ef93a5343 100644 --- a/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx @@ -1,5 +1,5 @@ import type { PermissionUpdate } from '@anthropic-ai/claude-agent-sdk' -import { Button, ButtonGroup, Chip, ScrollShadow } from '@heroui/react' +import { Button, Chip, ScrollShadow } from '@heroui/react' import { loggerService } from '@logger' import { useAppDispatch, useAppSelector } from '@renderer/store' import { selectPendingPermissionByToolName, toolPermissionsActions } from '@renderer/store/toolPermissions' @@ -54,7 +54,6 @@ export function ToolPermissionRequestCard({ toolResponse }: Props) { const isSubmittingAllow = request?.status === 'submitting-allow' const isSubmittingDeny = request?.status === 'submitting-deny' const isSubmitting = isSubmittingAllow || isSubmittingDeny - const hasSuggestions = (request?.suggestions?.length ?? 0) > 0 const handleDecision = useCallback( async ( @@ -147,37 +146,16 @@ export function ToolPermissionRequestCard({ toolResponse }: Props) { {t('agent.toolPermission.button.cancel')} - {hasSuggestions ? ( - - - - - ) : ( - - )} + + + + + + + {selectedFolderPath || t('settings.data.export_to_phone.lan.noZipSelected')} + + + + + + + + {showCloseConfirm && ( + +
+
+ ⚠️ + + {t('settings.data.export_to_phone.lan.confirm_close_title')} + +
+ + {t('settings.data.export_to_phone.lan.confirm_close_message')} + +
+ + +
+
+
+ )} + + )} + + + ) +} + +const TopViewKey = 'ExportToPhoneLanPopup' + +export default class ExportToPhoneLanPopup { + static topviewId = 0 + static hide() { + TopView.hide(TopViewKey) + } + static show() { + return new Promise((resolve) => { + TopView.show( + { + resolve(v) + TopView.hide(TopViewKey) + }} + />, + TopViewKey + ) + }) + } +} diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 98da54794f..9eaab84076 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -1047,6 +1047,7 @@ "clear": "Clear", "close": "Close", "collapse": "Collapse", + "completed": "Completed", "confirm": "Confirm", "copied": "Copied", "copy": "Copy", @@ -3038,6 +3039,46 @@ "title": "Export Menu Settings", "yuque": "Export to Yuque" }, + "export_to_phone": { + "confirm": { + "button": "Select backup file" + }, + "content": "Export some data, including chat logs and settings. Please note that the backup process may take some time. Thank you for your patience.", + "lan": { + "auto_close_tip": "Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "Confirm Close", + "connected": "Connected", + "connection_failed": "Connection failed", + "content": "Please ensure your computer and phone are on the same network for LAN transfer. Open the Cherry Studio App to scan this QR code.", + "error": { + "init_failed": "Initialization failed", + "no_file": "No file selected", + "no_ip": "Unable to get IP address", + "send_failed": "Failed to send file" + }, + "force_close": "Force Close", + "generating_qr": "Generating QR code...", + "noZipSelected": "No compressed file selected", + "scan_qr": "Please scan QR code with your phone", + "selectZip": "Select a compressed file", + "sendZip": "Begin data recovery", + "status": { + "completed": "Transfer completed", + "connected": "Connected", + "connecting": "Connecting...", + "disconnected": "Disconnected", + "error": "Connection error", + "initializing": "Initializing connection...", + "preparing": "Preparing transfer...", + "sending": "Transferring {{progress}}%", + "waiting_qr_scan": "Please scan QR code to connect" + }, + "title": "LAN transmission", + "transfer_progress": "Transfer progress" + }, + "title": "Export to phone" + }, "hour_interval_one": "{{count}} hour", "hour_interval_other": "{{count}} hours", "joplin": { diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index af6a3c1472..c3f486c0b2 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1047,6 +1047,7 @@ "clear": "清除", "close": "关闭", "collapse": "折叠", + "completed": "完成", "confirm": "确认", "copied": "已复制", "copy": "复制", @@ -3038,6 +3039,46 @@ "title": "导出菜单设置", "yuque": "导出到语雀" }, + "export_to_phone": { + "confirm": { + "button": "选择备份文件" + }, + "content": "导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "lan": { + "auto_close_tip": "{{seconds}} 秒后自动关闭...", + "confirm_close_message": "文件正在传输中,关闭将中断传输。确定要强制关闭吗?", + "confirm_close_title": "确认关闭", + "connected": "连接成功", + "connection_failed": "连接失败", + "content": "请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "error": { + "init_failed": "初始化失败", + "no_file": "未选择文件", + "no_ip": "无法获取 IP 地址", + "send_failed": "发送文件失败" + }, + "force_close": "强制关闭", + "generating_qr": "正在生成二维码...", + "noZipSelected": "未选择压缩文件", + "scan_qr": "请使用手机扫码连接", + "selectZip": "选择压缩文件", + "sendZip": "开始恢复数据", + "status": { + "completed": "传输完成", + "connected": "连接成功", + "connecting": "正在连接中...", + "disconnected": "连接已断开", + "error": "连接出错", + "initializing": "正在初始化连接...", + "preparing": "准备传输中...", + "sending": "传输中 {{progress}}%", + "waiting_qr_scan": "请扫描二维码连接" + }, + "title": "局域网传输", + "transfer_progress": "传输进度" + }, + "title": "导出至手机" + }, "hour_interval_one": "{{count}} 小时", "hour_interval_other": "{{count}} 小时", "joplin": { diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 8bd8ff17e7..58174e6944 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -1047,6 +1047,7 @@ "clear": "清除", "close": "關閉", "collapse": "折疊", + "completed": "[to be translated]:Completed", "confirm": "確認", "copied": "已複製", "copy": "複製", @@ -3038,6 +3039,46 @@ "title": "匯出選單設定", "yuque": "匯出到語雀" }, + "export_to_phone": { + "confirm": { + "button": "選擇備份檔案" + }, + "content": "匯出部分數據,包括聊天記錄、設定。請注意,備份過程可能需要一些時間,感謝您的耐心等候。", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "請確保電腦和手機處於同一網路以使用區域網路傳輸。請打開 Cherry Studio App 掃描此 QR 碼。", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "未選取壓縮檔案", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "選擇壓縮檔案", + "sendZip": "開始恢復資料", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "區域網路傳輸", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "匯出手機" + }, "hour_interval_one": "{{count}} 小時", "hour_interval_other": "{{count}} 小時", "joplin": { diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index 28d03c064b..49a68809e0 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -1047,6 +1047,7 @@ "clear": "Löschen", "close": "Schließen", "collapse": "Einklappen", + "completed": "[to be translated]:Completed", "confirm": "Bestätigen", "copied": "Kopiert", "copy": "Kopieren", @@ -3038,6 +3039,46 @@ "title": "Export-Menü-Einstellungen", "yuque": "Nach Yuque exportieren" }, + "export_to_phone": { + "confirm": { + "button": "[to be translated]:Select backup file" + }, + "content": "[to be translated]:Export some data, including chat logs and settings. Please note that the backup process may take some time. Thank you for your patience.", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "[to be translated]:Please ensure your computer and phone are on the same network for LAN transfer. Open the Cherry Studio App to scan this QR code.", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "[to be translated]:No compressed file selected", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "[to be translated]:Select a compressed file", + "sendZip": "[to be translated]:Begin data recovery", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "[to be translated]:LAN transmission", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "[to be translated]:Export to phone" + }, "hour_interval_one": "{{count}} Stunde", "hour_interval_other": "{{count}} Stunden", "joplin": { diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index ddea9edff1..5a38b80511 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -1047,6 +1047,7 @@ "clear": "Καθαρισμός", "close": "Κλείσιμο", "collapse": "Σύμπτυξη", + "completed": "[to be translated]:Completed", "confirm": "Επιβεβαίωση", "copied": "Αντιγράφηκε", "copy": "Αντιγραφή", @@ -3038,6 +3039,46 @@ "title": "Εξαγωγή ρυθμίσεων μενού", "yuque": "Εξαγωγή στο Yuque" }, + "export_to_phone": { + "confirm": { + "button": "[to be translated]:选择备份文件" + }, + "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "[to be translated]:未选择压缩文件", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "[to be translated]:选择压缩文件", + "sendZip": "[to be translated]:开始恢复数据", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "[to be translated]:局域网传输", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "[to be translated]:导出至手机" + }, "hour_interval_one": "{{count}} ώρα", "hour_interval_other": "{{count}} ώρες", "joplin": { diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 99e18afc31..b04258151d 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -1047,6 +1047,7 @@ "clear": "Limpiar", "close": "Cerrar", "collapse": "Colapsar", + "completed": "[to be translated]:Completed", "confirm": "Confirmar", "copied": "Copiado", "copy": "Copiar", @@ -3038,6 +3039,46 @@ "title": "Exportar configuración del menú", "yuque": "Exportar a Yuque" }, + "export_to_phone": { + "confirm": { + "button": "[to be translated]:选择备份文件" + }, + "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "[to be translated]:未选择压缩文件", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "[to be translated]:选择压缩文件", + "sendZip": "[to be translated]:开始恢复数据", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "[to be translated]:局域网传输", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "[to be translated]:导出至手机" + }, "hour_interval_one": "{{count}} hora", "hour_interval_other": "{{count}} horas", "joplin": { diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index 06c71c60ab..b9c68d9a8e 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -1047,6 +1047,7 @@ "clear": "Effacer", "close": "Fermer", "collapse": "Réduire", + "completed": "[to be translated]:Completed", "confirm": "Confirmer", "copied": "Copié", "copy": "Copier", @@ -3038,6 +3039,46 @@ "title": "Exporter les paramètres du menu", "yuque": "Exporter vers Yuque" }, + "export_to_phone": { + "confirm": { + "button": "[to be translated]:选择备份文件" + }, + "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "[to be translated]:未选择压缩文件", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "[to be translated]:选择压缩文件", + "sendZip": "[to be translated]:开始恢复数据", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "[to be translated]:局域网传输", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "[to be translated]:导出至手机" + }, "hour_interval_one": "{{count}} heure", "hour_interval_other": "{{count}} heures", "joplin": { diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index 6bd095a2bf..15b2fb111b 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -1047,6 +1047,7 @@ "clear": "クリア", "close": "閉じる", "collapse": "折りたたむ", + "completed": "[to be translated]:Completed", "confirm": "確認", "copied": "コピーされました", "copy": "コピー", @@ -3038,6 +3039,46 @@ "title": "エクスポートメニュー設定", "yuque": "語雀にエクスポート" }, + "export_to_phone": { + "confirm": { + "button": "[to be translated]:选择备份文件" + }, + "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "[to be translated]:未选择压缩文件", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "[to be translated]:选择压缩文件", + "sendZip": "[to be translated]:开始恢复数据", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "[to be translated]:局域网传输", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "[to be translated]:导出至手机" + }, "hour_interval_one": "{{count}} 時間", "hour_interval_other": "{{count}} 時間", "joplin": { diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index 3ff8c970be..0253dba3cd 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -1047,6 +1047,7 @@ "clear": "Limpar", "close": "Fechar", "collapse": "Recolher", + "completed": "[to be translated]:Completed", "confirm": "Confirmar", "copied": "Copiado", "copy": "Copiar", @@ -3038,6 +3039,46 @@ "title": "Exportar Configurações do Menu", "yuque": "Exportar para Yuque" }, + "export_to_phone": { + "confirm": { + "button": "[to be translated]:选择备份文件" + }, + "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "[to be translated]:未选择压缩文件", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "[to be translated]:选择压缩文件", + "sendZip": "[to be translated]:开始恢复数据", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "[to be translated]:局域网传输", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "[to be translated]:导出至手机" + }, "hour_interval_one": "{{count}} hora", "hour_interval_other": "{{count}} horas", "joplin": { diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index f65048d6b2..7e31339a53 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -1047,6 +1047,7 @@ "clear": "Очистить", "close": "Закрыть", "collapse": "Свернуть", + "completed": "[to be translated]:Completed", "confirm": "Подтверждение", "copied": "Скопировано", "copy": "Копировать", @@ -3038,6 +3039,46 @@ "title": "Настройки меню экспорта", "yuque": "Экспорт в Yuque" }, + "export_to_phone": { + "confirm": { + "button": "[to be translated]:选择备份文件" + }, + "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "lan": { + "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", + "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", + "confirm_close_title": "[to be translated]:Confirm Close", + "connected": "[to be translated]:Connected", + "connection_failed": "[to be translated]:Connection failed", + "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "error": { + "init_failed": "[to be translated]:Initialization failed", + "no_file": "[to be translated]:No file selected", + "no_ip": "[to be translated]:Unable to get IP address", + "send_failed": "[to be translated]:Failed to send file" + }, + "force_close": "[to be translated]:Force Close", + "generating_qr": "[to be translated]:Generating QR code...", + "noZipSelected": "[to be translated]:未选择压缩文件", + "scan_qr": "[to be translated]:Please scan QR code with your phone", + "selectZip": "[to be translated]:选择压缩文件", + "sendZip": "[to be translated]:开始恢复数据", + "status": { + "completed": "[to be translated]:Transfer completed", + "connected": "[to be translated]:Connected", + "connecting": "[to be translated]:Connecting...", + "disconnected": "[to be translated]:Disconnected", + "error": "[to be translated]:Connection error", + "initializing": "[to be translated]:Initializing connection...", + "preparing": "[to be translated]:Preparing transfer...", + "sending": "[to be translated]:Transferring {{progress}}%", + "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + }, + "title": "[to be translated]:局域网传输", + "transfer_progress": "[to be translated]:Transfer progress" + }, + "title": "[to be translated]:导出至手机" + }, "hour_interval_one": "{{count}} час", "hour_interval_other": "{{count}} часов", "joplin": { diff --git a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx index 4b00993f60..aa6078b6b1 100644 --- a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx @@ -3,13 +3,17 @@ import { CloudSyncOutlined, FileSearchOutlined, LoadingOutlined, + WifiOutlined, YuqueOutlined } from '@ant-design/icons' +import { Button } from '@heroui/button' +import { Switch } from '@heroui/switch' import DividerWithText from '@renderer/components/DividerWithText' import { NutstoreIcon } from '@renderer/components/Icons/NutstoreIcons' import { HStack } from '@renderer/components/Layout' import ListItem from '@renderer/components/ListItem' import BackupPopup from '@renderer/components/Popups/BackupPopup' +import ExportToPhoneLanPopup from '@renderer/components/Popups/ExportToPhoneLanPopup' import RestorePopup from '@renderer/components/Popups/RestorePopup' import { useTheme } from '@renderer/context/ThemeProvider' import { useKnowledgeFiles } from '@renderer/hooks/useKnowledgeFiles' @@ -20,7 +24,7 @@ import { setSkipBackupFile as _setSkipBackupFile } from '@renderer/store/setting import { AppInfo } from '@renderer/types' import { formatFileSize } from '@renderer/utils' import { occupiedDirs } from '@shared/config/constant' -import { Button, Progress, Switch, Typography } from 'antd' +import { Progress, Typography } from 'antd' import { FileText, FolderCog, FolderInput, FolderOpen, SaveIcon, Sparkle } from 'lucide-react' import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -290,12 +294,16 @@ const DataSettings: FC = () => {
{ + defaultSelected={shouldCopyData} + onValueChange={(checked) => { shouldCopyData = checked }} - style={{ marginRight: '8px' }} - /> + size="sm"> + + {t('settings.data.app_data.copy_data_option')} + + + {t('settings.data.app_data.copy_data_option')} @@ -605,10 +613,10 @@ const DataSettings: FC = () => { {t('settings.general.backup.title')} - - @@ -616,11 +624,24 @@ const DataSettings: FC = () => { {t('settings.data.backup.skip_file_data_title')} - + {t('settings.data.backup.skip_file_data_help')} + + + {t('settings.data.export_to_phone.title')} + + + + {t('settings.data.data.title')} @@ -635,7 +656,9 @@ const DataSettings: FC = () => { handleOpenPath(appInfo?.appDataPath)} style={{ flexShrink: 0 }} /> - + @@ -648,7 +671,7 @@ const DataSettings: FC = () => { handleOpenPath(appInfo?.logsPath)} style={{ flexShrink: 0 }} /> - @@ -658,7 +681,9 @@ const DataSettings: FC = () => { {t('settings.data.app_knowledge.label')} - + @@ -668,14 +693,16 @@ const DataSettings: FC = () => { {cacheSize && ({cacheSize}MB)} - + {t('settings.general.reset.title')} - diff --git a/yarn.lock b/yarn.lock index 06d44e14dc..fba0420fd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11073,6 +11073,13 @@ __metadata: languageName: node linkType: hard +"@socket.io/component-emitter@npm:~3.1.0": + version: 3.1.2 + resolution: "@socket.io/component-emitter@npm:3.1.2" + checksum: 10c0/c4242bad66f67e6f7b712733d25b43cbb9e19a595c8701c3ad99cbeb5901555f78b095e24852f862fffb43e96f1d8552e62def885ca82ae1bb05da3668fd87d7 + languageName: node + linkType: hard + "@standard-schema/spec@npm:^1.0.0": version: 1.0.0 resolution: "@standard-schema/spec@npm:1.0.0" @@ -12125,7 +12132,7 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:^2.8.19": +"@types/cors@npm:^2.8.12, @types/cors@npm:^2.8.19": version: 2.8.19 resolution: "@types/cors@npm:2.8.19" dependencies: @@ -12673,6 +12680,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=10.0.0": + version: 24.3.1 + resolution: "@types/node@npm:24.3.1" + dependencies: + undici-types: "npm:~7.10.0" + checksum: 10c0/99b86fc32294fcd61136ca1f771026443a1e370e9f284f75e243b29299dd878e18c193deba1ce29a374932db4e30eb80826e1049b9aad02d36f5c30b94b6f928 + languageName: node + linkType: hard + "@types/node@npm:^18.11.18": version: 18.19.86 resolution: "@types/node@npm:18.19.86" @@ -14108,6 +14124,7 @@ __metadata: pdf-parse: "npm:^1.1.1" playwright: "npm:^1.55.1" proxy-agent: "npm:^6.5.0" + qrcode.react: "npm:^4.2.0" react: "npm:^19.2.0" react-dom: "npm:^19.2.0" react-error-boundary: "npm:^6.0.0" @@ -14139,6 +14156,7 @@ __metadata: selection-hook: "npm:^1.0.12" sharp: "npm:^0.34.3" shiki: "npm:^3.12.0" + socket.io: "npm:^4.8.1" strict-url-sanitise: "npm:^0.0.1" string-width: "npm:^7.2.0" striptags: "npm:^3.2.0" @@ -14214,6 +14232,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:~1.3.4": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -14900,6 +14928,13 @@ __metadata: languageName: node linkType: hard +"base64id@npm:2.0.0, base64id@npm:~2.0.0": + version: 2.0.0 + resolution: "base64id@npm:2.0.0" + checksum: 10c0/6919efd237ed44b9988cbfc33eca6f173a10e810ce50292b271a1a421aac7748ef232a64d1e6032b08f19aae48dce6ee8f66c5ae2c9e5066c82b884861d4d453 + languageName: node + linkType: hard + "basic-ftp@npm:^5.0.2": version: 5.0.5 resolution: "basic-ftp@npm:5.0.5" @@ -16176,7 +16211,7 @@ __metadata: languageName: node linkType: hard -"cookie@npm:^0.7.1": +"cookie@npm:^0.7.1, cookie@npm:~0.7.2": version: 0.7.2 resolution: "cookie@npm:0.7.2" checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 @@ -16206,7 +16241,7 @@ __metadata: languageName: node linkType: hard -"cors@npm:^2.8.5": +"cors@npm:^2.8.5, cors@npm:~2.8.5": version: 2.8.5 resolution: "cors@npm:2.8.5" dependencies: @@ -16869,6 +16904,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + languageName: node + linkType: hard + "decamelize@npm:1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -17796,6 +17843,30 @@ __metadata: languageName: node linkType: hard +"engine.io-parser@npm:~5.2.1": + version: 5.2.3 + resolution: "engine.io-parser@npm:5.2.3" + checksum: 10c0/ed4900d8dbef470ab3839ccf3bfa79ee518ea8277c7f1f2759e8c22a48f64e687ea5e474291394d0c94f84054749fd93f3ef0acb51fa2f5f234cc9d9d8e7c536 + languageName: node + linkType: hard + +"engine.io@npm:~6.6.0": + version: 6.6.4 + resolution: "engine.io@npm:6.6.4" + dependencies: + "@types/cors": "npm:^2.8.12" + "@types/node": "npm:>=10.0.0" + accepts: "npm:~1.3.4" + base64id: "npm:2.0.0" + cookie: "npm:~0.7.2" + cors: "npm:~2.8.5" + debug: "npm:~4.3.1" + engine.io-parser: "npm:~5.2.1" + ws: "npm:~8.17.1" + checksum: 10c0/845761163f8ea7962c049df653b75dafb6b3693ad6f59809d4474751d7b0392cbf3dc2730b8a902ff93677a91fd28711d34ab29efd348a8a4b49c6b0724021ab + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.18.3": version: 5.18.3 resolution: "enhanced-resolve@npm:5.18.3" @@ -23077,7 +23148,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -23541,6 +23612,13 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + "negotiator@npm:^0.6.3": version: 0.6.4 resolution: "negotiator@npm:0.6.4" @@ -25232,6 +25310,15 @@ __metadata: languageName: node linkType: hard +"qrcode.react@npm:^4.2.0": + version: 4.2.0 + resolution: "qrcode.react@npm:4.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/68c691d130e5fda2f57cee505ed7aea840e7d02033100687b764601f9595e1116e34c13876628a93e1a5c2b85e4efc27d30b2fda72e2050c02f3e1c4e998d248 + languageName: node + linkType: hard + "qs@npm:^6.14.0": version: 6.14.0 resolution: "qs@npm:6.14.0" @@ -27499,6 +27586,41 @@ __metadata: languageName: node linkType: hard +"socket.io-adapter@npm:~2.5.2": + version: 2.5.5 + resolution: "socket.io-adapter@npm:2.5.5" + dependencies: + debug: "npm:~4.3.4" + ws: "npm:~8.17.1" + checksum: 10c0/04a5a2a9c4399d1b6597c2afc4492ab1e73430cc124ab02b09e948eabf341180b3866e2b61b5084cb899beb68a4db7c328c29bda5efb9207671b5cb0bc6de44e + languageName: node + linkType: hard + +"socket.io-parser@npm:~4.2.4": + version: 4.2.4 + resolution: "socket.io-parser@npm:4.2.4" + dependencies: + "@socket.io/component-emitter": "npm:~3.1.0" + debug: "npm:~4.3.1" + checksum: 10c0/9383b30358fde4a801ea4ec5e6860915c0389a091321f1c1f41506618b5cf7cd685d0a31c587467a0c4ee99ef98c2b99fb87911f9dfb329716c43b587f29ca48 + languageName: node + linkType: hard + +"socket.io@npm:^4.8.1": + version: 4.8.1 + resolution: "socket.io@npm:4.8.1" + dependencies: + accepts: "npm:~1.3.4" + base64id: "npm:~2.0.0" + cors: "npm:~2.8.5" + debug: "npm:~4.3.2" + engine.io: "npm:~6.6.0" + socket.io-adapter: "npm:~2.5.2" + socket.io-parser: "npm:~4.2.4" + checksum: 10c0/acf931a2bb235be96433b71da3d8addc63eeeaa8acabd33dc8d64e12287390a45f1e9f389a73cf7dc336961cd491679741b7a016048325c596835abbcc017ca9 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -28951,6 +29073,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~7.10.0": + version: 7.10.0 + resolution: "undici-types@npm:7.10.0" + checksum: 10c0/8b00ce50e235fe3cc601307f148b5e8fb427092ee3b23e8118ec0a5d7f68eca8cee468c8fc9f15cbb2cf2a3797945ebceb1cbd9732306a1d00e0a9b6afa0f635 + languageName: node + linkType: hard + "undici@npm:6.21.2": version: 6.21.2 resolution: "undici@npm:6.21.2" @@ -29987,6 +30116,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:~8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/f4a49064afae4500be772abdc2211c8518f39e1c959640457dcee15d4488628620625c783902a52af2dd02f68558da2868fd06e6fd0e67ebcd09e6881b1b5bfe + languageName: node + linkType: hard + "xlsx@https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz": version: 0.20.2 resolution: "xlsx@https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" From 8da43ab794910f53799baa6ab028834e61fd4dab Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 31 Oct 2025 17:15:55 +0800 Subject: [PATCH 13/83] chore: update release notes for v1.7.0-beta.3 - Added new features including an enhanced tool permission system, plugin management, and support for various AI models. - Improved UI elements and agent creation processes. - Fixed multiple bugs related to session models, assistant activation, and various API integrations. - Updated version in package.json to v1.7.0-beta.3. --- electron-builder.yml | 140 ++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 99 insertions(+), 43 deletions(-) diff --git a/electron-builder.yml b/electron-builder.yml index 8e31ee7d9c..ad90b39922 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -133,60 +133,116 @@ artifactBuildCompleted: scripts/artifact-build-completed.js releaseInfo: releaseNotes: | - What's New in v1.7.0-beta.2 + What's New in v1.7.0-beta.3 New Features: - - Session Settings: Manage session-specific settings and model configurations independently - - Notes Full-Text Search: Search across all notes with match highlighting - - Built-in DiDi MCP Server: Integration with DiDi ride-hailing services (China only) - - Intel OV OCR: Hardware-accelerated OCR using Intel NPU - - Auto-start API Server: Automatically starts when agents exist + - Enhanced Tool Permission System: Real-time tool approval interface with improved UX + - Plugin Management System: Support for Claude Agent plugins (agents, commands, skills) + - Skill Tool: Add skill execution capabilities for agents + - Mobile App Data Restore: Support restoring data to mobile applications + - OpenMinerU Preprocessor: Knowledge base now supports open-source MinerU for document processing + - HuggingFace Provider: Added HuggingFace as AI provider + - Claude Haiku 4.5: Support for the latest Claude Haiku 4.5 model + - Ling Series Models: Added support for Ling-1T and related models + - Intel OVMS Painting: New painting provider using Intel OpenVINO Model Server + - Automatic Update Checks: Implement periodic update checking with configurable intervals + - HuggingChat Mini App: New mini app for HuggingChat integration Improvements: - - Agent model selection now requires explicit user choice - - Added Mistral AI provider support - - Added NewAPI generic provider support - - Improved navbar layout consistency across different modes - - Enhanced chat component responsiveness - - Better code block display on small screens - - Updated OVMS to 2025.3 official release - - Added Greek language support + - Agent Creation: New agents are now automatically activated upon creation + - Lazy Loading: Optimize page load performance with route lazy loading + - UI Enhancements: Improved agent item styling and layout consistency + - Navigation: Better navbar layout for fullscreen mode on macOS + - Settings Tab: Enhanced context slider consistency + - Backup Manager: Unified footer layout for local and S3 backup managers + - Menu System: Enhanced application menu with improved help section + - Proxy Rules: Comprehensive proxy bypass rule matching + - German Language: Added German language support + - MCP Confirmation: Added confirmation modal when activating protocol-installed MCP servers + - Translation: Enhanced translation script with concurrency and validation + - Electron & Vite: Updated to Electron 38 and Vite 4.0.1 + + Claude Code Tool Improvements: + - GlobTool: Now counts lines instead of files in output for better clarity + - ReadTool: Automatically removes system reminder tags from output + - TodoWriteTool: Improved rendering behavior + - Environment Variables: Updated model-related environment variable names Bug Fixes: - - Fixed GitHub Copilot gpt-5-codex streaming issues - - Fixed assistant creation failures - - Fixed translate auto-copy functionality - - Fixed miniapps external link opening - - Fixed message layout and overflow issues - - Fixed API key parsing to preserve spaces - - Fixed agent display in different navbar layouts + - Fixed session model not being used when sending messages + - Fixed tool approval UI and shared workspace plugin inconsistencies + - Fixed API server readiness notification to renderer + - Fixed grouped items not respecting saved tag order + - Fixed assistant/agent activation when creating new ones + - Fixed Dashscope Anthropic API host and migrated old configs + - Fixed Qwen3 thinking mode control for Ollama + - Fixed disappeared MCP button + - Fixed create assistant causing blank screen + - Fixed up-down button visibility in some cases + - Fixed hooks preventing save on composing enter key + - Fixed Azure GPT-image-1 and OpenRouter Gemini-image + - Fixed Silicon reasoning issues + - Fixed topic branch incomplete copy with two-pass ID mapping + - Fixed deep research model search context restrictions + - Fixed model capability checking logic + - Fixed reranker API error response capture + - Fixed right-click paste file content into inputbar + - Fixed minimax-m2 support in aiCore - v1.7.0-beta.2 新特性 + v1.7.0-beta.3 新特性 新功能: - - 会话设置:独立管理会话特定的设置和模型配置 - - 笔记全文搜索:跨所有笔记搜索并高亮匹配内容 - - 内置滴滴 MCP 服务器:集成滴滴打车服务(仅限中国地区) - - Intel OV OCR:使用 Intel NPU 的硬件加速 OCR - - 自动启动 API 服务器:当存在 Agent 时自动启动 + - 增强工具权限系统:实时工具审批界面,改进用户体验 + - 插件管理系统:支持 Claude Agent 插件(agents、commands、skills) + - 技能工具:为 Agent 添加技能执行能力 + - 移动应用数据恢复:支持将数据恢复到移动应用程序 + - OpenMinerU 预处理器:知识库现支持使用开源 MinerU 处理文档 + - HuggingFace 提供商:添加 HuggingFace 作为 AI 提供商 + - Claude Haiku 4.5:支持最新的 Claude Haiku 4.5 模型 + - Ling 系列模型:添加 Ling-1T 及相关模型支持 + - Intel OVMS 绘图:使用 Intel OpenVINO 模型服务器的新绘图提供商 + - 自动更新检查:实现可配置间隔的定期更新检查 + - HuggingChat 小程序:新增 HuggingChat 集成小程序 改进: - - Agent 模型选择现在需要用户显式选择 - - 添加 Mistral AI 提供商支持 - - 添加 NewAPI 通用提供商支持 - - 改进不同模式下的导航栏布局一致性 - - 增强聊天组件响应式设计 - - 优化小屏幕代码块显示 - - 更新 OVMS 至 2025.3 正式版 - - 添加希腊语支持 + - Agent 创建:新创建的 Agent 现在会自动激活 + - 懒加载:通过路由懒加载优化页面加载性能 + - UI 增强:改进 Agent 项目样式和布局一致性 + - 导航:改进 macOS 全屏模式下的导航栏布局 + - 设置选项卡:增强上下文滑块一致性 + - 备份管理器:统一本地和 S3 备份管理器的页脚布局 + - 菜单系统:增强应用菜单,改进帮助部分 + - 代理规则:全面的代理绕过规则匹配 + - 德语支持:添加德语语言支持 + - MCP 确认:添加激活协议安装的 MCP 服务器时的确认模态框 + - 翻译:增强翻译脚本的并发和验证功能 + - Electron & Vite:更新至 Electron 38 和 Vite 4.0.1 + + Claude Code 工具改进: + - GlobTool:现在计算行数而不是文件数,提供更清晰的输出 + - ReadTool:自动从输出中移除系统提醒标签 + - TodoWriteTool:改进渲染行为 + - 环境变量:更新模型相关的环境变量名称 问题修复: - - 修复 GitHub Copilot gpt-5-codex 流式传输问题 - - 修复助手创建失败 - - 修复翻译自动复制功能 - - 修复小程序外部链接打开 - - 修复消息布局和溢出问题 - - 修复 API 密钥解析以保留空格 - - 修复不同导航栏布局中的 Agent 显示 + - 修复发送消息时未使用会话模型 + - 修复工具审批 UI 和共享工作区插件不一致 + - 修复 API 服务器就绪通知到渲染器 + - 修复分组项目不遵守已保存标签顺序 + - 修复创建新的助手/Agent 时的激活问题 + - 修复 Dashscope Anthropic API 主机并迁移旧配置 + - 修复 Ollama 的 Qwen3 思考模式控制 + - 修复 MCP 按钮消失 + - 修复创建助手导致空白屏幕 + - 修复某些情况下上下按钮可见性 + - 修复钩子在输入法输入时阻止保存 + - 修复 Azure GPT-image-1 和 OpenRouter Gemini-image + - 修复 Silicon 推理问题 + - 修复主题分支不完整复制,采用两阶段 ID 映射 + - 修复深度研究模型搜索上下文限制 + - 修复模型能力检查逻辑 + - 修复 reranker API 错误响应捕获 + - 修复右键粘贴文件内容到输入栏 + - 修复 aiCore 中的 minimax-m2 支持 diff --git a/package.json b/package.json index e4b7e646d8..0819ca99fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "CherryStudio", - "version": "1.7.0-beta.2", + "version": "1.7.0-beta.3", "private": true, "description": "A powerful AI assistant for producer.", "main": "./out/main/index.js", From 9dbc6fbf67d91aab46d16fcc7982f2c43ff3f973 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 31 Oct 2025 18:54:48 +0800 Subject: [PATCH 14/83] =?UTF-8?q?Revert=20"feat:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E6=87=92=E5=8A=A0=E8=BD=BD=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E4=BB=A5=E4=BC=98=E5=8C=96=E9=A1=B5=E9=9D=A2=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E6=80=A7=E8=83=BD=20(#11042)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit dd8690b59281817071db9aab93350e9efb29528f. --- src/renderer/src/Router.tsx | 64 ++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/src/renderer/src/Router.tsx b/src/renderer/src/Router.tsx index 61a376285f..edaebfa144 100644 --- a/src/renderer/src/Router.tsx +++ b/src/renderer/src/Router.tsx @@ -1,7 +1,6 @@ import '@renderer/databases' -import { Spinner } from '@heroui/react' -import { FC, lazy, Suspense, useMemo } from 'react' +import { FC, useMemo } from 'react' import { HashRouter, Route, Routes } from 'react-router-dom' import Sidebar from './components/app/Sidebar' @@ -9,25 +8,18 @@ import { ErrorBoundary } from './components/ErrorBoundary' import TabsContainer from './components/Tab/TabContainer' import NavigationHandler from './handler/NavigationHandler' import { useNavbarPosition } from './hooks/useSettings' - -const HomePage = lazy(() => import('./pages/home/HomePage')) -const AssistantPresetsPage = lazy(() => import('./pages/store/assistants/presets/AssistantPresetsPage')) -const PaintingsRoutePage = lazy(() => import('./pages/paintings/PaintingsRoutePage')) -const TranslatePage = lazy(() => import('./pages/translate/TranslatePage')) -const FilesPage = lazy(() => import('./pages/files/FilesPage')) -const NotesPage = lazy(() => import('./pages/notes/NotesPage')) -const KnowledgePage = lazy(() => import('./pages/knowledge/KnowledgePage')) -const MinAppPage = lazy(() => import('./pages/minapps/MinAppPage')) -const MinAppsPage = lazy(() => import('./pages/minapps/MinAppsPage')) -const CodeToolsPage = lazy(() => import('./pages/code/CodeToolsPage')) -const SettingsPage = lazy(() => import('./pages/settings/SettingsPage')) -const LaunchpadPage = lazy(() => import('./pages/launchpad/LaunchpadPage')) - -const RouterFallback: FC = () => ( -
- -
-) +import CodeToolsPage from './pages/code/CodeToolsPage' +import FilesPage from './pages/files/FilesPage' +import HomePage from './pages/home/HomePage' +import KnowledgePage from './pages/knowledge/KnowledgePage' +import LaunchpadPage from './pages/launchpad/LaunchpadPage' +import MinAppPage from './pages/minapps/MinAppPage' +import MinAppsPage from './pages/minapps/MinAppsPage' +import NotesPage from './pages/notes/NotesPage' +import PaintingsRoutePage from './pages/paintings/PaintingsRoutePage' +import SettingsPage from './pages/settings/SettingsPage' +import AssistantPresetsPage from './pages/store/assistants/presets/AssistantPresetsPage' +import TranslatePage from './pages/translate/TranslatePage' const Router: FC = () => { const { navbarPosition } = useNavbarPosition() @@ -35,22 +27,20 @@ const Router: FC = () => { const routes = useMemo(() => { return ( - }> - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - - + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + ) }, []) From 67a379641f1241e8a07ea92702ad051be8b75cf1 Mon Sep 17 00:00:00 2001 From: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:00:35 +0800 Subject: [PATCH 15/83] fix(agent): resolve edit modal loading race condition (#11084) * fix(agent): resolve edit modal loading race condition * fix(i18n): Auto update translations for PR #11084 --------- Co-authored-by: GitHub Action --- src/renderer/src/hooks/agents/useAgent.ts | 11 ++-- src/renderer/src/i18n/locales/zh-tw.json | 46 ++++++++-------- src/renderer/src/i18n/translate/de-de.json | 62 +++++++++++----------- src/renderer/src/i18n/translate/el-gr.json | 62 +++++++++++----------- src/renderer/src/i18n/translate/es-es.json | 62 +++++++++++----------- src/renderer/src/i18n/translate/fr-fr.json | 62 +++++++++++----------- src/renderer/src/i18n/translate/ja-jp.json | 62 +++++++++++----------- src/renderer/src/i18n/translate/pt-pt.json | 38 ++++++------- src/renderer/src/i18n/translate/ru-ru.json | 56 +++++++++---------- 9 files changed, 231 insertions(+), 230 deletions(-) diff --git a/src/renderer/src/hooks/agents/useAgent.ts b/src/renderer/src/hooks/agents/useAgent.ts index e1c682046f..9c516673bf 100644 --- a/src/renderer/src/hooks/agents/useAgent.ts +++ b/src/renderer/src/hooks/agents/useAgent.ts @@ -10,6 +10,10 @@ export const useAgent = (id: string | null) => { const client = useAgentClient() const key = id ? client.agentPaths.withId(id) : null const { apiServerConfig, apiServerRunning } = useApiServer() + + // Disable SWR fetching when server is not running by setting key to null + const swrKey = apiServerRunning && id ? key : null + const fetcher = useCallback(async () => { if (!id) { throw new Error(t('agent.get.error.null_id')) @@ -17,13 +21,10 @@ export const useAgent = (id: string | null) => { if (!apiServerConfig.enabled) { throw new Error(t('apiServer.messages.notEnabled')) } - if (!apiServerRunning) { - throw new Error(t('agent.server.error.not_running')) - } const result = await client.getAgent(id) return result - }, [apiServerConfig.enabled, apiServerRunning, client, id, t]) - const { data, error, isLoading } = useSWR(key, id ? fetcher : null) + }, [apiServerConfig.enabled, client, id, t]) + const { data, error, isLoading } = useSWR(swrKey, fetcher) return { agent: data, diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 58174e6944..332b52586a 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -1047,7 +1047,7 @@ "clear": "清除", "close": "關閉", "collapse": "折疊", - "completed": "[to be translated]:Completed", + "completed": "已完成", "confirm": "確認", "copied": "已複製", "copy": "複製", @@ -3045,37 +3045,37 @@ }, "content": "匯出部分數據,包括聊天記錄、設定。請注意,備份過程可能需要一些時間,感謝您的耐心等候。", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", + "auto_close_tip": "將於 {{seconds}} 秒後自動關閉...", + "confirm_close_message": "檔案傳輸正在進行中。關閉將會中斷傳輸。您確定要強制關閉嗎?", + "confirm_close_title": "確認關閉", + "connected": "已連線", + "connection_failed": "連線失敗", "content": "請確保電腦和手機處於同一網路以使用區域網路傳輸。請打開 Cherry Studio App 掃描此 QR 碼。", "error": { - "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "init_failed": "初始化失敗", + "no_file": "未選擇檔案", + "no_ip": "無法取得 IP 位址", + "send_failed": "無法傳送檔案" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", + "force_close": "強制關閉", + "generating_qr": "正在生成 QR 碼...", "noZipSelected": "未選取壓縮檔案", - "scan_qr": "[to be translated]:Please scan QR code with your phone", + "scan_qr": "請使用手機掃描QR碼", "selectZip": "選擇壓縮檔案", "sendZip": "開始恢復資料", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "轉帳完成", + "connected": "已連線", + "connecting": "連線中...", + "disconnected": "已斷線", + "error": "連線錯誤", + "initializing": "正在初始化連線...", + "preparing": "正在準備傳輸...", + "sending": "傳輸中 {{progress}}%", + "waiting_qr_scan": "請掃描QR碼以連接" }, "title": "區域網路傳輸", - "transfer_progress": "[to be translated]:Transfer progress" + "transfer_progress": "傳輸進度" }, "title": "匯出手機" }, diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index 49a68809e0..06cc53ec12 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -1047,7 +1047,7 @@ "clear": "Löschen", "close": "Schließen", "collapse": "Einklappen", - "completed": "[to be translated]:Completed", + "completed": "Abgeschlossen", "confirm": "Bestätigen", "copied": "Kopiert", "copy": "Kopieren", @@ -3041,43 +3041,43 @@ }, "export_to_phone": { "confirm": { - "button": "[to be translated]:Select backup file" + "button": "Sicherungsdatei auswählen" }, - "content": "[to be translated]:Export some data, including chat logs and settings. Please note that the backup process may take some time. Thank you for your patience.", + "content": "Exportieren Sie einige Daten, einschließlich Chat-Protokollen und Einstellungen. Bitte beachten Sie, dass der Sicherungsvorgang einige Zeit in Anspruch nehmen kann. Vielen Dank für Ihre Geduld.", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", - "content": "[to be translated]:Please ensure your computer and phone are on the same network for LAN transfer. Open the Cherry Studio App to scan this QR code.", + "auto_close_tip": "Automatisches Schließen in {{seconds}} Sekunden...", + "confirm_close_message": "Dateiübertragung läuft. Beim Schließen wird die Übertragung unterbrochen. Möchten Sie wirklich das Schließen erzwingen?", + "confirm_close_title": "Schließen bestätigen", + "connected": "Verbunden", + "connection_failed": "Verbindung fehlgeschlagen", + "content": "Bitte stelle sicher, dass sich dein Computer und dein Telefon im selben Netzwerk befinden, um eine LAN-Übertragung durchzuführen. Öffne die Cherry Studio App, um diesen QR-Code zu scannen.", "error": { - "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "init_failed": "Initialisierung fehlgeschlagen", + "no_file": "Keine Datei ausgewählt", + "no_ip": "IP-Adresse kann nicht abgerufen werden", + "send_failed": "Fehler beim Senden der Datei" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", - "noZipSelected": "[to be translated]:No compressed file selected", - "scan_qr": "[to be translated]:Please scan QR code with your phone", - "selectZip": "[to be translated]:Select a compressed file", - "sendZip": "[to be translated]:Begin data recovery", + "force_close": "Erzwungenes Schließen", + "generating_qr": "QR-Code wird generiert...", + "noZipSelected": "Keine komprimierte Datei ausgewählt", + "scan_qr": "Bitte scannen Sie den QR-Code mit Ihrem Telefon.", + "selectZip": "Wählen Sie eine komprimierte Datei", + "sendZip": "Datenwiederherstellung beginnen", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "Übertragung abgeschlossen", + "connected": "Verbunden", + "connecting": "Verbindung wird hergestellt...", + "disconnected": "Getrennt", + "error": "Verbindungsfehler", + "initializing": "Verbindung wird initialisiert...", + "preparing": "Übertragung wird vorbereitet...", + "sending": "Übertrage {{progress}}%", + "waiting_qr_scan": "Bitte QR-Code scannen, um zu verbinden" }, - "title": "[to be translated]:LAN transmission", - "transfer_progress": "[to be translated]:Transfer progress" + "title": "LAN-Übertragung", + "transfer_progress": "Übertragungsfortschritt" }, - "title": "[to be translated]:Export to phone" + "title": "Auf Telefon exportieren" }, "hour_interval_one": "{{count}} Stunde", "hour_interval_other": "{{count}} Stunden", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index 5a38b80511..fe7885030b 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -1047,7 +1047,7 @@ "clear": "Καθαρισμός", "close": "Κλείσιμο", "collapse": "Σύμπτυξη", - "completed": "[to be translated]:Completed", + "completed": "Ολοκληρώθηκε", "confirm": "Επιβεβαίωση", "copied": "Αντιγράφηκε", "copy": "Αντιγραφή", @@ -3041,43 +3041,43 @@ }, "export_to_phone": { "confirm": { - "button": "[to be translated]:选择备份文件" + "button": "Επιλέξτε αρχείο αντιγράφων ασφαλείας" }, - "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "content": "Εξαγωγή μέρους των δεδομένων, συμπεριλαμβανομένων των ιστορικών συνομιλιών και των ρυθμίσεων. Σημειώστε ότι η διαδικασία δημιουργίας αντιγράφων ασφαλείας ενδέχεται να διαρκέσει κάποιο χρονικό διάστημα, ευχαριστούμε για την υπομονή σας.", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", - "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "auto_close_tip": "Αυτόματο κλείσιμο σε {{seconds}} δευτερόλεπτα...", + "confirm_close_message": "Η μεταφορά αρχείων είναι σε εξέλιξη. Το κλείσιμο θα διακόψει τη μεταφορά. Είστε σίγουροι ότι θέλετε να κλείσετε βίαια;", + "confirm_close_title": "Επιβεβαίωση Κλεισίματος", + "connected": "Συνδεδεμένος", + "connection_failed": "Η σύνδεση απέτυχε", + "content": "Βεβαιωθείτε ότι ο υπολογιστής και το κινητό βρίσκονται στο ίδιο δίκτυο για να χρησιμοποιήσετε τη μεταφορά LAN. Ανοίξτε την εφαρμογή Cherry Studio και σαρώστε αυτόν τον κωδικό QR.", "error": { - "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "init_failed": "Η αρχικοποίηση απέτυχε", + "no_file": "Κανένα αρχείο δεν επιλέχθηκε", + "no_ip": "Αδυναμία λήψης διεύθυνσης IP", + "send_failed": "Αποτυχία αποστολής αρχείου" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", - "noZipSelected": "[to be translated]:未选择压缩文件", - "scan_qr": "[to be translated]:Please scan QR code with your phone", - "selectZip": "[to be translated]:选择压缩文件", - "sendZip": "[to be translated]:开始恢复数据", + "force_close": "Κλείσιμο με βία", + "generating_qr": "Δημιουργία κώδικα QR...", + "noZipSelected": "Δεν επιλέχθηκε συμπιεσμένο αρχείο", + "scan_qr": "Παρακαλώ σαρώστε τον κωδικό QR με το τηλέφωνό σας", + "selectZip": "Επιλέξτε συμπιεσμένο αρχείο", + "sendZip": "Έναρξη ανάκτησης δεδομένων", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "Η μεταφορά ολοκληρώθηκε", + "connected": "Συνδεδεμένος", + "connecting": "Σύνδεση...", + "disconnected": "Αποσυνδέθηκε", + "error": "Σφάλμα σύνδεσης", + "initializing": "Αρχικοποίηση σύνδεσης...", + "preparing": "Προετοιμασία μεταφοράς...", + "sending": "Μεταφορά {{progress}}%", + "waiting_qr_scan": "Παρακαλώ σαρώστε τον κωδικό QR για σύνδεση" }, - "title": "[to be translated]:局域网传输", - "transfer_progress": "[to be translated]:Transfer progress" + "title": "Μεταφορά τοπικού δικτύου", + "transfer_progress": "Πρόοδος μεταφοράς" }, - "title": "[to be translated]:导出至手机" + "title": "Εξαγωγή στο κινητό" }, "hour_interval_one": "{{count}} ώρα", "hour_interval_other": "{{count}} ώρες", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index b04258151d..182da4c1a0 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -1047,7 +1047,7 @@ "clear": "Limpiar", "close": "Cerrar", "collapse": "Colapsar", - "completed": "[to be translated]:Completed", + "completed": "Completado", "confirm": "Confirmar", "copied": "Copiado", "copy": "Copiar", @@ -3041,43 +3041,43 @@ }, "export_to_phone": { "confirm": { - "button": "[to be translated]:选择备份文件" + "button": "Seleccionar archivo de copia de seguridad" }, - "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "content": "Exportar parte de los datos, incluidos los registros de chat y la configuración. Tenga en cuenta que el proceso de copia de seguridad puede tardar un tiempo; gracias por su paciencia.", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", - "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "auto_close_tip": "Cierre automático en {{seconds}} segundos...", + "confirm_close_message": "La transferencia de archivos está en progreso. Cerrar interrumpirá la transferencia. ¿Estás seguro de que quieres forzar el cierre?", + "confirm_close_title": "Confirmar Cierre", + "connected": "Conectado", + "connection_failed": "Conexión fallida", + "content": "Asegúrate de que el ordenador y el móvil estén en la misma red para usar la transferencia por LAN. Abre la aplicación Cherry Studio y escanea este código QR.", "error": { - "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "init_failed": "Falló la inicialización", + "no_file": "Ningún archivo seleccionado", + "no_ip": "No se puede obtener la dirección IP", + "send_failed": "Error al enviar el archivo" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", - "noZipSelected": "[to be translated]:未选择压缩文件", - "scan_qr": "[to be translated]:Please scan QR code with your phone", - "selectZip": "[to be translated]:选择压缩文件", - "sendZip": "[to be translated]:开始恢复数据", + "force_close": "Cerrar forzosamente", + "generating_qr": "Generando código QR...", + "noZipSelected": "No se ha seleccionado ningún archivo comprimido", + "scan_qr": "Por favor, escanea el código QR con tu teléfono", + "selectZip": "Seleccionar archivo comprimido", + "sendZip": "Comenzar la recuperación de datos", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "Transferencia completada", + "connected": "Conectado", + "connecting": "Conectando...", + "disconnected": "Desconectado", + "error": "Error de conexión", + "initializing": "Inicializando conexión...", + "preparing": "Preparando transferencia...", + "sending": "Transfiriendo {{progress}}%", + "waiting_qr_scan": "Por favor, escanea el código QR para conectarte" }, - "title": "[to be translated]:局域网传输", - "transfer_progress": "[to be translated]:Transfer progress" + "title": "Transferencia de red local", + "transfer_progress": "Progreso de transferencia" }, - "title": "[to be translated]:导出至手机" + "title": "Exportar al teléfono" }, "hour_interval_one": "{{count}} hora", "hour_interval_other": "{{count}} horas", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index b9c68d9a8e..32ee893d1a 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -1047,7 +1047,7 @@ "clear": "Effacer", "close": "Fermer", "collapse": "Réduire", - "completed": "[to be translated]:Completed", + "completed": "Terminé", "confirm": "Confirmer", "copied": "Copié", "copy": "Copier", @@ -3041,43 +3041,43 @@ }, "export_to_phone": { "confirm": { - "button": "[to be translated]:选择备份文件" + "button": "Sélectionner le fichier de sauvegarde" }, - "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "content": "Exporter une partie des données, incluant les historiques de discussion et les paramètres. Veuillez noter que le processus de sauvegarde peut prendre un certain temps ; merci pour votre patience.", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", - "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "auto_close_tip": "Fermeture automatique dans {{seconds}} secondes...", + "confirm_close_message": "Le transfert de fichier est en cours. Fermer interrompra le transfert. Êtes-vous sûr de vouloir forcer la fermeture ?", + "confirm_close_title": "Confirmer la fermeture", + "connected": "Connecté", + "connection_failed": "Échec de la connexion", + "content": "Assurez-vous que l'ordinateur et le téléphone sont connectés au même réseau pour utiliser le transfert en réseau local. Ouvrez l'application Cherry Studio et scannez ce code QR.", "error": { - "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "init_failed": "Échec de l'initialisation", + "no_file": "Aucun fichier sélectionné", + "no_ip": "Impossible d'obtenir l'adresse IP", + "send_failed": "Échec de l'envoi du fichier" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", - "noZipSelected": "[to be translated]:未选择压缩文件", - "scan_qr": "[to be translated]:Please scan QR code with your phone", - "selectZip": "[to be translated]:选择压缩文件", - "sendZip": "[to be translated]:开始恢复数据", + "force_close": "Fermer de force", + "generating_qr": "Génération du code QR...", + "noZipSelected": "Aucun fichier compressé sélectionné", + "scan_qr": "Veuillez scanner le code QR avec votre téléphone", + "selectZip": "Sélectionner le fichier compressé", + "sendZip": "Commencer la restauration des données", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "Transfert terminé", + "connected": "Connecté", + "connecting": "Connexion...", + "disconnected": "Déconnecté", + "error": "Erreur de connexion", + "initializing": "Initialisation de la connexion...", + "preparing": "Préparation du transfert...", + "sending": "Transfert {{progress}} %", + "waiting_qr_scan": "Veuillez scanner le code QR pour vous connecter" }, - "title": "[to be translated]:局域网传输", - "transfer_progress": "[to be translated]:Transfer progress" + "title": "Transmission en réseau local", + "transfer_progress": "Progression du transfert" }, - "title": "[to be translated]:导出至手机" + "title": "Exporter vers le téléphone" }, "hour_interval_one": "{{count}} heure", "hour_interval_other": "{{count}} heures", diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index 15b2fb111b..fbbbbc9048 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -1047,7 +1047,7 @@ "clear": "クリア", "close": "閉じる", "collapse": "折りたたむ", - "completed": "[to be translated]:Completed", + "completed": "完了", "confirm": "確認", "copied": "コピーされました", "copy": "コピー", @@ -3041,43 +3041,43 @@ }, "export_to_phone": { "confirm": { - "button": "[to be translated]:选择备份文件" + "button": "バックアップファイルを選択" }, - "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "content": "一部のデータ、チャット履歴や設定をエクスポートします。バックアップには時間がかかる場合がありますので、しばらくお待ちください。", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", - "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "auto_close_tip": "{{seconds}}秒後に自動的に閉じます...", + "confirm_close_message": "ファイル転送が進行中です。閉じると転送が中断されます。強制終了してもよろしいですか?", + "confirm_close_title": "閉じることを確認", + "connected": "接続済み", + "connection_failed": "接続に失敗しました", + "content": "コンピューターとスマートフォンが同じネットワークに接続されていることを確認し、ローカルエリアネットワーク転送を使用してください。Cherry Studioアプリを開き、このQRコードをスキャンしてください。", "error": { - "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "init_failed": "初期化に失敗しました", + "no_file": "ファイルが選択されていません", + "no_ip": "IPアドレスを取得できません", + "send_failed": "ファイルの送信に失敗しました" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", - "noZipSelected": "[to be translated]:未选择压缩文件", - "scan_qr": "[to be translated]:Please scan QR code with your phone", - "selectZip": "[to be translated]:选择压缩文件", - "sendZip": "[to be translated]:开始恢复数据", + "force_close": "強制終了", + "generating_qr": "QRコードを生成中...", + "noZipSelected": "圧縮ファイルが選択されていません", + "scan_qr": "携帯電話でQRコードをスキャンしてください", + "selectZip": "圧縮ファイルを選択", + "sendZip": "データの復元を開始します", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "転送完了", + "connected": "接続済み", + "connecting": "接続中...", + "disconnected": "切断されました", + "error": "接続エラー", + "initializing": "接続を初期化中...", + "preparing": "転送準備中...", + "sending": "転送中 {{progress}}%", + "waiting_qr_scan": "QRコードをスキャンして接続してください" }, - "title": "[to be translated]:局域网传输", - "transfer_progress": "[to be translated]:Transfer progress" + "title": "LAN転送", + "transfer_progress": "転送進行" }, - "title": "[to be translated]:导出至手机" + "title": "スマートフォンにエクスポート" }, "hour_interval_one": "{{count}} 時間", "hour_interval_other": "{{count}} 時間", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index 0253dba3cd..75c4db55e9 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -1047,7 +1047,7 @@ "clear": "Limpar", "close": "Fechar", "collapse": "Recolher", - "completed": "[to be translated]:Completed", + "completed": "Concluído", "confirm": "Confirmar", "copied": "Copiado", "copy": "Copiar", @@ -3041,28 +3041,28 @@ }, "export_to_phone": { "confirm": { - "button": "[to be translated]:选择备份文件" + "button": "Selecionar arquivo de backup" }, - "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "content": "Exportar parte dos dados, incluindo registros de conversas e configurações. Observe que o processo de backup pode demorar um pouco; agradecemos sua paciência.", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", - "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "auto_close_tip": "Fechando automaticamente em {{seconds}} segundos...", + "confirm_close_message": "Transferência de arquivo em andamento. Fechar irá interromper a transferência. Tem certeza de que deseja forçar o fechamento?", + "confirm_close_title": "Confirmar Fechamento", + "connected": "Conectado", + "connection_failed": "Falha na conexão", + "content": "Certifique-se de que o computador e o telefone estejam na mesma rede para usar a transferência via LAN. Abra o aplicativo Cherry Studio e escaneie este código QR.", "error": { "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", + "no_file": "Nenhum arquivo selecionado", "no_ip": "[to be translated]:Unable to get IP address", "send_failed": "[to be translated]:Failed to send file" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", - "noZipSelected": "[to be translated]:未选择压缩文件", - "scan_qr": "[to be translated]:Please scan QR code with your phone", - "selectZip": "[to be translated]:选择压缩文件", - "sendZip": "[to be translated]:开始恢复数据", + "force_close": "Forçar Fechamento", + "generating_qr": "Gerando código QR...", + "noZipSelected": "Nenhum arquivo de compressão selecionado", + "scan_qr": "Por favor, escaneie o código QR com o seu telefone", + "selectZip": "Selecionar arquivo compactado", + "sendZip": "Iniciar recuperação de dados", "status": { "completed": "[to be translated]:Transfer completed", "connected": "[to be translated]:Connected", @@ -3074,10 +3074,10 @@ "sending": "[to be translated]:Transferring {{progress}}%", "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" }, - "title": "[to be translated]:局域网传输", - "transfer_progress": "[to be translated]:Transfer progress" + "title": "transmissão de rede local", + "transfer_progress": "Progresso da transferência" }, - "title": "[to be translated]:导出至手机" + "title": "Exportar para o telemóvel" }, "hour_interval_one": "{{count}} hora", "hour_interval_other": "{{count}} horas", diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index 7e31339a53..f86e16ff2f 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -3041,41 +3041,41 @@ }, "export_to_phone": { "confirm": { - "button": "[to be translated]:选择备份文件" + "button": "Выберите файл резервной копии" }, "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", "lan": { - "auto_close_tip": "[to be translated]:Auto-closing in {{seconds}} seconds...", - "confirm_close_message": "[to be translated]:File transfer is in progress. Closing will interrupt the transfer. Are you sure you want to force close?", - "confirm_close_title": "[to be translated]:Confirm Close", - "connected": "[to be translated]:Connected", - "connection_failed": "[to be translated]:Connection failed", - "content": "[to be translated]:请确保电脑和手机处于同一网络以使用局域网传输。请打开 Cherry Studio App 扫描此二维码。", + "auto_close_tip": "Автоматическое закрытие через {{seconds}} секунд...", + "confirm_close_message": "Передача файла в процессе. Закрытие прервет передачу. Вы уверены, что хотите принудительно закрыть?", + "confirm_close_title": "Подтвердить закрытие", + "connected": "Подключено", + "connection_failed": "Соединение не удалось", + "content": "Убедитесь, что компьютер и телефон подключены к одной сети, чтобы использовать локальную передачу. Откройте приложение Cherry Studio и отсканируйте этот QR-код.", "error": { - "init_failed": "[to be translated]:Initialization failed", - "no_file": "[to be translated]:No file selected", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "init_failed": "Инициализация не удалась", + "no_file": "Файл не выбран", + "no_ip": "Не удалось получить IP-адрес", + "send_failed": "Не удалось отправить файл" }, - "force_close": "[to be translated]:Force Close", - "generating_qr": "[to be translated]:Generating QR code...", - "noZipSelected": "[to be translated]:未选择压缩文件", - "scan_qr": "[to be translated]:Please scan QR code with your phone", - "selectZip": "[to be translated]:选择压缩文件", - "sendZip": "[to be translated]:开始恢复数据", + "force_close": "Принудительное закрытие", + "generating_qr": "Генерация QR-кода...", + "noZipSelected": "Архив не выбран", + "scan_qr": "Пожалуйста, отсканируйте QR-код с помощью вашего телефона", + "selectZip": "Выберите архив", + "sendZip": "Начать восстановление данных", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "Перевод завершён", + "connected": "Подключено", + "connecting": "Подключение...", + "disconnected": "Отключено", + "error": "Ошибка подключения", + "initializing": "Инициализация соединения...", + "preparing": "Подготовка передачи...", + "sending": "Передача {{progress}}%", + "waiting_qr_scan": "Пожалуйста, отсканируйте QR-код для подключения" }, - "title": "[to be translated]:局域网传输", - "transfer_progress": "[to be translated]:Transfer progress" + "title": "Передача по локальной сети", + "transfer_progress": "Прогресс передачи" }, "title": "[to be translated]:导出至手机" }, From fe53b0914a800be836a634599f801dd6670948c7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 31 Oct 2025 21:27:44 +0800 Subject: [PATCH 16/83] feat: add enterprise section and remove license from AboutSettings - Introduced an "Enterprise" section in the i18n files for English, Simplified Chinese, and Traditional Chinese. - Removed the "License" section from the AboutSettings component, replacing it with a link to the enterprise website. - Updated icons in the AboutSettings component to reflect the new structure. --- src/renderer/src/i18n/locales/en-us.json | 7 +++---- src/renderer/src/i18n/locales/zh-cn.json | 7 +++---- src/renderer/src/i18n/locales/zh-tw.json | 7 +++---- .../src/pages/settings/AboutSettings.tsx | 20 +++++++------------ 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 9eaab84076..4210da1533 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -2923,15 +2923,14 @@ }, "description": "A powerful AI assistant for producer", "downloading": "Downloading...", + "enterprise": { + "title": "Enterprise" + }, "feedback": { "button": "Feedback", "title": "Feedback" }, "label": "About & Feedback", - "license": { - "button": "License", - "title": "License" - }, "releases": { "button": "Releases", "title": "Release Notes" diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index c3f486c0b2..405c92ac60 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -2923,15 +2923,14 @@ }, "description": "一款为创造者而生的 AI 助手", "downloading": "正在下载更新...", + "enterprise": { + "title": "企业版" + }, "feedback": { "button": "反馈", "title": "意见反馈" }, "label": "关于我们", - "license": { - "button": "查看", - "title": "许可证" - }, "releases": { "button": "查看", "title": "更新日志" diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 332b52586a..ea93788341 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -2923,15 +2923,14 @@ }, "description": "一款為創作者而生的強大 AI 助手", "downloading": "正在下載...", + "enterprise": { + "title": "企業版" + }, "feedback": { "button": "回饋", "title": "回饋" }, "label": "關於與回饋", - "license": { - "button": "檢視", - "title": "授權" - }, "releases": { "button": "檢視", "title": "更新日誌" diff --git a/src/renderer/src/pages/settings/AboutSettings.tsx b/src/renderer/src/pages/settings/AboutSettings.tsx index 1cbb8ce694..dcf95324d0 100644 --- a/src/renderer/src/pages/settings/AboutSettings.tsx +++ b/src/renderer/src/pages/settings/AboutSettings.tsx @@ -17,7 +17,7 @@ import { UpgradeChannel } from '@shared/config/constant' import { Avatar, Button, Progress, Radio, Row, Switch, Tag, Tooltip } from 'antd' import { UpdateInfo } from 'builder-util-runtime' import { debounce } from 'lodash' -import { Bug, FileCheck, Globe, Mail, Rss } from 'lucide-react' +import { Bug, Building2, Github, Globe, Mail, Rss } from 'lucide-react' import { BadgeQuestionMark } from 'lucide-react' import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -83,14 +83,8 @@ const AboutSettings: FC = () => { await window.api.devTools.toggle() } - const showLicense = async () => { - const { appPath } = await window.api.getAppInfo() - openSmartMinapp({ - id: 'cherrystudio-license', - name: t('settings.about.license.title'), - url: `file://${appPath}/resources/cherry-studio/license.html`, - logo: AppLogo - }) + const showEnterprise = async () => { + onOpenWebsite('https://cherry-ai.com/enterprise') } const showReleases = async () => { @@ -315,7 +309,7 @@ const AboutSettings: FC = () => { - + {t('settings.about.feedback.title')} + From 82ca35fc29f030d2a82e18fdf9c810bd9c84eff4 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 31 Oct 2025 21:29:29 +0800 Subject: [PATCH 17/83] chore: update issue template names by removing language specification - Modified the names of the issue templates for bug reports, feature requests, and other questions to remove the "(English)" suffix, simplifying the titles for better clarity. --- .github/ISSUE_TEMPLATE/0_bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/1_feature_request.yml | 2 +- .github/ISSUE_TEMPLATE/3_others.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/0_bug_report.yml b/.github/ISSUE_TEMPLATE/0_bug_report.yml index c50cdef530..9baf846a6d 100644 --- a/.github/ISSUE_TEMPLATE/0_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/0_bug_report.yml @@ -1,4 +1,4 @@ -name: 🐛 Bug Report (English) +name: 🐛 Bug Report description: Create a report to help us improve title: '[Bug]: ' labels: ['BUG'] diff --git a/.github/ISSUE_TEMPLATE/1_feature_request.yml b/.github/ISSUE_TEMPLATE/1_feature_request.yml index 0822742704..d980cb8367 100644 --- a/.github/ISSUE_TEMPLATE/1_feature_request.yml +++ b/.github/ISSUE_TEMPLATE/1_feature_request.yml @@ -1,4 +1,4 @@ -name: 💡 Feature Request (English) +name: 💡 Feature Request description: Suggest an idea for this project title: '[Feature]: ' labels: ['feature'] diff --git a/.github/ISSUE_TEMPLATE/3_others.yml b/.github/ISSUE_TEMPLATE/3_others.yml index 4d8a383080..2784c66d59 100644 --- a/.github/ISSUE_TEMPLATE/3_others.yml +++ b/.github/ISSUE_TEMPLATE/3_others.yml @@ -1,4 +1,4 @@ -name: 🤔 Other Questions (English) +name: 🤔 Other Questions description: Submit questions that don't fit into bug reports or feature requests title: '[Other]: ' body: From 1018ad87b8d7945ffd9f1a953d96ff94b823562b Mon Sep 17 00:00:00 2001 From: Pleasure1234 <3196812536@qq.com> Date: Fri, 31 Oct 2025 14:17:06 +0000 Subject: [PATCH 18/83] fix: cancel debounced save on file path update (#11069) Adds cancellation of the debounced save when the active file path is updated after moving a file or folder. This prevents saving to the old path and ensures lastFilePathRef is updated accordingly. --- src/renderer/src/pages/notes/NotesPage.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/pages/notes/NotesPage.tsx b/src/renderer/src/pages/notes/NotesPage.tsx index bbd57b9da1..fb7df83bfd 100644 --- a/src/renderer/src/pages/notes/NotesPage.tsx +++ b/src/renderer/src/pages/notes/NotesPage.tsx @@ -716,10 +716,17 @@ const NotesPage: FC = () => { const normalizedActivePath = activeFilePath ? normalizePathValue(activeFilePath) : undefined if (normalizedActivePath) { if (normalizedActivePath === sourceNode.externalPath) { + // Cancel debounced save to prevent saving to old path + debouncedSaveRef.current?.cancel() + lastFilePathRef.current = destinationPath dispatch(setActiveFilePath(destinationPath)) } else if (sourceNode.type === 'folder' && normalizedActivePath.startsWith(`${sourceNode.externalPath}/`)) { const suffix = normalizedActivePath.slice(sourceNode.externalPath.length) - dispatch(setActiveFilePath(`${destinationPath}${suffix}`)) + const newActivePath = `${destinationPath}${suffix}` + // Cancel debounced save to prevent saving to old path + debouncedSaveRef.current?.cancel() + lastFilePathRef.current = newActivePath + dispatch(setActiveFilePath(newActivePath)) } } From 562fbb3ff76a0b9466ca942770ccbf812ff6397e Mon Sep 17 00:00:00 2001 From: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:28:25 +0800 Subject: [PATCH 19/83] fix: minor ui tweak of plugin installation interface (#11085) * fix: use dropdown instead of chip filter * fix: add padding to avoid scroll bar overlap * fix: set max card grid col to 2 * fix: minor ui tweak for plugin card * fix: remove redundant args * fix(i18n): Auto update translations for PR #11085 * fix: cleanup comments --------- Co-authored-by: GitHub Action --- src/renderer/src/i18n/translate/pt-pt.json | 24 ++-- src/renderer/src/i18n/translate/ru-ru.json | 6 +- .../settings/AgentSettings/PluginSettings.tsx | 4 +- .../components/CategoryFilter.tsx | 53 -------- .../components/PluginBrowser.tsx | 127 +++++++++++++----- .../AgentSettings/components/PluginCard.tsx | 15 ++- .../AgentSettings/components/index.ts | 2 - 7 files changed, 121 insertions(+), 110 deletions(-) delete mode 100644 src/renderer/src/pages/settings/AgentSettings/components/CategoryFilter.tsx diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index 75c4db55e9..aa185cb07d 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -3052,10 +3052,10 @@ "connection_failed": "Falha na conexão", "content": "Certifique-se de que o computador e o telefone estejam na mesma rede para usar a transferência via LAN. Abra o aplicativo Cherry Studio e escaneie este código QR.", "error": { - "init_failed": "[to be translated]:Initialization failed", + "init_failed": "Falha na inicialização", "no_file": "Nenhum arquivo selecionado", - "no_ip": "[to be translated]:Unable to get IP address", - "send_failed": "[to be translated]:Failed to send file" + "no_ip": "Incapaz de obter endereço IP", + "send_failed": "Falha ao enviar arquivo" }, "force_close": "Forçar Fechamento", "generating_qr": "Gerando código QR...", @@ -3064,15 +3064,15 @@ "selectZip": "Selecionar arquivo compactado", "sendZip": "Iniciar recuperação de dados", "status": { - "completed": "[to be translated]:Transfer completed", - "connected": "[to be translated]:Connected", - "connecting": "[to be translated]:Connecting...", - "disconnected": "[to be translated]:Disconnected", - "error": "[to be translated]:Connection error", - "initializing": "[to be translated]:Initializing connection...", - "preparing": "[to be translated]:Preparing transfer...", - "sending": "[to be translated]:Transferring {{progress}}%", - "waiting_qr_scan": "[to be translated]:Please scan QR code to connect" + "completed": "Transferência concluída", + "connected": "Conectado", + "connecting": "Conectando...", + "disconnected": "Desconectado", + "error": "Erro de conexão", + "initializing": "Inicializando conexão...", + "preparing": "Preparando transferência...", + "sending": "Transferindo {{progress}}%", + "waiting_qr_scan": "Por favor, escaneie o código QR para conectar" }, "title": "transmissão de rede local", "transfer_progress": "Progresso da transferência" diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index f86e16ff2f..8df5ef6630 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -1047,7 +1047,7 @@ "clear": "Очистить", "close": "Закрыть", "collapse": "Свернуть", - "completed": "[to be translated]:Completed", + "completed": "Завершено", "confirm": "Подтверждение", "copied": "Скопировано", "copy": "Копировать", @@ -3043,7 +3043,7 @@ "confirm": { "button": "Выберите файл резервной копии" }, - "content": "[to be translated]:导出部分数据,包括聊天记录、设置。请注意,备份过程可能需要一些时间,感谢您的耐心等待。", + "content": "Экспорт части данных, включая чат и настройки. Пожалуйста, обратите внимание, что процесс резервного копирования может занять некоторое время. Благодарим за ваше терпение.", "lan": { "auto_close_tip": "Автоматическое закрытие через {{seconds}} секунд...", "confirm_close_message": "Передача файла в процессе. Закрытие прервет передачу. Вы уверены, что хотите принудительно закрыть?", @@ -3077,7 +3077,7 @@ "title": "Передача по локальной сети", "transfer_progress": "Прогресс передачи" }, - "title": "[to be translated]:导出至手机" + "title": "Экспорт на телефон" }, "hour_interval_one": "{{count}} час", "hour_interval_other": "{{count}} часов", diff --git a/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx index aa7bb93ea4..fec28b13a0 100644 --- a/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx @@ -63,7 +63,7 @@ const PluginSettings: FC = ({ agentBase }) => { panel: 'w-full flex-1 overflow-hidden' }}> -
+
{errorAvailable ? ( @@ -88,7 +88,7 @@ const PluginSettings: FC = ({ agentBase }) => { -
+
{errorInstalled ? ( diff --git a/src/renderer/src/pages/settings/AgentSettings/components/CategoryFilter.tsx b/src/renderer/src/pages/settings/AgentSettings/components/CategoryFilter.tsx deleted file mode 100644 index c9ecee2814..0000000000 --- a/src/renderer/src/pages/settings/AgentSettings/components/CategoryFilter.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Chip } from '@heroui/react' -import { FC } from 'react' -import { useTranslation } from 'react-i18next' - -export interface CategoryFilterProps { - categories: string[] - selectedCategories: string[] - onChange: (categories: string[]) => void -} - -export const CategoryFilter: FC = ({ categories, selectedCategories, onChange }) => { - const { t } = useTranslation() - - const isAllSelected = selectedCategories.length === 0 - - const handleCategoryClick = (category: string) => { - if (selectedCategories.includes(category)) { - onChange(selectedCategories.filter((c) => c !== category)) - } else { - onChange([...selectedCategories, category]) - } - } - - const handleAllClick = () => { - onChange([]) - } - - return ( -
- - {t('plugins.all_categories')} - - - {categories.map((category) => { - const isSelected = selectedCategories.includes(category) - return ( - handleCategoryClick(category)} - className="cursor-pointer"> - {category} - - ) - })} -
- ) -} diff --git a/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx b/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx index 3f034e5ec4..af9f5d357c 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx @@ -1,10 +1,19 @@ -import { Input, Pagination, Tab, Tabs } from '@heroui/react' +import { + Button, + Dropdown, + DropdownItem, + DropdownMenu, + DropdownTrigger, + Input, + Pagination, + Tab, + Tabs +} from '@heroui/react' import { InstalledPlugin, PluginMetadata } from '@renderer/types/plugin' -import { Search } from 'lucide-react' +import { Filter, Search } from 'lucide-react' import { FC, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { CategoryFilter } from './CategoryFilter' import { PluginCard } from './PluginCard' import { PluginDetailModal } from './PluginDetailModal' @@ -122,8 +131,13 @@ export const PluginBrowser: FC = ({ setCurrentPage(1) } - const handleCategoryChange = (categories: string[]) => { - setSelectedCategories(categories) + const handleCategoryChange = (keys: Set) => { + // Reset if "all" selected, otherwise filter categories + if (keys.has('all') || keys.size === 0) { + setSelectedCategories([]) + } else { + setSelectedCategories(Array.from(keys).filter((key) => key !== 'all')) + } setCurrentPage(1) } @@ -144,25 +158,71 @@ export const PluginBrowser: FC = ({ return (
- {/* Search Input */} - } - isClearable - classNames={{ - input: 'text-small', - inputWrapper: 'h-10' - }} - /> + {/* Search and Filter */} +
+ } + isClearable + classNames={{ + input: 'text-small', + inputWrapper: 'h-10' + }} + className="flex-1" + /> - {/* Category Filter */} - + + + + + ({ key: category, label: category })) + ]}> + {(item) => { + const isSelected = + item.key === 'all' ? selectedCategories.length === 0 : selectedCategories.includes(item.key) + + return ( + { + if (item.key === 'all') { + handleCategoryChange(new Set(['all'])) + } else { + const newKeys = selectedCategories.includes(item.key) + ? new Set(selectedCategories.filter((c) => c !== item.key)) + : new Set([...selectedCategories, item.key]) + handleCategoryChange(newKeys) + } + }} + className={isSelected ? 'bg-primary-50' : ''}> + {item.label} + {isSelected && } + + ) + }} + + +
{/* Type Tabs */} @@ -184,21 +244,22 @@ export const PluginBrowser: FC = ({

{t('plugins.try_different_search')}

) : ( -
+
{paginatedPlugins.map((plugin) => { const installed = isPluginInstalled(plugin) const isActioning = actioningPlugin === plugin.sourcePath return ( - handleInstall(plugin)} - onUninstall={() => handleUninstall(plugin)} - loading={loading || isActioning} - onClick={() => handlePluginClick(plugin)} - /> +
+ handleInstall(plugin)} + onUninstall={() => handleUninstall(plugin)} + loading={loading || isActioning} + onClick={() => handlePluginClick(plugin)} + /> +
) })}
diff --git a/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx b/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx index ddf89adad7..a82a9e7726 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx @@ -17,14 +17,19 @@ export const PluginCard: FC = ({ plugin, installed, onInstall, const { t } = useTranslation() return ( - + -
-

{plugin.name}

+
+

{plugin.name}

+ color={plugin.type === 'agent' ? 'primary' : plugin.type === 'skill' ? 'success' : 'secondary'} + className="h-4 min-w-0 flex-shrink-0 px-0.5" + style={{ fontSize: '10px' }}> {plugin.type}
@@ -33,7 +38,7 @@ export const PluginCard: FC = ({ plugin, installed, onInstall, - +

{plugin.description || t('plugins.no_description')}

{plugin.tags && plugin.tags.length > 0 && ( diff --git a/src/renderer/src/pages/settings/AgentSettings/components/index.ts b/src/renderer/src/pages/settings/AgentSettings/components/index.ts index 9cdb704545..6c6873f7ed 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/index.ts +++ b/src/renderer/src/pages/settings/AgentSettings/components/index.ts @@ -1,5 +1,3 @@ -export type { CategoryFilterProps } from './CategoryFilter' -export { CategoryFilter } from './CategoryFilter' export type { InstalledPluginsListProps } from './InstalledPluginsList' export { InstalledPluginsList } from './InstalledPluginsList' export type { PluginBrowserProps } from './PluginBrowser' From fb02a61a48191c210ff8dec3aa436581b9c5eae3 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 31 Oct 2025 22:26:09 +0800 Subject: [PATCH 20/83] feat: add AddAssistantOrAgentPopup component and update i18n translations - Introduced a new AddAssistantOrAgentPopup component for selecting between assistant and agent options. - Updated English, Simplified Chinese, and Traditional Chinese translations to include descriptions and titles for assistant and agent options. - Refactored UnifiedAddButton to utilize the new popup for adding assistants or agents. --- biome.jsonc | 2 +- .../Popups/AddAssistantOrAgentPopup.tsx | 119 +++++++++++++++ src/renderer/src/i18n/locales/en-us.json | 5 + src/renderer/src/i18n/locales/zh-cn.json | 5 + src/renderer/src/i18n/locales/zh-tw.json | 5 + .../src/pages/home/Tabs/AssistantsTab.tsx | 2 +- .../pages/home/Tabs/components/AgentItem.tsx | 3 +- .../home/Tabs/components/AssistantItem.tsx | 3 +- .../home/Tabs/components/UnifiedAddButton.tsx | 54 ++----- .../settings/AgentSettings/PluginSettings.tsx | 4 +- .../AgentSettings/ToolingSettings.tsx | 4 +- .../components/InstalledPluginsList.tsx | 2 +- .../components/PluginBrowser.tsx | 143 +++++++++--------- .../AgentSettings/components/PluginCard.tsx | 9 +- tsconfig.node.json | 3 +- 15 files changed, 242 insertions(+), 121 deletions(-) create mode 100644 src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx diff --git a/biome.jsonc b/biome.jsonc index 94c2e3bae6..9509135fc4 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -23,7 +23,7 @@ }, "files": { "ignoreUnknown": false, - "includes": ["**"], + "includes": ["**", "!**/.claude/**"], "maxSize": 2097152 }, "formatter": { diff --git a/src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx b/src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx new file mode 100644 index 0000000000..4094b3f3d1 --- /dev/null +++ b/src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx @@ -0,0 +1,119 @@ +import { cn } from '@heroui/react' +import { TopView } from '@renderer/components/TopView' +import { Modal } from 'antd' +import { Bot, MessageSquare } from 'lucide-react' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' + +type OptionType = 'assistant' | 'agent' + +interface ShowParams { + onSelect: (type: OptionType) => void +} + +interface Props extends ShowParams { + resolve: (data: { type?: OptionType }) => void +} + +const PopupContainer: React.FC = ({ onSelect, resolve }) => { + const { t } = useTranslation() + const [open, setOpen] = useState(true) + const [hoveredOption, setHoveredOption] = useState(null) + + const onCancel = () => { + setOpen(false) + } + + const onClose = () => { + resolve({}) + } + + const handleSelect = (type: OptionType) => { + setOpen(false) + onSelect(type) + resolve({ type }) + } + + AddAssistantOrAgentPopup.hide = onCancel + + return ( + +
+ {/* Assistant Option */} + + + {/* Agent Option */} + +
+
+ ) +} + +const TopViewKey = 'AddAssistantOrAgentPopup' + +export default class AddAssistantOrAgentPopup { + static topviewId = 0 + static hide() { + TopView.hide(TopViewKey) + } + static show(props: ShowParams) { + return new Promise<{ type?: OptionType }>((resolve) => { + TopView.show( + { + resolve(v) + TopView.hide(TopViewKey) + }} + />, + TopViewKey + ) + }) + } +} diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 4210da1533..b3b89851d7 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "Handle complex tasks with various tools", "error": { "failed": "Failed to add a agent", "invalid_agent": "Invalid Agent" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "Daily conversations and quick Q&A", "title": "Add Assistant" }, + "option": { + "title": "Select Type" + }, "topic": { "title": "New Topic" } diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 405c92ac60..8f91651bac 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "调用各种工具处理复杂任务", "error": { "failed": "添加 Agent 失败", "invalid_agent": "无效的 Agent" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "日常对话和快速问答", "title": "添加助手" }, + "option": { + "title": "选择添加类型" + }, "topic": { "title": "新建话题" } diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index ea93788341..f89802ee23 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "調用各種工具處理複雜任務", "error": { "failed": "無法新增代理人", "invalid_agent": "無效的 Agent" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "日常對話和快速問答", "title": "新增助手" }, + "option": { + "title": "選擇新增類型" + }, "topic": { "title": "新增話題" } diff --git a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx index 2cb6aabfa4..4eebe45bc3 100644 --- a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx @@ -170,7 +170,7 @@ const AssistantsTab: FC = (props) => { onAssistantSwitch={setActiveAssistant} onAssistantDelete={onDeleteAssistant} onAgentDelete={deleteAgent} - onAgentPress={setActiveAgentId} + onAgentPress={handleAgentPress} addPreset={addAssistantPreset} copyAssistant={copyAssistant} onCreateDefaultAssistant={onCreateDefaultAssistant} diff --git a/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx b/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx index 9836ee5891..4ecc862ae3 100644 --- a/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx @@ -84,7 +84,8 @@ export const Container: React.FC<{ isActive?: boolean } & React.HTMLAttributes (
diff --git a/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx b/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx index d50add0bd8..433709d20b 100644 --- a/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx +++ b/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx @@ -1,10 +1,10 @@ -import { Button, Popover, PopoverContent, PopoverTrigger, useDisclosure } from '@heroui/react' +import { useDisclosure } from '@heroui/react' +import AddAssistantOrAgentPopup from '@renderer/components/Popups/AddAssistantOrAgentPopup' import { AgentModal } from '@renderer/components/Popups/agent/AgentModal' import { useAppDispatch } from '@renderer/store' import { setActiveTopicOrSessionAction } from '@renderer/store/runtime' import { AgentEntity, Assistant, Topic } from '@renderer/types' -import { Bot, MessageSquare } from 'lucide-react' -import { FC, useCallback, useState } from 'react' +import { FC, useCallback } from 'react' import { useTranslation } from 'react-i18next' import AddButton from './AddButton' @@ -17,18 +17,19 @@ interface UnifiedAddButtonProps { const UnifiedAddButton: FC = ({ onCreateAssistant, setActiveAssistant, setActiveAgentId }) => { const { t } = useTranslation() - const [isPopoverOpen, setIsPopoverOpen] = useState(false) const { isOpen: isAgentModalOpen, onOpen: onAgentModalOpen, onClose: onAgentModalClose } = useDisclosure() const dispatch = useAppDispatch() - const handleAddAssistant = () => { - setIsPopoverOpen(false) - onCreateAssistant() - } - - const handleAddAgent = () => { - setIsPopoverOpen(false) - onAgentModalOpen() + const handleAddButtonClick = () => { + AddAssistantOrAgentPopup.show({ + onSelect: (type) => { + if (type === 'assistant') { + onCreateAssistant() + } else if (type === 'agent') { + onAgentModalOpen() + } + } + }) } const afterCreate = useCallback( @@ -58,32 +59,9 @@ const UnifiedAddButton: FC = ({ onCreateAssistant, setAct return (
- - - {t('chat.add.assistant.title')} - - -
- - -
-
-
- + + {t('chat.add.assistant.title')} +
) diff --git a/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx index fec28b13a0..74d63ecba3 100644 --- a/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx @@ -54,7 +54,7 @@ const PluginSettings: FC = ({ agentBase }) => { ) return ( - + = ({ agentBase }) => { panel: 'w-full flex-1 overflow-hidden' }}> -
+
{errorAvailable ? ( diff --git a/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx index f58fae7b6c..d828e921a6 100644 --- a/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx @@ -168,6 +168,7 @@ export const ToolingSettings: FC = ({ agentBase, upda
), + centered: true, okText: t('common.confirm'), cancelText: t('common.cancel'), onOk: applyChange, @@ -274,9 +275,10 @@ export const ToolingSettings: FC = ({ agentBase, upda key={card.mode} isPressable={!disabled} isDisabled={disabled || isUpdatingMode} + shadow="none" onPress={() => handleSelectPermissionMode(card.mode)} className={`border ${ - isSelected ? 'border-primary shadow-lg' : 'border-default-200' + isSelected ? 'border-primary' : 'border-default-200' } ${disabled ? 'opacity-60' : ''}`}>
diff --git a/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx b/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx index 4aa3015a4a..1a6924a6d2 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx @@ -55,7 +55,7 @@ export const InstalledPluginsList: FC = ({ plugins, o {t('plugins.name')} {t('plugins.type')} {t('plugins.category')} - {t('plugins.actions')} + {t('plugins.actions')} {plugins.map((plugin) => ( diff --git a/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx b/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx index af9f5d357c..fd106325fb 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx @@ -1,17 +1,7 @@ -import { - Button, - Dropdown, - DropdownItem, - DropdownMenu, - DropdownTrigger, - Input, - Pagination, - Tab, - Tabs -} from '@heroui/react' +import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Input, Tab, Tabs } from '@heroui/react' import { InstalledPlugin, PluginMetadata } from '@renderer/types/plugin' import { Filter, Search } from 'lucide-react' -import { FC, useMemo, useState } from 'react' +import { FC, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { PluginCard } from './PluginCard' @@ -46,10 +36,11 @@ export const PluginBrowser: FC = ({ const [searchQuery, setSearchQuery] = useState('') const [selectedCategories, setSelectedCategories] = useState([]) const [activeType, setActiveType] = useState('all') - const [currentPage, setCurrentPage] = useState(1) + const [displayCount, setDisplayCount] = useState(ITEMS_PER_PAGE) const [actioningPlugin, setActioningPlugin] = useState(null) const [selectedPlugin, setSelectedPlugin] = useState(null) const [isModalOpen, setIsModalOpen] = useState(false) + const observerTarget = useRef(null) // Combine all plugins based on active type const allPlugins = useMemo(() => { @@ -95,14 +86,35 @@ export const PluginBrowser: FC = ({ }) }, [allPlugins, searchQuery, selectedCategories]) - // Paginate filtered plugins - const paginatedPlugins = useMemo(() => { - const startIndex = (currentPage - 1) * ITEMS_PER_PAGE - const endIndex = startIndex + ITEMS_PER_PAGE - return filteredPlugins.slice(startIndex, endIndex) - }, [filteredPlugins, currentPage]) + // Display plugins based on displayCount + const displayedPlugins = useMemo(() => { + return filteredPlugins.slice(0, displayCount) + }, [filteredPlugins, displayCount]) - const totalPages = Math.ceil(filteredPlugins.length / ITEMS_PER_PAGE) + const hasMore = displayCount < filteredPlugins.length + + // Reset display count when filters change + useEffect(() => { + setDisplayCount(ITEMS_PER_PAGE) + }, [filteredPlugins]) + + // Infinite scroll observer + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && hasMore) { + setDisplayCount((prev) => prev + ITEMS_PER_PAGE) + } + }, + { threshold: 0.1 } + ) + + if (observerTarget.current) { + observer.observe(observerTarget.current) + } + + return () => observer.disconnect() + }, [hasMore]) // Check if a plugin is installed const isPluginInstalled = (plugin: PluginMetadata): boolean => { @@ -125,10 +137,9 @@ export const PluginBrowser: FC = ({ setActioningPlugin(null) } - // Reset to first page when filters change + // Reset display count when filters change const handleSearchChange = (value: string) => { setSearchQuery(value) - setCurrentPage(1) } const handleCategoryChange = (keys: Set) => { @@ -138,12 +149,10 @@ export const PluginBrowser: FC = ({ } else { setSelectedCategories(Array.from(keys).filter((key) => key !== 'all')) } - setCurrentPage(1) } const handleTypeChange = (type: string | number) => { setActiveType(type as PluginType) - setCurrentPage(1) } const handlePluginClick = (plugin: PluginMetadata) => { @@ -159,32 +168,27 @@ export const PluginBrowser: FC = ({ return (
{/* Search and Filter */} -
+
} isClearable - classNames={{ - input: 'text-small', - inputWrapper: 'h-10' - }} + size="md" className="flex-1" - /> - - + inputWrapper: 'pr-12' + }} + /> + @@ -225,12 +229,14 @@ export const PluginBrowser: FC = ({
{/* Type Tabs */} - - - - - - +
+ + + + + + +
{/* Result Count */}
@@ -238,38 +244,35 @@ export const PluginBrowser: FC = ({
{/* Plugin Grid */} - {paginatedPlugins.length === 0 ? ( + {displayedPlugins.length === 0 ? (

{t('plugins.no_results')}

{t('plugins.try_different_search')}

) : ( -
- {paginatedPlugins.map((plugin) => { - const installed = isPluginInstalled(plugin) - const isActioning = actioningPlugin === plugin.sourcePath + <> +
+ {displayedPlugins.map((plugin) => { + const installed = isPluginInstalled(plugin) + const isActioning = actioningPlugin === plugin.sourcePath - return ( -
- handleInstall(plugin)} - onUninstall={() => handleUninstall(plugin)} - loading={loading || isActioning} - onClick={() => handlePluginClick(plugin)} - /> -
- ) - })} -
- )} - - {/* Pagination */} - {totalPages > 1 && ( -
- -
+ return ( +
+ handleInstall(plugin)} + onUninstall={() => handleUninstall(plugin)} + loading={loading || isActioning} + onClick={() => handlePluginClick(plugin)} + /> +
+ ) + })} +
+ {/* Infinite scroll trigger */} + {hasMore &&
} + )} {/* Plugin Detail Modal */} diff --git a/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx b/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx index a82a9e7726..ee94bc0ad7 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx @@ -1,5 +1,6 @@ import { Button, Card, CardBody, CardFooter, CardHeader, Chip, Spinner } from '@heroui/react' import { PluginMetadata } from '@renderer/types/plugin' +import { upperFirst } from 'lodash' import { Download, Trash2 } from 'lucide-react' import { FC } from 'react' import { useTranslation } from 'react-i18next' @@ -18,8 +19,9 @@ export const PluginCard: FC = ({ plugin, installed, onInstall, return (
@@ -28,9 +30,8 @@ export const PluginCard: FC = ({ plugin, installed, onInstall, size="sm" variant="solid" color={plugin.type === 'agent' ? 'primary' : plugin.type === 'skill' ? 'success' : 'secondary'} - className="h-4 min-w-0 flex-shrink-0 px-0.5" - style={{ fontSize: '10px' }}> - {plugin.type} + className="h-4 min-w-0 flex-shrink-0 px-0.5 text-xs"> + {upperFirst(plugin.type)}
diff --git a/tsconfig.node.json b/tsconfig.node.json index b6f9061cdf..83c3f2b461 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -9,7 +9,8 @@ "packages/shared/**/*", "scripts", "packages/mcp-trace/**/*", - "src/renderer/src/services/traceApi.ts" ], + "src/renderer/src/services/traceApi.ts" + ], "compilerOptions": { "composite": true, "incremental": true, From 1f0381aebee0765df03cc02a00ed4b68808c26c2 Mon Sep 17 00:00:00 2001 From: SuYao Date: Sat, 1 Nov 2025 01:52:16 +0800 Subject: [PATCH 21/83] Fix/azure embedding (#11044) * fix: update EmbeddingsFactory to use net.fetch and refactor KnowledgeService to use ModernAiProvider * fix: remove deprecated @langchain/community dependency from package.json * fix: add @langchain/community dependency to package.json and update yarn.lock --- ...langchain-core-npm-0.3.44-41d5c3cb0a.patch | 71 --- ...@langchain-core-npm-1.0.2-183ef83fe4.patch | 68 +++ ...ngchain-openai-npm-0.3.16-e525b59526.patch | 19 - ...angchain-openai-npm-1.0.0-474d0ad9d4.patch | 17 + package.json | 13 +- .../embedjs/embeddings/EmbeddingsFactory.ts | 3 +- src/renderer/src/services/KnowledgeService.ts | 25 +- yarn.lock | 429 +++++++----------- 8 files changed, 275 insertions(+), 370 deletions(-) delete mode 100644 .yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch create mode 100644 .yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch delete mode 100644 .yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch create mode 100644 .yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch diff --git a/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch b/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch deleted file mode 100644 index e1258fcb35..0000000000 --- a/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff --git a/dist/utils/tiktoken.cjs b/dist/utils/tiktoken.cjs -index 973b0d0e75aeaf8de579419af31b879b32975413..f23c7caa8b9dc8bd404132725346a4786f6b278b 100644 ---- a/dist/utils/tiktoken.cjs -+++ b/dist/utils/tiktoken.cjs -@@ -1,25 +1,14 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.encodingForModel = exports.getEncoding = void 0; --const lite_1 = require("js-tiktoken/lite"); - const async_caller_js_1 = require("./async_caller.cjs"); - const cache = {}; - const caller = /* #__PURE__ */ new async_caller_js_1.AsyncCaller({}); - async function getEncoding(encoding) { -- if (!(encoding in cache)) { -- cache[encoding] = caller -- .fetch(`https://tiktoken.pages.dev/js/${encoding}.json`) -- .then((res) => res.json()) -- .then((data) => new lite_1.Tiktoken(data)) -- .catch((e) => { -- delete cache[encoding]; -- throw e; -- }); -- } -- return await cache[encoding]; -+ throw new Error("TikToken Not implemented"); - } - exports.getEncoding = getEncoding; - async function encodingForModel(model) { -- return getEncoding((0, lite_1.getEncodingNameForModel)(model)); -+ throw new Error("TikToken Not implemented"); - } - exports.encodingForModel = encodingForModel; -diff --git a/dist/utils/tiktoken.js b/dist/utils/tiktoken.js -index 8e41ee6f00f2f9c7fa2c59fa2b2f4297634b97aa..aa5f314a6349ad0d1c5aea8631a56aad099176e0 100644 ---- a/dist/utils/tiktoken.js -+++ b/dist/utils/tiktoken.js -@@ -1,20 +1,9 @@ --import { Tiktoken, getEncodingNameForModel, } from "js-tiktoken/lite"; - import { AsyncCaller } from "./async_caller.js"; - const cache = {}; - const caller = /* #__PURE__ */ new AsyncCaller({}); - export async function getEncoding(encoding) { -- if (!(encoding in cache)) { -- cache[encoding] = caller -- .fetch(`https://tiktoken.pages.dev/js/${encoding}.json`) -- .then((res) => res.json()) -- .then((data) => new Tiktoken(data)) -- .catch((e) => { -- delete cache[encoding]; -- throw e; -- }); -- } -- return await cache[encoding]; -+ throw new Error("TikToken Not implemented"); - } - export async function encodingForModel(model) { -- return getEncoding(getEncodingNameForModel(model)); -+ throw new Error("TikToken Not implemented"); - } -diff --git a/package.json b/package.json -index 36072aecf700fca1bc49832a19be832eca726103..90b8922fba1c3d1b26f78477c891b07816d6238a 100644 ---- a/package.json -+++ b/package.json -@@ -37,7 +37,6 @@ - "ansi-styles": "^5.0.0", - "camelcase": "6", - "decamelize": "1.2.0", -- "js-tiktoken": "^1.0.12", - "langsmith": ">=0.2.8 <0.4.0", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", diff --git a/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch b/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch new file mode 100644 index 0000000000..6c8ad0b426 --- /dev/null +++ b/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch @@ -0,0 +1,68 @@ +diff --git a/dist/utils/tiktoken.cjs b/dist/utils/tiktoken.cjs +index c5b41f121d2e3d24c3a4969e31fa1acffdcad3b9..ec724489dcae79ee6c61acf2d4d84bd19daef036 100644 +--- a/dist/utils/tiktoken.cjs ++++ b/dist/utils/tiktoken.cjs +@@ -1,6 +1,5 @@ + const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs'); + const require_utils_async_caller = require('./async_caller.cjs'); +-const js_tiktoken_lite = require_rolldown_runtime.__toESM(require("js-tiktoken/lite")); + + //#region src/utils/tiktoken.ts + var tiktoken_exports = {}; +@@ -11,14 +10,10 @@ require_rolldown_runtime.__export(tiktoken_exports, { + const cache = {}; + const caller = /* @__PURE__ */ new require_utils_async_caller.AsyncCaller({}); + async function getEncoding(encoding) { +- if (!(encoding in cache)) cache[encoding] = caller.fetch(`https://tiktoken.pages.dev/js/${encoding}.json`).then((res) => res.json()).then((data) => new js_tiktoken_lite.Tiktoken(data)).catch((e) => { +- delete cache[encoding]; +- throw e; +- }); +- return await cache[encoding]; ++ throw new Error("TikToken Not implemented"); + } + async function encodingForModel(model) { +- return getEncoding((0, js_tiktoken_lite.getEncodingNameForModel)(model)); ++ throw new Error("TikToken Not implemented"); + } + + //#endregion +diff --git a/dist/utils/tiktoken.js b/dist/utils/tiktoken.js +index 641acca03cb92f04a6fa5c9c31f1880ce635572e..707389970ad957aa0ff20ef37fa8dd2875be737c 100644 +--- a/dist/utils/tiktoken.js ++++ b/dist/utils/tiktoken.js +@@ -1,6 +1,5 @@ + import { __export } from "../_virtual/rolldown_runtime.js"; + import { AsyncCaller } from "./async_caller.js"; +-import { Tiktoken, getEncodingNameForModel } from "js-tiktoken/lite"; + + //#region src/utils/tiktoken.ts + var tiktoken_exports = {}; +@@ -11,14 +10,10 @@ __export(tiktoken_exports, { + const cache = {}; + const caller = /* @__PURE__ */ new AsyncCaller({}); + async function getEncoding(encoding) { +- if (!(encoding in cache)) cache[encoding] = caller.fetch(`https://tiktoken.pages.dev/js/${encoding}.json`).then((res) => res.json()).then((data) => new Tiktoken(data)).catch((e) => { +- delete cache[encoding]; +- throw e; +- }); +- return await cache[encoding]; ++ throw new Error("TikToken Not implemented"); + } + async function encodingForModel(model) { +- return getEncoding(getEncodingNameForModel(model)); ++ throw new Error("TikToken Not implemented"); + } + + //#endregion +diff --git a/package.json b/package.json +index a24f8fc61de58526051999260f2ebee5f136354b..e885359e8966e7730c51772533ce37e01edb3046 100644 +--- a/package.json ++++ b/package.json +@@ -20,7 +20,6 @@ + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", +- "js-tiktoken": "^1.0.12", + "langsmith": "^0.3.64", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", diff --git a/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch b/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch deleted file mode 100644 index 3f37fb3ed8..0000000000 --- a/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/dist/embeddings.js b/dist/embeddings.js -index 1f8154be3e9c22442a915eb4b85fa6d2a21b0d0c..dc13ef4a30e6c282824a5357bcee9bd0ae222aab 100644 ---- a/dist/embeddings.js -+++ b/dist/embeddings.js -@@ -214,10 +214,12 @@ export class OpenAIEmbeddings extends Embeddings { - * @returns Promise that resolves to an embedding for the document. - */ - async embedQuery(text) { -+ const isBaiduCloud = this.clientConfig.baseURL.includes('baidubce.com') -+ const input = this.stripNewLines ? text.replace(/\n/g, ' ') : text - const params = { - model: this.model, -- input: this.stripNewLines ? text.replace(/\n/g, " ") : text, -- }; -+ input: isBaiduCloud ? [input] : input -+ } - if (this.dimensions) { - params.dimensions = this.dimensions; - } diff --git a/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch b/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch new file mode 100644 index 0000000000..bb4fa01264 --- /dev/null +++ b/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch @@ -0,0 +1,17 @@ +diff --git a/dist/embeddings.js b/dist/embeddings.js +index 6f4b928d3e4717309382e1b5c2e31ab5bc6c5af0..bc79429c88a6d27d4997a2740c4d8ae0707f5991 100644 +--- a/dist/embeddings.js ++++ b/dist/embeddings.js +@@ -94,9 +94,11 @@ var OpenAIEmbeddings = class extends Embeddings { + * @returns Promise that resolves to an embedding for the document. + */ + async embedQuery(text) { ++ const isBaiduCloud = this.clientConfig.baseURL.includes('baidubce.com'); ++ const input = this.stripNewLines ? text.replace(/\n/g, " ") : text + const params = { + model: this.model, +- input: this.stripNewLines ? text.replace(/\n/g, " ") : text ++ input: isBaiduCloud ? [input] : input + }; + if (this.dimensions) params.dimensions = this.dimensions; + if (this.encodingFormat) params.encoding_format = this.encodingFormat; diff --git a/package.json b/package.json index 0819ca99fb..0187f2fef1 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,9 @@ "@hello-pangea/dnd": "^18.0.1", "@heroui/react": "^2.8.3", "@kangfenmao/keyv-storage": "^0.1.0", - "@langchain/community": "^0.3.50", + "@langchain/community": "^1.0.0", + "@langchain/core": "patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch", + "@langchain/openai": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch", "@mistralai/mistralai": "^1.7.5", "@modelcontextprotocol/sdk": "^1.17.5", "@mozilla/readability": "^0.6.0", @@ -374,9 +376,7 @@ "@codemirror/language": "6.11.3", "@codemirror/lint": "6.8.5", "@codemirror/view": "6.38.1", - "@langchain/core@npm:^0.3.26": "patch:@langchain/core@npm%3A0.3.44#~/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch", - "@langchain/openai@npm:^0.3.16": "patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch", - "@langchain/openai@npm:>=0.1.0 <0.4.0": "patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch", + "@langchain/core@npm:^0.3.26": "patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch", "app-builder-lib@npm:26.0.13": "patch:app-builder-lib@npm%3A26.0.13#~/.yarn/patches/app-builder-lib-npm-26.0.13-a064c9e1d0.patch", "app-builder-lib@npm:26.0.15": "patch:app-builder-lib@npm%3A26.0.15#~/.yarn/patches/app-builder-lib-npm-26.0.15-360e5b0476.patch", "atomically@npm:^1.7.0": "patch:atomically@npm%3A1.7.0#~/.yarn/patches/atomically-npm-1.7.0-e742e5293b.patch", @@ -400,7 +400,10 @@ "@img/sharp-linux-arm64": "0.34.3", "@img/sharp-linux-x64": "0.34.3", "@img/sharp-win32-x64": "0.34.3", - "openai@npm:5.12.2": "npm:@cherrystudio/openai@6.5.0" + "openai@npm:5.12.2": "npm:@cherrystudio/openai@6.5.0", + "@langchain/openai@npm:>=0.1.0 <0.6.0": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch", + "@langchain/openai@npm:^0.3.16": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch", + "@langchain/openai@npm:>=0.2.0 <0.7.0": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch" }, "packageManager": "yarn@4.9.1", "lint-staged": { diff --git a/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts b/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts index f1a2559af7..f34555bed0 100644 --- a/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts +++ b/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts @@ -2,6 +2,7 @@ import type { BaseEmbeddings } from '@cherrystudio/embedjs-interfaces' import { OllamaEmbeddings } from '@cherrystudio/embedjs-ollama' import { OpenAiEmbeddings } from '@cherrystudio/embedjs-openai' import { ApiClient } from '@types' +import { net } from 'electron' import { VoyageEmbeddings } from './VoyageEmbeddings' @@ -43,7 +44,7 @@ export default class EmbeddingsFactory { apiKey, dimensions, batchSize, - configuration: { baseURL } + configuration: { baseURL, fetch: net.fetch as typeof fetch } }) } } diff --git a/src/renderer/src/services/KnowledgeService.ts b/src/renderer/src/services/KnowledgeService.ts index 4966b8fcdc..e49a7fca6c 100644 --- a/src/renderer/src/services/KnowledgeService.ts +++ b/src/renderer/src/services/KnowledgeService.ts @@ -1,9 +1,10 @@ import { loggerService } from '@logger' import { Span } from '@opentelemetry/api' -import AiProvider from '@renderer/aiCore' +import { ModernAiProvider } from '@renderer/aiCore' +import AiProvider from '@renderer/aiCore/legacy' import { DEFAULT_KNOWLEDGE_DOCUMENT_COUNT, DEFAULT_KNOWLEDGE_THRESHOLD } from '@renderer/config/constant' import { getEmbeddingMaxContext } from '@renderer/config/embedings' -import { isGeminiProvider } from '@renderer/config/providers' +import { isAzureOpenAIProvider, isGeminiProvider } from '@renderer/config/providers' import { addSpan, endSpan } from '@renderer/services/SpanManagerService' import store from '@renderer/store' import { @@ -14,6 +15,7 @@ import { KnowledgeSearchResult } from '@renderer/types' import { Chunk, ChunkType } from '@renderer/types/chunk' +import { routeToEndpoint } from '@renderer/utils' import { ExtractResults } from '@renderer/utils/extract' import { isEmpty } from 'lodash' @@ -23,9 +25,8 @@ import FileManager from './FileManager' const logger = loggerService.withContext('RendererKnowledgeService') export const getKnowledgeBaseParams = (base: KnowledgeBase): KnowledgeBaseParams => { - const provider = getProviderByModel(base.model) const rerankProvider = getProviderByModel(base.rerankModel) - const aiProvider = new AiProvider(provider) + const aiProvider = new ModernAiProvider(base.model) const rerankAiProvider = new AiProvider(rerankProvider) // get preprocess provider from store instead of base.preprocessProvider @@ -39,12 +40,19 @@ export const getKnowledgeBaseParams = (base: KnowledgeBase): KnowledgeBaseParams } : base.preprocessProvider - let host = aiProvider.getBaseURL() + const actualProvider = aiProvider.getActualProvider() + + let { baseURL } = routeToEndpoint(actualProvider.apiHost) + const rerankHost = rerankAiProvider.getBaseURL() - if (isGeminiProvider(provider)) { - host = host + '/v1beta/openai/' + if (isGeminiProvider(actualProvider)) { + baseURL = baseURL + '/openai' + } else if (isAzureOpenAIProvider(actualProvider)) { + baseURL = baseURL + '/v1' } + logger.info(`Knowledge base ${base.name} using baseURL: ${baseURL}`) + let chunkSize = base.chunkSize const maxChunkSize = getEmbeddingMaxContext(base.model.id) @@ -64,8 +72,7 @@ export const getKnowledgeBaseParams = (base: KnowledgeBase): KnowledgeBaseParams model: base.model.id, provider: base.model.provider, apiKey: aiProvider.getApiKey() || 'secret', - apiVersion: provider.apiVersion, - baseURL: host + baseURL }, chunkSize, chunkOverlap: base.chunkOverlap, diff --git a/yarn.lock b/yarn.lock index fba0420fd4..1d4550b9b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2706,7 +2706,7 @@ __metadata: languageName: unknown linkType: soft -"@cherrystudio/openai@npm:^6.5.0, openai@npm:@cherrystudio/openai@6.5.0": +"@cherrystudio/openai@npm:^6.5.0": version: 6.5.0 resolution: "@cherrystudio/openai@npm:6.5.0" peerDependencies: @@ -4111,39 +4111,6 @@ __metadata: languageName: node linkType: hard -"@graphql-typed-document-node/core@npm:^3.2.0": - version: 3.2.0 - resolution: "@graphql-typed-document-node/core@npm:3.2.0" - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/94e9d75c1f178bbae8d874f5a9361708a3350c8def7eaeb6920f2c820e82403b7d4f55b3735856d68e145e86c85cbfe2adc444fdc25519cd51f108697e99346c - languageName: node - linkType: hard - -"@grpc/grpc-js@npm:^1.13.1": - version: 1.13.4 - resolution: "@grpc/grpc-js@npm:1.13.4" - dependencies: - "@grpc/proto-loader": "npm:^0.7.13" - "@js-sdsl/ordered-map": "npm:^4.4.2" - checksum: 10c0/ecdb99efbe540d8b261ca53e4be224fb4683fb22c6ab1b575d2f4ca34471fc7f221b58f718001a6d157c54237cc482514766233968f5de50e358f061600a885b - languageName: node - linkType: hard - -"@grpc/proto-loader@npm:^0.7.13": - version: 0.7.15 - resolution: "@grpc/proto-loader@npm:0.7.15" - dependencies: - lodash.camelcase: "npm:^4.3.0" - long: "npm:^5.0.0" - protobufjs: "npm:^7.2.5" - yargs: "npm:^17.7.2" - bin: - proto-loader-gen-types: build/bin/proto-loader-gen-types.js - checksum: 10c0/514a134a724b56d73d0a202b7e02c84479da21e364547bacb2f4995ebc0d52412a1a21653add9f004ebd146c1e6eb4bcb0b8846fdfe1bfa8a98ed8f3d203da4a - languageName: node - linkType: hard - "@hello-pangea/dnd@npm:^18.0.1": version: 18.0.1 resolution: "@hello-pangea/dnd@npm:18.0.1" @@ -5983,13 +5950,6 @@ __metadata: languageName: node linkType: hard -"@js-sdsl/ordered-map@npm:^4.4.2": - version: 4.4.2 - resolution: "@js-sdsl/ordered-map@npm:4.4.2" - checksum: 10c0/cc7e15dc4acf6d9ef663757279600bab70533d847dcc1ab01332e9e680bd30b77cdf9ad885cc774276f51d98b05a013571c940e5b360985af5eb798dc1a2ee2b - languageName: node - linkType: hard - "@jsdevtools/ono@npm:^7.1.3": version: 7.1.3 resolution: "@jsdevtools/ono@npm:7.1.3" @@ -6004,27 +5964,56 @@ __metadata: languageName: node linkType: hard -"@langchain/community@npm:^0.3.50": - version: 0.3.54 - resolution: "@langchain/community@npm:0.3.54" +"@langchain/classic@npm:1.0.0": + version: 1.0.0 + resolution: "@langchain/classic@npm:1.0.0" dependencies: - "@langchain/openai": "npm:>=0.2.0 <0.7.0" - "@langchain/weaviate": "npm:^0.2.0" + "@langchain/openai": "npm:1.0.0-alpha.3" + "@langchain/textsplitters": "npm:1.0.0" + handlebars: "npm:^4.7.8" + js-yaml: "npm:^4.1.0" + jsonpointer: "npm:^5.0.1" + langsmith: "npm:^0.3.64" + openapi-types: "npm:^12.1.3" + p-retry: "npm:4" + uuid: "npm:^10.0.0" + yaml: "npm:^2.2.1" + zod: "npm:^3.25.76 || ^4" + peerDependencies: + "@langchain/core": ^1.0.0 + cheerio: "*" + peggy: ^3.0.2 + typeorm: "*" + dependenciesMeta: + langsmith: + optional: true + peerDependenciesMeta: + cheerio: + optional: true + peggy: + optional: true + typeorm: + optional: true + checksum: 10c0/5d222a0dcd5faa9c0c520a79e8852403f6d4c8ecc34d48a3aaeec6965e68be3b02aae97c91a3ffea0c99114884bd1cbf48551bbb8c5cd71811685778a8ac30d8 + languageName: node + linkType: hard + +"@langchain/community@npm:^1.0.0": + version: 1.0.0 + resolution: "@langchain/community@npm:1.0.0" + dependencies: + "@langchain/classic": "npm:1.0.0" + "@langchain/openai": "npm:1.0.0" binary-extensions: "npm:^2.2.0" expr-eval: "npm:^2.0.2" flat: "npm:^5.0.2" js-yaml: "npm:^4.1.0" - langchain: "npm:>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" - langsmith: "npm:^0.3.46" uuid: "npm:^10.0.0" - zod: "npm:^3.25.32" + zod: "npm:^3.25.76 || ^4" peerDependencies: "@arcjet/redact": ^v1.0.0-alpha.23 "@aws-crypto/sha256-js": ^5.0.0 - "@aws-sdk/client-bedrock-agent-runtime": ^3.749.0 - "@aws-sdk/client-bedrock-runtime": ^3.749.0 "@aws-sdk/client-dynamodb": ^3.749.0 - "@aws-sdk/client-kendra": ^3.749.0 "@aws-sdk/client-lambda": ^3.749.0 "@aws-sdk/client-s3": ^3.749.0 "@aws-sdk/client-sagemaker-runtime": ^3.749.0 @@ -6035,22 +6024,19 @@ __metadata: "@browserbasehq/sdk": "*" "@browserbasehq/stagehand": ^1.0.0 "@clickhouse/client": ^0.2.5 - "@cloudflare/ai": "*" "@datastax/astra-db-ts": ^1.0.0 "@elastic/elasticsearch": ^8.4.0 "@getmetal/metal-sdk": "*" "@getzep/zep-cloud": ^1.0.6 "@getzep/zep-js": ^0.9.0 - "@gomomento/sdk": ^1.51.1 "@gomomento/sdk-core": ^1.51.1 - "@google-ai/generativelanguage": "*" "@google-cloud/storage": ^6.10.1 || ^7.7.0 "@gradientai/nodejs-sdk": ^1.2.0 "@huggingface/inference": ^4.0.5 "@huggingface/transformers": ^3.5.2 "@ibm-cloud/watsonx-ai": "*" - "@lancedb/lancedb": ^0.12.0 - "@langchain/core": ">=0.3.58 <0.4.0" + "@lancedb/lancedb": ^0.19.1 + "@langchain/core": ^1.0.0 "@layerup/layerup-security": ^1.5.12 "@libsql/client": ^0.14.0 "@mendable/firecrawl-js": ^1.4.3 @@ -6059,10 +6045,8 @@ __metadata: "@neondatabase/serverless": "*" "@notionhq/client": ^2.2.10 "@opensearch-project/opensearch": "*" - "@pinecone-database/pinecone": "*" "@planetscale/database": ^1.8.0 "@premai/prem-sdk": ^0.3.25 - "@qdrant/js-client-rest": ^1.15.0 "@raycast/api": ^1.55.2 "@rockset/client": ^0.9.1 "@smithy/eventstream-codec": ^2.0.5 @@ -6072,7 +6056,6 @@ __metadata: "@spider-cloud/spider-client": ^0.0.21 "@supabase/supabase-js": ^2.45.0 "@tensorflow-models/universal-sentence-encoder": "*" - "@tensorflow/tfjs-converter": "*" "@tensorflow/tfjs-core": "*" "@upstash/ratelimit": ^1.1.3 || ^2.0.3 "@upstash/redis": ^1.20.6 @@ -6093,16 +6076,15 @@ __metadata: closevector-common: 0.1.3 closevector-node: 0.1.6 closevector-web: 0.1.6 - cohere-ai: "*" convex: ^1.3.1 crypto-js: ^4.2.0 d3-dsv: ^2.0.0 discord.js: ^14.14.1 - dria: ^0.0.3 duck-duck-scrape: ^2.2.5 epub2: ^3.0.1 + faiss-node: "*" fast-xml-parser: "*" - firebase-admin: ^11.9.0 || ^12.0.0 + firebase-admin: ^11.9.0 || ^12.0.0 || ^13.0.0 google-auth-library: "*" googleapis: "*" hnswlib-node: ^3.0.0 @@ -6114,15 +6096,14 @@ __metadata: it-all: ^3.0.4 jsdom: "*" jsonwebtoken: ^9.0.2 - llmonitor: ^0.5.9 lodash: ^4.17.21 lunary: ^0.7.10 mammoth: ^1.6.0 mariadb: ^3.4.0 mem0ai: ^2.1.8 - mongodb: ^6.17.0 mysql2: ^3.9.8 neo4j-driver: "*" + node-llama-cpp: ">=3.0.0" notion-to-md: ^3.1.0 officeparser: ^4.0.4 openai: "*" @@ -6134,7 +6115,6 @@ __metadata: portkey-ai: ^0.1.11 puppeteer: "*" pyodide: ">=0.24.1 <0.27.0" - redis: "*" replicate: "*" sonix-speech-recognition: ^2.1.1 srt-parser-2: ^1.2.3 @@ -6142,8 +6122,6 @@ __metadata: typesense: ^1.5.3 usearch: ^1.1.1 voy-search: 0.6.2 - weaviate-client: ^3.5.2 - web-auth-library: ^1.0.3 word-extractor: "*" ws: ^8.14.2 youtubei.js: "*" @@ -6152,14 +6130,8 @@ __metadata: optional: true "@aws-crypto/sha256-js": optional: true - "@aws-sdk/client-bedrock-agent-runtime": - optional: true - "@aws-sdk/client-bedrock-runtime": - optional: true "@aws-sdk/client-dynamodb": optional: true - "@aws-sdk/client-kendra": - optional: true "@aws-sdk/client-lambda": optional: true "@aws-sdk/client-s3": @@ -6180,8 +6152,6 @@ __metadata: optional: true "@clickhouse/client": optional: true - "@cloudflare/ai": - optional: true "@datastax/astra-db-ts": optional: true "@elastic/elasticsearch": @@ -6192,12 +6162,8 @@ __metadata: optional: true "@getzep/zep-js": optional: true - "@gomomento/sdk": - optional: true "@gomomento/sdk-core": optional: true - "@google-ai/generativelanguage": - optional: true "@google-cloud/storage": optional: true "@gradientai/nodejs-sdk": @@ -6250,8 +6216,6 @@ __metadata: optional: true "@tensorflow-models/universal-sentence-encoder": optional: true - "@tensorflow/tfjs-converter": - optional: true "@tensorflow/tfjs-core": optional: true "@upstash/ratelimit": @@ -6268,6 +6232,8 @@ __metadata: optional: true "@xata.io/client": optional: true + "@xenova/transformers": + optional: true "@zilliz/milvus2-sdk-node": optional: true apify-client: @@ -6302,12 +6268,12 @@ __metadata: optional: true discord.js: optional: true - dria: - optional: true duck-duck-scrape: optional: true epub2: optional: true + faiss-node: + optional: true fast-xml-parser: optional: true firebase-admin: @@ -6332,8 +6298,6 @@ __metadata: optional: true jsonwebtoken: optional: true - llmonitor: - optional: true lodash: optional: true lunary: @@ -6350,6 +6314,8 @@ __metadata: optional: true neo4j-driver: optional: true + node-llama-cpp: + optional: true notion-to-md: optional: true officeparser: @@ -6388,55 +6354,51 @@ __metadata: optional: true weaviate-client: optional: true - web-auth-library: - optional: true word-extractor: optional: true ws: optional: true youtubei.js: optional: true - checksum: 10c0/17ba91662e644cde0b8ffa9d11d2c2de47e32b3567cee08628d316251f860f0ac874ec3b4f44012e0d93009b1779fbd514c6882fadac8c2368213b6578f59d88 + checksum: 10c0/b933e0afeb54267b41579e7b8590e9279a11bb1f7434a0357f437348a79ad74e24d7c0287e1e4db85e049ee72eb97150a3a1e2134c93cf74f82b783e36be4970 languageName: node linkType: hard -"@langchain/core@npm:0.3.44": - version: 0.3.44 - resolution: "@langchain/core@npm:0.3.44" +"@langchain/core@npm:1.0.2": + version: 1.0.2 + resolution: "@langchain/core@npm:1.0.2" dependencies: "@cfworker/json-schema": "npm:^4.0.2" ansi-styles: "npm:^5.0.0" camelcase: "npm:6" decamelize: "npm:1.2.0" js-tiktoken: "npm:^1.0.12" - langsmith: "npm:>=0.2.8 <0.4.0" + langsmith: "npm:^0.3.64" mustache: "npm:^4.2.0" p-queue: "npm:^6.6.2" p-retry: "npm:4" uuid: "npm:^10.0.0" - zod: "npm:^3.22.4" - zod-to-json-schema: "npm:^3.22.3" - checksum: 10c0/fb8d7c5760419cc9d0a3ed4f04473e103c8a27031566ba0c89438879bbd66e3d8869349f943045e86ddb33c4e8db4ae59311a3aad45e832d273b0e7d7db3f939 + zod: "npm:^3.25.76 || ^4" + checksum: 10c0/2ffa73615f6e2b98b9204e73b678f10b6d18c100d78481c8dbd4f628f5b934dd3f1b1f4de793d51d2e290aa65c07d7f903d6396ac8dc24d9ed219672157a6a09 languageName: node linkType: hard -"@langchain/core@patch:@langchain/core@npm%3A0.3.44#~/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch": - version: 0.3.44 - resolution: "@langchain/core@patch:@langchain/core@npm%3A0.3.44#~/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch::version=0.3.44&hash=41dd7b" +"@langchain/core@patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch": + version: 1.0.2 + resolution: "@langchain/core@patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch::version=1.0.2&hash=95b174" dependencies: "@cfworker/json-schema": "npm:^4.0.2" ansi-styles: "npm:^5.0.0" camelcase: "npm:6" decamelize: "npm:1.2.0" js-tiktoken: "npm:^1.0.12" - langsmith: "npm:>=0.2.8 <0.4.0" + langsmith: "npm:^0.3.64" mustache: "npm:^4.2.0" p-queue: "npm:^6.6.2" p-retry: "npm:4" uuid: "npm:^10.0.0" - zod: "npm:^3.22.4" - zod-to-json-schema: "npm:^3.22.3" - checksum: 10c0/7002581999230bc6fbdb6c2fad0eda2c1ca93a7629e28eadf1501dd0a7f785010d6b3e7841148ced186fc0fb4a84ec5f3b75850985579610e222943cc57e1649 + zod: "npm:^3.25.76 || ^4" + checksum: 10c0/c83e49ef2293c49821264ee81cc7bfaac3321289dae1b1553c929bd67ee361df2a0f3c950ac24a361916349c4d66f2db2ee5a6a509c6b8be288acebb06c17a89 languageName: node linkType: hard @@ -6454,58 +6416,53 @@ __metadata: languageName: node linkType: hard -"@langchain/openai@npm:0.3.16": - version: 0.3.16 - resolution: "@langchain/openai@npm:0.3.16" +"@langchain/openai@npm:1.0.0": + version: 1.0.0 + resolution: "@langchain/openai@npm:1.0.0" dependencies: js-tiktoken: "npm:^1.0.12" - openai: "npm:^4.77.0" - zod: "npm:^3.22.4" - zod-to-json-schema: "npm:^3.22.3" + openai: "npm:^6.3.0" + zod: "npm:^3.25.76 || ^4" peerDependencies: - "@langchain/core": ">=0.2.26 <0.4.0" - checksum: 10c0/5955a02c09227d8d1d7feef26d3487cf151e2c3d36ec7550c4fe111179eb78de76befd1bd2df6a80ae4fc88676f5ebaa35d5d8788faab62972d82989ca18ec87 + "@langchain/core": ^1.0.0 + checksum: 10c0/788b6c996c19b7ff4a87b4005898f737d54998ce07aeab99225bd251cdfbb49a1b7a2f6340ce55f16ffb7566b3a050bb997866603a2b0acd5b22fff7910af2d0 languageName: node linkType: hard -"@langchain/openai@npm:>=0.1.0 <0.6.0": - version: 0.5.5 - resolution: "@langchain/openai@npm:0.5.5" +"@langchain/openai@npm:1.0.0-alpha.3": + version: 1.0.0-alpha.3 + resolution: "@langchain/openai@npm:1.0.0-alpha.3" dependencies: js-tiktoken: "npm:^1.0.12" - openai: "npm:^4.87.3" - zod: "npm:^3.22.4" - zod-to-json-schema: "npm:^3.22.3" + openai: "npm:^6.3.0" + zod: "npm:^3.25.76 || ^4" peerDependencies: - "@langchain/core": ">=0.3.39 <0.4.0" - checksum: 10c0/475c040f473f9c9270e8130c86d480f68834af5723e7e9b761c60152cafe5bc162e87856a4c654b12d6fe8f0cf99b27247b3869e4c0c79797847263523e045d4 + "@langchain/core": ^1.0.0-alpha.6 + checksum: 10c0/e33abd68b3f22314dcf9256e500eb166d64476dd8f000314c237e94efef47e9889b29934f0dac816ec5834bb9848fe22ea715cd49efccc5363f224a9dc2965c4 languageName: node linkType: hard -"@langchain/openai@npm:>=0.2.0 <0.7.0": - version: 0.6.11 - resolution: "@langchain/openai@npm:0.6.11" +"@langchain/openai@patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch": + version: 1.0.0 + resolution: "@langchain/openai@patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch::version=1.0.0&hash=682dd3" dependencies: js-tiktoken: "npm:^1.0.12" - openai: "npm:5.12.2" - zod: "npm:^3.25.32" + openai: "npm:^6.3.0" + zod: "npm:^3.25.76 || ^4" peerDependencies: - "@langchain/core": ">=0.3.68 <0.4.0" - checksum: 10c0/d95bc7f4f4a66c82f031800d1196d1e13a536b3f647480209d8432bb4d2ebfbc53dddb43d86e6d2de0f4d94050ca4b8002e50ab1813552faba24d4045c00feda + "@langchain/core": ^1.0.0 + checksum: 10c0/93503a3322af417f2209923ecb01fb8f94946d0806007eacb94fd8b44fa4f2976e2ef84094b4e462b320886bcef8d59f12fa109c8bf654e2dd98dd9c8cd073be languageName: node linkType: hard -"@langchain/openai@patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch": - version: 0.3.16 - resolution: "@langchain/openai@patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch::version=0.3.16&hash=642f39" +"@langchain/textsplitters@npm:1.0.0": + version: 1.0.0 + resolution: "@langchain/textsplitters@npm:1.0.0" dependencies: js-tiktoken: "npm:^1.0.12" - openai: "npm:^4.77.0" - zod: "npm:^3.22.4" - zod-to-json-schema: "npm:^3.22.3" peerDependencies: - "@langchain/core": ">=0.2.26 <0.4.0" - checksum: 10c0/2106626e01e1865ad08b647d155bee86caf83620040a00d3406ec0a7d34650e393a7bbf7cfbbc3b45958ddeaf29055f6e1fe5b61d85da07a87e89ccbc5b6c4b6 + "@langchain/core": ^1.0.0 + checksum: 10c0/733039261456099f71c282c64a0f36c8283547d3db1c16218f0a67bd80837c73a70bf0c60072c5b496257c6b2d4eff84d88a1a9a4daa8f798f5f573686eb0dbb languageName: node linkType: hard @@ -6520,18 +6477,6 @@ __metadata: languageName: node linkType: hard -"@langchain/weaviate@npm:^0.2.0": - version: 0.2.2 - resolution: "@langchain/weaviate@npm:0.2.2" - dependencies: - uuid: "npm:^10.0.0" - weaviate-client: "npm:^3.5.2" - peerDependencies: - "@langchain/core": ">=0.2.21 <0.4.0" - checksum: 10c0/f1ec809e5b6ba6c14efeea93d6c7a8e015c2f9eaaa732884ba25d32cb6517117e38cddb6ec662358a40246523309f07e5f3114d3067e03eb43af168a43cc6405 - languageName: node - linkType: hard - "@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.0.2, @lezer/common@npm:^1.0.3, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.2.0, @lezer/common@npm:^1.2.1": version: 1.2.3 resolution: "@lezer/common@npm:1.2.3" @@ -13947,7 +13892,9 @@ __metadata: "@hello-pangea/dnd": "npm:^18.0.1" "@heroui/react": "npm:^2.8.3" "@kangfenmao/keyv-storage": "npm:^0.1.0" - "@langchain/community": "npm:^0.3.50" + "@langchain/community": "npm:^1.0.0" + "@langchain/core": "patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch" + "@langchain/openai": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch" "@libsql/client": "npm:0.14.0" "@libsql/win32-x64-msvc": "npm:^0.4.7" "@mistralai/mistralai": "npm:^1.7.5" @@ -14206,13 +14153,6 @@ __metadata: languageName: node linkType: hard -"abort-controller-x@npm:^0.4.0, abort-controller-x@npm:^0.4.3": - version: 0.4.3 - resolution: "abort-controller-x@npm:0.4.3" - checksum: 10c0/8091b5c9279c304890e4e9cc90601947790846b7b2c149bb322a25e873eb3db060ef3da74a93b6fe40ccea41c3962fc4b175468a0ecdf4c4bb6421023ad9d71e - languageName: node - linkType: hard - "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -19751,25 +19691,6 @@ __metadata: languageName: node linkType: hard -"graphql-request@npm:^6.1.0": - version: 6.1.0 - resolution: "graphql-request@npm:6.1.0" - dependencies: - "@graphql-typed-document-node/core": "npm:^3.2.0" - cross-fetch: "npm:^3.1.5" - peerDependencies: - graphql: 14 - 16 - checksum: 10c0/f8167925a110e8e1de93d56c14245e7e64391dc8dce5002dd01bf24a3059f345d4ca1bb6ce2040e2ec78264211b0704e75da3e63984f0f74d2042f697a4e8cc6 - languageName: node - linkType: hard - -"graphql@npm:^16.11.0": - version: 16.11.0 - resolution: "graphql@npm:16.11.0" - checksum: 10c0/124da7860a2292e9acf2fed0c71fc0f6a9b9ca865d390d112bdd563c1f474357141501c12891f4164fe984315764736ad67f705219c62f7580681d431a85db88 - languageName: node - linkType: hard - "gray-matter@npm:^4.0.3": version: 4.0.3 resolution: "gray-matter@npm:4.0.3" @@ -19799,6 +19720,24 @@ __metadata: languageName: node linkType: hard +"handlebars@npm:^4.7.8": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 10c0/7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d + languageName: node + linkType: hard + "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -21251,7 +21190,7 @@ __metadata: languageName: node linkType: hard -"langchain@npm:>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0, langchain@npm:^0.3.8": +"langchain@npm:^0.3.8": version: 0.3.21 resolution: "langchain@npm:0.3.21" dependencies: @@ -21358,9 +21297,9 @@ __metadata: languageName: node linkType: hard -"langsmith@npm:^0.3.46": - version: 0.3.67 - resolution: "langsmith@npm:0.3.67" +"langsmith@npm:^0.3.64": + version: 0.3.76 + resolution: "langsmith@npm:0.3.76" dependencies: "@types/uuid": "npm:^10.0.0" chalk: "npm:^4.1.2" @@ -21383,7 +21322,7 @@ __metadata: optional: true openai: optional: true - checksum: 10c0/e22ec270764632a110dc77cb7fd018cd59e905fda529fba4c056e5c1ceda5a2746dc5e07e81b5ef2c949c0a712ffe5dd99721b465ba08d699e9a56e42b041bf4 + checksum: 10c0/3e76e69add862e6031a385edd2cf2e963b0db9e606d582a46fd77f05e49d8b9746eacdb5bc6b1fba2be2744f94e9d4e2d055c3ba0f394d6bc6e0f85f9cf4df77 languageName: node linkType: hard @@ -21768,13 +21707,6 @@ __metadata: languageName: node linkType: hard -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 - languageName: node - linkType: hard - "lodash.curry@npm:^4.0.1": version: 4.1.1 resolution: "lodash.curry@npm:4.1.1" @@ -21868,7 +21800,7 @@ __metadata: languageName: node linkType: hard -"long@npm:^5.0.0, long@npm:^5.3.2": +"long@npm:^5.0.0": version: 5.3.2 resolution: "long@npm:5.3.2" checksum: 10c0/7130fe1cbce2dca06734b35b70d380ca3f70271c7f8852c922a7c62c86c4e35f0c39290565eca7133c625908d40e126ac57c02b1b1a4636b9457d77e1e60b981 @@ -23633,6 +23565,13 @@ __metadata: languageName: node linkType: hard +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d + languageName: node + linkType: hard + "nested-property@npm:^4.0.0": version: 4.0.0 resolution: "nested-property@npm:4.0.0" @@ -23647,36 +23586,6 @@ __metadata: languageName: node linkType: hard -"nice-grpc-client-middleware-retry@npm:^3.1.11": - version: 3.1.11 - resolution: "nice-grpc-client-middleware-retry@npm:3.1.11" - dependencies: - abort-controller-x: "npm:^0.4.0" - nice-grpc-common: "npm:^2.0.2" - checksum: 10c0/0d9c704a1a5c399f8243753c75a7db86c9eb414ca5bae1920cd66f60ea235190c5ea667daa1c161345ae4bf86817085f3add4438ca67f9144c5e57b9542ef5c5 - languageName: node - linkType: hard - -"nice-grpc-common@npm:^2.0.2": - version: 2.0.2 - resolution: "nice-grpc-common@npm:2.0.2" - dependencies: - ts-error: "npm:^1.0.6" - checksum: 10c0/9eb8a44e1a5c7051cf0e4a06dc7fda2c7abb6cfbcbb746806418c2c58f3f0075212c61bbce54239a204e6a552065f0fa92dfedcf3402dc16220b2ffaee4ab857 - languageName: node - linkType: hard - -"nice-grpc@npm:^2.1.12": - version: 2.1.12 - resolution: "nice-grpc@npm:2.1.12" - dependencies: - "@grpc/grpc-js": "npm:^1.13.1" - abort-controller-x: "npm:^0.4.0" - nice-grpc-common: "npm:^2.0.2" - checksum: 10c0/7a8e720a42a0297315bfafa0c93297e36d341927eaddae9e5a06c8ea2863b16d701a642dc9610e3e768d19cc9569afe5b99de2dfaeb1648042d32a139a7ba773 - languageName: node - linkType: hard - "node-abi@npm:4.12.0": version: 4.12.0 resolution: "node-abi@npm:4.12.0" @@ -24080,6 +23989,23 @@ __metadata: languageName: node linkType: hard +"openai@npm:^6.3.0": + version: 6.7.0 + resolution: "openai@npm:6.7.0" + peerDependencies: + ws: ^8.18.0 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + bin: + openai: bin/cli + checksum: 10c0/dbee766f28308235fdc370a325f50ab4de2d869a832f78fbb7cb81ede0518b55c6e6ab70cd0fe9cdc7a3fd948ef56a8d8f23d0a86fef21ac7ed97e35ef547c92 + languageName: node + linkType: hard + "openapi-types@npm:^12.1.3": version: 12.1.3 resolution: "openapi-types@npm:12.1.3" @@ -25206,26 +25132,6 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^7.2.5": - version: 7.5.4 - resolution: "protobufjs@npm:7.5.4" - dependencies: - "@protobufjs/aspromise": "npm:^1.1.2" - "@protobufjs/base64": "npm:^1.1.2" - "@protobufjs/codegen": "npm:^2.0.4" - "@protobufjs/eventemitter": "npm:^1.1.0" - "@protobufjs/fetch": "npm:^1.1.0" - "@protobufjs/float": "npm:^1.0.2" - "@protobufjs/inquire": "npm:^1.1.0" - "@protobufjs/path": "npm:^1.1.2" - "@protobufjs/pool": "npm:^1.1.0" - "@protobufjs/utf8": "npm:^1.1.0" - "@types/node": "npm:>=13.7.0" - long: "npm:^5.0.0" - checksum: 10c0/913b676109ffb3c05d3d31e03a684e569be91f3bba8613da4a683d69d9dba948daa2afd7d2e7944d1aa6c417890c35d9d9a8883c1160affafb0f9670d59ef722 - languageName: node - linkType: hard - "protobufjs@npm:^7.3.0": version: 7.5.2 resolution: "protobufjs@npm:7.5.2" @@ -27670,7 +27576,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 @@ -28732,13 +28638,6 @@ __metadata: languageName: node linkType: hard -"ts-error@npm:^1.0.6": - version: 1.0.6 - resolution: "ts-error@npm:1.0.6" - checksum: 10c0/c46994b0b88eae75d676ab18edcdb3e6c309abb39d8169c2d15286d10f4fc7bfc58c537a81f3efe24701e840247b5e79ac8e21a7335327811a07cfc33f69a72f - languageName: node - linkType: hard - "ts-pattern@npm:^5.7.0": version: 5.7.0 resolution: "ts-pattern@npm:5.7.0" @@ -29030,6 +28929,15 @@ __metadata: languageName: node linkType: hard +"uglify-js@npm:^3.1.4": + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 + languageName: node + linkType: hard + "unbzip2-stream@npm:^1.0.9": version: 1.4.3 resolution: "unbzip2-stream@npm:1.4.3" @@ -29785,22 +29693,6 @@ __metadata: languageName: node linkType: hard -"weaviate-client@npm:^3.5.2": - version: 3.8.1 - resolution: "weaviate-client@npm:3.8.1" - dependencies: - abort-controller-x: "npm:^0.4.3" - graphql: "npm:^16.11.0" - graphql-request: "npm:^6.1.0" - long: "npm:^5.3.2" - nice-grpc: "npm:^2.1.12" - nice-grpc-client-middleware-retry: "npm:^3.1.11" - nice-grpc-common: "npm:^2.0.2" - uuid: "npm:^9.0.1" - checksum: 10c0/a001a1b0eaf9b1344f1d7963520fe43b83bfc1a34efbe1d1b8748ae7b042f95d502cc6d31f681969865d7df90cf54a902233c3dea379aac6df40cb4ed704f665 - languageName: node - linkType: hard - "web-namespaces@npm:^2.0.0": version: 2.0.1 resolution: "web-namespaces@npm:2.0.1" @@ -30046,6 +29938,13 @@ __metadata: languageName: node linkType: hard +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 10c0/7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -30298,7 +30197,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.2, yargs@npm:^17.0.1, yargs@npm:^17.5.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2": +"yargs@npm:17.7.2, yargs@npm:^17.0.1, yargs@npm:^17.5.1, yargs@npm:^17.6.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -30424,10 +30323,10 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.25.32": - version: 3.25.76 - resolution: "zod@npm:3.25.76" - checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c +"zod@npm:^3.25.76 || ^4": + version: 4.1.12 + resolution: "zod@npm:4.1.12" + checksum: 10c0/b64c1feb19e99d77075261eaf613e0b2be4dfcd3551eff65ad8b4f2a079b61e379854d066f7d447491fcf193f45babd8095551a9d47973d30b46b6d8e2c46774 languageName: node linkType: hard From dc06c103e0e1ea93c66fec586df665a6c4a42194 Mon Sep 17 00:00:00 2001 From: fullex <106392080+0xfullex@users.noreply.github.com> Date: Sat, 1 Nov 2025 10:40:02 +0800 Subject: [PATCH 22/83] chore[lint]: add import type lint (#11091) chore: add import type lint --- .oxlintrc.json | 2 +- .../aiCore/src/core/middleware/manager.ts | 2 +- packages/aiCore/src/core/middleware/types.ts | 2 +- .../aiCore/src/core/middleware/wrapper.ts | 2 +- .../aiCore/src/core/models/ModelResolver.ts | 2 +- packages/aiCore/src/core/models/types.ts | 2 +- packages/aiCore/src/core/options/factory.ts | 2 +- .../toolUsePlugin/promptToolUsePlugin.ts | 2 +- .../plugins/built-in/toolUsePlugin/type.ts | 4 +- .../built-in/webSearchPlugin/helper.ts | 13 ++++--- .../plugins/built-in/webSearchPlugin/index.ts | 3 +- packages/aiCore/src/core/plugins/manager.ts | 2 +- .../aiCore/src/core/providers/HubProvider.ts | 2 +- .../src/core/providers/RegistryManagement.ts | 2 +- packages/aiCore/src/core/providers/schemas.ts | 5 ++- packages/aiCore/src/core/providers/types.ts | 2 +- .../runtime/__tests__/generateImage.test.ts | 2 +- packages/aiCore/src/core/runtime/executor.ts | 4 +- packages/aiCore/src/core/runtime/index.ts | 2 +- .../aiCore/src/core/runtime/pluginEngine.ts | 11 +++++- packages/aiCore/src/core/runtime/types.ts | 4 +- .../extension-table-plus/src/kit/index.ts | 3 +- .../mcp-trace/trace-core/core/spanConvert.ts | 4 +- .../mcp-trace/trace-core/core/traceCache.ts | 2 +- .../trace-core/exporters/FuncSpanExporter.ts | 5 ++- .../processors/CacheSpanProcessor.ts | 8 ++-- .../processors/EmitterSpanProcessor.ts | 7 ++-- .../processors/FuncSpanProcessor.ts | 6 ++- packages/mcp-trace/trace-core/types/config.ts | 4 +- packages/mcp-trace/trace-node/nodeTracer.ts | 9 +++-- .../trace-web/TopicContextManager.ts | 3 +- .../trace-web/traceContextPromise.ts | 3 +- packages/mcp-trace/trace-web/webTracer.ts | 6 ++- packages/shared/anthropic/index.ts | 4 +- packages/shared/config/types.ts | 2 +- src/main/apiServer/config.ts | 2 +- src/main/apiServer/middleware/auth.ts | 2 +- src/main/apiServer/middleware/error.ts | 2 +- src/main/apiServer/middleware/openapi.ts | 2 +- .../routes/agents/handlers/agents.ts | 5 ++- .../routes/agents/handlers/messages.ts | 2 +- .../routes/agents/handlers/sessions.ts | 5 ++- .../routes/agents/middleware/common.ts | 2 +- .../routes/agents/validators/zodValidator.ts | 5 ++- src/main/apiServer/routes/chat.ts | 5 ++- src/main/apiServer/routes/mcp.ts | 3 +- src/main/apiServer/routes/messages.ts | 7 ++-- src/main/apiServer/routes/models.ts | 6 ++- .../apiServer/services/chat-completion.ts | 7 ++-- src/main/apiServer/services/mcp.ts | 14 +++---- src/main/apiServer/services/messages.ts | 8 ++-- src/main/apiServer/services/models.ts | 2 +- src/main/apiServer/utils/index.ts | 2 +- src/main/apiServer/utils/mcp.ts | 5 ++- src/main/ipc.ts | 10 +++-- .../embedjs/embeddings/Embeddings.ts | 2 +- .../embedjs/embeddings/EmbeddingsFactory.ts | 2 +- src/main/knowledge/embedjs/loader/index.ts | 7 ++-- src/main/knowledge/embedjs/loader/odLoader.ts | 3 +- .../preprocess/BasePreprocessProvider.ts | 2 +- .../preprocess/DefaultPreprocessProvider.ts | 2 +- .../preprocess/Doc2xPreprocessProvider.ts | 2 +- .../preprocess/MineruPreprocessProvider.ts | 2 +- .../preprocess/MistralPreprocessProvider.ts | 11 +++--- .../OpenMineruPreprocessProvider.ts | 2 +- .../preprocess/PreprocessProvider.ts | 4 +- .../preprocess/PreprocessProviderFactory.ts | 4 +- src/main/knowledge/reranker/BaseReranker.ts | 4 +- .../knowledge/reranker/GeneralReranker.ts | 2 +- src/main/knowledge/reranker/Reranker.ts | 2 +- .../reranker/strategies/BailianStrategy.ts | 2 +- .../reranker/strategies/DefaultStrategy.ts | 2 +- .../reranker/strategies/JinaStrategy.ts | 2 +- .../reranker/strategies/StrategyFactory.ts | 2 +- .../reranker/strategies/TeiStrategy.ts | 2 +- .../reranker/strategies/VoyageStrategy.ts | 2 +- src/main/mcpServers/brave-search.ts | 3 +- src/main/mcpServers/factory.ts | 5 ++- src/main/mcpServers/sequentialthinking.ts | 3 +- src/main/services/ApiServerService.ts | 2 +- src/main/services/AppMenuService.ts | 3 +- src/main/services/AppUpdater.ts | 6 ++- src/main/services/BackupManager.ts | 6 +-- src/main/services/CodeToolsService.ts | 3 +- src/main/services/ConfigManager.ts | 6 ++- src/main/services/ContextMenu.ts | 3 +- src/main/services/FileStorage.ts | 16 +++----- src/main/services/KnowledgeService.ts | 5 ++- src/main/services/MCPService.ts | 5 ++- src/main/services/MistralClientManager.ts | 2 +- src/main/services/NodeTraceService.ts | 3 +- src/main/services/NotificationService.ts | 2 +- src/main/services/ProxyManager.ts | 3 +- src/main/services/PythonService.ts | 3 +- src/main/services/ShortcutService.ts | 5 ++- src/main/services/SpanCacheService.ts | 5 ++- src/main/services/TrayService.ts | 3 +- src/main/services/WebDav.ts | 8 ++-- src/main/services/WebSocketService.ts | 3 +- .../services/__tests__/AppUpdater.test.ts | 2 +- src/main/services/agents/BaseService.ts | 9 +++-- .../agents/database/MigrationService.ts | 2 +- src/main/services/agents/errors.ts | 4 +- .../agents/interfaces/AgentStreamInterface.ts | 4 +- .../services/agents/services/AgentService.ts | 6 +-- .../agents/services/SessionMessageService.ts | 4 +- .../agents/services/SessionService.ts | 6 +-- .../agents/services/claudecode/commands.ts | 2 +- .../agents/services/claudecode/index.ts | 7 ++-- .../services/claudecode/tool-permissions.ts | 2 +- .../agents/services/claudecode/tools.ts | 2 +- .../agents/services/claudecode/transform.ts | 2 +- src/main/services/mcp/oauth/callback.ts | 4 +- src/main/services/mcp/oauth/provider.ts | 10 +++-- src/main/services/mcp/oauth/storage.ts | 5 ++- src/main/services/mcp/oauth/types.ts | 4 +- src/main/services/memory/MemoryService.ts | 3 +- src/main/services/ocr/OcrService.ts | 3 +- .../services/ocr/builtin/OcrBaseService.ts | 2 +- src/main/services/ocr/builtin/OvOcrService.ts | 3 +- src/main/services/ocr/builtin/PpocrService.ts | 3 +- .../services/ocr/builtin/SystemOcrService.ts | 3 +- .../services/ocr/builtin/TesseractService.ts | 7 +++- .../services/remotefile/BaseFileService.ts | 2 +- .../services/remotefile/FileServiceManager.ts | 4 +- src/main/services/remotefile/GeminiService.ts | 5 ++- .../services/remotefile/MistralService.ts | 4 +- src/main/services/remotefile/OpenAIService.ts | 2 +- src/main/services/urlschema/mcp-install.ts | 2 +- src/main/utils/file.ts | 3 +- src/main/utils/ocr.ts | 2 +- src/main/utils/windowUtil.ts | 2 +- src/main/utils/zoom.ts | 2 +- src/preload/index.ts | 13 ++++--- src/preload/preload.d.ts | 2 +- src/renderer/src/Router.tsx | 3 +- .../src/aiCore/chunk/AiSdkToChunkAdapter.ts | 6 ++- .../src/aiCore/chunk/handleToolCallChunk.ts | 5 ++- src/renderer/src/aiCore/index_new.ts | 7 ++-- .../aiCore/legacy/clients/ApiClientFactory.ts | 4 +- .../aiCore/legacy/clients/BaseApiClient.ts | 22 ++++++----- .../legacy/clients/MixedBaseApiClient.ts | 16 ++++---- .../__tests__/ApiClientFactory.test.ts | 2 +- .../index.clientCompatibilityTypes.test.ts | 2 +- .../clients/aihubmix/AihubmixAPIClient.ts | 4 +- .../clients/anthropic/AnthropicAPIClient.ts | 26 ++++++------- .../anthropic/AnthropicVertexClient.ts | 4 +- .../legacy/clients/aws/AwsBedrockAPIClient.ts | 22 ++++------- .../clients/cherryai/CherryAiAPIClient.ts | 6 +-- .../legacy/clients/gemini/GeminiAPIClient.ts | 27 ++++++------- .../legacy/clients/gemini/VertexAPIClient.ts | 2 +- .../legacy/clients/newapi/NewAPIClient.ts | 6 +-- .../legacy/clients/openai/OpenAIApiClient.ts | 30 +++++++------- .../legacy/clients/openai/OpenAIBaseClient.ts | 6 +-- .../clients/openai/OpenAIResponseAPIClient.ts | 19 +++++---- .../aiCore/legacy/clients/ovms/OVMSClient.ts | 5 ++- .../legacy/clients/ppio/PPIOAPIClient.ts | 4 +- .../src/aiCore/legacy/clients/types.ts | 14 +++---- .../legacy/clients/zhipu/ZhipuAPIClient.ts | 6 +-- src/renderer/src/aiCore/legacy/index.ts | 4 +- .../src/aiCore/legacy/middleware/builder.ts | 2 +- .../common/AbortHandlerMiddleware.ts | 5 ++- .../common/ErrorHandlerMiddleware.ts | 6 +-- .../common/FinalChunkConsumerMiddleware.ts | 6 +-- .../middleware/common/LoggingMiddleware.ts | 2 +- .../src/aiCore/legacy/middleware/composer.ts | 16 +++----- .../middleware/core/McpToolChunkMiddleware.ts | 11 +++--- .../core/RawStreamListenerMiddleware.ts | 8 ++-- .../core/ResponseTransformMiddleware.ts | 8 ++-- .../core/StreamAdapterMiddleware.ts | 6 +-- .../middleware/core/TextChunkMiddleware.ts | 4 +- .../middleware/core/ThinkChunkMiddleware.ts | 7 ++-- .../TransformCoreToSdkParamsMiddleware.ts | 4 +- .../middleware/core/WebSearchMiddleware.ts | 4 +- .../feat/ImageGenerationMiddleware.ts | 8 ++-- .../feat/ThinkingTagExtractionMiddleware.ts | 13 ++++--- .../feat/ToolUseExtractionMiddleware.ts | 12 +++--- .../src/aiCore/legacy/middleware/index.ts | 2 +- .../src/aiCore/legacy/middleware/schemas.ts | 10 ++--- .../src/aiCore/legacy/middleware/types.ts | 10 ++--- .../src/aiCore/legacy/middleware/utils.ts | 3 +- .../middleware/AiSdkMiddlewareBuilder.ts | 8 ++-- .../aiCore/middleware/noThinkMiddleware.ts | 2 +- .../openrouterGenerateImageMiddleware.ts | 2 +- .../middleware/qwenThinkingMiddleware.ts | 2 +- .../aiCore/middleware/toolChoiceMiddleware.ts | 2 +- .../src/aiCore/plugins/PluginBuilder.ts | 6 +-- .../plugins/searchOrchestrationPlugin.ts | 3 +- .../src/aiCore/plugins/telemetryPlugin.ts | 5 ++- .../src/aiCore/prepareParams/fileProcessor.ts | 2 +- .../aiCore/prepareParams/messageConverter.ts | 2 +- .../aiCore/prepareParams/parameterBuilder.ts | 4 +- .../src/aiCore/provider/config/aihubmix.ts | 2 +- .../src/aiCore/provider/config/newApi.ts | 2 +- src/renderer/src/aiCore/provider/factory.ts | 2 +- .../src/aiCore/tools/KnowledgeSearchTool.ts | 2 +- .../src/aiCore/tools/WebSearchTool.ts | 4 +- .../src/aiCore/trace/AiSdkSpanAdapter.ts | 5 ++- src/renderer/src/aiCore/utils/image.ts | 3 +- src/renderer/src/aiCore/utils/mcp.ts | 4 +- src/renderer/src/aiCore/utils/options.ts | 4 +- src/renderer/src/aiCore/utils/reasoning.ts | 7 ++-- src/renderer/src/aiCore/utils/websearch.ts | 8 ++-- src/renderer/src/api/agent.ts | 31 ++++++++------- .../__tests__/useToolManager.test.ts | 3 +- .../src/components/ActionTools/constants.ts | 2 +- .../ActionTools/hooks/useImageTools.tsx | 3 +- .../ActionTools/hooks/useToolManager.ts | 2 +- src/renderer/src/components/ApiModelLabel.tsx | 2 +- .../src/components/Avatar/ModelAvatar.tsx | 7 ++-- .../components/Buttons/ActionIconButton.tsx | 3 +- .../CodeBlockView/HtmlArtifactsCard.tsx | 5 ++- .../CodeBlockView/HtmlArtifactsPopup.tsx | 3 +- .../components/CodeBlockView/StatusBar.tsx | 3 +- .../src/components/CodeBlockView/view.tsx | 9 +++-- .../src/components/CodeEditor/hooks.ts | 3 +- .../src/components/CodeEditor/index.tsx | 3 +- .../__tests__/CodeToolButton.test.tsx | 2 +- .../__tests__/CodeToolbar.test.tsx | 2 +- .../__tests__/useCopyTool.test.tsx | 2 +- .../__tests__/useDownloadTool.test.tsx | 2 +- .../__tests__/useSplitViewTool.test.tsx | 2 +- .../__tests__/useViewSourceTool.test.tsx | 2 +- .../src/components/CodeToolbar/button.tsx | 2 +- .../CodeToolbar/hooks/useCopyTool.tsx | 5 ++- .../CodeToolbar/hooks/useDownloadTool.tsx | 5 ++- .../CodeToolbar/hooks/useExpandTool.tsx | 3 +- .../CodeToolbar/hooks/useRunTool.tsx | 3 +- .../CodeToolbar/hooks/useSaveTool.tsx | 5 ++- .../CodeToolbar/hooks/useSplitViewTool.tsx | 5 ++- .../CodeToolbar/hooks/useViewSourceTool.tsx | 5 ++- .../CodeToolbar/hooks/useWrapTool.tsx | 3 +- .../src/components/CodeToolbar/toolbar.tsx | 2 +- src/renderer/src/components/CodeViewer.tsx | 2 +- .../src/components/CollapsibleSearchBar.tsx | 3 +- src/renderer/src/components/ConfirmDialog.tsx | 2 +- src/renderer/src/components/CopyButton.tsx | 2 +- .../src/components/CustomCollapse.tsx | 3 +- .../src/components/DividerWithText.tsx | 3 +- .../__tests__/useDraggableReorder.test.ts | 2 +- .../src/components/DraggableList/list.tsx | 9 ++--- .../DraggableList/useDraggableReorder.ts | 5 ++- .../components/DraggableList/virtual-list.tsx | 6 +-- .../src/components/EditableNumber/index.tsx | 3 +- src/renderer/src/components/EmojiIcon.tsx | 2 +- .../src/components/EmojiPicker/index.tsx | 3 +- src/renderer/src/components/ErrorBoundary.tsx | 5 ++- .../src/components/FreeTrialModelTag.tsx | 4 +- .../HealthStatusIndicator/indicator.tsx | 2 +- .../components/HealthStatusIndicator/types.ts | 2 +- .../HealthStatusIndicator/useHealthStatus.tsx | 2 +- src/renderer/src/components/HighlightText.tsx | 3 +- .../src/components/Icons/FileIcons.tsx | 2 +- .../src/components/Icons/MinAppIcon.tsx | 4 +- src/renderer/src/components/Icons/OcrIcon.tsx | 2 +- .../src/components/Icons/ReasoningIcon.tsx | 3 +- src/renderer/src/components/Icons/SVGIcon.tsx | 2 +- .../components/Icons/SvgSpinners180Ring.tsx | 2 +- .../src/components/Icons/ToolIcon.tsx | 2 +- .../src/components/Icons/ToolsCallingIcon.tsx | 3 +- .../src/components/Icons/VisionIcon.tsx | 3 +- .../src/components/Icons/WebSearchIcon.tsx | 3 +- src/renderer/src/components/ImageViewer.tsx | 3 +- src/renderer/src/components/InfoPopover.tsx | 3 +- .../components/InputEmbeddingDimension.tsx | 2 +- .../src/components/LanguageSelect.tsx | 8 ++-- .../src/components/ListItem/index.tsx | 2 +- .../src/components/MarkdownEditor/index.tsx | 3 +- .../src/components/MaxContextCount.tsx | 2 +- src/renderer/src/components/MinApp/MinApp.tsx | 4 +- .../src/components/MinApp/MinAppTabsPool.tsx | 2 +- .../MinApp/MinappPopupContainer.tsx | 4 +- .../components/MinApp/WebviewContainer.tsx | 2 +- .../src/components/ModelIdWithTags.tsx | 2 +- .../src/components/ModelSelectButton.tsx | 5 ++- src/renderer/src/components/ModelSelector.tsx | 7 ++-- .../src/components/ModelTagsWithLabel.tsx | 5 ++- .../src/components/OAuth/OAuthButton.tsx | 7 ++-- .../components/Popups/AddAssistantPopup.tsx | 5 ++- .../components/Popups/ApiKeyListPopup/hook.ts | 17 +++----- .../Popups/ApiKeyListPopup/item.tsx | 10 +++-- .../Popups/ApiKeyListPopup/list.tsx | 10 +++-- .../Popups/ApiKeyListPopup/types.ts | 2 +- .../src/components/Popups/GeneralPopup.tsx | 6 ++- .../components/Popups/MultiSelectionPopup.tsx | 4 +- .../components/Popups/ObsidianExportPopup.tsx | 3 +- .../src/components/Popups/PromptPopup.tsx | 5 ++- .../src/components/Popups/RichEditPopup.tsx | 5 ++- .../Popups/SaveToKnowledgePopup.tsx | 12 +++--- .../SelectModelPopup/TagFilterSection.tsx | 2 +- .../SelectModelPopup/api-model-popup.tsx | 5 ++- .../Popups/SelectModelPopup/filters.ts | 3 +- .../Popups/SelectModelPopup/popup.tsx | 5 ++- .../Popups/SelectModelPopup/searchbar.tsx | 3 +- .../Popups/SelectModelPopup/types.ts | 4 +- .../src/components/Popups/TextEditPopup.tsx | 7 ++-- .../src/components/Popups/VideoPopup.tsx | 2 +- .../components/Popups/agent/AgentModal.tsx | 13 ++++--- .../components/Popups/agent/SessionModal.tsx | 5 ++- .../src/components/Popups/agent/shared.tsx | 3 +- .../components/Preview/GraphvizPreview.tsx | 2 +- .../components/Preview/ImagePreviewLayout.tsx | 2 +- .../src/components/Preview/MermaidPreview.tsx | 2 +- .../components/Preview/PlantUmlPreview.tsx | 2 +- .../src/components/Preview/SvgPreview.tsx | 2 +- .../src/components/ProviderAvatar.tsx | 2 +- .../components/ProviderLogoPicker/index.tsx | 3 +- .../src/components/QuickPanel/provider.tsx | 2 +- .../src/components/QuickPanel/view.tsx | 2 +- .../RichEditor/components/ActionMenu.tsx | 3 +- .../RichEditor/components/PlusButton.tsx | 3 +- .../RichEditor/components/TableActionMenu.tsx | 3 +- .../placeholder/ImagePlaceholderNodeView.tsx | 2 +- .../code-block-shiki/CodeBlockNodeView.tsx | 3 +- .../code-block-shiki/shikijsPlugin.ts | 3 +- .../RichEditor/extensions/placeholder.ts | 5 ++- .../RichEditor/extensions/plus-button.ts | 5 ++- .../src/components/RichEditor/toolbar.tsx | 5 ++- .../src/components/RichEditor/types.ts | 2 +- .../src/components/Scrollbar/index.tsx | 3 +- src/renderer/src/components/Selector.tsx | 6 ++- .../src/components/Tab/TabContainer.tsx | 5 ++- .../src/components/Tags/CustomTag.tsx | 3 +- .../components/Tags/Model/EmbeddingTag.tsx | 3 +- .../src/components/Tags/Model/FreeTag.tsx | 3 +- .../components/Tags/Model/ReasoningTag.tsx | 3 +- .../src/components/Tags/Model/RerankerTag.tsx | 3 +- .../components/Tags/Model/ToolsCallingTag.tsx | 3 +- .../src/components/Tags/Model/VisionTag.tsx | 3 +- .../components/Tags/Model/WebSearchTag.tsx | 3 +- src/renderer/src/components/TextBadge.tsx | 2 +- .../components/TooltipIcons/HelpTooltip.tsx | 3 +- .../components/TooltipIcons/InfoTooltip.tsx | 3 +- .../components/TooltipIcons/WarnTooltip.tsx | 3 +- src/renderer/src/components/TopView/index.tsx | 3 +- src/renderer/src/components/TopView/toast.ts | 2 +- .../src/components/TranslateButton.tsx | 3 +- src/renderer/src/components/UpdateDialog.tsx | 2 +- .../src/components/WindowControls/index.tsx | 2 +- .../__tests__/ModelSelector.test.tsx | 2 +- .../__tests__/QuickPanelView.test.tsx | 5 ++- .../components/agent/AllowedToolsSelect.tsx | 5 ++- .../src/components/app/PinnedMinapps.tsx | 5 ++- src/renderer/src/components/app/Sidebar.tsx | 2 +- .../src/components/dnd/ItemRenderer.tsx | 7 ++-- src/renderer/src/components/dnd/Sortable.tsx | 8 +--- .../src/components/dnd/SortableItem.tsx | 2 +- .../src/components/dnd/useDndReorder.ts | 3 +- .../src/config/__test__/models.test.ts | 2 +- src/renderer/src/config/agent.ts | 4 +- src/renderer/src/config/endpointTypes.ts | 2 +- src/renderer/src/config/minapps.ts | 2 +- src/renderer/src/config/models/default.ts | 2 +- src/renderer/src/config/models/embedding.ts | 2 +- src/renderer/src/config/models/logo.ts | 2 +- src/renderer/src/config/models/reasoning.ts | 2 +- src/renderer/src/config/models/tooluse.ts | 3 +- src/renderer/src/config/models/utils.ts | 4 +- src/renderer/src/config/models/vision.ts | 2 +- src/renderer/src/config/models/websearch.ts | 3 +- src/renderer/src/config/ocr.ts | 2 +- .../src/config/preprocessProviders.ts | 2 +- src/renderer/src/config/providers.ts | 5 +-- src/renderer/src/config/sidebar.ts | 2 +- src/renderer/src/config/tools.ts | 4 +- src/renderer/src/config/translate.ts | 2 +- src/renderer/src/config/webSearchProviders.ts | 2 +- src/renderer/src/context/AntdProvider.tsx | 4 +- .../src/context/CodeStyleProvider.tsx | 3 +- .../src/context/MessageEditingContext.tsx | 3 +- .../src/context/NotificationProvider.tsx | 2 +- src/renderer/src/context/ThemeProvider.tsx | 3 +- src/renderer/src/databases/index.ts | 2 +- src/renderer/src/databases/upgrades.ts | 2 +- src/renderer/src/env.d.ts | 8 ++-- src/renderer/src/hooks/agents/useAgents.ts | 2 +- src/renderer/src/hooks/agents/useModel.ts | 2 +- src/renderer/src/hooks/agents/useModels.ts | 2 +- src/renderer/src/hooks/agents/useSessions.ts | 2 +- .../src/hooks/agents/useUpdateAgent.ts | 4 +- .../src/hooks/agents/useUpdateSession.ts | 4 +- src/renderer/src/hooks/useAssistant.ts | 2 +- src/renderer/src/hooks/useAssistantPresets.ts | 2 +- src/renderer/src/hooks/useChatContext.ts | 4 +- src/renderer/src/hooks/useCodeHighlight.ts | 2 +- src/renderer/src/hooks/useCodeTools.ts | 2 +- src/renderer/src/hooks/useFiles.ts | 2 +- src/renderer/src/hooks/useKnowledge.ts | 15 ++----- .../src/hooks/useKnowledgeBaseForm.ts | 2 +- src/renderer/src/hooks/useKnowledgeFiles.tsx | 2 +- src/renderer/src/hooks/useMCPServerTrust.tsx | 2 +- src/renderer/src/hooks/useMCPServers.ts | 5 ++- src/renderer/src/hooks/useMinappPopup.ts | 2 +- src/renderer/src/hooks/useMinapps.ts | 5 ++- src/renderer/src/hooks/useNotesQuery.ts | 2 +- src/renderer/src/hooks/useNotesSettings.ts | 9 +---- src/renderer/src/hooks/useOcr.ts | 3 +- src/renderer/src/hooks/useOcrProvider.tsx | 10 +---- src/renderer/src/hooks/usePaintings.ts | 2 +- src/renderer/src/hooks/usePreprocess.ts | 4 +- src/renderer/src/hooks/useProvider.ts | 3 +- .../src/hooks/useSelectionAssistant.ts | 2 +- src/renderer/src/hooks/useSettings.ts | 8 ++-- src/renderer/src/hooks/useSidebarIcon.ts | 2 +- src/renderer/src/hooks/useStore.ts | 2 +- src/renderer/src/hooks/useTags.ts | 3 +- src/renderer/src/hooks/useTopic.ts | 2 +- src/renderer/src/hooks/useTranslate.ts | 5 ++- src/renderer/src/hooks/useUserTheme.ts | 3 +- src/renderer/src/hooks/useVertexAI.ts | 2 +- .../src/hooks/useWebSearchProviders.ts | 2 +- src/renderer/src/i18n/label.ts | 9 +---- src/renderer/src/pages/code/CodeToolsPage.tsx | 8 ++-- src/renderer/src/pages/code/index.ts | 2 +- src/renderer/src/pages/files/ContentView.tsx | 3 +- src/renderer/src/pages/files/FileList.tsx | 3 +- src/renderer/src/pages/files/FilesPage.tsx | 6 ++- .../src/pages/history/HistoryPage.tsx | 8 ++-- .../history/components/SearchMessage.tsx | 5 ++- .../history/components/SearchResults.tsx | 5 ++- .../history/components/TopicMessages.tsx | 5 ++- .../history/components/TopicsHistory.tsx | 2 +- src/renderer/src/pages/home/Chat.tsx | 8 ++-- src/renderer/src/pages/home/ChatNavbar.tsx | 4 +- src/renderer/src/pages/home/HomePage.tsx | 5 ++- .../home/Inputbar/AgentSessionInputbar.tsx | 9 +++-- .../pages/home/Inputbar/AttachmentButton.tsx | 5 ++- .../pages/home/Inputbar/AttachmentPreview.tsx | 5 ++- .../home/Inputbar/GenerateImageButton.tsx | 4 +- .../src/pages/home/Inputbar/Inputbar.tsx | 11 ++++-- .../src/pages/home/Inputbar/InputbarTools.tsx | 39 ++++++++++++------- .../home/Inputbar/KnowledgeBaseButton.tsx | 8 ++-- .../home/Inputbar/KnowledgeBaseInput.tsx | 4 +- .../pages/home/Inputbar/MCPToolsButton.tsx | 8 ++-- .../home/Inputbar/MentionModelsButton.tsx | 5 ++- .../home/Inputbar/MentionModelsInput.tsx | 4 +- .../pages/home/Inputbar/NewContextButton.tsx | 2 +- .../home/Inputbar/QuickPhrasesButton.tsx | 2 +- .../pages/home/Inputbar/SendMessageButton.tsx | 2 +- .../pages/home/Inputbar/ThinkingButton.tsx | 5 ++- .../src/pages/home/Inputbar/TokenCount.tsx | 2 +- .../pages/home/Inputbar/UrlContextbutton.tsx | 3 +- .../pages/home/Inputbar/WebSearchButton.tsx | 8 ++-- .../src/pages/home/Markdown/Markdown.tsx | 2 +- .../home/Markdown/MarkdownSvgRenderer.tsx | 3 +- .../home/Messages/Blocks/CitationBlock.tsx | 2 +- .../pages/home/Messages/Blocks/ErrorBlock.tsx | 6 +-- .../pages/home/Messages/ChatFlowHistory.tsx | 10 +++-- .../pages/home/Messages/ChatNavigation.tsx | 5 ++- .../src/pages/home/Messages/CitationsList.tsx | 2 +- .../src/pages/home/Messages/Message.tsx | 5 ++- .../home/Messages/MessageAttachments.tsx | 2 +- .../src/pages/home/Messages/MessageEditor.tsx | 15 ++++--- .../src/pages/home/Messages/MessageGroup.tsx | 2 +- .../home/Messages/MessageGroupMenuBar.tsx | 5 ++- .../home/Messages/MessageGroupModelList.tsx | 3 +- .../home/Messages/MessageGroupSettings.tsx | 3 +- .../src/pages/home/Messages/MessageHeader.tsx | 3 +- .../src/pages/home/Messages/MessageImage.tsx | 2 +- .../pages/home/Messages/MessageMenubar.tsx | 15 +++---- .../pages/home/Messages/MessageOutline.tsx | 8 ++-- .../src/pages/home/Messages/MessageSelect.tsx | 5 ++- .../pages/home/Messages/MessageTranslate.tsx | 3 +- .../src/pages/home/Messages/MessageVideo.tsx | 5 ++- .../src/pages/home/Messages/Messages.tsx | 3 +- .../src/pages/home/Messages/NarrowLayout.tsx | 2 +- .../pages/home/Messages/NewTopicButton.tsx | 2 +- .../src/pages/home/Messages/Prompt.tsx | 5 ++- .../Tools/MessageAgentTools/GenericTools.tsx | 2 +- .../Tools/MessageAgentTools/index.tsx | 5 ++- .../Messages/Tools/MessageKnowledgeSearch.tsx | 4 +- .../home/Messages/Tools/MessageMcpTool.tsx | 7 ++-- .../Messages/Tools/MessageMemorySearch.tsx | 4 +- .../pages/home/Messages/Tools/MessageTool.tsx | 2 +- .../home/Messages/Tools/MessageWebSearch.tsx | 4 +- .../Tools/ToolPermissionRequestCard.tsx | 2 +- src/renderer/src/pages/home/Navbar.tsx | 4 +- .../src/pages/home/Tabs/AssistantsTab.tsx | 5 ++- .../pages/home/Tabs/SessionSettingsTab.tsx | 6 +-- .../src/pages/home/Tabs/SessionsTab.tsx | 3 +- .../src/pages/home/Tabs/SettingsTab.tsx | 8 ++-- .../src/pages/home/Tabs/TopicsTab.tsx | 4 +- .../pages/home/Tabs/components/AddButton.tsx | 5 ++- .../pages/home/Tabs/components/AgentItem.tsx | 5 ++- .../home/Tabs/components/AssistantItem.tsx | 8 ++-- .../Tabs/components/OpenAISettingsGroup.tsx | 19 ++++----- .../home/Tabs/components/SessionItem.tsx | 5 ++- .../pages/home/Tabs/components/TagGroup.tsx | 2 +- .../src/pages/home/Tabs/components/Topics.tsx | 9 +++-- .../home/Tabs/components/UnifiedAddButton.tsx | 5 ++- .../home/Tabs/components/UnifiedList.tsx | 7 ++-- .../home/Tabs/components/UnifiedTagGroups.tsx | 7 ++-- .../home/Tabs/hooks/useUnifiedGrouping.ts | 7 ++-- .../pages/home/Tabs/hooks/useUnifiedItems.ts | 2 +- .../home/Tabs/hooks/useUnifiedSorting.ts | 4 +- src/renderer/src/pages/home/Tabs/index.tsx | 7 ++-- .../home/components/AssistantsDrawer.tsx | 2 +- .../home/components/ChatNavbarContent.tsx | 5 ++- .../components/SelectAgentBaseModelButton.tsx | 5 ++- .../home/components/SelectModelButton.tsx | 5 ++- .../pages/home/components/UpdateAppButton.tsx | 2 +- .../src/pages/knowledge/KnowledgeContent.tsx | 5 ++- .../src/pages/knowledge/KnowledgePage.tsx | 8 ++-- .../__tests__/GeneralSettingsPanel.test.tsx | 2 +- .../__tests__/KnowledgeBaseFormModal.test.tsx | 3 +- .../components/AddKnowledgeBasePopup.tsx | 2 +- .../components/EditKnowledgeBasePopup.tsx | 2 +- .../KnowledgeSearchItem/TextItem.tsx | 5 ++- .../KnowledgeSearchItem/VideoItem.tsx | 5 ++- .../KnowledgeSearchItem/components.tsx | 2 +- .../components/KnowledgeSearchItem/hooks.ts | 3 +- .../components/KnowledgeSearchItem/index.tsx | 2 +- .../components/KnowledgeSearchPopup.tsx | 5 ++- .../AdvancedSettingsPanel.tsx | 2 +- .../GeneralSettingsPanel.tsx | 5 ++- .../KnowledgeBaseFormModal.tsx | 3 +- .../pages/knowledge/components/QuotaTag.tsx | 5 ++- .../pages/knowledge/components/StatusIcon.tsx | 5 ++- .../knowledge/items/KnowledgeDirectories.tsx | 5 ++- .../pages/knowledge/items/KnowledgeFiles.tsx | 6 ++- .../pages/knowledge/items/KnowledgeNotes.tsx | 5 ++- .../knowledge/items/KnowledgeSitemaps.tsx | 5 ++- .../pages/knowledge/items/KnowledgeUrls.tsx | 5 ++- .../pages/knowledge/items/KnowledgeVideos.tsx | 6 ++- .../src/pages/launchpad/LaunchpadPage.tsx | 3 +- .../src/pages/memory/settings-modal.tsx | 5 ++- src/renderer/src/pages/minapps/MinAppPage.tsx | 5 ++- .../src/pages/minapps/MinAppsPage.tsx | 3 +- .../MiniappSettings/MiniAppIconsManager.tsx | 15 +++---- .../MiniappSettings/MiniAppSettings.tsx | 3 +- .../src/pages/minapps/NewAppButton.tsx | 5 ++- .../minapps/components/MinAppFullPageView.tsx | 7 ++-- .../minapps/components/MinimalToolbar.tsx | 7 ++-- .../minapps/components/WebviewSearch.tsx | 3 +- src/renderer/src/pages/notes/MenuConfig.tsx | 4 +- src/renderer/src/pages/notes/NotesEditor.tsx | 10 +++-- src/renderer/src/pages/notes/NotesPage.tsx | 11 +++--- src/renderer/src/pages/notes/NotesSidebar.tsx | 15 ++++--- .../src/pages/notes/NotesSidebarHeader.tsx | 8 ++-- .../pages/notes/hooks/useFullTextSearch.ts | 5 ++- .../src/pages/paintings/DmxapiPage.tsx | 5 ++- .../src/pages/paintings/NewApiPage.tsx | 5 ++- .../pages/paintings/PaintingsRoutePage.tsx | 5 ++- .../src/pages/paintings/ZhipuPage.tsx | 3 +- .../pages/paintings/components/Artboard.tsx | 5 ++- .../paintings/components/ImageUploader.tsx | 2 +- .../paintings/components/PaintingsList.tsx | 5 ++- .../paintings/components/ProviderSelect.tsx | 5 ++- .../pages/paintings/config/DmxapiConfig.ts | 3 +- .../pages/paintings/config/NewApiConfig.ts | 2 +- .../src/pages/paintings/config/ZhipuConfig.ts | 2 +- .../pages/paintings/utils/TokenFluxService.ts | 2 +- .../src/pages/paintings/utils/index.ts | 4 +- .../src/pages/settings/AboutSettings.tsx | 5 ++- .../AgentSettings/AccessibleDirsSetting.tsx | 2 +- .../AgentSettings/AdvancedSettings.tsx | 8 ++-- .../settings/AgentSettings/AvatarSetting.tsx | 9 +---- .../AgentSettings/DescriptionSetting.tsx | 2 +- .../AgentSettings/EssentialSettings.tsx | 9 +++-- .../settings/AgentSettings/ModelSetting.tsx | 2 +- .../settings/AgentSettings/NameSetting.tsx | 2 +- .../settings/AgentSettings/PluginSettings.tsx | 5 ++- .../settings/AgentSettings/PromptSettings.tsx | 11 +++--- .../AgentSettings/ToolingSettings.tsx | 7 ++-- .../components/InstalledPluginsList.tsx | 5 ++- .../components/PluginBrowser.tsx | 5 ++- .../AgentSettings/components/PluginCard.tsx | 4 +- .../components/PluginDetailModal.tsx | 5 ++- .../pages/settings/AgentSettings/shared.tsx | 5 ++- .../AssistantKnowledgeBaseSettings.tsx | 5 ++- .../AssistantMCPSettings.tsx | 2 +- .../AssistantMemorySettings.tsx | 2 +- .../AssistantModelSettings.tsx | 5 ++- .../AssistantPromptSettings.tsx | 4 +- .../AssistantRegularPromptsSettings.tsx | 5 ++- .../settings/AssistantSettings/index.tsx | 2 +- .../AgentsSubscribeUrlSettings.tsx | 2 +- .../settings/DataSettings/DataSettings.tsx | 5 ++- .../DataSettings/ExportMenuSettings.tsx | 5 ++- .../settings/DataSettings/JoplinSettings.tsx | 5 ++- .../DataSettings/LocalBackupSettings.tsx | 2 +- .../DataSettings/MarkdownExportSettings.tsx | 5 ++- .../settings/DataSettings/NotionSettings.tsx | 5 ++- .../DataSettings/NutstoreSettings.tsx | 3 +- .../DataSettings/ObsidianSettings.tsx | 3 +- .../settings/DataSettings/S3Settings.tsx | 5 ++- .../settings/DataSettings/SiyuanSettings.tsx | 5 ++- .../settings/DataSettings/WebDavSettings.tsx | 3 +- .../settings/DataSettings/YuqueSettings.tsx | 5 ++- .../DisplaySettings/DisplaySettings.tsx | 5 ++- .../DisplaySettings/SidebarIconsManager.tsx | 15 +++---- .../DocProcessSettings/OcrImageSettings.tsx | 3 +- .../OcrProviderSettings.tsx | 3 +- .../DocProcessSettings/OcrSettings.tsx | 8 ++-- .../DocProcessSettings/OcrSystemSettings.tsx | 3 +- .../OcrTesseractSettings.tsx | 3 +- .../PreprocessProviderSettings.tsx | 5 ++- .../DocProcessSettings/PreprocessSettings.tsx | 5 ++- .../settings/DocProcessSettings/index.tsx | 2 +- .../src/pages/settings/GeneralSettings.tsx | 10 +++-- .../MCPSettings/AddMcpServerModal.tsx | 6 ++- .../MCPSettings/BuiltinMCPServerList.tsx | 2 +- .../settings/MCPSettings/EditMcpJsonPopup.tsx | 3 +- .../settings/MCPSettings/InstallNpxUv.tsx | 3 +- .../settings/MCPSettings/McpDescription.tsx | 3 +- .../settings/MCPSettings/McpMarketList.tsx | 2 +- .../pages/settings/MCPSettings/McpPrompt.tsx | 2 +- .../settings/MCPSettings/McpResource.tsx | 2 +- .../settings/MCPSettings/McpServerCard.tsx | 7 ++-- .../settings/MCPSettings/McpServersList.tsx | 5 ++- .../settings/MCPSettings/McpSettings.tsx | 5 ++- .../pages/settings/MCPSettings/McpTool.tsx | 4 +- .../pages/settings/MCPSettings/NpxSearch.tsx | 2 +- .../src/pages/settings/MCPSettings/index.tsx | 2 +- .../src/pages/settings/MCPSettings/utils.ts | 2 +- .../DefaultAssistantSettings.tsx | 5 ++- .../settings/ModelSettings/ModelSettings.tsx | 5 ++- .../src/pages/settings/NotesSettings.tsx | 5 ++- .../ProviderSettings/AddProviderPopup.tsx | 4 +- .../ApiOptionsSettings/ApiOptionsSettings.tsx | 2 +- .../ProviderSettings/AwsBedrockSettings.tsx | 3 +- .../ProviderSettings/CustomHeaderPopup.tsx | 2 +- .../ProviderSettings/DMXAPISettings.tsx | 6 ++- .../EditModelPopup/EditModelPopup.tsx | 2 +- .../EditModelPopup/ModelEditContent.tsx | 21 +++------- .../EditModelPopup/ModelTypeSelector.tsx | 5 ++- .../ProviderSettings/GPUStackSettings.tsx | 3 +- .../GithubCopilotSettings.tsx | 3 +- .../ProviderSettings/LMStudioSettings.tsx | 3 +- .../ModelList/AddModelPopup.tsx | 5 ++- .../ModelList/DownloadOVMSModelPopup.tsx | 5 ++- .../ModelList/HealthCheckPopup.tsx | 2 +- .../ModelList/ManageModelsList.tsx | 2 +- .../ModelList/ManageModelsPopup.tsx | 2 +- .../ProviderSettings/ModelList/ModelList.tsx | 2 +- .../ModelList/ModelListGroup.tsx | 4 +- .../ModelList/ModelListItem.tsx | 4 +- .../ModelList/NewApiAddModelPopup.tsx | 5 ++- .../ModelList/NewApiBatchAddModelPopup.tsx | 5 ++- .../ModelList/useHealthCheck.ts | 5 ++- .../ProviderSettings/ModelList/utils.ts | 2 +- .../ProviderSettings/ModelNotesPopup.tsx | 5 ++- .../ProviderSettings/OVMSSettings.tsx | 3 +- .../ProviderSettings/ProviderList.tsx | 11 ++++-- .../ProviderSettings/ProviderOAuth.tsx | 2 +- .../ProviderSettings/ProviderSetting.tsx | 9 +++-- .../SelectProviderModelPopup.tsx | 2 +- .../ProviderSettings/UrlSchemaInfoPopup.tsx | 2 +- .../pages/settings/QuickAssistantSettings.tsx | 3 +- .../pages/settings/QuickPhraseSettings.tsx | 5 ++- .../SelectionAssistantSettings.tsx | 5 ++- .../components/MacProcessTrustHintModal.tsx | 2 +- .../components/SelectionActionSearchModal.tsx | 3 +- .../components/SelectionActionUserModal.tsx | 3 +- .../components/SelectionActionsList.tsx | 2 +- .../components/SelectionFilterListModal.tsx | 3 +- .../hooks/useSettingsActionsList.ts | 2 +- .../src/pages/settings/SettingGroup.tsx | 2 +- .../src/pages/settings/SettingsPage.tsx | 2 +- .../src/pages/settings/ShortcutSettings.tsx | 8 ++-- .../ApiServerSettings/ApiServerSettings.tsx | 5 ++- .../CustomLanguageModal.tsx | 5 ++- .../CustomLanguageSettings.tsx | 5 ++- .../WebSearchSettings/AddSubscribePopup.tsx | 3 +- .../WebSearchSettings/BasicSettings.tsx | 2 +- .../WebSearchSettings/BlacklistSettings.tsx | 6 ++- .../CompressionSettings/RagSettings.tsx | 2 +- .../WebSearchProviderSetting.tsx | 5 ++- .../settings/WebSearchSettings/index.tsx | 5 ++- src/renderer/src/pages/settings/index.tsx | 5 ++- .../presets/AssistantPresetsPage.tsx | 5 ++- .../components/AddAssistantPresetPopup.tsx | 5 ++- .../components/AssistantPresetGroupIcon.tsx | 5 ++- .../components/ImportAssistantPresetPopup.tsx | 2 +- .../pages/store/assistants/presets/index.ts | 2 +- .../src/pages/translate/TranslateHistory.tsx | 5 ++- .../src/pages/translate/TranslatePage.tsx | 9 +++-- .../src/pages/translate/TranslateSettings.tsx | 5 ++- .../BaseWebSearchProvider.ts | 4 +- .../WebSearchProvider/BochaProvider.ts | 6 +-- .../WebSearchProvider/DefaultProvider.ts | 2 +- .../WebSearchProvider/ExaProvider.ts | 4 +- .../WebSearchProvider/LocalBaiduProvider.ts | 3 +- .../WebSearchProvider/LocalBingProvider.ts | 3 +- .../WebSearchProvider/LocalGoogleProvider.ts | 3 +- .../WebSearchProvider/LocalSearchProvider.ts | 4 +- .../WebSearchProvider/SearxngProvider.ts | 4 +- .../WebSearchProvider/TavilyProvider.ts | 4 +- .../WebSearchProviderFactory.ts | 4 +- .../WebSearchProvider/ZhipuProvider.ts | 4 +- .../src/providers/WebSearchProvider/index.ts | 4 +- src/renderer/src/queue/KnowledgeQueue.ts | 2 +- src/renderer/src/services/ApiService.ts | 13 ++++--- src/renderer/src/services/BackupService.ts | 2 +- .../src/services/ConversationService.ts | 4 +- src/renderer/src/services/FileAction.ts | 4 +- src/renderer/src/services/FileManager.ts | 2 +- .../src/services/HealthCheckService.ts | 5 ++- src/renderer/src/services/KnowledgeService.ts | 9 +++-- src/renderer/src/services/MemoryProcessor.ts | 4 +- src/renderer/src/services/MemoryService.ts | 2 +- src/renderer/src/services/MessagesService.ts | 2 +- .../src/services/ModelMessageService.ts | 4 +- src/renderer/src/services/ModelService.ts | 2 +- .../src/services/NavigationService.ts | 2 +- .../src/services/NotesSearchService.ts | 2 +- src/renderer/src/services/NotesService.ts | 2 +- src/renderer/src/services/NotesTreeService.ts | 2 +- src/renderer/src/services/NutstoreService.ts | 2 +- .../src/services/OrchestrateService.ts | 5 ++- src/renderer/src/services/PasteService.ts | 2 +- src/renderer/src/services/ProviderService.ts | 2 +- .../src/services/QuickPhraseService.ts | 2 +- .../src/services/ShikiStreamService.ts | 3 +- .../src/services/SpanManagerService.ts | 12 +++--- src/renderer/src/services/StoreSyncService.ts | 2 +- src/renderer/src/services/TabsService.ts | 4 +- src/renderer/src/services/TokenService.ts | 3 +- src/renderer/src/services/TranslateService.ts | 5 ++- src/renderer/src/services/WebSearchService.ts | 6 +-- src/renderer/src/services/WebTraceService.ts | 2 +- .../src/services/__tests__/ApiService.test.ts | 31 ++++++++------- .../__tests__/ModelMessageService.test.ts | 2 +- .../__tests__/ShikiStreamTokenizer.test.ts | 3 +- .../helpers/ShikiStreamTokenizer.helper.ts | 5 ++- .../services/messageStreaming/BlockManager.ts | 3 +- .../callbacks/baseCallbacks.ts | 14 +++---- .../callbacks/citationCallbacks.ts | 5 ++- .../callbacks/imageCallbacks.ts | 5 ++- .../messageStreaming/callbacks/index.ts | 2 +- .../callbacks/textCallbacks.ts | 5 ++- .../callbacks/thinkingCallbacks.ts | 5 ++- .../callbacks/toolCallbacks.ts | 5 ++- .../callbacks/videoCallbacks.ts | 2 +- src/renderer/src/services/ocr/OcrService.ts | 3 +- .../ocr/clients/OcrApiClientFactory.ts | 4 +- .../services/ocr/clients/OcrBaseApiClient.ts | 2 +- .../ocr/clients/OcrExampleApiClient.ts | 2 +- src/renderer/src/store/assistants.ts | 7 ++-- src/renderer/src/store/backup.ts | 3 +- src/renderer/src/store/codeTools.ts | 5 ++- src/renderer/src/store/copilot.ts | 3 +- src/renderer/src/store/inputTools.ts | 5 ++- src/renderer/src/store/knowledge.ts | 5 ++- src/renderer/src/store/llm.ts | 5 ++- src/renderer/src/store/messageBlock.ts | 5 ++- src/renderer/src/store/migrate.ts | 8 ++-- src/renderer/src/store/minapps.ts | 5 ++- src/renderer/src/store/newMessage.ts | 3 +- src/renderer/src/store/note.ts | 9 +++-- src/renderer/src/store/nutstore.ts | 5 ++- src/renderer/src/store/ocr.ts | 5 ++- src/renderer/src/store/paintings.ts | 5 ++- src/renderer/src/store/preprocess.ts | 5 ++- src/renderer/src/store/runtime.ts | 3 +- src/renderer/src/store/selectionStore.ts | 5 ++- src/renderer/src/store/settings.ts | 11 +++--- src/renderer/src/store/shortcuts.ts | 5 ++- src/renderer/src/store/tabs.ts | 3 +- .../thunk/__tests__/knowledgeThunk.test.ts | 3 +- .../src/store/thunk/knowledgeThunk.ts | 5 ++- src/renderer/src/store/toolPermissions.ts | 3 +- src/renderer/src/store/translate.ts | 3 +- src/renderer/src/store/websearch.ts | 3 +- src/renderer/src/tools/index.ts | 2 +- src/renderer/src/tools/think.ts | 2 +- .../trace/dataHandler/AsyncIterableHandler.ts | 6 +-- .../trace/dataHandler/CommonResultHandler.ts | 6 +-- .../trace/dataHandler/MessageStreamHandler.ts | 6 +-- .../src/trace/dataHandler/StreamHandler.ts | 8 ++-- src/renderer/src/trace/pages/SpanDetail.tsx | 5 ++- src/renderer/src/trace/pages/TraceModel.tsx | 2 +- src/renderer/src/trace/pages/TraceTree.tsx | 2 +- src/renderer/src/trace/pages/index.tsx | 4 +- .../src/trace/types/ModelSpanEntity.ts | 2 +- src/renderer/src/types/agent.ts | 2 +- src/renderer/src/types/aiCoreTypes.ts | 2 +- src/renderer/src/types/apiModels.ts | 2 +- src/renderer/src/types/chunk.ts | 6 +-- src/renderer/src/types/error.ts | 6 +-- src/renderer/src/types/healthCheck.ts | 2 +- src/renderer/src/types/index.ts | 4 +- src/renderer/src/types/knowledge.ts | 4 +- src/renderer/src/types/newMessage.ts | 2 +- src/renderer/src/types/ocr.ts | 5 ++- src/renderer/src/types/provider.ts | 2 +- src/renderer/src/types/sdk.ts | 19 ++++----- .../src/utils/__tests__/assistant.test.ts | 2 +- .../src/utils/__tests__/citation.test.ts | 5 ++- src/renderer/src/utils/__tests__/copy.test.ts | 2 +- .../src/utils/__tests__/export.test.ts | 3 +- .../src/utils/__tests__/model.test.ts | 2 +- .../src/utils/__tests__/naming.test.ts | 2 +- .../src/utils/__tests__/tagExtraction.test.ts | 3 +- .../src/utils/__tests__/websearch.test.ts | 2 +- src/renderer/src/utils/agentSession.ts | 2 +- src/renderer/src/utils/api.ts | 2 +- src/renderer/src/utils/assistant.ts | 2 +- .../src/utils/blacklistMatchPattern.ts | 4 +- src/renderer/src/utils/citation.ts | 5 ++- src/renderer/src/utils/copy.ts | 2 +- src/renderer/src/utils/dataLimit.ts | 2 +- src/renderer/src/utils/error.ts | 17 ++++---- src/renderer/src/utils/fetch.ts | 2 +- src/renderer/src/utils/file.ts | 3 +- src/renderer/src/utils/healthCheck.ts | 3 +- src/renderer/src/utils/index.ts | 4 +- src/renderer/src/utils/input.ts | 2 +- src/renderer/src/utils/markdownConverter.ts | 2 +- src/renderer/src/utils/match.ts | 3 +- src/renderer/src/utils/mcp-tools.ts | 15 +++---- src/renderer/src/utils/messageUtils/create.ts | 2 +- src/renderer/src/utils/messageUtils/find.ts | 2 +- src/renderer/src/utils/messageUtils/is.ts | 2 +- src/renderer/src/utils/model.ts | 3 +- src/renderer/src/utils/naming.ts | 3 +- src/renderer/src/utils/prompt.ts | 2 +- src/renderer/src/utils/provider.ts | 2 +- src/renderer/src/utils/shiki.ts | 5 ++- src/renderer/src/utils/style.ts | 3 +- src/renderer/src/utils/translate.ts | 8 ++-- src/renderer/src/utils/websearch.ts | 2 +- .../src/windows/mini/chat/ChatWindow.tsx | 4 +- .../windows/mini/chat/components/Message.tsx | 3 +- .../windows/mini/chat/components/Messages.tsx | 4 +- .../src/windows/mini/home/HomeWindow.tsx | 12 ++++-- .../mini/home/components/ClipboardPreview.tsx | 2 +- .../mini/home/components/FeatureMenus.tsx | 3 +- .../windows/mini/home/components/Footer.tsx | 2 +- .../windows/mini/home/components/InputBar.tsx | 4 +- .../mini/translate/TranslateWindow.tsx | 5 ++- .../selection/action/SelectionActionApp.tsx | 3 +- .../action/components/ActionGeneral.tsx | 5 ++- .../action/components/ActionTranslate.tsx | 5 ++- .../action/components/ActionUtils.ts | 5 ++- .../action/components/WindowFooter.tsx | 3 +- .../windows/selection/action/entryPoint.tsx | 3 +- .../selection/toolbar/SelectionToolbar.tsx | 5 ++- .../windows/selection/toolbar/entryPoint.tsx | 2 +- .../src/workers/shiki-stream.worker.ts | 3 +- 840 files changed, 2074 insertions(+), 1684 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 5bd988159a..5d63538e2c 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -140,7 +140,7 @@ "typescript/await-thenable": "warn", // "typescript/ban-ts-comment": "error", "typescript/no-array-constructor": "error", - // "typescript/consistent-type-imports": "error", + "typescript/consistent-type-imports": "error", "typescript/no-array-delete": "warn", "typescript/no-base-to-string": "warn", "typescript/no-duplicate-enum-values": "error", diff --git a/packages/aiCore/src/core/middleware/manager.ts b/packages/aiCore/src/core/middleware/manager.ts index bcb044b3a9..f285b8ecd1 100644 --- a/packages/aiCore/src/core/middleware/manager.ts +++ b/packages/aiCore/src/core/middleware/manager.ts @@ -2,7 +2,7 @@ * 中间件管理器 * 专注于 AI SDK 中间件的管理,与插件系统分离 */ -import { LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { LanguageModelV2Middleware } from '@ai-sdk/provider' /** * 创建中间件列表 diff --git a/packages/aiCore/src/core/middleware/types.ts b/packages/aiCore/src/core/middleware/types.ts index 50b5210b53..f500b0a91d 100644 --- a/packages/aiCore/src/core/middleware/types.ts +++ b/packages/aiCore/src/core/middleware/types.ts @@ -1,7 +1,7 @@ /** * 中间件系统类型定义 */ -import { LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { LanguageModelV2Middleware } from '@ai-sdk/provider' /** * 具名中间件接口 diff --git a/packages/aiCore/src/core/middleware/wrapper.ts b/packages/aiCore/src/core/middleware/wrapper.ts index 625eddbab3..059c82380f 100644 --- a/packages/aiCore/src/core/middleware/wrapper.ts +++ b/packages/aiCore/src/core/middleware/wrapper.ts @@ -2,7 +2,7 @@ * 模型包装工具函数 * 用于将中间件应用到LanguageModel上 */ -import { LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider' import { wrapLanguageModel } from 'ai' /** diff --git a/packages/aiCore/src/core/models/ModelResolver.ts b/packages/aiCore/src/core/models/ModelResolver.ts index 20bf3d76d1..ed9fa910e0 100644 --- a/packages/aiCore/src/core/models/ModelResolver.ts +++ b/packages/aiCore/src/core/models/ModelResolver.ts @@ -5,7 +5,7 @@ * 集成了来自 ModelCreator 的特殊处理逻辑 */ -import { EmbeddingModelV2, ImageModelV2, LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { EmbeddingModelV2, ImageModelV2, LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider' import { wrapModelWithMiddlewares } from '../middleware/wrapper' import { DEFAULT_SEPARATOR, globalRegistryManagement } from '../providers/RegistryManagement' diff --git a/packages/aiCore/src/core/models/types.ts b/packages/aiCore/src/core/models/types.ts index 57cb72366e..560d5bbeae 100644 --- a/packages/aiCore/src/core/models/types.ts +++ b/packages/aiCore/src/core/models/types.ts @@ -1,7 +1,7 @@ /** * Creation 模块类型定义 */ -import { LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { LanguageModelV2Middleware } from '@ai-sdk/provider' import type { ProviderId, ProviderSettingsMap } from '../providers/types' diff --git a/packages/aiCore/src/core/options/factory.ts b/packages/aiCore/src/core/options/factory.ts index ffeb15185c..ecd53e6330 100644 --- a/packages/aiCore/src/core/options/factory.ts +++ b/packages/aiCore/src/core/options/factory.ts @@ -1,4 +1,4 @@ -import { ExtractProviderOptions, ProviderOptionsMap, TypedProviderOptions } from './types' +import type { ExtractProviderOptions, ProviderOptionsMap, TypedProviderOptions } from './types' /** * 创建特定供应商的选项 diff --git a/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts b/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts index a2cc7d9aff..274fdcee5c 100644 --- a/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts +++ b/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts @@ -10,7 +10,7 @@ import type { AiRequestContext } from '../../types' import { StreamEventManager } from './StreamEventManager' import { type TagConfig, TagExtractor } from './tagExtraction' import { ToolExecutor } from './ToolExecutor' -import { PromptToolUseConfig, ToolUseResult } from './type' +import type { PromptToolUseConfig, ToolUseResult } from './type' /** * 工具使用标签配置 diff --git a/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/type.ts b/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/type.ts index 33ed6189ed..4937b25601 100644 --- a/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/type.ts +++ b/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/type.ts @@ -1,6 +1,6 @@ -import { ToolSet } from 'ai' +import type { ToolSet } from 'ai' -import { AiRequestContext } from '../..' +import type { AiRequestContext } from '../..' /** * 解析结果类型 diff --git a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts index fd68da27d2..42bd17e09c 100644 --- a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts +++ b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts @@ -1,10 +1,11 @@ -import { anthropic } from '@ai-sdk/anthropic' -import { google } from '@ai-sdk/google' -import { openai } from '@ai-sdk/openai' -import { InferToolInput, InferToolOutput, type Tool } from 'ai' +import type { anthropic } from '@ai-sdk/anthropic' +import type { google } from '@ai-sdk/google' +import type { openai } from '@ai-sdk/openai' +import type { InferToolInput, InferToolOutput } from 'ai' +import { type Tool } from 'ai' -import { ProviderOptionsMap } from '../../../options/types' -import { OpenRouterSearchConfig } from './openrouter' +import type { ProviderOptionsMap } from '../../../options/types' +import type { OpenRouterSearchConfig } from './openrouter' /** * 从 AI SDK 的工具函数中提取参数类型,以确保类型安全。 diff --git a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts index abd3ce3e2c..34eba79637 100644 --- a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts +++ b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts @@ -9,7 +9,8 @@ import { openai } from '@ai-sdk/openai' import { createOpenRouterOptions, createXaiOptions, mergeProviderOptions } from '../../../options' import { definePlugin } from '../../' import type { AiRequestContext } from '../../types' -import { DEFAULT_WEB_SEARCH_CONFIG, WebSearchPluginConfig } from './helper' +import type { WebSearchPluginConfig } from './helper' +import { DEFAULT_WEB_SEARCH_CONFIG } from './helper' /** * 网络搜索插件 diff --git a/packages/aiCore/src/core/plugins/manager.ts b/packages/aiCore/src/core/plugins/manager.ts index 4c927ed1de..40f5836c44 100644 --- a/packages/aiCore/src/core/plugins/manager.ts +++ b/packages/aiCore/src/core/plugins/manager.ts @@ -1,4 +1,4 @@ -import { AiPlugin, AiRequestContext } from './types' +import type { AiPlugin, AiRequestContext } from './types' /** * 插件管理器 diff --git a/packages/aiCore/src/core/providers/HubProvider.ts b/packages/aiCore/src/core/providers/HubProvider.ts index 0283d634b0..e87274be98 100644 --- a/packages/aiCore/src/core/providers/HubProvider.ts +++ b/packages/aiCore/src/core/providers/HubProvider.ts @@ -5,7 +5,7 @@ * 例如: aihubmix:anthropic:claude-3.5-sonnet */ -import { ProviderV2 } from '@ai-sdk/provider' +import type { ProviderV2 } from '@ai-sdk/provider' import { customProvider } from 'ai' import { globalRegistryManagement } from './RegistryManagement' diff --git a/packages/aiCore/src/core/providers/RegistryManagement.ts b/packages/aiCore/src/core/providers/RegistryManagement.ts index a8aefd44b2..67d10f3f2f 100644 --- a/packages/aiCore/src/core/providers/RegistryManagement.ts +++ b/packages/aiCore/src/core/providers/RegistryManagement.ts @@ -4,7 +4,7 @@ * 基于 AI SDK 原生的 createProviderRegistry */ -import { EmbeddingModelV2, ImageModelV2, LanguageModelV2, ProviderV2 } from '@ai-sdk/provider' +import type { EmbeddingModelV2, ImageModelV2, LanguageModelV2, ProviderV2 } from '@ai-sdk/provider' import { createProviderRegistry, type ProviderRegistryProvider } from 'ai' type PROVIDERS = Record diff --git a/packages/aiCore/src/core/providers/schemas.ts b/packages/aiCore/src/core/providers/schemas.ts index 0d507d5cc6..7ca4f6b0c8 100644 --- a/packages/aiCore/src/core/providers/schemas.ts +++ b/packages/aiCore/src/core/providers/schemas.ts @@ -10,10 +10,11 @@ import { createGoogleGenerativeAI } from '@ai-sdk/google' import { createHuggingFace } from '@ai-sdk/huggingface' import { createOpenAI, type OpenAIProviderSettings } from '@ai-sdk/openai' import { createOpenAICompatible } from '@ai-sdk/openai-compatible' -import { LanguageModelV2 } from '@ai-sdk/provider' +import type { LanguageModelV2 } from '@ai-sdk/provider' import { createXai } from '@ai-sdk/xai' import { createOpenRouter } from '@openrouter/ai-sdk-provider' -import { customProvider, Provider } from 'ai' +import type { Provider } from 'ai' +import { customProvider } from 'ai' import * as z from 'zod' /** diff --git a/packages/aiCore/src/core/providers/types.ts b/packages/aiCore/src/core/providers/types.ts index f862f43a75..6f1ec2c405 100644 --- a/packages/aiCore/src/core/providers/types.ts +++ b/packages/aiCore/src/core/providers/types.ts @@ -4,7 +4,7 @@ import { type DeepSeekProviderSettings } from '@ai-sdk/deepseek' import { type GoogleGenerativeAIProviderSettings } from '@ai-sdk/google' import { type OpenAIProviderSettings } from '@ai-sdk/openai' import { type OpenAICompatibleProviderSettings } from '@ai-sdk/openai-compatible' -import { +import type { EmbeddingModelV2 as EmbeddingModel, ImageModelV2 as ImageModel, LanguageModelV2 as LanguageModel, diff --git a/packages/aiCore/src/core/runtime/__tests__/generateImage.test.ts b/packages/aiCore/src/core/runtime/__tests__/generateImage.test.ts index bde5779fd9..217319aacc 100644 --- a/packages/aiCore/src/core/runtime/__tests__/generateImage.test.ts +++ b/packages/aiCore/src/core/runtime/__tests__/generateImage.test.ts @@ -1,4 +1,4 @@ -import { ImageModelV2 } from '@ai-sdk/provider' +import type { ImageModelV2 } from '@ai-sdk/provider' import { experimental_generateImage as aiGenerateImage, NoImageGeneratedError } from 'ai' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/packages/aiCore/src/core/runtime/executor.ts b/packages/aiCore/src/core/runtime/executor.ts index ab764bacd6..85c1fb64de 100644 --- a/packages/aiCore/src/core/runtime/executor.ts +++ b/packages/aiCore/src/core/runtime/executor.ts @@ -2,12 +2,12 @@ * 运行时执行器 * 专注于插件化的AI调用处理 */ -import { ImageModelV2, LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { ImageModelV2, LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { LanguageModel } from 'ai' import { experimental_generateImage as _generateImage, generateObject as _generateObject, generateText as _generateText, - LanguageModel, streamObject as _streamObject, streamText as _streamText } from 'ai' diff --git a/packages/aiCore/src/core/runtime/index.ts b/packages/aiCore/src/core/runtime/index.ts index 37aa4fec34..3dae7d0c2a 100644 --- a/packages/aiCore/src/core/runtime/index.ts +++ b/packages/aiCore/src/core/runtime/index.ts @@ -11,7 +11,7 @@ export type { RuntimeConfig } from './types' // === 便捷工厂函数 === -import { LanguageModelV2Middleware } from '@ai-sdk/provider' +import type { LanguageModelV2Middleware } from '@ai-sdk/provider' import { type AiPlugin } from '../plugins' import { type ProviderId, type ProviderSettingsMap } from '../providers/types' diff --git a/packages/aiCore/src/core/runtime/pluginEngine.ts b/packages/aiCore/src/core/runtime/pluginEngine.ts index d0100d2bcb..a2fc08b927 100644 --- a/packages/aiCore/src/core/runtime/pluginEngine.ts +++ b/packages/aiCore/src/core/runtime/pluginEngine.ts @@ -1,6 +1,13 @@ /* eslint-disable @eslint-react/naming-convention/context-name */ -import { ImageModelV2 } from '@ai-sdk/provider' -import { experimental_generateImage, generateObject, generateText, LanguageModel, streamObject, streamText } from 'ai' +import type { ImageModelV2 } from '@ai-sdk/provider' +import type { + experimental_generateImage, + generateObject, + generateText, + LanguageModel, + streamObject, + streamText +} from 'ai' import { type AiPlugin, createContext, PluginManager } from '../plugins' import { type ProviderId } from '../providers/types' diff --git a/packages/aiCore/src/core/runtime/types.ts b/packages/aiCore/src/core/runtime/types.ts index fbdcf46333..b95e00be4f 100644 --- a/packages/aiCore/src/core/runtime/types.ts +++ b/packages/aiCore/src/core/runtime/types.ts @@ -1,8 +1,8 @@ /** * Runtime 层类型定义 */ -import { ImageModelV2 } from '@ai-sdk/provider' -import { experimental_generateImage, generateObject, generateText, streamObject, streamText } from 'ai' +import type { ImageModelV2 } from '@ai-sdk/provider' +import type { experimental_generateImage, generateObject, generateText, streamObject, streamText } from 'ai' import { type ModelConfig } from '../models/types' import { type AiPlugin } from '../plugins' diff --git a/packages/extension-table-plus/src/kit/index.ts b/packages/extension-table-plus/src/kit/index.ts index 00221c5bfe..eb0fefb595 100755 --- a/packages/extension-table-plus/src/kit/index.ts +++ b/packages/extension-table-plus/src/kit/index.ts @@ -1,4 +1,5 @@ -import { Extension, Node } from '@tiptap/core' +import type { Node } from '@tiptap/core' +import { Extension } from '@tiptap/core' import type { TableCellOptions } from '../cell/index.js' import { TableCell } from '../cell/index.js' diff --git a/packages/mcp-trace/trace-core/core/spanConvert.ts b/packages/mcp-trace/trace-core/core/spanConvert.ts index a226f5d108..1a5eafff06 100644 --- a/packages/mcp-trace/trace-core/core/spanConvert.ts +++ b/packages/mcp-trace/trace-core/core/spanConvert.ts @@ -1,7 +1,7 @@ import { SpanKind, SpanStatusCode } from '@opentelemetry/api' -import { ReadableSpan } from '@opentelemetry/sdk-trace-base' +import type { ReadableSpan } from '@opentelemetry/sdk-trace-base' -import { SpanEntity } from '../types/config' +import type { SpanEntity } from '../types/config' /** * convert ReadableSpan to SpanEntity diff --git a/packages/mcp-trace/trace-core/core/traceCache.ts b/packages/mcp-trace/trace-core/core/traceCache.ts index cc5ba795ff..6b181fa3c8 100644 --- a/packages/mcp-trace/trace-core/core/traceCache.ts +++ b/packages/mcp-trace/trace-core/core/traceCache.ts @@ -1,4 +1,4 @@ -import { ReadableSpan } from '@opentelemetry/sdk-trace-base' +import type { ReadableSpan } from '@opentelemetry/sdk-trace-base' export interface TraceCache { createSpan: (span: ReadableSpan) => void diff --git a/packages/mcp-trace/trace-core/exporters/FuncSpanExporter.ts b/packages/mcp-trace/trace-core/exporters/FuncSpanExporter.ts index 48d769daf8..0bc97b82e1 100644 --- a/packages/mcp-trace/trace-core/exporters/FuncSpanExporter.ts +++ b/packages/mcp-trace/trace-core/exporters/FuncSpanExporter.ts @@ -1,5 +1,6 @@ -import { ExportResult, ExportResultCode } from '@opentelemetry/core' -import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base' +import type { ExportResult } from '@opentelemetry/core' +import { ExportResultCode } from '@opentelemetry/core' +import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base' export type SaveFunction = (spans: ReadableSpan[]) => Promise diff --git a/packages/mcp-trace/trace-core/processors/CacheSpanProcessor.ts b/packages/mcp-trace/trace-core/processors/CacheSpanProcessor.ts index b20a61de06..3d3e1a73a3 100644 --- a/packages/mcp-trace/trace-core/processors/CacheSpanProcessor.ts +++ b/packages/mcp-trace/trace-core/processors/CacheSpanProcessor.ts @@ -1,7 +1,9 @@ -import { Context, trace } from '@opentelemetry/api' -import { BatchSpanProcessor, BufferConfig, ReadableSpan, Span, SpanExporter } from '@opentelemetry/sdk-trace-base' +import type { Context } from '@opentelemetry/api' +import { trace } from '@opentelemetry/api' +import type { BufferConfig, ReadableSpan, Span, SpanExporter } from '@opentelemetry/sdk-trace-base' +import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base' -import { TraceCache } from '../core/traceCache' +import type { TraceCache } from '../core/traceCache' export class CacheBatchSpanProcessor extends BatchSpanProcessor { private cache: TraceCache diff --git a/packages/mcp-trace/trace-core/processors/EmitterSpanProcessor.ts b/packages/mcp-trace/trace-core/processors/EmitterSpanProcessor.ts index 41015b2082..c09ec352d6 100644 --- a/packages/mcp-trace/trace-core/processors/EmitterSpanProcessor.ts +++ b/packages/mcp-trace/trace-core/processors/EmitterSpanProcessor.ts @@ -1,6 +1,7 @@ -import { Context } from '@opentelemetry/api' -import { BatchSpanProcessor, BufferConfig, ReadableSpan, Span, SpanExporter } from '@opentelemetry/sdk-trace-base' -import { EventEmitter } from 'stream' +import type { Context } from '@opentelemetry/api' +import type { BufferConfig, ReadableSpan, Span, SpanExporter } from '@opentelemetry/sdk-trace-base' +import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base' +import type { EventEmitter } from 'stream' import { convertSpanToSpanEntity } from '../core/spanConvert' diff --git a/packages/mcp-trace/trace-core/processors/FuncSpanProcessor.ts b/packages/mcp-trace/trace-core/processors/FuncSpanProcessor.ts index 8a7281d955..ba88e322d2 100644 --- a/packages/mcp-trace/trace-core/processors/FuncSpanProcessor.ts +++ b/packages/mcp-trace/trace-core/processors/FuncSpanProcessor.ts @@ -1,5 +1,7 @@ -import { Context, trace } from '@opentelemetry/api' -import { BatchSpanProcessor, BufferConfig, ReadableSpan, Span, SpanExporter } from '@opentelemetry/sdk-trace-base' +import type { Context } from '@opentelemetry/api' +import { trace } from '@opentelemetry/api' +import type { BufferConfig, ReadableSpan, Span, SpanExporter } from '@opentelemetry/sdk-trace-base' +import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base' export type SpanFunction = (span: ReadableSpan) => void diff --git a/packages/mcp-trace/trace-core/types/config.ts b/packages/mcp-trace/trace-core/types/config.ts index 37f705eb8d..aa86353eae 100644 --- a/packages/mcp-trace/trace-core/types/config.ts +++ b/packages/mcp-trace/trace-core/types/config.ts @@ -1,5 +1,5 @@ -import { Link } from '@opentelemetry/api' -import { TimedEvent } from '@opentelemetry/sdk-trace-base' +import type { Link } from '@opentelemetry/api' +import type { TimedEvent } from '@opentelemetry/sdk-trace-base' export type AttributeValue = | string diff --git a/packages/mcp-trace/trace-node/nodeTracer.ts b/packages/mcp-trace/trace-node/nodeTracer.ts index aee9525010..79fa4c4393 100644 --- a/packages/mcp-trace/trace-node/nodeTracer.ts +++ b/packages/mcp-trace/trace-node/nodeTracer.ts @@ -1,11 +1,14 @@ -import { trace, Tracer } from '@opentelemetry/api' +import type { Tracer } from '@opentelemetry/api' +import { trace } from '@opentelemetry/api' import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks' import { W3CTraceContextPropagator } from '@opentelemetry/core' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http' -import { BatchSpanProcessor, ConsoleSpanExporter, SpanProcessor } from '@opentelemetry/sdk-trace-base' +import type { SpanProcessor } from '@opentelemetry/sdk-trace-base' +import { BatchSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base' import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import { defaultConfig, TraceConfig } from '../trace-core/types/config' +import type { TraceConfig } from '../trace-core/types/config' +import { defaultConfig } from '../trace-core/types/config' export class NodeTracer { private static provider: NodeTracerProvider diff --git a/packages/mcp-trace/trace-web/TopicContextManager.ts b/packages/mcp-trace/trace-web/TopicContextManager.ts index a2688fc02f..2962ae868e 100644 --- a/packages/mcp-trace/trace-web/TopicContextManager.ts +++ b/packages/mcp-trace/trace-web/TopicContextManager.ts @@ -1,4 +1,5 @@ -import { Context, ContextManager, ROOT_CONTEXT } from '@opentelemetry/api' +import type { Context, ContextManager } from '@opentelemetry/api' +import { ROOT_CONTEXT } from '@opentelemetry/api' export class TopicContextManager implements ContextManager { private topicContextStack: Map diff --git a/packages/mcp-trace/trace-web/traceContextPromise.ts b/packages/mcp-trace/trace-web/traceContextPromise.ts index ee99722b71..d529c3ca58 100644 --- a/packages/mcp-trace/trace-web/traceContextPromise.ts +++ b/packages/mcp-trace/trace-web/traceContextPromise.ts @@ -1,4 +1,5 @@ -import { Context, context } from '@opentelemetry/api' +import type { Context } from '@opentelemetry/api' +import { context } from '@opentelemetry/api' const originalPromise = globalThis.Promise diff --git a/packages/mcp-trace/trace-web/webTracer.ts b/packages/mcp-trace/trace-web/webTracer.ts index 0b8af5813a..fdf221f3f1 100644 --- a/packages/mcp-trace/trace-web/webTracer.ts +++ b/packages/mcp-trace/trace-web/webTracer.ts @@ -1,9 +1,11 @@ import { W3CTraceContextPropagator } from '@opentelemetry/core' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http' -import { BatchSpanProcessor, ConsoleSpanExporter, SpanProcessor } from '@opentelemetry/sdk-trace-base' +import type { SpanProcessor } from '@opentelemetry/sdk-trace-base' +import { BatchSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base' import { WebTracerProvider } from '@opentelemetry/sdk-trace-web' -import { defaultConfig, TraceConfig } from '../trace-core/types/config' +import type { TraceConfig } from '../trace-core/types/config' +import { defaultConfig } from '../trace-core/types/config' import { TopicContextManager } from './TopicContextManager' export const contextManager = new TopicContextManager() diff --git a/packages/shared/anthropic/index.ts b/packages/shared/anthropic/index.ts index 777cbd13e8..b9e9cb8846 100644 --- a/packages/shared/anthropic/index.ts +++ b/packages/shared/anthropic/index.ts @@ -9,9 +9,9 @@ */ import Anthropic from '@anthropic-ai/sdk' -import { TextBlockParam } from '@anthropic-ai/sdk/resources' +import type { TextBlockParam } from '@anthropic-ai/sdk/resources' import { loggerService } from '@logger' -import { Provider } from '@types' +import type { Provider } from '@types' import type { ModelMessage } from 'ai' const logger = loggerService.withContext('anthropic-sdk') diff --git a/packages/shared/config/types.ts b/packages/shared/config/types.ts index 8012ed9022..6d76173e26 100644 --- a/packages/shared/config/types.ts +++ b/packages/shared/config/types.ts @@ -1,4 +1,4 @@ -import { ProcessingStatus } from '@types' +import type { ProcessingStatus } from '@types' export type LoaderReturn = { entriesAdded: number diff --git a/src/main/apiServer/config.ts b/src/main/apiServer/config.ts index c962726d24..60b1986be9 100644 --- a/src/main/apiServer/config.ts +++ b/src/main/apiServer/config.ts @@ -1,4 +1,4 @@ -import { ApiServerConfig } from '@types' +import type { ApiServerConfig } from '@types' import { v4 as uuidv4 } from 'uuid' import { loggerService } from '../services/LoggerService' diff --git a/src/main/apiServer/middleware/auth.ts b/src/main/apiServer/middleware/auth.ts index 93548c4a50..bf44e4eb37 100644 --- a/src/main/apiServer/middleware/auth.ts +++ b/src/main/apiServer/middleware/auth.ts @@ -1,5 +1,5 @@ import crypto from 'crypto' -import { NextFunction, Request, Response } from 'express' +import type { NextFunction, Request, Response } from 'express' import { config } from '../config' diff --git a/src/main/apiServer/middleware/error.ts b/src/main/apiServer/middleware/error.ts index 401a8cad84..03c2d5617e 100644 --- a/src/main/apiServer/middleware/error.ts +++ b/src/main/apiServer/middleware/error.ts @@ -1,4 +1,4 @@ -import { NextFunction, Request, Response } from 'express' +import type { NextFunction, Request, Response } from 'express' import { loggerService } from '../../services/LoggerService' diff --git a/src/main/apiServer/middleware/openapi.ts b/src/main/apiServer/middleware/openapi.ts index da3cfe0c4c..c136fecdde 100644 --- a/src/main/apiServer/middleware/openapi.ts +++ b/src/main/apiServer/middleware/openapi.ts @@ -1,4 +1,4 @@ -import { Express } from 'express' +import type { Express } from 'express' import swaggerJSDoc from 'swagger-jsdoc' import swaggerUi from 'swagger-ui-express' diff --git a/src/main/apiServer/routes/agents/handlers/agents.ts b/src/main/apiServer/routes/agents/handlers/agents.ts index d6f31a555d..53e5f9433e 100644 --- a/src/main/apiServer/routes/agents/handlers/agents.ts +++ b/src/main/apiServer/routes/agents/handlers/agents.ts @@ -1,7 +1,8 @@ import { loggerService } from '@logger' import { AgentModelValidationError, agentService, sessionService } from '@main/services/agents' -import { ListAgentsResponse, type ReplaceAgentRequest, type UpdateAgentRequest } from '@types' -import { Request, Response } from 'express' +import type { ListAgentsResponse } from '@types' +import { type ReplaceAgentRequest, type UpdateAgentRequest } from '@types' +import type { Request, Response } from 'express' import type { ValidationRequest } from '../validators/zodValidator' diff --git a/src/main/apiServer/routes/agents/handlers/messages.ts b/src/main/apiServer/routes/agents/handlers/messages.ts index e18fadc0e0..1b547abba8 100644 --- a/src/main/apiServer/routes/agents/handlers/messages.ts +++ b/src/main/apiServer/routes/agents/handlers/messages.ts @@ -2,7 +2,7 @@ import { loggerService } from '@logger' import { MESSAGE_STREAM_TIMEOUT_MS } from '@main/apiServer/config/timeouts' import { createStreamAbortController, STREAM_TIMEOUT_REASON } from '@main/apiServer/utils/createStreamAbortController' import { agentService, sessionMessageService, sessionService } from '@main/services/agents' -import { Request, Response } from 'express' +import type { Request, Response } from 'express' const logger = loggerService.withContext('ApiServerMessagesHandlers') diff --git a/src/main/apiServer/routes/agents/handlers/sessions.ts b/src/main/apiServer/routes/agents/handlers/sessions.ts index 72875dab8a..efd5d82573 100644 --- a/src/main/apiServer/routes/agents/handlers/sessions.ts +++ b/src/main/apiServer/routes/agents/handlers/sessions.ts @@ -1,7 +1,8 @@ import { loggerService } from '@logger' import { AgentModelValidationError, sessionMessageService, sessionService } from '@main/services/agents' -import { ListAgentSessionsResponse, type ReplaceSessionRequest, UpdateSessionResponse } from '@types' -import { Request, Response } from 'express' +import type { ListAgentSessionsResponse, UpdateSessionResponse } from '@types' +import { type ReplaceSessionRequest } from '@types' +import type { Request, Response } from 'express' import type { ValidationRequest } from '../validators/zodValidator' diff --git a/src/main/apiServer/routes/agents/middleware/common.ts b/src/main/apiServer/routes/agents/middleware/common.ts index d45f197e4a..7ca5db8baf 100644 --- a/src/main/apiServer/routes/agents/middleware/common.ts +++ b/src/main/apiServer/routes/agents/middleware/common.ts @@ -1,4 +1,4 @@ -import { Request, Response } from 'express' +import type { Request, Response } from 'express' import { agentService } from '../../../../services/agents' import { loggerService } from '../../../../services/LoggerService' diff --git a/src/main/apiServer/routes/agents/validators/zodValidator.ts b/src/main/apiServer/routes/agents/validators/zodValidator.ts index 1a0e83786a..971c1445ed 100644 --- a/src/main/apiServer/routes/agents/validators/zodValidator.ts +++ b/src/main/apiServer/routes/agents/validators/zodValidator.ts @@ -1,5 +1,6 @@ -import { NextFunction, Request, Response } from 'express' -import { ZodError, ZodType } from 'zod' +import type { NextFunction, Request, Response } from 'express' +import type { ZodType } from 'zod' +import { ZodError } from 'zod' export interface ValidationRequest extends Request { validatedBody?: any diff --git a/src/main/apiServer/routes/chat.ts b/src/main/apiServer/routes/chat.ts index baf29aae08..3dd58b9654 100644 --- a/src/main/apiServer/routes/chat.ts +++ b/src/main/apiServer/routes/chat.ts @@ -1,5 +1,6 @@ -import { ChatCompletionCreateParams } from '@cherrystudio/openai/resources' -import express, { Request, Response } from 'express' +import type { ChatCompletionCreateParams } from '@cherrystudio/openai/resources' +import type { Request, Response } from 'express' +import express from 'express' import { loggerService } from '../../services/LoggerService' import { diff --git a/src/main/apiServer/routes/mcp.ts b/src/main/apiServer/routes/mcp.ts index 6474194712..90626af158 100644 --- a/src/main/apiServer/routes/mcp.ts +++ b/src/main/apiServer/routes/mcp.ts @@ -1,4 +1,5 @@ -import express, { Request, Response } from 'express' +import type { Request, Response } from 'express' +import express from 'express' import { loggerService } from '../../services/LoggerService' import { mcpApiService } from '../services/mcp' diff --git a/src/main/apiServer/routes/messages.ts b/src/main/apiServer/routes/messages.ts index 3b7c338199..02ce0544e8 100644 --- a/src/main/apiServer/routes/messages.ts +++ b/src/main/apiServer/routes/messages.ts @@ -1,7 +1,8 @@ -import { MessageCreateParams } from '@anthropic-ai/sdk/resources' +import type { MessageCreateParams } from '@anthropic-ai/sdk/resources' import { loggerService } from '@logger' -import { Provider } from '@types' -import express, { Request, Response } from 'express' +import type { Provider } from '@types' +import type { Request, Response } from 'express' +import express from 'express' import { messagesService } from '../services/messages' import { getProviderById, validateModelId } from '../utils' diff --git a/src/main/apiServer/routes/models.ts b/src/main/apiServer/routes/models.ts index d926a23523..8481e1ea59 100644 --- a/src/main/apiServer/routes/models.ts +++ b/src/main/apiServer/routes/models.ts @@ -1,5 +1,7 @@ -import { ApiModelsFilterSchema, ApiModelsResponse } from '@types' -import express, { Request, Response } from 'express' +import type { ApiModelsResponse } from '@types' +import { ApiModelsFilterSchema } from '@types' +import type { Request, Response } from 'express' +import express from 'express' import { loggerService } from '../../services/LoggerService' import { modelsService } from '../services/models' diff --git a/src/main/apiServer/services/chat-completion.ts b/src/main/apiServer/services/chat-completion.ts index 63eed3ed8b..a7c6160e81 100644 --- a/src/main/apiServer/services/chat-completion.ts +++ b/src/main/apiServer/services/chat-completion.ts @@ -1,9 +1,10 @@ import OpenAI from '@cherrystudio/openai' -import { ChatCompletionCreateParams, ChatCompletionCreateParamsStreaming } from '@cherrystudio/openai/resources' -import { Provider } from '@types' +import type { ChatCompletionCreateParams, ChatCompletionCreateParamsStreaming } from '@cherrystudio/openai/resources' +import type { Provider } from '@types' import { loggerService } from '../../services/LoggerService' -import { ModelValidationError, validateModelId } from '../utils' +import type { ModelValidationError } from '../utils' +import { validateModelId } from '../utils' const logger = loggerService.withContext('ChatCompletionService') diff --git a/src/main/apiServer/services/mcp.ts b/src/main/apiServer/services/mcp.ts index c03a90f930..d75fadee6c 100644 --- a/src/main/apiServer/services/mcp.ts +++ b/src/main/apiServer/services/mcp.ts @@ -1,16 +1,12 @@ import mcpService from '@main/services/MCPService' import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp' -import { - isJSONRPCRequest, - JSONRPCMessage, - JSONRPCMessageSchema, - MessageExtraInfo -} from '@modelcontextprotocol/sdk/types' -import { MCPServer } from '@types' +import type { JSONRPCMessage, MessageExtraInfo } from '@modelcontextprotocol/sdk/types' +import { isJSONRPCRequest, JSONRPCMessageSchema } from '@modelcontextprotocol/sdk/types' +import type { MCPServer } from '@types' import { randomUUID } from 'crypto' import { EventEmitter } from 'events' -import { Request, Response } from 'express' -import { IncomingMessage, ServerResponse } from 'http' +import type { Request, Response } from 'express' +import type { IncomingMessage, ServerResponse } from 'http' import { loggerService } from '../../services/LoggerService' import { getMcpServerById, getMCPServersFromRedux } from '../utils/mcp' diff --git a/src/main/apiServer/services/messages.ts b/src/main/apiServer/services/messages.ts index edce9a9528..8b46deaa8f 100644 --- a/src/main/apiServer/services/messages.ts +++ b/src/main/apiServer/services/messages.ts @@ -1,10 +1,10 @@ -import Anthropic from '@anthropic-ai/sdk' -import { MessageCreateParams, MessageStreamEvent } from '@anthropic-ai/sdk/resources' +import type Anthropic from '@anthropic-ai/sdk' +import type { MessageCreateParams, MessageStreamEvent } from '@anthropic-ai/sdk/resources' import { loggerService } from '@logger' import anthropicService from '@main/services/AnthropicService' import { buildClaudeCodeSystemMessage, getSdkClient } from '@shared/anthropic' -import { Provider } from '@types' -import { Response } from 'express' +import type { Provider } from '@types' +import type { Response } from 'express' const logger = loggerService.withContext('MessagesService') const EXCLUDED_FORWARD_HEADERS: ReadonlySet = new Set([ diff --git a/src/main/apiServer/services/models.ts b/src/main/apiServer/services/models.ts index 660686ef45..a32d6d37dc 100644 --- a/src/main/apiServer/services/models.ts +++ b/src/main/apiServer/services/models.ts @@ -1,6 +1,6 @@ import { isEmpty } from 'lodash' -import { ApiModel, ApiModelsFilter, ApiModelsResponse } from '../../../renderer/src/types/apiModels' +import type { ApiModel, ApiModelsFilter, ApiModelsResponse } from '../../../renderer/src/types/apiModels' import { loggerService } from '../../services/LoggerService' import { getAvailableProviders, diff --git a/src/main/apiServer/utils/index.ts b/src/main/apiServer/utils/index.ts index 7fb0c3511f..f9f751c559 100644 --- a/src/main/apiServer/utils/index.ts +++ b/src/main/apiServer/utils/index.ts @@ -1,7 +1,7 @@ import { CacheService } from '@main/services/CacheService' import { loggerService } from '@main/services/LoggerService' import { reduxService } from '@main/services/ReduxService' -import { ApiModel, Model, Provider } from '@types' +import type { ApiModel, Model, Provider } from '@types' const logger = loggerService.withContext('ApiServerUtils') diff --git a/src/main/apiServer/utils/mcp.ts b/src/main/apiServer/utils/mcp.ts index 40a9006528..f110df5847 100644 --- a/src/main/apiServer/utils/mcp.ts +++ b/src/main/apiServer/utils/mcp.ts @@ -1,8 +1,9 @@ import { CacheService } from '@main/services/CacheService' import mcpService from '@main/services/MCPService' import { Server } from '@modelcontextprotocol/sdk/server/index.js' -import { CallToolRequestSchema, ListToolsRequestSchema, ListToolsResult } from '@modelcontextprotocol/sdk/types.js' -import { MCPServer } from '@types' +import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js' +import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' +import type { MCPServer } from '@types' import { loggerService } from '../../services/LoggerService' import { reduxService } from '../../services/ReduxService' diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 08fef11955..0e63f11600 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -8,11 +8,12 @@ import { generateSignature } from '@main/integration/cherryai' import anthropicService from '@main/services/AnthropicService' import { getBinaryPath, isBinaryExists, runInstallScript } from '@main/utils/process' import { handleZoomFactor } from '@main/utils/zoom' -import { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' -import { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH, UpgradeChannel } from '@shared/config/constant' +import type { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' +import type { UpgradeChannel } from '@shared/config/constant' +import { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH } from '@shared/config/constant' import { IpcChannel } from '@shared/IpcChannel' import type { PluginError } from '@types' -import { +import type { AgentPersistedMessage, FileMetadata, Notification, @@ -23,7 +24,8 @@ import { ThemeMode } from '@types' import checkDiskSpace from 'check-disk-space' -import { BrowserWindow, dialog, ipcMain, ProxyConfig, session, shell, systemPreferences, webContents } from 'electron' +import type { ProxyConfig } from 'electron' +import { BrowserWindow, dialog, ipcMain, session, shell, systemPreferences, webContents } from 'electron' import fontList from 'font-list' import { agentMessageRepository } from './services/agents/database' diff --git a/src/main/knowledge/embedjs/embeddings/Embeddings.ts b/src/main/knowledge/embedjs/embeddings/Embeddings.ts index 17bb8ff470..3f5b6ced15 100644 --- a/src/main/knowledge/embedjs/embeddings/Embeddings.ts +++ b/src/main/knowledge/embedjs/embeddings/Embeddings.ts @@ -1,6 +1,6 @@ import type { BaseEmbeddings } from '@cherrystudio/embedjs-interfaces' import { TraceMethod } from '@mcp-trace/trace-core' -import { ApiClient } from '@types' +import type { ApiClient } from '@types' import EmbeddingsFactory from './EmbeddingsFactory' diff --git a/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts b/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts index f34555bed0..8a780d5618 100644 --- a/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts +++ b/src/main/knowledge/embedjs/embeddings/EmbeddingsFactory.ts @@ -1,7 +1,7 @@ import type { BaseEmbeddings } from '@cherrystudio/embedjs-interfaces' import { OllamaEmbeddings } from '@cherrystudio/embedjs-ollama' import { OpenAiEmbeddings } from '@cherrystudio/embedjs-openai' -import { ApiClient } from '@types' +import type { ApiClient } from '@types' import { net } from 'electron' import { VoyageEmbeddings } from './VoyageEmbeddings' diff --git a/src/main/knowledge/embedjs/loader/index.ts b/src/main/knowledge/embedjs/loader/index.ts index 4b38418194..9f1efd268c 100644 --- a/src/main/knowledge/embedjs/loader/index.ts +++ b/src/main/knowledge/embedjs/loader/index.ts @@ -1,10 +1,11 @@ -import { JsonLoader, LocalPathLoader, RAGApplication, TextLoader } from '@cherrystudio/embedjs' +import type { RAGApplication } from '@cherrystudio/embedjs' +import { JsonLoader, LocalPathLoader, TextLoader } from '@cherrystudio/embedjs' import type { AddLoaderReturn } from '@cherrystudio/embedjs-interfaces' import { WebLoader } from '@cherrystudio/embedjs-loader-web' import { loggerService } from '@logger' import { readTextFileWithAutoEncoding } from '@main/utils/file' -import { LoaderReturn } from '@shared/config/types' -import { FileMetadata, KnowledgeBaseParams } from '@types' +import type { LoaderReturn } from '@shared/config/types' +import type { FileMetadata, KnowledgeBaseParams } from '@types' import { DraftsExportLoader } from './draftsExportLoader' import { EpubLoader } from './epubLoader' diff --git a/src/main/knowledge/embedjs/loader/odLoader.ts b/src/main/knowledge/embedjs/loader/odLoader.ts index 03825bf4db..7e325966af 100644 --- a/src/main/knowledge/embedjs/loader/odLoader.ts +++ b/src/main/knowledge/embedjs/loader/odLoader.ts @@ -3,7 +3,8 @@ import { cleanString } from '@cherrystudio/embedjs-utils' import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters' import { loggerService } from '@logger' import md5 from 'md5' -import { OfficeParserConfig, parseOfficeAsync } from 'officeparser' +import type { OfficeParserConfig } from 'officeparser' +import { parseOfficeAsync } from 'officeparser' const logger = loggerService.withContext('OdLoader') diff --git a/src/main/knowledge/preprocess/BasePreprocessProvider.ts b/src/main/knowledge/preprocess/BasePreprocessProvider.ts index daf9901498..ed4a5fb8d4 100644 --- a/src/main/knowledge/preprocess/BasePreprocessProvider.ts +++ b/src/main/knowledge/preprocess/BasePreprocessProvider.ts @@ -4,7 +4,7 @@ import path from 'node:path' import { loggerService } from '@logger' import { windowService } from '@main/services/WindowService' import { getFileExt, getTempDir } from '@main/utils/file' -import { FileMetadata, PreprocessProvider } from '@types' +import type { FileMetadata, PreprocessProvider } from '@types' import { PDFDocument } from 'pdf-lib' const logger = loggerService.withContext('BasePreprocessProvider') diff --git a/src/main/knowledge/preprocess/DefaultPreprocessProvider.ts b/src/main/knowledge/preprocess/DefaultPreprocessProvider.ts index 3899a3d25a..64169d935e 100644 --- a/src/main/knowledge/preprocess/DefaultPreprocessProvider.ts +++ b/src/main/knowledge/preprocess/DefaultPreprocessProvider.ts @@ -1,4 +1,4 @@ -import { FileMetadata, PreprocessProvider } from '@types' +import type { FileMetadata, PreprocessProvider } from '@types' import BasePreprocessProvider from './BasePreprocessProvider' diff --git a/src/main/knowledge/preprocess/Doc2xPreprocessProvider.ts b/src/main/knowledge/preprocess/Doc2xPreprocessProvider.ts index 6708e8f938..4e2fb09609 100644 --- a/src/main/knowledge/preprocess/Doc2xPreprocessProvider.ts +++ b/src/main/knowledge/preprocess/Doc2xPreprocessProvider.ts @@ -3,7 +3,7 @@ import path from 'node:path' import { loggerService } from '@logger' import { fileStorage } from '@main/services/FileStorage' -import { FileMetadata, PreprocessProvider } from '@types' +import type { FileMetadata, PreprocessProvider } from '@types' import AdmZip from 'adm-zip' import { net } from 'electron' diff --git a/src/main/knowledge/preprocess/MineruPreprocessProvider.ts b/src/main/knowledge/preprocess/MineruPreprocessProvider.ts index 1976f64c05..0e93af674a 100644 --- a/src/main/knowledge/preprocess/MineruPreprocessProvider.ts +++ b/src/main/knowledge/preprocess/MineruPreprocessProvider.ts @@ -3,7 +3,7 @@ import path from 'node:path' import { loggerService } from '@logger' import { fileStorage } from '@main/services/FileStorage' -import { FileMetadata, PreprocessProvider } from '@types' +import type { FileMetadata, PreprocessProvider } from '@types' import AdmZip from 'adm-zip' import { net } from 'electron' diff --git a/src/main/knowledge/preprocess/MistralPreprocessProvider.ts b/src/main/knowledge/preprocess/MistralPreprocessProvider.ts index d5ad3d4e14..a8f7b350ee 100644 --- a/src/main/knowledge/preprocess/MistralPreprocessProvider.ts +++ b/src/main/knowledge/preprocess/MistralPreprocessProvider.ts @@ -4,11 +4,12 @@ import { loggerService } from '@logger' import { fileStorage } from '@main/services/FileStorage' import { MistralClientManager } from '@main/services/MistralClientManager' import { MistralService } from '@main/services/remotefile/MistralService' -import { Mistral } from '@mistralai/mistralai' -import { DocumentURLChunk } from '@mistralai/mistralai/models/components/documenturlchunk' -import { ImageURLChunk } from '@mistralai/mistralai/models/components/imageurlchunk' -import { OCRResponse } from '@mistralai/mistralai/models/components/ocrresponse' -import { FileMetadata, FileTypes, PreprocessProvider, Provider } from '@types' +import type { Mistral } from '@mistralai/mistralai' +import type { DocumentURLChunk } from '@mistralai/mistralai/models/components/documenturlchunk' +import type { ImageURLChunk } from '@mistralai/mistralai/models/components/imageurlchunk' +import type { OCRResponse } from '@mistralai/mistralai/models/components/ocrresponse' +import type { FileMetadata, PreprocessProvider, Provider } from '@types' +import { FileTypes } from '@types' import path from 'path' import BasePreprocessProvider from './BasePreprocessProvider' diff --git a/src/main/knowledge/preprocess/OpenMineruPreprocessProvider.ts b/src/main/knowledge/preprocess/OpenMineruPreprocessProvider.ts index 4225b87003..9a3bca65a1 100644 --- a/src/main/knowledge/preprocess/OpenMineruPreprocessProvider.ts +++ b/src/main/knowledge/preprocess/OpenMineruPreprocessProvider.ts @@ -3,7 +3,7 @@ import path from 'node:path' import { loggerService } from '@logger' import { fileStorage } from '@main/services/FileStorage' -import { FileMetadata, PreprocessProvider } from '@types' +import type { FileMetadata, PreprocessProvider } from '@types' import AdmZip from 'adm-zip' import { net } from 'electron' import FormData from 'form-data' diff --git a/src/main/knowledge/preprocess/PreprocessProvider.ts b/src/main/knowledge/preprocess/PreprocessProvider.ts index 44a34f64ae..f0b3d8f12e 100644 --- a/src/main/knowledge/preprocess/PreprocessProvider.ts +++ b/src/main/knowledge/preprocess/PreprocessProvider.ts @@ -1,6 +1,6 @@ -import { FileMetadata, PreprocessProvider as Provider } from '@types' +import type { FileMetadata, PreprocessProvider as Provider } from '@types' -import BasePreprocessProvider from './BasePreprocessProvider' +import type BasePreprocessProvider from './BasePreprocessProvider' import PreprocessProviderFactory from './PreprocessProviderFactory' export default class PreprocessProvider { diff --git a/src/main/knowledge/preprocess/PreprocessProviderFactory.ts b/src/main/knowledge/preprocess/PreprocessProviderFactory.ts index e824601749..94d4e70d5a 100644 --- a/src/main/knowledge/preprocess/PreprocessProviderFactory.ts +++ b/src/main/knowledge/preprocess/PreprocessProviderFactory.ts @@ -1,6 +1,6 @@ -import { PreprocessProvider } from '@types' +import type { PreprocessProvider } from '@types' -import BasePreprocessProvider from './BasePreprocessProvider' +import type BasePreprocessProvider from './BasePreprocessProvider' import DefaultPreprocessProvider from './DefaultPreprocessProvider' import Doc2xPreprocessProvider from './Doc2xPreprocessProvider' import MineruPreprocessProvider from './MineruPreprocessProvider' diff --git a/src/main/knowledge/reranker/BaseReranker.ts b/src/main/knowledge/reranker/BaseReranker.ts index 1e321e2d86..ddf5a089c4 100644 --- a/src/main/knowledge/reranker/BaseReranker.ts +++ b/src/main/knowledge/reranker/BaseReranker.ts @@ -1,7 +1,7 @@ import { DEFAULT_DOCUMENT_COUNT, DEFAULT_RELEVANT_SCORE } from '@main/utils/knowledge' -import { KnowledgeBaseParams, KnowledgeSearchResult } from '@types' +import type { KnowledgeBaseParams, KnowledgeSearchResult } from '@types' -import { MultiModalDocument, RerankStrategy } from './strategies/RerankStrategy' +import type { MultiModalDocument, RerankStrategy } from './strategies/RerankStrategy' import { StrategyFactory } from './strategies/StrategyFactory' export default abstract class BaseReranker { diff --git a/src/main/knowledge/reranker/GeneralReranker.ts b/src/main/knowledge/reranker/GeneralReranker.ts index e3ac5e8c21..96beffbb4c 100644 --- a/src/main/knowledge/reranker/GeneralReranker.ts +++ b/src/main/knowledge/reranker/GeneralReranker.ts @@ -1,4 +1,4 @@ -import { KnowledgeBaseParams, KnowledgeSearchResult } from '@types' +import type { KnowledgeBaseParams, KnowledgeSearchResult } from '@types' import { net } from 'electron' import BaseReranker from './BaseReranker' diff --git a/src/main/knowledge/reranker/Reranker.ts b/src/main/knowledge/reranker/Reranker.ts index 59de4b0470..26cb61f6b9 100644 --- a/src/main/knowledge/reranker/Reranker.ts +++ b/src/main/knowledge/reranker/Reranker.ts @@ -1,4 +1,4 @@ -import { KnowledgeBaseParams, KnowledgeSearchResult } from '@types' +import type { KnowledgeBaseParams, KnowledgeSearchResult } from '@types' import GeneralReranker from './GeneralReranker' diff --git a/src/main/knowledge/reranker/strategies/BailianStrategy.ts b/src/main/knowledge/reranker/strategies/BailianStrategy.ts index e5932b9f40..8953bfe859 100644 --- a/src/main/knowledge/reranker/strategies/BailianStrategy.ts +++ b/src/main/knowledge/reranker/strategies/BailianStrategy.ts @@ -1,4 +1,4 @@ -import { MultiModalDocument, RerankStrategy } from './RerankStrategy' +import type { MultiModalDocument, RerankStrategy } from './RerankStrategy' export class BailianStrategy implements RerankStrategy { buildUrl(): string { return 'https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank' diff --git a/src/main/knowledge/reranker/strategies/DefaultStrategy.ts b/src/main/knowledge/reranker/strategies/DefaultStrategy.ts index 59ee3fb47b..9bd8e69f73 100644 --- a/src/main/knowledge/reranker/strategies/DefaultStrategy.ts +++ b/src/main/knowledge/reranker/strategies/DefaultStrategy.ts @@ -1,4 +1,4 @@ -import { MultiModalDocument, RerankStrategy } from './RerankStrategy' +import type { MultiModalDocument, RerankStrategy } from './RerankStrategy' export class DefaultStrategy implements RerankStrategy { buildUrl(baseURL?: string): string { if (baseURL && baseURL.endsWith('/')) { diff --git a/src/main/knowledge/reranker/strategies/JinaStrategy.ts b/src/main/knowledge/reranker/strategies/JinaStrategy.ts index 200190f544..b348f2f9bd 100644 --- a/src/main/knowledge/reranker/strategies/JinaStrategy.ts +++ b/src/main/knowledge/reranker/strategies/JinaStrategy.ts @@ -1,4 +1,4 @@ -import { MultiModalDocument, RerankStrategy } from './RerankStrategy' +import type { MultiModalDocument, RerankStrategy } from './RerankStrategy' export class JinaStrategy implements RerankStrategy { buildUrl(baseURL?: string): string { if (baseURL && baseURL.endsWith('/')) { diff --git a/src/main/knowledge/reranker/strategies/StrategyFactory.ts b/src/main/knowledge/reranker/strategies/StrategyFactory.ts index 9e04547e31..e0e782f722 100644 --- a/src/main/knowledge/reranker/strategies/StrategyFactory.ts +++ b/src/main/knowledge/reranker/strategies/StrategyFactory.ts @@ -1,7 +1,7 @@ import { BailianStrategy } from './BailianStrategy' import { DefaultStrategy } from './DefaultStrategy' import { JinaStrategy } from './JinaStrategy' -import { RerankStrategy } from './RerankStrategy' +import type { RerankStrategy } from './RerankStrategy' import { TEIStrategy } from './TeiStrategy' import { isTEIProvider, RERANKER_PROVIDERS } from './types' import { VoyageAIStrategy } from './VoyageStrategy' diff --git a/src/main/knowledge/reranker/strategies/TeiStrategy.ts b/src/main/knowledge/reranker/strategies/TeiStrategy.ts index 58f24661ba..df92f1ea5b 100644 --- a/src/main/knowledge/reranker/strategies/TeiStrategy.ts +++ b/src/main/knowledge/reranker/strategies/TeiStrategy.ts @@ -1,4 +1,4 @@ -import { MultiModalDocument, RerankStrategy } from './RerankStrategy' +import type { MultiModalDocument, RerankStrategy } from './RerankStrategy' export class TEIStrategy implements RerankStrategy { buildUrl(baseURL?: string): string { if (baseURL && baseURL.endsWith('/')) { diff --git a/src/main/knowledge/reranker/strategies/VoyageStrategy.ts b/src/main/knowledge/reranker/strategies/VoyageStrategy.ts index e81319f024..2bd13f85e3 100644 --- a/src/main/knowledge/reranker/strategies/VoyageStrategy.ts +++ b/src/main/knowledge/reranker/strategies/VoyageStrategy.ts @@ -1,4 +1,4 @@ -import { MultiModalDocument, RerankStrategy } from './RerankStrategy' +import type { MultiModalDocument, RerankStrategy } from './RerankStrategy' export class VoyageAIStrategy implements RerankStrategy { buildUrl(baseURL?: string): string { if (baseURL && baseURL.endsWith('/')) { diff --git a/src/main/mcpServers/brave-search.ts b/src/main/mcpServers/brave-search.ts index d11a4f2580..7ba6bb65fa 100644 --- a/src/main/mcpServers/brave-search.ts +++ b/src/main/mcpServers/brave-search.ts @@ -2,7 +2,8 @@ // port https://github.com/modelcontextprotocol/servers/blob/main/src/brave-search/index.ts import { Server } from '@modelcontextprotocol/sdk/server/index.js' -import { CallToolRequestSchema, ListToolsRequestSchema, Tool } from '@modelcontextprotocol/sdk/types.js' +import type { Tool } from '@modelcontextprotocol/sdk/types.js' +import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' import { net } from 'electron' const WEB_SEARCH_TOOL: Tool = { diff --git a/src/main/mcpServers/factory.ts b/src/main/mcpServers/factory.ts index 74266d7d35..2323701e49 100644 --- a/src/main/mcpServers/factory.ts +++ b/src/main/mcpServers/factory.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import { Server } from '@modelcontextprotocol/sdk/server/index.js' -import { BuiltinMCPServerName, BuiltinMCPServerNames } from '@types' +import type { Server } from '@modelcontextprotocol/sdk/server/index.js' +import type { BuiltinMCPServerName } from '@types' +import { BuiltinMCPServerNames } from '@types' import BraveSearchServer from './brave-search' import DiDiMcpServer from './didi-mcp' diff --git a/src/main/mcpServers/sequentialthinking.ts b/src/main/mcpServers/sequentialthinking.ts index 90c1c329d5..485e0279e7 100644 --- a/src/main/mcpServers/sequentialthinking.ts +++ b/src/main/mcpServers/sequentialthinking.ts @@ -3,7 +3,8 @@ import { loggerService } from '@logger' import { Server } from '@modelcontextprotocol/sdk/server/index.js' -import { CallToolRequestSchema, ListToolsRequestSchema, Tool } from '@modelcontextprotocol/sdk/types.js' +import type { Tool } from '@modelcontextprotocol/sdk/types.js' +import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' // Fixed chalk import for ESM import chalk from 'chalk' diff --git a/src/main/services/ApiServerService.ts b/src/main/services/ApiServerService.ts index 76a5eca617..40452b6d19 100644 --- a/src/main/services/ApiServerService.ts +++ b/src/main/services/ApiServerService.ts @@ -1,5 +1,5 @@ import { IpcChannel } from '@shared/IpcChannel' -import { +import type { ApiServerConfig, GetApiServerStatusResult, RestartApiServerStatusResult, diff --git a/src/main/services/AppMenuService.ts b/src/main/services/AppMenuService.ts index 7492516507..abb494f707 100644 --- a/src/main/services/AppMenuService.ts +++ b/src/main/services/AppMenuService.ts @@ -2,7 +2,8 @@ import { isMac } from '@main/constant' import { windowService } from '@main/services/WindowService' import { locales } from '@main/utils/locales' import { IpcChannel } from '@shared/IpcChannel' -import { app, Menu, MenuItemConstructorOptions, shell } from 'electron' +import type { MenuItemConstructorOptions } from 'electron' +import { app, Menu, shell } from 'electron' import { configManager } from './ConfigManager' export class AppMenuService { diff --git a/src/main/services/AppUpdater.ts b/src/main/services/AppUpdater.ts index ec0f1b97e0..168084bd32 100644 --- a/src/main/services/AppUpdater.ts +++ b/src/main/services/AppUpdater.ts @@ -4,9 +4,11 @@ import { getIpCountry } from '@main/utils/ipService' import { generateUserAgent } from '@main/utils/systemInfo' import { FeedUrl, UpgradeChannel } from '@shared/config/constant' import { IpcChannel } from '@shared/IpcChannel' -import { CancellationToken, UpdateInfo } from 'builder-util-runtime' +import type { UpdateInfo } from 'builder-util-runtime' +import { CancellationToken } from 'builder-util-runtime' import { app, net } from 'electron' -import { AppUpdater as _AppUpdater, autoUpdater, Logger, NsisUpdater, UpdateCheckResult } from 'electron-updater' +import type { AppUpdater as _AppUpdater, Logger, NsisUpdater, UpdateCheckResult } from 'electron-updater' +import { autoUpdater } from 'electron-updater' import path from 'path' import semver from 'semver' diff --git a/src/main/services/BackupManager.ts b/src/main/services/BackupManager.ts index c6d3ee1841..f331254fdf 100644 --- a/src/main/services/BackupManager.ts +++ b/src/main/services/BackupManager.ts @@ -1,14 +1,14 @@ import { loggerService } from '@logger' import { IpcChannel } from '@shared/IpcChannel' -import { WebDavConfig } from '@types' -import { S3Config } from '@types' +import type { WebDavConfig } from '@types' +import type { S3Config } from '@types' import archiver from 'archiver' import { exec } from 'child_process' import { app } from 'electron' import * as fs from 'fs-extra' import StreamZip from 'node-stream-zip' import * as path from 'path' -import { CreateDirectoryOptions, FileStat } from 'webdav' +import type { CreateDirectoryOptions, FileStat } from 'webdav' import { getDataPath } from '../utils' import S3Storage from './S3Storage' diff --git a/src/main/services/CodeToolsService.ts b/src/main/services/CodeToolsService.ts index d6eea8a9e6..3a93a40d79 100644 --- a/src/main/services/CodeToolsService.ts +++ b/src/main/services/CodeToolsService.ts @@ -7,13 +7,12 @@ import { isMac, isWin } from '@main/constant' import { removeEnvProxy } from '@main/utils' import { isUserInChina } from '@main/utils/ipService' import { getBinaryName } from '@main/utils/process' +import type { TerminalConfig, TerminalConfigWithCommand } from '@shared/config/constant' import { codeTools, MACOS_TERMINALS, MACOS_TERMINALS_WITH_COMMANDS, terminalApps, - TerminalConfig, - TerminalConfigWithCommand, WINDOWS_TERMINALS, WINDOWS_TERMINALS_WITH_COMMANDS } from '@shared/config/constant' diff --git a/src/main/services/ConfigManager.ts b/src/main/services/ConfigManager.ts index 3cab0bf91d..61e285ac1b 100644 --- a/src/main/services/ConfigManager.ts +++ b/src/main/services/ConfigManager.ts @@ -1,5 +1,7 @@ -import { defaultLanguage, UpgradeChannel, ZOOM_SHORTCUTS } from '@shared/config/constant' -import { LanguageVarious, Shortcut, ThemeMode } from '@types' +import type { UpgradeChannel } from '@shared/config/constant' +import { defaultLanguage, ZOOM_SHORTCUTS } from '@shared/config/constant' +import type { LanguageVarious, Shortcut } from '@types' +import { ThemeMode } from '@types' import { app } from 'electron' import Store from 'electron-store' import { v4 as uuidv4 } from 'uuid' diff --git a/src/main/services/ContextMenu.ts b/src/main/services/ContextMenu.ts index 411d6e075d..e735a2501f 100644 --- a/src/main/services/ContextMenu.ts +++ b/src/main/services/ContextMenu.ts @@ -1,4 +1,5 @@ -import { Menu, MenuItemConstructorOptions } from 'electron' +import type { MenuItemConstructorOptions } from 'electron' +import { Menu } from 'electron' import { locales } from '../utils/locales' import { configManager } from './ConfigManager' diff --git a/src/main/services/FileStorage.ts b/src/main/services/FileStorage.ts index 2244b97cb0..00dda778be 100644 --- a/src/main/services/FileStorage.ts +++ b/src/main/services/FileStorage.ts @@ -10,19 +10,13 @@ import { scanDir } from '@main/utils/file' import { documentExts, imageExts, KB, MB } from '@shared/config/constant' -import { FileMetadata, NotesTreeNode } from '@types' +import type { FileMetadata, NotesTreeNode } from '@types' import chardet from 'chardet' -import chokidar, { FSWatcher } from 'chokidar' +import type { FSWatcher } from 'chokidar' +import chokidar from 'chokidar' import * as crypto from 'crypto' -import { - dialog, - net, - OpenDialogOptions, - OpenDialogReturnValue, - SaveDialogOptions, - SaveDialogReturnValue, - shell -} from 'electron' +import type { OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from 'electron' +import { dialog, net, shell } from 'electron' import * as fs from 'fs' import { writeFileSync } from 'fs' import { readFile } from 'fs/promises' diff --git a/src/main/services/KnowledgeService.ts b/src/main/services/KnowledgeService.ts index 4e8707b2b7..f139b3e2c1 100644 --- a/src/main/services/KnowledgeService.ts +++ b/src/main/services/KnowledgeService.ts @@ -16,7 +16,8 @@ import * as fs from 'node:fs' import path from 'node:path' -import { RAGApplication, RAGApplicationBuilder } from '@cherrystudio/embedjs' +import type { RAGApplication } from '@cherrystudio/embedjs' +import { RAGApplicationBuilder } from '@cherrystudio/embedjs' import { LibSqlDb } from '@cherrystudio/embedjs-libsql' import { SitemapLoader } from '@cherrystudio/embedjs-loader-sitemap' import { WebLoader } from '@cherrystudio/embedjs-loader-web' @@ -34,7 +35,7 @@ import { TraceMethod } from '@mcp-trace/trace-core' import { MB } from '@shared/config/constant' import type { LoaderReturn } from '@shared/config/types' import { IpcChannel } from '@shared/IpcChannel' -import { FileMetadata, KnowledgeBaseParams, KnowledgeItem, KnowledgeSearchResult } from '@types' +import type { FileMetadata, KnowledgeBaseParams, KnowledgeItem, KnowledgeSearchResult } from '@types' import { v4 as uuidv4 } from 'uuid' const logger = loggerService.withContext('MainKnowledgeService') diff --git a/src/main/services/MCPService.ts b/src/main/services/MCPService.ts index f1bfbaa841..ba3340780b 100644 --- a/src/main/services/MCPService.ts +++ b/src/main/services/MCPService.ts @@ -10,7 +10,8 @@ import { getBinaryName, getBinaryPath } from '@main/utils/process' import getLoginShellEnvironment from '@main/utils/shell-env' import { TraceMethod, withSpanFunc } from '@mcp-trace/trace-core' import { Client } from '@modelcontextprotocol/sdk/client/index.js' -import { SSEClientTransport, SSEClientTransportOptions } from '@modelcontextprotocol/sdk/client/sse.js' +import type { SSEClientTransportOptions } from '@modelcontextprotocol/sdk/client/sse.js' +import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js' import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js' import { StreamableHTTPClientTransport, @@ -29,7 +30,7 @@ import { ToolListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js' import { nanoid } from '@reduxjs/toolkit' -import { MCPProgressEvent } from '@shared/config/types' +import type { MCPProgressEvent } from '@shared/config/types' import { IpcChannel } from '@shared/IpcChannel' import { defaultAppHeaders } from '@shared/utils' import { diff --git a/src/main/services/MistralClientManager.ts b/src/main/services/MistralClientManager.ts index c2efe35d1d..8f5a90f76e 100644 --- a/src/main/services/MistralClientManager.ts +++ b/src/main/services/MistralClientManager.ts @@ -1,5 +1,5 @@ import { Mistral } from '@mistralai/mistralai' -import { Provider } from '@types' +import type { Provider } from '@types' export class MistralClientManager { private static instance: MistralClientManager diff --git a/src/main/services/NodeTraceService.ts b/src/main/services/NodeTraceService.ts index d2e4db20c9..70fd92a28b 100644 --- a/src/main/services/NodeTraceService.ts +++ b/src/main/services/NodeTraceService.ts @@ -2,7 +2,8 @@ import { loggerService } from '@logger' import { isDev } from '@main/constant' import { CacheBatchSpanProcessor, FunctionSpanExporter } from '@mcp-trace/trace-core' import { NodeTracer as MCPNodeTracer } from '@mcp-trace/trace-node/nodeTracer' -import { context, SpanContext, trace } from '@opentelemetry/api' +import type { SpanContext } from '@opentelemetry/api' +import { context, trace } from '@opentelemetry/api' import { BrowserWindow, ipcMain } from 'electron' import * as path from 'path' diff --git a/src/main/services/NotificationService.ts b/src/main/services/NotificationService.ts index fa9261aa7e..5a599b409d 100644 --- a/src/main/services/NotificationService.ts +++ b/src/main/services/NotificationService.ts @@ -1,4 +1,4 @@ -import { Notification } from '@types' +import type { Notification } from '@types' import { Notification as ElectronNotification } from 'electron' import { windowService } from './WindowService' diff --git a/src/main/services/ProxyManager.ts b/src/main/services/ProxyManager.ts index 6fcf20da1c..a4a2211a20 100644 --- a/src/main/services/ProxyManager.ts +++ b/src/main/services/ProxyManager.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' import axios from 'axios' -import { app, ProxyConfig, session } from 'electron' +import type { ProxyConfig } from 'electron' +import { app, session } from 'electron' import { socksDispatcher } from 'fetch-socks' import http from 'http' import https from 'https' diff --git a/src/main/services/PythonService.ts b/src/main/services/PythonService.ts index 13b4546e56..b4b2596831 100644 --- a/src/main/services/PythonService.ts +++ b/src/main/services/PythonService.ts @@ -1,6 +1,7 @@ import { randomUUID } from 'node:crypto' -import { BrowserWindow, ipcMain } from 'electron' +import type { BrowserWindow } from 'electron' +import { ipcMain } from 'electron' interface PythonExecutionRequest { id: string diff --git a/src/main/services/ShortcutService.ts b/src/main/services/ShortcutService.ts index 97216e6a65..583dbbd95c 100644 --- a/src/main/services/ShortcutService.ts +++ b/src/main/services/ShortcutService.ts @@ -1,7 +1,8 @@ import { loggerService } from '@logger' import { handleZoomFactor } from '@main/utils/zoom' -import { Shortcut } from '@types' -import { BrowserWindow, globalShortcut } from 'electron' +import type { Shortcut } from '@types' +import type { BrowserWindow } from 'electron' +import { globalShortcut } from 'electron' import { configManager } from './ConfigManager' import selectionService from './SelectionService' diff --git a/src/main/services/SpanCacheService.ts b/src/main/services/SpanCacheService.ts index 98ff36d298..62707388a4 100644 --- a/src/main/services/SpanCacheService.ts +++ b/src/main/services/SpanCacheService.ts @@ -1,7 +1,8 @@ import { loggerService } from '@logger' -import { Attributes, convertSpanToSpanEntity, SpanEntity, TokenUsage, TraceCache } from '@mcp-trace/trace-core' +import type { Attributes, SpanEntity, TokenUsage, TraceCache } from '@mcp-trace/trace-core' +import { convertSpanToSpanEntity } from '@mcp-trace/trace-core' import { SpanStatusCode } from '@opentelemetry/api' -import { ReadableSpan } from '@opentelemetry/sdk-trace-base' +import type { ReadableSpan } from '@opentelemetry/sdk-trace-base' import fs from 'fs/promises' import * as os from 'os' import * as path from 'path' diff --git a/src/main/services/TrayService.ts b/src/main/services/TrayService.ts index 205d7fdee9..41c64e06ca 100644 --- a/src/main/services/TrayService.ts +++ b/src/main/services/TrayService.ts @@ -1,6 +1,7 @@ import { isLinux, isMac, isWin } from '@main/constant' import { locales } from '@main/utils/locales' -import { app, Menu, MenuItemConstructorOptions, nativeImage, nativeTheme, Tray } from 'electron' +import type { MenuItemConstructorOptions } from 'electron' +import { app, Menu, nativeImage, nativeTheme, Tray } from 'electron' import icon from '../../../build/tray_icon.png?asset' import iconDark from '../../../build/tray_icon_dark.png?asset' diff --git a/src/main/services/WebDav.ts b/src/main/services/WebDav.ts index 11a2d7ebfb..150227f98c 100644 --- a/src/main/services/WebDav.ts +++ b/src/main/services/WebDav.ts @@ -1,16 +1,16 @@ import { loggerService } from '@logger' -import { WebDavConfig } from '@types' +import type { WebDavConfig } from '@types' import https from 'https' import path from 'path' -import Stream from 'stream' -import { +import type Stream from 'stream' +import type { BufferLike, - createClient, CreateDirectoryOptions, GetFileContentsOptions, PutFileContentsOptions, WebDAVClient } from 'webdav' +import { createClient } from 'webdav' const logger = loggerService.withContext('WebDav') diff --git a/src/main/services/WebSocketService.ts b/src/main/services/WebSocketService.ts index f1cbe8f426..f812517179 100644 --- a/src/main/services/WebSocketService.ts +++ b/src/main/services/WebSocketService.ts @@ -2,7 +2,8 @@ import { loggerService } from '@logger' import * as fs from 'fs' import { networkInterfaces } from 'os' import * as path from 'path' -import { Server, Socket } from 'socket.io' +import type { Socket } from 'socket.io' +import { Server } from 'socket.io' import { windowService } from './WindowService' diff --git a/src/main/services/__tests__/AppUpdater.test.ts b/src/main/services/__tests__/AppUpdater.test.ts index 4b3ac70d45..1be0e2f486 100644 --- a/src/main/services/__tests__/AppUpdater.test.ts +++ b/src/main/services/__tests__/AppUpdater.test.ts @@ -1,4 +1,4 @@ -import { UpdateInfo } from 'builder-util-runtime' +import type { UpdateInfo } from 'builder-util-runtime' import { beforeEach, describe, expect, it, vi } from 'vitest' // Mock dependencies diff --git a/src/main/services/agents/BaseService.ts b/src/main/services/agents/BaseService.ts index 86d4aef52c..d96ce1b8e4 100644 --- a/src/main/services/agents/BaseService.ts +++ b/src/main/services/agents/BaseService.ts @@ -1,8 +1,10 @@ import { type Client, createClient } from '@libsql/client' import { loggerService } from '@logger' import { mcpApiService } from '@main/apiServer/services/mcp' -import { ModelValidationError, validateModelId } from '@main/apiServer/utils' -import { AgentType, MCPTool, objectKeys, SlashCommand, Tool } from '@types' +import type { ModelValidationError } from '@main/apiServer/utils' +import { validateModelId } from '@main/apiServer/utils' +import type { AgentType, MCPTool, SlashCommand, Tool } from '@types' +import { objectKeys } from '@types' import { drizzle, type LibSQLDatabase } from 'drizzle-orm/libsql' import fs from 'fs' import path from 'path' @@ -10,7 +12,8 @@ import path from 'path' import { MigrationService } from './database/MigrationService' import * as schema from './database/schema' import { dbPath } from './drizzle.config' -import { AgentModelField, AgentModelValidationError } from './errors' +import type { AgentModelField } from './errors' +import { AgentModelValidationError } from './errors' import { builtinSlashCommands } from './services/claudecode/commands' import { builtinTools } from './services/claudecode/tools' diff --git a/src/main/services/agents/database/MigrationService.ts b/src/main/services/agents/database/MigrationService.ts index fce09bc68b..834e39dd80 100644 --- a/src/main/services/agents/database/MigrationService.ts +++ b/src/main/services/agents/database/MigrationService.ts @@ -5,7 +5,7 @@ import { type LibSQLDatabase } from 'drizzle-orm/libsql' import fs from 'fs' import path from 'path' -import * as schema from './schema' +import type * as schema from './schema' import { migrations, type NewMigration } from './schema/migrations.schema' const logger = loggerService.withContext('MigrationService') diff --git a/src/main/services/agents/errors.ts b/src/main/services/agents/errors.ts index b0df2341d7..95f1202e86 100644 --- a/src/main/services/agents/errors.ts +++ b/src/main/services/agents/errors.ts @@ -1,5 +1,5 @@ -import { ModelValidationError } from '@main/apiServer/utils' -import { AgentType } from '@types' +import type { ModelValidationError } from '@main/apiServer/utils' +import type { AgentType } from '@types' export type AgentModelField = 'model' | 'plan_model' | 'small_model' diff --git a/src/main/services/agents/interfaces/AgentStreamInterface.ts b/src/main/services/agents/interfaces/AgentStreamInterface.ts index 1b9c6f136d..7b52515256 100644 --- a/src/main/services/agents/interfaces/AgentStreamInterface.ts +++ b/src/main/services/agents/interfaces/AgentStreamInterface.ts @@ -1,9 +1,9 @@ // Agent-agnostic streaming interface // This interface should be implemented by all agent services -import { EventEmitter } from 'node:events' +import type { EventEmitter } from 'node:events' -import { GetAgentSessionResponse } from '@types' +import type { GetAgentSessionResponse } from '@types' import type { TextStreamPart } from 'ai' // Generic agent stream event that works with any agent type diff --git a/src/main/services/agents/services/AgentService.ts b/src/main/services/agents/services/AgentService.ts index c3ae2fb794..07ed89a0f3 100644 --- a/src/main/services/agents/services/AgentService.ts +++ b/src/main/services/agents/services/AgentService.ts @@ -3,8 +3,7 @@ import path from 'node:path' import { loggerService } from '@logger' import { pluginService } from '@main/services/agents/plugins/PluginService' import { getDataPath } from '@main/utils' -import { - AgentBaseSchema, +import type { AgentEntity, CreateAgentRequest, CreateAgentResponse, @@ -13,11 +12,12 @@ import { UpdateAgentRequest, UpdateAgentResponse } from '@types' +import { AgentBaseSchema } from '@types' import { asc, count, desc, eq } from 'drizzle-orm' import { BaseService } from '../BaseService' import { type AgentRow, agentsTable, type InsertAgentRow } from '../database/schema' -import { AgentModelField } from '../errors' +import type { AgentModelField } from '../errors' const logger = loggerService.withContext('AgentService') diff --git a/src/main/services/agents/services/SessionMessageService.ts b/src/main/services/agents/services/SessionMessageService.ts index f7d44e1612..46435fa371 100644 --- a/src/main/services/agents/services/SessionMessageService.ts +++ b/src/main/services/agents/services/SessionMessageService.ts @@ -5,12 +5,12 @@ import type { GetAgentSessionResponse, ListOptions } from '@types' -import { TextStreamPart } from 'ai' +import type { TextStreamPart } from 'ai' import { and, desc, eq, not } from 'drizzle-orm' import { BaseService } from '../BaseService' import { sessionMessagesTable } from '../database/schema' -import { AgentStreamEvent } from '../interfaces/AgentStreamInterface' +import type { AgentStreamEvent } from '../interfaces/AgentStreamInterface' import ClaudeCodeService from './claudecode' const logger = loggerService.withContext('SessionMessageService') diff --git a/src/main/services/agents/services/SessionService.ts b/src/main/services/agents/services/SessionService.ts index 5fcb60600d..62dad3ed51 100644 --- a/src/main/services/agents/services/SessionService.ts +++ b/src/main/services/agents/services/SessionService.ts @@ -1,3 +1,4 @@ +import type { UpdateSessionResponse } from '@types' import { AgentBaseSchema, type AgentEntity, @@ -5,14 +6,13 @@ import { type CreateSessionRequest, type GetAgentSessionResponse, type ListOptions, - type UpdateSessionRequest, - UpdateSessionResponse + type UpdateSessionRequest } from '@types' import { and, count, desc, eq, type SQL } from 'drizzle-orm' import { BaseService } from '../BaseService' import { agentsTable, type InsertSessionRow, type SessionRow, sessionsTable } from '../database/schema' -import { AgentModelField } from '../errors' +import type { AgentModelField } from '../errors' export class SessionService extends BaseService { private static instance: SessionService | null = null diff --git a/src/main/services/agents/services/claudecode/commands.ts b/src/main/services/agents/services/claudecode/commands.ts index ce90e0978a..f30d620572 100644 --- a/src/main/services/agents/services/claudecode/commands.ts +++ b/src/main/services/agents/services/claudecode/commands.ts @@ -1,4 +1,4 @@ -import { SlashCommand } from '@types' +import type { SlashCommand } from '@types' export const builtinSlashCommands: SlashCommand[] = [ { command: '/add-dir', description: 'Add additional working directories' }, diff --git a/src/main/services/agents/services/claudecode/index.ts b/src/main/services/agents/services/claudecode/index.ts index e8e79694dc..c9a8c677cd 100644 --- a/src/main/services/agents/services/claudecode/index.ts +++ b/src/main/services/agents/services/claudecode/index.ts @@ -2,15 +2,16 @@ import { EventEmitter } from 'node:events' import { createRequire } from 'node:module' -import { CanUseTool, McpHttpServerConfig, Options, query, SDKMessage } from '@anthropic-ai/claude-agent-sdk' +import type { CanUseTool, McpHttpServerConfig, Options, SDKMessage } from '@anthropic-ai/claude-agent-sdk' +import { query } from '@anthropic-ai/claude-agent-sdk' import { loggerService } from '@logger' import { config as apiConfigService } from '@main/apiServer/config' import { validateModelId } from '@main/apiServer/utils' import getLoginShellEnvironment from '@main/utils/shell-env' import { app } from 'electron' -import { GetAgentSessionResponse } from '../..' -import { AgentServiceInterface, AgentStream, AgentStreamEvent } from '../../interfaces/AgentStreamInterface' +import type { GetAgentSessionResponse } from '../..' +import type { AgentServiceInterface, AgentStream, AgentStreamEvent } from '../../interfaces/AgentStreamInterface' import { promptForToolApproval } from './tool-permissions' import { ClaudeStreamState, transformSDKMessageToStreamParts } from './transform' diff --git a/src/main/services/agents/services/claudecode/tool-permissions.ts b/src/main/services/agents/services/claudecode/tool-permissions.ts index 1479b13ad1..c95f4c679e 100644 --- a/src/main/services/agents/services/claudecode/tool-permissions.ts +++ b/src/main/services/agents/services/claudecode/tool-permissions.ts @@ -1,6 +1,6 @@ import { randomUUID } from 'node:crypto' -import { PermissionResult, PermissionUpdate } from '@anthropic-ai/claude-agent-sdk' +import type { PermissionResult, PermissionUpdate } from '@anthropic-ai/claude-agent-sdk' import { loggerService } from '@logger' import { IpcChannel } from '@shared/IpcChannel' import { ipcMain } from 'electron' diff --git a/src/main/services/agents/services/claudecode/tools.ts b/src/main/services/agents/services/claudecode/tools.ts index 0785827cd5..483caded84 100644 --- a/src/main/services/agents/services/claudecode/tools.ts +++ b/src/main/services/agents/services/claudecode/tools.ts @@ -1,4 +1,4 @@ -import { Tool } from '@types' +import type { Tool } from '@types' // https://docs.anthropic.com/en/docs/claude-code/settings#tools-available-to-claude export const builtinTools: Tool[] = [ diff --git a/src/main/services/agents/services/claudecode/transform.ts b/src/main/services/agents/services/claudecode/transform.ts index f421e91f22..5905ed6434 100644 --- a/src/main/services/agents/services/claudecode/transform.ts +++ b/src/main/services/agents/services/claudecode/transform.ts @@ -20,7 +20,7 @@ * emitting `text-*` parts and a synthetic `finish-step`. */ -import { SDKMessage } from '@anthropic-ai/claude-agent-sdk' +import type { SDKMessage } from '@anthropic-ai/claude-agent-sdk' import type { BetaStopReason } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs' import { loggerService } from '@logger' import type { FinishReason, LanguageModelUsage, ProviderMetadata, TextStreamPart } from 'ai' diff --git a/src/main/services/mcp/oauth/callback.ts b/src/main/services/mcp/oauth/callback.ts index 22d5b4c6bd..81d435f867 100644 --- a/src/main/services/mcp/oauth/callback.ts +++ b/src/main/services/mcp/oauth/callback.ts @@ -1,9 +1,9 @@ import { loggerService } from '@logger' -import EventEmitter from 'events' +import type EventEmitter from 'events' import http from 'http' import { URL } from 'url' -import { OAuthCallbackServerOptions } from './types' +import type { OAuthCallbackServerOptions } from './types' const logger = loggerService.withContext('MCP:OAuthCallbackServer') diff --git a/src/main/services/mcp/oauth/provider.ts b/src/main/services/mcp/oauth/provider.ts index 811ce8a275..29fdfc0c50 100644 --- a/src/main/services/mcp/oauth/provider.ts +++ b/src/main/services/mcp/oauth/provider.ts @@ -2,13 +2,17 @@ import path from 'node:path' import { loggerService } from '@logger' import { getConfigDir } from '@main/utils/file' -import { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth' -import { OAuthClientInformation, OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth' +import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth' +import type { + OAuthClientInformation, + OAuthClientInformationFull, + OAuthTokens +} from '@modelcontextprotocol/sdk/shared/auth' import open from 'open' import { sanitizeUrl } from 'strict-url-sanitise' import { JsonFileStorage } from './storage' -import { OAuthProviderOptions } from './types' +import type { OAuthProviderOptions } from './types' const logger = loggerService.withContext('MCP:OAuthClientProvider') diff --git a/src/main/services/mcp/oauth/storage.ts b/src/main/services/mcp/oauth/storage.ts index d2dbb589cc..1a872d1e1c 100644 --- a/src/main/services/mcp/oauth/storage.ts +++ b/src/main/services/mcp/oauth/storage.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { +import type { OAuthClientInformation, OAuthClientInformationFull, OAuthTokens @@ -7,7 +7,8 @@ import { import fs from 'fs/promises' import path from 'path' -import { IOAuthStorage, OAuthStorageData, OAuthStorageSchema } from './types' +import type { IOAuthStorage, OAuthStorageData } from './types' +import { OAuthStorageSchema } from './types' const logger = loggerService.withContext('MCP:OAuthStorage') diff --git a/src/main/services/mcp/oauth/types.ts b/src/main/services/mcp/oauth/types.ts index f081fbe70c..1eecf08d4f 100644 --- a/src/main/services/mcp/oauth/types.ts +++ b/src/main/services/mcp/oauth/types.ts @@ -1,9 +1,9 @@ -import { +import type { OAuthClientInformation, OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js' -import EventEmitter from 'events' +import type EventEmitter from 'events' import * as z from 'zod' export interface OAuthStorageData { diff --git a/src/main/services/memory/MemoryService.ts b/src/main/services/memory/MemoryService.ts index 85f182b686..3466e2c3c6 100644 --- a/src/main/services/memory/MemoryService.ts +++ b/src/main/services/memory/MemoryService.ts @@ -1,4 +1,5 @@ -import { Client, createClient } from '@libsql/client' +import type { Client } from '@libsql/client' +import { createClient } from '@libsql/client' import { loggerService } from '@logger' import Embeddings from '@main/knowledge/embedjs/embeddings/Embeddings' import type { diff --git a/src/main/services/ocr/OcrService.ts b/src/main/services/ocr/OcrService.ts index b2943e30ec..80cd547671 100644 --- a/src/main/services/ocr/OcrService.ts +++ b/src/main/services/ocr/OcrService.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' import { isLinux } from '@main/constant' -import { BuiltinOcrProviderIds, OcrHandler, OcrProvider, OcrResult, SupportedOcrFile } from '@types' +import type { OcrHandler, OcrProvider, OcrResult, SupportedOcrFile } from '@types' +import { BuiltinOcrProviderIds } from '@types' import { ovOcrService } from './builtin/OvOcrService' import { ppocrService } from './builtin/PpocrService' diff --git a/src/main/services/ocr/builtin/OcrBaseService.ts b/src/main/services/ocr/builtin/OcrBaseService.ts index 9c36e79c3a..dabe2e50b8 100644 --- a/src/main/services/ocr/builtin/OcrBaseService.ts +++ b/src/main/services/ocr/builtin/OcrBaseService.ts @@ -1,4 +1,4 @@ -import { OcrHandler } from '@types' +import type { OcrHandler } from '@types' export abstract class OcrBaseService { abstract ocr: OcrHandler diff --git a/src/main/services/ocr/builtin/OvOcrService.ts b/src/main/services/ocr/builtin/OvOcrService.ts index 1650ca8832..6e0eee1c37 100644 --- a/src/main/services/ocr/builtin/OvOcrService.ts +++ b/src/main/services/ocr/builtin/OvOcrService.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' import { isWin } from '@main/constant' -import { isImageFileMetadata, OcrOvConfig, OcrResult, SupportedOcrFile } from '@types' +import type { OcrOvConfig, OcrResult, SupportedOcrFile } from '@types' +import { isImageFileMetadata } from '@types' import { exec } from 'child_process' import * as fs from 'fs' import * as os from 'os' diff --git a/src/main/services/ocr/builtin/PpocrService.ts b/src/main/services/ocr/builtin/PpocrService.ts index 4b00be4bed..61c923c542 100644 --- a/src/main/services/ocr/builtin/PpocrService.ts +++ b/src/main/services/ocr/builtin/PpocrService.ts @@ -1,5 +1,6 @@ import { loadOcrImage } from '@main/utils/ocr' -import { ImageFileMetadata, isImageFileMetadata, OcrPpocrConfig, OcrResult, SupportedOcrFile } from '@types' +import type { ImageFileMetadata, OcrPpocrConfig, OcrResult, SupportedOcrFile } from '@types' +import { isImageFileMetadata } from '@types' import { net } from 'electron' import * as z from 'zod' diff --git a/src/main/services/ocr/builtin/SystemOcrService.ts b/src/main/services/ocr/builtin/SystemOcrService.ts index b496df398e..f166718e4a 100644 --- a/src/main/services/ocr/builtin/SystemOcrService.ts +++ b/src/main/services/ocr/builtin/SystemOcrService.ts @@ -1,7 +1,8 @@ import { isLinux, isWin } from '@main/constant' import { loadOcrImage } from '@main/utils/ocr' import { OcrAccuracy, recognize } from '@napi-rs/system-ocr' -import { ImageFileMetadata, isImageFileMetadata, OcrResult, OcrSystemConfig, SupportedOcrFile } from '@types' +import type { ImageFileMetadata, OcrResult, OcrSystemConfig, SupportedOcrFile } from '@types' +import { isImageFileMetadata } from '@types' import { OcrBaseService } from './OcrBaseService' diff --git a/src/main/services/ocr/builtin/TesseractService.ts b/src/main/services/ocr/builtin/TesseractService.ts index 9fd7bbcf01..8d41ce085d 100644 --- a/src/main/services/ocr/builtin/TesseractService.ts +++ b/src/main/services/ocr/builtin/TesseractService.ts @@ -2,12 +2,15 @@ import { loggerService } from '@logger' import { getIpCountry } from '@main/utils/ipService' import { loadOcrImage } from '@main/utils/ocr' import { MB } from '@shared/config/constant' -import { ImageFileMetadata, isImageFileMetadata, OcrResult, OcrTesseractConfig, SupportedOcrFile } from '@types' +import type { ImageFileMetadata, OcrResult, OcrTesseractConfig, SupportedOcrFile } from '@types' +import { isImageFileMetadata } from '@types' import { app } from 'electron' import fs from 'fs' import { isEqual } from 'lodash' import path from 'path' -import Tesseract, { createWorker, LanguageCode } from 'tesseract.js' +import type { LanguageCode } from 'tesseract.js' +import type Tesseract from 'tesseract.js' +import { createWorker } from 'tesseract.js' import { OcrBaseService } from './OcrBaseService' diff --git a/src/main/services/remotefile/BaseFileService.ts b/src/main/services/remotefile/BaseFileService.ts index ff06eb0b44..49067b424d 100644 --- a/src/main/services/remotefile/BaseFileService.ts +++ b/src/main/services/remotefile/BaseFileService.ts @@ -1,4 +1,4 @@ -import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' +import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' export abstract class BaseFileService { protected readonly provider: Provider diff --git a/src/main/services/remotefile/FileServiceManager.ts b/src/main/services/remotefile/FileServiceManager.ts index 14f622757a..962214af51 100644 --- a/src/main/services/remotefile/FileServiceManager.ts +++ b/src/main/services/remotefile/FileServiceManager.ts @@ -1,6 +1,6 @@ -import { Provider } from '@types' +import type { Provider } from '@types' -import { BaseFileService } from './BaseFileService' +import type { BaseFileService } from './BaseFileService' import { GeminiService } from './GeminiService' import { MistralService } from './MistralService' import { OpenaiService } from './OpenAIService' diff --git a/src/main/services/remotefile/GeminiService.ts b/src/main/services/remotefile/GeminiService.ts index ba5a8fae80..16214dff5e 100644 --- a/src/main/services/remotefile/GeminiService.ts +++ b/src/main/services/remotefile/GeminiService.ts @@ -1,7 +1,8 @@ -import { File, Files, FileState, GoogleGenAI } from '@google/genai' +import type { File, Files } from '@google/genai' +import { FileState, GoogleGenAI } from '@google/genai' import { loggerService } from '@logger' import { fileStorage } from '@main/services/FileStorage' -import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' +import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' import { v4 as uuidv4 } from 'uuid' import { CacheService } from '../CacheService' diff --git a/src/main/services/remotefile/MistralService.ts b/src/main/services/remotefile/MistralService.ts index d3867a619d..6045e25972 100644 --- a/src/main/services/remotefile/MistralService.ts +++ b/src/main/services/remotefile/MistralService.ts @@ -2,8 +2,8 @@ import fs from 'node:fs/promises' import { loggerService } from '@logger' import { fileStorage } from '@main/services/FileStorage' -import { Mistral } from '@mistralai/mistralai' -import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' +import type { Mistral } from '@mistralai/mistralai' +import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' import { MistralClientManager } from '../MistralClientManager' import { BaseFileService } from './BaseFileService' diff --git a/src/main/services/remotefile/OpenAIService.ts b/src/main/services/remotefile/OpenAIService.ts index 734bf6f26a..59640f75a6 100644 --- a/src/main/services/remotefile/OpenAIService.ts +++ b/src/main/services/remotefile/OpenAIService.ts @@ -1,7 +1,7 @@ import OpenAI from '@cherrystudio/openai' import { loggerService } from '@logger' import { fileStorage } from '@main/services/FileStorage' -import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' +import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types' import * as fs from 'fs' import { CacheService } from '../CacheService' diff --git a/src/main/services/urlschema/mcp-install.ts b/src/main/services/urlschema/mcp-install.ts index e35c40d52e..2d783255e4 100644 --- a/src/main/services/urlschema/mcp-install.ts +++ b/src/main/services/urlschema/mcp-install.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' import { nanoid } from '@reduxjs/toolkit' import { IpcChannel } from '@shared/IpcChannel' -import { MCPServer } from '@types' +import type { MCPServer } from '@types' import { windowService } from '../WindowService' diff --git a/src/main/utils/file.ts b/src/main/utils/file.ts index 20305d1c9e..17155f423b 100644 --- a/src/main/utils/file.ts +++ b/src/main/utils/file.ts @@ -6,7 +6,8 @@ import path from 'node:path' import { loggerService } from '@logger' import { audioExts, documentExts, imageExts, MB, textExts, videoExts } from '@shared/config/constant' -import { FileMetadata, FileTypes, NotesTreeNode } from '@types' +import type { FileMetadata, NotesTreeNode } from '@types' +import { FileTypes } from '@types' import chardet from 'chardet' import { app } from 'electron' import iconv from 'iconv-lite' diff --git a/src/main/utils/ocr.ts b/src/main/utils/ocr.ts index 493b837dd9..fdb5ff1743 100644 --- a/src/main/utils/ocr.ts +++ b/src/main/utils/ocr.ts @@ -1,4 +1,4 @@ -import { ImageFileMetadata } from '@types' +import type { ImageFileMetadata } from '@types' import { readFile } from 'fs/promises' const preprocessImage = async (buffer: Buffer): Promise => { diff --git a/src/main/utils/windowUtil.ts b/src/main/utils/windowUtil.ts index 4000156fff..454ce917f5 100644 --- a/src/main/utils/windowUtil.ts +++ b/src/main/utils/windowUtil.ts @@ -1,4 +1,4 @@ -import { BrowserWindow } from 'electron' +import type { BrowserWindow } from 'electron' import { isDev, isWin } from '../constant' diff --git a/src/main/utils/zoom.ts b/src/main/utils/zoom.ts index d91d411591..d75b31724e 100644 --- a/src/main/utils/zoom.ts +++ b/src/main/utils/zoom.ts @@ -1,4 +1,4 @@ -import { BrowserWindow } from 'electron' +import type { BrowserWindow } from 'electron' import { configManager } from '../services/ConfigManager' diff --git a/src/preload/index.ts b/src/preload/index.ts index 30536b8a3f..d60e0edfe9 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,13 +1,13 @@ import type { PermissionUpdate } from '@anthropic-ai/claude-agent-sdk' import { electronAPI } from '@electron-toolkit/preload' -import { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' -import { SpanContext } from '@opentelemetry/api' -import { TerminalConfig, UpgradeChannel } from '@shared/config/constant' +import type { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' +import type { SpanContext } from '@opentelemetry/api' +import type { TerminalConfig, UpgradeChannel } from '@shared/config/constant' import type { LogLevel, LogSourceWithContext } from '@shared/config/logger' import type { FileChangeEvent, WebviewKeyEvent } from '@shared/config/types' import { IpcChannel } from '@shared/IpcChannel' import type { Notification } from '@types' -import { +import type { AddMemoryOptions, AssistantMessage, FileListResponse, @@ -33,8 +33,9 @@ import { ThemeMode, WebDavConfig } from '@types' -import { contextBridge, ipcRenderer, OpenDialogOptions, shell, webUtils } from 'electron' -import { CreateDirectoryOptions } from 'webdav' +import type { OpenDialogOptions } from 'electron' +import { contextBridge, ipcRenderer, shell, webUtils } from 'electron' +import type { CreateDirectoryOptions } from 'webdav' import type { InstalledPlugin, diff --git a/src/preload/preload.d.ts b/src/preload/preload.d.ts index 7e46ae82a8..a7c633130a 100644 --- a/src/preload/preload.d.ts +++ b/src/preload/preload.d.ts @@ -1,4 +1,4 @@ -import { ElectronAPI } from '@electron-toolkit/preload' +import type { ElectronAPI } from '@electron-toolkit/preload' import type { WindowApiType } from './index' diff --git a/src/renderer/src/Router.tsx b/src/renderer/src/Router.tsx index edaebfa144..cb3c494f1b 100644 --- a/src/renderer/src/Router.tsx +++ b/src/renderer/src/Router.tsx @@ -1,6 +1,7 @@ import '@renderer/databases' -import { FC, useMemo } from 'react' +import type { FC } from 'react' +import { useMemo } from 'react' import { HashRouter, Route, Routes } from 'react-router-dom' import Sidebar from './components/app/Sidebar' diff --git a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts index 3f27f9440c..6e4288d241 100644 --- a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts +++ b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts @@ -4,8 +4,10 @@ */ import { loggerService } from '@logger' -import { AISDKWebSearchResult, MCPTool, WebSearchResults, WebSearchSource } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { AISDKWebSearchResult, MCPTool, WebSearchResults } from '@renderer/types' +import { WebSearchSource } from '@renderer/types' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { ProviderSpecificError } from '@renderer/types/provider-specific-error' import { formatErrorMessage } from '@renderer/utils/error' import { convertLinks, flushLinkConverterBuffer } from '@renderer/utils/linkConverter' diff --git a/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts b/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts index 4d18024f89..32c7e534e3 100644 --- a/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts +++ b/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts @@ -6,7 +6,7 @@ import { loggerService } from '@logger' import { processKnowledgeReferences } from '@renderer/services/KnowledgeService' -import { +import type { BaseTool, MCPCallToolResponse, MCPTool, @@ -14,7 +14,8 @@ import { MCPToolResultContent, NormalToolResponse } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import type { ToolSet, TypedToolCall, TypedToolError, TypedToolResult } from 'ai' const logger = loggerService.withContext('ToolCallChunkHandler') diff --git a/src/renderer/src/aiCore/index_new.ts b/src/renderer/src/aiCore/index_new.ts index f6d6673cb9..800d2ff302 100644 --- a/src/renderer/src/aiCore/index_new.ts +++ b/src/renderer/src/aiCore/index_new.ts @@ -11,7 +11,7 @@ import { createExecutor } from '@cherrystudio/ai-core' import { loggerService } from '@logger' import { getEnableDeveloperMode } from '@renderer/hooks/useSettings' import { addSpan, endSpan } from '@renderer/services/SpanManagerService' -import { StartSpanParams } from '@renderer/trace/types/ModelSpanEntity' +import type { StartSpanParams } from '@renderer/trace/types/ModelSpanEntity' import type { Assistant, GenerateImageParams, Model, Provider } from '@renderer/types' import type { AiSdkModel, StreamTextParams } from '@renderer/types/aiCoreTypes' import { SUPPORTED_IMAGE_ENDPOINT_LIST } from '@renderer/utils' @@ -20,8 +20,9 @@ import { type ImageModel, type LanguageModel, type Provider as AiSdkProvider, wr import AiSdkToChunkAdapter from './chunk/AiSdkToChunkAdapter' import LegacyAiProvider from './legacy/index' -import { CompletionsParams, CompletionsResult } from './legacy/middleware/schemas' -import { AiSdkMiddlewareConfig, buildAiSdkMiddlewares } from './middleware/AiSdkMiddlewareBuilder' +import type { CompletionsParams, CompletionsResult } from './legacy/middleware/schemas' +import type { AiSdkMiddlewareConfig } from './middleware/AiSdkMiddlewareBuilder' +import { buildAiSdkMiddlewares } from './middleware/AiSdkMiddlewareBuilder' import { buildPlugins } from './plugins/PluginBuilder' import { createAiSdkProvider } from './provider/factory' import { diff --git a/src/renderer/src/aiCore/legacy/clients/ApiClientFactory.ts b/src/renderer/src/aiCore/legacy/clients/ApiClientFactory.ts index e7194c240b..bc416161c4 100644 --- a/src/renderer/src/aiCore/legacy/clients/ApiClientFactory.ts +++ b/src/renderer/src/aiCore/legacy/clients/ApiClientFactory.ts @@ -1,11 +1,11 @@ import { loggerService } from '@logger' import { isNewApiProvider } from '@renderer/config/providers' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { AihubmixAPIClient } from './aihubmix/AihubmixAPIClient' import { AnthropicAPIClient } from './anthropic/AnthropicAPIClient' import { AwsBedrockAPIClient } from './aws/AwsBedrockAPIClient' -import { BaseApiClient } from './BaseApiClient' +import type { BaseApiClient } from './BaseApiClient' import { CherryAiAPIClient } from './cherryai/CherryAiAPIClient' import { GeminiAPIClient } from './gemini/GeminiAPIClient' import { VertexAPIClient } from './gemini/VertexAPIClient' diff --git a/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts b/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts index 4a41db7c97..767cad1294 100644 --- a/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts @@ -9,29 +9,31 @@ import { REFERENCE_PROMPT } from '@renderer/config/prompts' import { isSupportServiceTierProvider } from '@renderer/config/providers' import { getLMStudioKeepAliveTime } from '@renderer/hooks/useLMStudio' import { getAssistantSettings } from '@renderer/services/AssistantService' -import { +import type { Assistant, - FileTypes, GenerateImageParams, - GroqServiceTiers, - isGroqServiceTier, - isOpenAIServiceTier, KnowledgeReference, MCPCallToolResponse, MCPTool, MCPToolResponse, MemoryItem, Model, - OpenAIServiceTiers, OpenAIVerbosity, Provider, - SystemProviderIds, ToolCallResponse, WebSearchProviderResponse, WebSearchResponse } from '@renderer/types' -import { Message } from '@renderer/types/newMessage' import { + FileTypes, + GroqServiceTiers, + isGroqServiceTier, + isOpenAIServiceTier, + OpenAIServiceTiers, + SystemProviderIds +} from '@renderer/types' +import type { Message } from '@renderer/types/newMessage' +import type { RequestOptions, SdkInstance, SdkMessageParam, @@ -49,8 +51,8 @@ import { defaultTimeout } from '@shared/config/constant' import { defaultAppHeaders } from '@shared/utils' import { isEmpty } from 'lodash' -import { CompletionsContext } from '../middleware/types' -import { ApiClient, RequestTransformer, ResponseChunkTransformer } from './types' +import type { CompletionsContext } from '../middleware/types' +import type { ApiClient, RequestTransformer, ResponseChunkTransformer } from './types' const logger = loggerService.withContext('BaseApiClient') diff --git a/src/renderer/src/aiCore/legacy/clients/MixedBaseApiClient.ts b/src/renderer/src/aiCore/legacy/clients/MixedBaseApiClient.ts index 36a207ecb3..fb5568a6e8 100644 --- a/src/renderer/src/aiCore/legacy/clients/MixedBaseApiClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/MixedBaseApiClient.ts @@ -1,4 +1,4 @@ -import { +import type { GenerateImageParams, MCPCallToolResponse, MCPTool, @@ -7,7 +7,7 @@ import { Provider, ToolCallResponse } from '@renderer/types' -import { +import type { RequestOptions, SdkInstance, SdkMessageParam, @@ -19,13 +19,13 @@ import { SdkToolCall } from '@renderer/types/sdk' -import { CompletionsContext } from '../middleware/types' -import { AnthropicAPIClient } from './anthropic/AnthropicAPIClient' +import type { CompletionsContext } from '../middleware/types' +import type { AnthropicAPIClient } from './anthropic/AnthropicAPIClient' import { BaseApiClient } from './BaseApiClient' -import { GeminiAPIClient } from './gemini/GeminiAPIClient' -import { OpenAIAPIClient } from './openai/OpenAIApiClient' -import { OpenAIResponseAPIClient } from './openai/OpenAIResponseAPIClient' -import { RequestTransformer, ResponseChunkTransformer } from './types' +import type { GeminiAPIClient } from './gemini/GeminiAPIClient' +import type { OpenAIAPIClient } from './openai/OpenAIApiClient' +import type { OpenAIResponseAPIClient } from './openai/OpenAIResponseAPIClient' +import type { RequestTransformer, ResponseChunkTransformer } from './types' /** * MixedAPIClient - 适用于可能含有多种接口类型的Provider diff --git a/src/renderer/src/aiCore/legacy/clients/__tests__/ApiClientFactory.test.ts b/src/renderer/src/aiCore/legacy/clients/__tests__/ApiClientFactory.test.ts index b8870fdb7c..03ec1e1ea2 100644 --- a/src/renderer/src/aiCore/legacy/clients/__tests__/ApiClientFactory.test.ts +++ b/src/renderer/src/aiCore/legacy/clients/__tests__/ApiClientFactory.test.ts @@ -1,4 +1,4 @@ -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { beforeEach, describe, expect, it, vi } from 'vitest' import { AihubmixAPIClient } from '../aihubmix/AihubmixAPIClient' diff --git a/src/renderer/src/aiCore/legacy/clients/__tests__/index.clientCompatibilityTypes.test.ts b/src/renderer/src/aiCore/legacy/clients/__tests__/index.clientCompatibilityTypes.test.ts index dd85730c36..bcff572410 100644 --- a/src/renderer/src/aiCore/legacy/clients/__tests__/index.clientCompatibilityTypes.test.ts +++ b/src/renderer/src/aiCore/legacy/clients/__tests__/index.clientCompatibilityTypes.test.ts @@ -6,7 +6,7 @@ import { VertexAPIClient } from '@renderer/aiCore/legacy/clients/gemini/VertexAP import { NewAPIClient } from '@renderer/aiCore/legacy/clients/newapi/NewAPIClient' import { OpenAIAPIClient } from '@renderer/aiCore/legacy/clients/openai/OpenAIApiClient' import { OpenAIResponseAPIClient } from '@renderer/aiCore/legacy/clients/openai/OpenAIResponseAPIClient' -import { EndpointType, Model, Provider } from '@renderer/types' +import type { EndpointType, Model, Provider } from '@renderer/types' import { beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('@renderer/config/models', () => ({ diff --git a/src/renderer/src/aiCore/legacy/clients/aihubmix/AihubmixAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/aihubmix/AihubmixAPIClient.ts index 1149c04b35..a8a0ca5ac6 100644 --- a/src/renderer/src/aiCore/legacy/clients/aihubmix/AihubmixAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/aihubmix/AihubmixAPIClient.ts @@ -1,8 +1,8 @@ import { isOpenAILLMModel } from '@renderer/config/models' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { AnthropicAPIClient } from '../anthropic/AnthropicAPIClient' -import { BaseApiClient } from '../BaseApiClient' +import type { BaseApiClient } from '../BaseApiClient' import { GeminiAPIClient } from '../gemini/GeminiAPIClient' import { MixedBaseAPIClient } from '../MixedBaseApiClient' import { OpenAIAPIClient } from '../openai/OpenAIApiClient' diff --git a/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicAPIClient.ts index 4f9bb28e41..15f3cf1007 100644 --- a/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicAPIClient.ts @@ -1,5 +1,5 @@ -import Anthropic from '@anthropic-ai/sdk' -import { +import type Anthropic from '@anthropic-ai/sdk' +import type { Base64ImageSource, ImageBlockParam, MessageParam, @@ -8,7 +8,7 @@ import { ToolUseBlock, WebSearchTool20250305 } from '@anthropic-ai/sdk/resources' -import { +import type { ContentBlock, ContentBlockParam, MessageCreateParamsBase, @@ -23,27 +23,24 @@ import { WebSearchToolResultError } from '@anthropic-ai/sdk/resources/messages' import { MessageStream } from '@anthropic-ai/sdk/resources/messages/messages' -import AnthropicVertex from '@anthropic-ai/vertex-sdk' +import type AnthropicVertex from '@anthropic-ai/vertex-sdk' import { loggerService } from '@logger' import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant' import { findTokenLimit, isClaudeReasoningModel, isReasoningModel, isWebSearchModel } from '@renderer/config/models' import { getAssistantSettings } from '@renderer/services/AssistantService' import FileManager from '@renderer/services/FileManager' import { estimateTextTokens } from '@renderer/services/TokenService' -import { +import type { Assistant, - EFFORT_RATIO, - FileTypes, MCPCallToolResponse, MCPTool, MCPToolResponse, Model, Provider, - ToolCallResponse, - WebSearchSource + ToolCallResponse } from '@renderer/types' -import { - ChunkType, +import { EFFORT_RATIO, FileTypes, WebSearchSource } from '@renderer/types' +import type { ErrorChunk, LLMWebSearchCompleteChunk, LLMWebSearchInProgressChunk, @@ -53,8 +50,9 @@ import { ThinkingDeltaChunk, ThinkingStartChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { type Message } from '@renderer/types/newMessage' -import { +import type { AnthropicSdkMessageParam, AnthropicSdkParams, AnthropicSdkRawChunk, @@ -71,9 +69,9 @@ import { findFileBlocks, findImageBlocks } from '@renderer/utils/messageUtils/fi import { buildClaudeCodeSystemMessage, getSdkClient } from '@shared/anthropic' import { t } from 'i18next' -import { GenericChunk } from '../../middleware/schemas' +import type { GenericChunk } from '../../middleware/schemas' import { BaseApiClient } from '../BaseApiClient' -import { AnthropicStreamListener, RawStreamListener, RequestTransformer, ResponseChunkTransformer } from '../types' +import type { AnthropicStreamListener, RawStreamListener, RequestTransformer, ResponseChunkTransformer } from '../types' const logger = loggerService.withContext('AnthropicAPIClient') diff --git a/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicVertexClient.ts b/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicVertexClient.ts index bb96ac90ae..2fe16e8875 100644 --- a/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicVertexClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/anthropic/AnthropicVertexClient.ts @@ -1,8 +1,8 @@ -import Anthropic from '@anthropic-ai/sdk' +import type Anthropic from '@anthropic-ai/sdk' import AnthropicVertex from '@anthropic-ai/vertex-sdk' import { loggerService } from '@logger' import { getVertexAILocation, getVertexAIProjectId, getVertexAIServiceAccount } from '@renderer/hooks/useVertexAI' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { isEmpty } from 'lodash' import { AnthropicAPIClient } from './AnthropicAPIClient' diff --git a/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts index 1de8a724c4..94f74eecff 100644 --- a/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts @@ -6,7 +6,7 @@ import { InvokeModelWithResponseStreamCommand } from '@aws-sdk/client-bedrock-runtime' import { loggerService } from '@logger' -import { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas' +import type { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas' import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant' import { findTokenLimit, isReasoningModel } from '@renderer/config/models' import { @@ -16,10 +16,8 @@ import { } from '@renderer/hooks/useAwsBedrock' import { getAssistantSettings } from '@renderer/services/AssistantService' import { estimateTextTokens } from '@renderer/services/TokenService' -import { +import type { Assistant, - EFFORT_RATIO, - FileTypes, GenerateImageParams, MCPCallToolResponse, MCPTool, @@ -28,15 +26,11 @@ import { Provider, ToolCallResponse } from '@renderer/types' -import { - ChunkType, - MCPToolCreatedChunk, - TextDeltaChunk, - ThinkingDeltaChunk, - ThinkingStartChunk -} from '@renderer/types/chunk' -import { Message } from '@renderer/types/newMessage' -import { +import { EFFORT_RATIO, FileTypes } from '@renderer/types' +import type { MCPToolCreatedChunk, TextDeltaChunk, ThinkingDeltaChunk, ThinkingStartChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' +import type { Message } from '@renderer/types/newMessage' +import type { AwsBedrockSdkInstance, AwsBedrockSdkMessageParam, AwsBedrockSdkParams, @@ -58,7 +52,7 @@ import { findFileBlocks, findImageBlocks } from '@renderer/utils/messageUtils/fi import { t } from 'i18next' import { BaseApiClient } from '../BaseApiClient' -import { RequestTransformer, ResponseChunkTransformer } from '../types' +import type { RequestTransformer, ResponseChunkTransformer } from '../types' const logger = loggerService.withContext('AwsBedrockAPIClient') diff --git a/src/renderer/src/aiCore/legacy/clients/cherryai/CherryAiAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/cherryai/CherryAiAPIClient.ts index 08e4d9df34..b72e0a8829 100644 --- a/src/renderer/src/aiCore/legacy/clients/cherryai/CherryAiAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/cherryai/CherryAiAPIClient.ts @@ -1,6 +1,6 @@ -import OpenAI from '@cherrystudio/openai' -import { Provider } from '@renderer/types' -import { OpenAISdkParams, OpenAISdkRawOutput } from '@renderer/types/sdk' +import type OpenAI from '@cherrystudio/openai' +import type { Provider } from '@renderer/types' +import type { OpenAISdkParams, OpenAISdkRawOutput } from '@renderer/types/sdk' import { OpenAIAPIClient } from '../openai/OpenAIApiClient' diff --git a/src/renderer/src/aiCore/legacy/clients/gemini/GeminiAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/gemini/GeminiAPIClient.ts index 33d34c7961..27e659c1af 100644 --- a/src/renderer/src/aiCore/legacy/clients/gemini/GeminiAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/gemini/GeminiAPIClient.ts @@ -1,14 +1,9 @@ -import { +import type { Content, - createPartFromUri, File, FunctionCall, GenerateContentConfig, GenerateImagesConfig, - GoogleGenAI, - HarmBlockThreshold, - HarmCategory, - Modality, Model as GeminiModel, Part, SafetySetting, @@ -16,6 +11,7 @@ import { ThinkingConfig, Tool } from '@google/genai' +import { createPartFromUri, GoogleGenAI, HarmBlockThreshold, HarmCategory, Modality } from '@google/genai' import { loggerService } from '@logger' import { nanoid } from '@reduxjs/toolkit' import { @@ -26,11 +22,9 @@ import { isVisionModel } from '@renderer/config/models' import { estimateTextTokens } from '@renderer/services/TokenService' -import { +import type { Assistant, - EFFORT_RATIO, FileMetadata, - FileTypes, FileUploadResponse, GenerateImageParams, MCPCallToolResponse, @@ -38,12 +32,13 @@ import { MCPToolResponse, Model, Provider, - ToolCallResponse, - WebSearchSource + ToolCallResponse } from '@renderer/types' -import { ChunkType, LLMWebSearchCompleteChunk, TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk' -import { Message } from '@renderer/types/newMessage' -import { +import { EFFORT_RATIO, FileTypes, WebSearchSource } from '@renderer/types' +import type { LLMWebSearchCompleteChunk, TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' +import type { Message } from '@renderer/types/newMessage' +import type { GeminiOptions, GeminiSdkMessageParam, GeminiSdkParams, @@ -62,9 +57,9 @@ import { findFileBlocks, findImageBlocks, getMainTextContent } from '@renderer/u import { defaultTimeout, MB } from '@shared/config/constant' import { t } from 'i18next' -import { GenericChunk } from '../../middleware/schemas' +import type { GenericChunk } from '../../middleware/schemas' import { BaseApiClient } from '../BaseApiClient' -import { RequestTransformer, ResponseChunkTransformer } from '../types' +import type { RequestTransformer, ResponseChunkTransformer } from '../types' const logger = loggerService.withContext('GeminiAPIClient') diff --git a/src/renderer/src/aiCore/legacy/clients/gemini/VertexAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/gemini/VertexAPIClient.ts index 37e6677367..49a96a8f19 100644 --- a/src/renderer/src/aiCore/legacy/clients/gemini/VertexAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/gemini/VertexAPIClient.ts @@ -1,7 +1,7 @@ import { GoogleGenAI } from '@google/genai' import { loggerService } from '@logger' import { createVertexProvider, isVertexAIConfigured, isVertexProvider } from '@renderer/hooks/useVertexAI' -import { Model, Provider, VertexProvider } from '@renderer/types' +import type { Model, Provider, VertexProvider } from '@renderer/types' import { isEmpty } from 'lodash' import { AnthropicVertexClient } from '../anthropic/AnthropicVertexClient' diff --git a/src/renderer/src/aiCore/legacy/clients/newapi/NewAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/newapi/NewAPIClient.ts index 58b349a2be..f3e04e0d55 100644 --- a/src/renderer/src/aiCore/legacy/clients/newapi/NewAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/newapi/NewAPIClient.ts @@ -1,10 +1,10 @@ import { loggerService } from '@logger' import { isSupportedModel } from '@renderer/config/models' -import { Model, Provider } from '@renderer/types' -import { NewApiModel } from '@renderer/types/sdk' +import type { Model, Provider } from '@renderer/types' +import type { NewApiModel } from '@renderer/types/sdk' import { AnthropicAPIClient } from '../anthropic/AnthropicAPIClient' -import { BaseApiClient } from '../BaseApiClient' +import type { BaseApiClient } from '../BaseApiClient' import { GeminiAPIClient } from '../gemini/GeminiAPIClient' import { MixedBaseAPIClient } from '../MixedBaseApiClient' import { OpenAIAPIClient } from '../openai/OpenAIApiClient' diff --git a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts index 618d9b461b..239890c7a7 100644 --- a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts @@ -1,5 +1,6 @@ -import OpenAI, { AzureOpenAI } from '@cherrystudio/openai' -import { +import type { AzureOpenAI } from '@cherrystudio/openai' +import type OpenAI from '@cherrystudio/openai' +import type { ChatCompletionContentPart, ChatCompletionContentPartRefusal, ChatCompletionTool @@ -48,25 +49,28 @@ import { mapLanguageToQwenMTModel } from '@renderer/config/translate' import { processPostsuffixQwen3Model, processReqMessages } from '@renderer/services/ModelMessageService' import { estimateTextTokens } from '@renderer/services/TokenService' // For Copilot token -import { +import type { Assistant, - EFFORT_RATIO, - FileTypes, - isSystemProvider, - isTranslateAssistant, MCPCallToolResponse, MCPTool, MCPToolResponse, Model, OpenAIServiceTier, Provider, + ToolCallResponse +} from '@renderer/types' +import { + EFFORT_RATIO, + FileTypes, + isSystemProvider, + isTranslateAssistant, SystemProviderIds, - ToolCallResponse, WebSearchSource } from '@renderer/types' -import { ChunkType, TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk' -import { Message } from '@renderer/types/newMessage' -import { +import type { TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' +import type { Message } from '@renderer/types/newMessage' +import type { OpenAIExtraBody, OpenAIModality, OpenAISdkMessageParam, @@ -86,8 +90,8 @@ import { import { findFileBlocks, findImageBlocks } from '@renderer/utils/messageUtils/find' import { t } from 'i18next' -import { GenericChunk } from '../../middleware/schemas' -import { RequestTransformer, ResponseChunkTransformer, ResponseChunkTransformerContext } from '../types' +import type { GenericChunk } from '../../middleware/schemas' +import type { RequestTransformer, ResponseChunkTransformer, ResponseChunkTransformerContext } from '../types' import { OpenAIBaseClient } from './OpenAIBaseClient' const logger = loggerService.withContext('OpenAIApiClient') diff --git a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIBaseClient.ts b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIBaseClient.ts index 8a0a3fe0f4..abd1793618 100644 --- a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIBaseClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIBaseClient.ts @@ -10,9 +10,9 @@ import { import { getStoreSetting } from '@renderer/hooks/useSettings' import { getAssistantSettings } from '@renderer/services/AssistantService' import store from '@renderer/store' -import { SettingsState } from '@renderer/store/settings' -import { Assistant, GenerateImageParams, Model, Provider } from '@renderer/types' -import { +import type { SettingsState } from '@renderer/store/settings' +import type { Assistant, GenerateImageParams, Model, Provider } from '@renderer/types' +import type { OpenAIResponseSdkMessageParam, OpenAIResponseSdkParams, OpenAIResponseSdkRawChunk, diff --git a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIResponseAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIResponseAPIClient.ts index 5d13d6ff70..b9131be661 100644 --- a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIResponseAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIResponseAPIClient.ts @@ -1,8 +1,8 @@ import OpenAI, { AzureOpenAI } from '@cherrystudio/openai' -import { ResponseInput } from '@cherrystudio/openai/resources/responses/responses' +import type { ResponseInput } from '@cherrystudio/openai/resources/responses/responses' import { loggerService } from '@logger' -import { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas' -import { CompletionsContext } from '@renderer/aiCore/legacy/middleware/types' +import type { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas' +import type { CompletionsContext } from '@renderer/aiCore/legacy/middleware/types' import { isGPT5SeriesModel, isOpenAIChatCompletionOnlyModel, @@ -14,21 +14,20 @@ import { } from '@renderer/config/models' import { isSupportDeveloperRoleProvider } from '@renderer/config/providers' import { estimateTextTokens } from '@renderer/services/TokenService' -import { +import type { FileMetadata, - FileTypes, MCPCallToolResponse, MCPTool, MCPToolResponse, Model, OpenAIServiceTier, Provider, - ToolCallResponse, - WebSearchSource + ToolCallResponse } from '@renderer/types' +import { FileTypes, WebSearchSource } from '@renderer/types' import { ChunkType } from '@renderer/types/chunk' -import { Message } from '@renderer/types/newMessage' -import { +import type { Message } from '@renderer/types/newMessage' +import type { OpenAIResponseSdkMessageParam, OpenAIResponseSdkParams, OpenAIResponseSdkRawChunk, @@ -48,7 +47,7 @@ import { MB } from '@shared/config/constant' import { t } from 'i18next' import { isEmpty } from 'lodash' -import { RequestTransformer, ResponseChunkTransformer } from '../types' +import type { RequestTransformer, ResponseChunkTransformer } from '../types' import { OpenAIAPIClient } from './OpenAIApiClient' import { OpenAIBaseClient } from './OpenAIBaseClient' diff --git a/src/renderer/src/aiCore/legacy/clients/ovms/OVMSClient.ts b/src/renderer/src/aiCore/legacy/clients/ovms/OVMSClient.ts index 5dc91550a0..179bb54a1e 100644 --- a/src/renderer/src/aiCore/legacy/clients/ovms/OVMSClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/ovms/OVMSClient.ts @@ -1,7 +1,8 @@ -import OpenAI from '@cherrystudio/openai' +import type OpenAI from '@cherrystudio/openai' import { loggerService } from '@logger' import { isSupportedModel } from '@renderer/config/models' -import { objectKeys, Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' +import { objectKeys } from '@renderer/types' import { OpenAIAPIClient } from '../openai/OpenAIApiClient' diff --git a/src/renderer/src/aiCore/legacy/clients/ppio/PPIOAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/ppio/PPIOAPIClient.ts index 57b54b9618..345496e156 100644 --- a/src/renderer/src/aiCore/legacy/clients/ppio/PPIOAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/ppio/PPIOAPIClient.ts @@ -1,7 +1,7 @@ -import OpenAI from '@cherrystudio/openai' +import type OpenAI from '@cherrystudio/openai' import { loggerService } from '@logger' import { isSupportedModel } from '@renderer/config/models' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { OpenAIAPIClient } from '../openai/OpenAIApiClient' diff --git a/src/renderer/src/aiCore/legacy/clients/types.ts b/src/renderer/src/aiCore/legacy/clients/types.ts index 6d10f4285c..bf7b129d93 100644 --- a/src/renderer/src/aiCore/legacy/clients/types.ts +++ b/src/renderer/src/aiCore/legacy/clients/types.ts @@ -1,8 +1,8 @@ -import Anthropic from '@anthropic-ai/sdk' -import OpenAI from '@cherrystudio/openai' -import { Assistant, MCPTool, MCPToolResponse, Model, ToolCallResponse } from '@renderer/types' -import { Provider } from '@renderer/types' -import { +import type Anthropic from '@anthropic-ai/sdk' +import type OpenAI from '@cherrystudio/openai' +import type { Assistant, MCPTool, MCPToolResponse, Model, ToolCallResponse } from '@renderer/types' +import type { Provider } from '@renderer/types' +import type { AnthropicSdkRawChunk, OpenAIResponseSdkRawChunk, OpenAIResponseSdkRawOutput, @@ -15,8 +15,8 @@ import { SdkToolCall } from '@renderer/types/sdk' -import { CompletionsParams, GenericChunk } from '../middleware/schemas' -import { CompletionsContext } from '../middleware/types' +import type { CompletionsParams, GenericChunk } from '../middleware/schemas' +import type { CompletionsContext } from '../middleware/types' /** * 原始流监听器接口 diff --git a/src/renderer/src/aiCore/legacy/clients/zhipu/ZhipuAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/zhipu/ZhipuAPIClient.ts index c04e08fb7c..ea6c141e31 100644 --- a/src/renderer/src/aiCore/legacy/clients/zhipu/ZhipuAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/zhipu/ZhipuAPIClient.ts @@ -1,7 +1,7 @@ -import OpenAI from '@cherrystudio/openai' +import type OpenAI from '@cherrystudio/openai' import { loggerService } from '@logger' -import { Provider } from '@renderer/types' -import { GenerateImageParams } from '@renderer/types' +import type { Provider } from '@renderer/types' +import type { GenerateImageParams } from '@renderer/types' import { OpenAIAPIClient } from '../openai/OpenAIApiClient' diff --git a/src/renderer/src/aiCore/legacy/index.ts b/src/renderer/src/aiCore/legacy/index.ts index adc81f03ad..da6cdb6726 100644 --- a/src/renderer/src/aiCore/legacy/index.ts +++ b/src/renderer/src/aiCore/legacy/index.ts @@ -1,10 +1,10 @@ import { loggerService } from '@logger' import { ApiClientFactory } from '@renderer/aiCore/legacy/clients/ApiClientFactory' -import { BaseApiClient } from '@renderer/aiCore/legacy/clients/BaseApiClient' +import type { BaseApiClient } from '@renderer/aiCore/legacy/clients/BaseApiClient' import { isDedicatedImageGenerationModel, isFunctionCallingModel } from '@renderer/config/models' import { getProviderByModel } from '@renderer/services/AssistantService' import { withSpanResult } from '@renderer/services/SpanManagerService' -import { StartSpanParams } from '@renderer/trace/types/ModelSpanEntity' +import type { StartSpanParams } from '@renderer/trace/types/ModelSpanEntity' import type { GenerateImageParams, Model, Provider } from '@renderer/types' import type { RequestOptions, SdkModel } from '@renderer/types/sdk' import { isSupportedToolUse } from '@renderer/utils/mcp-tools' diff --git a/src/renderer/src/aiCore/legacy/middleware/builder.ts b/src/renderer/src/aiCore/legacy/middleware/builder.ts index 2ea20d4937..1d0b9d136d 100644 --- a/src/renderer/src/aiCore/legacy/middleware/builder.ts +++ b/src/renderer/src/aiCore/legacy/middleware/builder.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' import { DefaultCompletionsNamedMiddlewares } from './register' -import { BaseContext, CompletionsMiddleware, MethodMiddleware } from './types' +import type { BaseContext, CompletionsMiddleware, MethodMiddleware } from './types' const logger = loggerService.withContext('aiCore:MiddlewareBuilder') diff --git a/src/renderer/src/aiCore/legacy/middleware/common/AbortHandlerMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/common/AbortHandlerMiddleware.ts index a733e45d70..5f24797813 100644 --- a/src/renderer/src/aiCore/legacy/middleware/common/AbortHandlerMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/common/AbortHandlerMiddleware.ts @@ -1,8 +1,9 @@ import { loggerService } from '@logger' -import { Chunk, ChunkType, ErrorChunk } from '@renderer/types/chunk' +import type { Chunk, ErrorChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { addAbortController, removeAbortController } from '@renderer/utils/abortController' -import { CompletionsParams, CompletionsResult } from '../schemas' +import type { CompletionsParams, CompletionsResult } from '../schemas' import type { CompletionsContext, CompletionsMiddleware } from '../types' const logger = loggerService.withContext('aiCore:AbortHandlerMiddleware') diff --git a/src/renderer/src/aiCore/legacy/middleware/common/ErrorHandlerMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/common/ErrorHandlerMiddleware.ts index dde98cbd1e..7d6a7f631a 100644 --- a/src/renderer/src/aiCore/legacy/middleware/common/ErrorHandlerMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/common/ErrorHandlerMiddleware.ts @@ -1,10 +1,10 @@ import { loggerService } from '@logger' import { isZhipuModel } from '@renderer/config/models' import { getStoreProviders } from '@renderer/hooks/useStore' -import { Chunk } from '@renderer/types/chunk' +import type { Chunk } from '@renderer/types/chunk' -import { CompletionsParams, CompletionsResult } from '../schemas' -import { CompletionsContext } from '../types' +import type { CompletionsParams, CompletionsResult } from '../schemas' +import type { CompletionsContext } from '../types' import { createErrorChunk } from '../utils' const logger = loggerService.withContext('ErrorHandlerMiddleware') diff --git a/src/renderer/src/aiCore/legacy/middleware/common/FinalChunkConsumerMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/common/FinalChunkConsumerMiddleware.ts index 57498b97fb..0325e4e21a 100644 --- a/src/renderer/src/aiCore/legacy/middleware/common/FinalChunkConsumerMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/common/FinalChunkConsumerMiddleware.ts @@ -1,10 +1,10 @@ import { loggerService } from '@logger' -import { Usage } from '@renderer/types' +import type { Usage } from '@renderer/types' import type { Chunk } from '@renderer/types/chunk' import { ChunkType } from '@renderer/types/chunk' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'FinalChunkConsumerAndNotifierMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/common/LoggingMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/common/LoggingMiddleware.ts index acd371d777..480cbbc39f 100644 --- a/src/renderer/src/aiCore/legacy/middleware/common/LoggingMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/common/LoggingMiddleware.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' -import { BaseContext, MethodMiddleware, MiddlewareAPI } from '../types' +import type { BaseContext, MethodMiddleware, MiddlewareAPI } from '../types' const logger = loggerService.withContext('LoggingMiddleware') diff --git a/src/renderer/src/aiCore/legacy/middleware/composer.ts b/src/renderer/src/aiCore/legacy/middleware/composer.ts index 82b9fd1704..97bbf0a38d 100644 --- a/src/renderer/src/aiCore/legacy/middleware/composer.ts +++ b/src/renderer/src/aiCore/legacy/middleware/composer.ts @@ -1,5 +1,5 @@ import { withSpanResult } from '@renderer/services/SpanManagerService' -import { +import type { RequestOptions, SdkInstance, SdkMessageParam, @@ -10,16 +10,10 @@ import { SdkToolCall } from '@renderer/types/sdk' -import { BaseApiClient } from '../clients' -import { CompletionsParams, CompletionsResult } from './schemas' -import { - BaseContext, - CompletionsContext, - CompletionsMiddleware, - MethodMiddleware, - MIDDLEWARE_CONTEXT_SYMBOL, - MiddlewareAPI -} from './types' +import type { BaseApiClient } from '../clients' +import type { CompletionsParams, CompletionsResult } from './schemas' +import type { BaseContext, CompletionsContext, CompletionsMiddleware, MethodMiddleware, MiddlewareAPI } from './types' +import { MIDDLEWARE_CONTEXT_SYMBOL } from './types' /** * Creates the initial context for a method call, populating method-specific fields. / diff --git a/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts index fc0327925e..6affa5a565 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts @@ -1,7 +1,8 @@ import { loggerService } from '@logger' -import { MCPCallToolResponse, MCPTool, MCPToolResponse, Model } from '@renderer/types' -import { ChunkType, MCPToolCreatedChunk } from '@renderer/types/chunk' -import { SdkMessageParam, SdkRawOutput, SdkToolCall } from '@renderer/types/sdk' +import type { MCPCallToolResponse, MCPTool, MCPToolResponse, Model } from '@renderer/types' +import type { MCPToolCreatedChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' +import type { SdkMessageParam, SdkRawOutput, SdkToolCall } from '@renderer/types/sdk' import { callBuiltInTool, callMCPTool, @@ -12,8 +13,8 @@ import { } from '@renderer/utils/mcp-tools' import { confirmSameNameTools, requestToolConfirmation, setToolIdToNameMapping } from '@renderer/utils/userConfirmation' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'McpToolChunkMiddleware' const MAX_TOOL_RECURSION_DEPTH = 20 // 防止无限递归 diff --git a/src/renderer/src/aiCore/legacy/middleware/core/RawStreamListenerMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/RawStreamListenerMiddleware.ts index 0d59ad9de6..04bfd751e2 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/RawStreamListenerMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/RawStreamListenerMiddleware.ts @@ -1,9 +1,9 @@ import { AnthropicAPIClient } from '@renderer/aiCore/legacy/clients/anthropic/AnthropicAPIClient' -import { AnthropicSdkRawChunk, AnthropicSdkRawOutput } from '@renderer/types/sdk' +import type { AnthropicSdkRawChunk, AnthropicSdkRawOutput } from '@renderer/types/sdk' -import { AnthropicStreamListener } from '../../clients/types' -import { CompletionsParams, CompletionsResult } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { AnthropicStreamListener } from '../../clients/types' +import type { CompletionsParams, CompletionsResult } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'RawStreamListenerMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/core/ResponseTransformMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/ResponseTransformMiddleware.ts index 850da8306d..bdab7b8783 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/ResponseTransformMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/ResponseTransformMiddleware.ts @@ -1,9 +1,9 @@ import { loggerService } from '@logger' -import { SdkRawChunk } from '@renderer/types/sdk' +import type { SdkRawChunk } from '@renderer/types/sdk' -import { ResponseChunkTransformerContext } from '../../clients/types' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { ResponseChunkTransformerContext } from '../../clients/types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'ResponseTransformMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/core/StreamAdapterMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/StreamAdapterMiddleware.ts index 8bb5266319..b6dc13e602 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/StreamAdapterMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/StreamAdapterMiddleware.ts @@ -1,8 +1,8 @@ -import { SdkRawChunk } from '@renderer/types/sdk' +import type { SdkRawChunk } from '@renderer/types/sdk' import { asyncGeneratorToReadableStream, createSingleChunkReadableStream } from '@renderer/utils/stream' -import { CompletionsParams, CompletionsResult } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' import { isAsyncIterable } from '../utils' export const MIDDLEWARE_NAME = 'StreamAdapterMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/core/TextChunkMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/TextChunkMiddleware.ts index 41157bf504..837244981a 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/TextChunkMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/TextChunkMiddleware.ts @@ -1,8 +1,8 @@ import { loggerService } from '@logger' import { ChunkType } from '@renderer/types/chunk' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'TextChunkMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/core/ThinkChunkMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/ThinkChunkMiddleware.ts index 2149d8fe79..5920cdc0ea 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/ThinkChunkMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/ThinkChunkMiddleware.ts @@ -1,8 +1,9 @@ import { loggerService } from '@logger' -import { ChunkType, ThinkingCompleteChunk, ThinkingDeltaChunk } from '@renderer/types/chunk' +import type { ThinkingCompleteChunk, ThinkingDeltaChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'ThinkChunkMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/core/TransformCoreToSdkParamsMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/TransformCoreToSdkParamsMiddleware.ts index 71831a3ef6..ebc86f5a5e 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/TransformCoreToSdkParamsMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/TransformCoreToSdkParamsMiddleware.ts @@ -1,8 +1,8 @@ import { loggerService } from '@logger' import { ChunkType } from '@renderer/types/chunk' -import { CompletionsParams, CompletionsResult } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'TransformCoreToSdkParamsMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/core/WebSearchMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/WebSearchMiddleware.ts index ae346af836..3365b163b6 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/WebSearchMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/WebSearchMiddleware.ts @@ -2,8 +2,8 @@ import { loggerService } from '@logger' import { ChunkType } from '@renderer/types/chunk' import { convertLinks, flushLinkConverterBuffer } from '@renderer/utils/linkConverter' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' const logger = loggerService.withContext('WebSearchMiddleware') diff --git a/src/renderer/src/aiCore/legacy/middleware/feat/ImageGenerationMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/feat/ImageGenerationMiddleware.ts index 40ab43c561..0df303e41e 100644 --- a/src/renderer/src/aiCore/legacy/middleware/feat/ImageGenerationMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/feat/ImageGenerationMiddleware.ts @@ -1,4 +1,4 @@ -import OpenAI from '@cherrystudio/openai' +import type OpenAI from '@cherrystudio/openai' import { toFile } from '@cherrystudio/openai/uploads' import { isDedicatedImageGenerationModel } from '@renderer/config/models' import FileManager from '@renderer/services/FileManager' @@ -6,9 +6,9 @@ import { ChunkType } from '@renderer/types/chunk' import { findImageBlocks, getMainTextContent } from '@renderer/utils/messageUtils/find' import { defaultTimeout } from '@shared/config/constant' -import { BaseApiClient } from '../../clients/BaseApiClient' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { BaseApiClient } from '../../clients/BaseApiClient' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'ImageGenerationMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/feat/ThinkingTagExtractionMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/feat/ThinkingTagExtractionMiddleware.ts index 447b9d2f23..dea679eaac 100644 --- a/src/renderer/src/aiCore/legacy/middleware/feat/ThinkingTagExtractionMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/feat/ThinkingTagExtractionMiddleware.ts @@ -1,17 +1,18 @@ import { loggerService } from '@logger' -import { Model } from '@renderer/types' -import { - ChunkType, +import type { Model } from '@renderer/types' +import type { TextDeltaChunk, ThinkingCompleteChunk, ThinkingDeltaChunk, ThinkingStartChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { getLowerBaseModelName } from '@renderer/utils' -import { TagConfig, TagExtractor } from '@renderer/utils/tagExtraction' +import type { TagConfig } from '@renderer/utils/tagExtraction' +import { TagExtractor } from '@renderer/utils/tagExtraction' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' const logger = loggerService.withContext('ThinkingTagExtractionMiddleware') diff --git a/src/renderer/src/aiCore/legacy/middleware/feat/ToolUseExtractionMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/feat/ToolUseExtractionMiddleware.ts index 1f559bf5ad..38d842e08d 100644 --- a/src/renderer/src/aiCore/legacy/middleware/feat/ToolUseExtractionMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/feat/ToolUseExtractionMiddleware.ts @@ -1,11 +1,13 @@ import { loggerService } from '@logger' -import { MCPTool } from '@renderer/types' -import { ChunkType, MCPToolCreatedChunk, TextDeltaChunk } from '@renderer/types/chunk' +import type { MCPTool } from '@renderer/types' +import type { MCPToolCreatedChunk, TextDeltaChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { parseToolUse } from '@renderer/utils/mcp-tools' -import { TagConfig, TagExtractor } from '@renderer/utils/tagExtraction' +import type { TagConfig } from '@renderer/utils/tagExtraction' +import { TagExtractor } from '@renderer/utils/tagExtraction' -import { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' -import { CompletionsContext, CompletionsMiddleware } from '../types' +import type { CompletionsParams, CompletionsResult, GenericChunk } from '../schemas' +import type { CompletionsContext, CompletionsMiddleware } from '../types' export const MIDDLEWARE_NAME = 'ToolUseExtractionMiddleware' diff --git a/src/renderer/src/aiCore/legacy/middleware/index.ts b/src/renderer/src/aiCore/legacy/middleware/index.ts index 64be4edd44..66213c33b8 100644 --- a/src/renderer/src/aiCore/legacy/middleware/index.ts +++ b/src/renderer/src/aiCore/legacy/middleware/index.ts @@ -1,4 +1,4 @@ -import { CompletionsMiddleware, MethodMiddleware } from './types' +import type { CompletionsMiddleware, MethodMiddleware } from './types' // /** // * Wraps a provider instance with middlewares. diff --git a/src/renderer/src/aiCore/legacy/middleware/schemas.ts b/src/renderer/src/aiCore/legacy/middleware/schemas.ts index ce89934f02..9119d818db 100644 --- a/src/renderer/src/aiCore/legacy/middleware/schemas.ts +++ b/src/renderer/src/aiCore/legacy/middleware/schemas.ts @@ -1,9 +1,9 @@ -import { Assistant, MCPTool } from '@renderer/types' -import { Chunk } from '@renderer/types/chunk' -import { Message } from '@renderer/types/newMessage' -import { SdkRawChunk, SdkRawOutput } from '@renderer/types/sdk' +import type { Assistant, MCPTool } from '@renderer/types' +import type { Chunk } from '@renderer/types/chunk' +import type { Message } from '@renderer/types/newMessage' +import type { SdkRawChunk, SdkRawOutput } from '@renderer/types/sdk' -import { ProcessingState } from './types' +import type { ProcessingState } from './types' // ============================================================================ // Core Request Types - 核心请求结构 diff --git a/src/renderer/src/aiCore/legacy/middleware/types.ts b/src/renderer/src/aiCore/legacy/middleware/types.ts index 0a7dbe390b..3762035107 100644 --- a/src/renderer/src/aiCore/legacy/middleware/types.ts +++ b/src/renderer/src/aiCore/legacy/middleware/types.ts @@ -1,6 +1,6 @@ -import { MCPToolResponse, Metrics, Usage, WebSearchResponse } from '@renderer/types' -import { Chunk, ErrorChunk } from '@renderer/types/chunk' -import { +import type { MCPToolResponse, Metrics, Usage, WebSearchResponse } from '@renderer/types' +import type { Chunk, ErrorChunk } from '@renderer/types/chunk' +import type { SdkInstance, SdkMessageParam, SdkParams, @@ -10,8 +10,8 @@ import { SdkToolCall } from '@renderer/types/sdk' -import { BaseApiClient } from '../clients' -import { CompletionsParams, CompletionsResult } from './schemas' +import type { BaseApiClient } from '../clients' +import type { CompletionsParams, CompletionsResult } from './schemas' /** * Symbol to uniquely identify middleware context objects. diff --git a/src/renderer/src/aiCore/legacy/middleware/utils.ts b/src/renderer/src/aiCore/legacy/middleware/utils.ts index 12a2fe651d..32e94e16b6 100644 --- a/src/renderer/src/aiCore/legacy/middleware/utils.ts +++ b/src/renderer/src/aiCore/legacy/middleware/utils.ts @@ -1,4 +1,5 @@ -import { ChunkType, ErrorChunk } from '@renderer/types/chunk' +import type { ErrorChunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' /** * Creates an ErrorChunk object with a standardized structure. diff --git a/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts b/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts index b10607b670..3f14917cdd 100644 --- a/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts +++ b/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts @@ -1,10 +1,12 @@ -import { WebSearchPluginConfig } from '@cherrystudio/ai-core/built-in/plugins' +import type { WebSearchPluginConfig } from '@cherrystudio/ai-core/built-in/plugins' import { loggerService } from '@logger' import { isSupportedThinkingTokenQwenModel } from '@renderer/config/models' import { isSupportEnableThinkingProvider } from '@renderer/config/providers' -import { type Assistant, MCPTool, type Message, type Model, type Provider } from '@renderer/types' +import type { MCPTool } from '@renderer/types' +import { type Assistant, type Message, type Model, type Provider } from '@renderer/types' import type { Chunk } from '@renderer/types/chunk' -import { extractReasoningMiddleware, LanguageModelMiddleware, simulateStreamingMiddleware } from 'ai' +import type { LanguageModelMiddleware } from 'ai' +import { extractReasoningMiddleware, simulateStreamingMiddleware } from 'ai' import { isEmpty } from 'lodash' import { isOpenRouterGeminiGenerateImageModel } from '../utils/image' diff --git a/src/renderer/src/aiCore/middleware/noThinkMiddleware.ts b/src/renderer/src/aiCore/middleware/noThinkMiddleware.ts index 9d7d933bc1..3e5624983c 100644 --- a/src/renderer/src/aiCore/middleware/noThinkMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/noThinkMiddleware.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { LanguageModelMiddleware } from 'ai' +import type { LanguageModelMiddleware } from 'ai' const logger = loggerService.withContext('noThinkMiddleware') diff --git a/src/renderer/src/aiCore/middleware/openrouterGenerateImageMiddleware.ts b/src/renderer/src/aiCore/middleware/openrouterGenerateImageMiddleware.ts index 0110d9a4f0..792192b931 100644 --- a/src/renderer/src/aiCore/middleware/openrouterGenerateImageMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/openrouterGenerateImageMiddleware.ts @@ -1,4 +1,4 @@ -import { LanguageModelMiddleware } from 'ai' +import type { LanguageModelMiddleware } from 'ai' /** * Returns a LanguageModelMiddleware that ensures the OpenRouter provider is configured to support both diff --git a/src/renderer/src/aiCore/middleware/qwenThinkingMiddleware.ts b/src/renderer/src/aiCore/middleware/qwenThinkingMiddleware.ts index 34515a42c9..931831a1c6 100644 --- a/src/renderer/src/aiCore/middleware/qwenThinkingMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/qwenThinkingMiddleware.ts @@ -1,4 +1,4 @@ -import { LanguageModelMiddleware } from 'ai' +import type { LanguageModelMiddleware } from 'ai' /** * Qwen Thinking Middleware diff --git a/src/renderer/src/aiCore/middleware/toolChoiceMiddleware.ts b/src/renderer/src/aiCore/middleware/toolChoiceMiddleware.ts index 6d3ba37d1d..7bb00aff55 100644 --- a/src/renderer/src/aiCore/middleware/toolChoiceMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/toolChoiceMiddleware.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { LanguageModelMiddleware } from 'ai' +import type { LanguageModelMiddleware } from 'ai' const logger = loggerService.withContext('toolChoiceMiddleware') diff --git a/src/renderer/src/aiCore/plugins/PluginBuilder.ts b/src/renderer/src/aiCore/plugins/PluginBuilder.ts index c249142330..eb46eb7524 100644 --- a/src/renderer/src/aiCore/plugins/PluginBuilder.ts +++ b/src/renderer/src/aiCore/plugins/PluginBuilder.ts @@ -1,10 +1,10 @@ -import { AiPlugin } from '@cherrystudio/ai-core' +import type { AiPlugin } from '@cherrystudio/ai-core' import { createPromptToolUsePlugin, webSearchPlugin } from '@cherrystudio/ai-core/built-in/plugins' import { loggerService } from '@logger' import { getEnableDeveloperMode } from '@renderer/hooks/useSettings' -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' -import { AiSdkMiddlewareConfig } from '../middleware/AiSdkMiddlewareBuilder' +import type { AiSdkMiddlewareConfig } from '../middleware/AiSdkMiddlewareBuilder' import { searchOrchestrationPlugin } from './searchOrchestrationPlugin' import { createTelemetryPlugin } from './telemetryPlugin' diff --git a/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts b/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts index 7e662ddee6..6be577f194 100644 --- a/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts +++ b/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts @@ -18,7 +18,8 @@ import { getDefaultModel, getProviderByModel } from '@renderer/services/Assistan import store from '@renderer/store' import { selectCurrentUserId, selectGlobalMemoryEnabled, selectMemoryConfig } from '@renderer/store/memory' import type { Assistant } from '@renderer/types' -import { extractInfoFromXML, ExtractResults } from '@renderer/utils/extract' +import type { ExtractResults } from '@renderer/utils/extract' +import { extractInfoFromXML } from '@renderer/utils/extract' import type { LanguageModel, ModelMessage } from 'ai' import { generateText } from 'ai' import { isEmpty } from 'lodash' diff --git a/src/renderer/src/aiCore/plugins/telemetryPlugin.ts b/src/renderer/src/aiCore/plugins/telemetryPlugin.ts index 0f06091c5a..485d339d25 100644 --- a/src/renderer/src/aiCore/plugins/telemetryPlugin.ts +++ b/src/renderer/src/aiCore/plugins/telemetryPlugin.ts @@ -8,10 +8,11 @@ import { definePlugin } from '@cherrystudio/ai-core' import { loggerService } from '@logger' -import { Context, context as otelContext, Span, SpanContext, trace, Tracer } from '@opentelemetry/api' +import type { Context, Span, SpanContext, Tracer } from '@opentelemetry/api' +import { context as otelContext, trace } from '@opentelemetry/api' import { currentSpan } from '@renderer/services/SpanManagerService' import { webTraceService } from '@renderer/services/WebTraceService' -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' import { AiSdkSpanAdapter } from '../trace/AiSdkSpanAdapter' diff --git a/src/renderer/src/aiCore/prepareParams/fileProcessor.ts b/src/renderer/src/aiCore/prepareParams/fileProcessor.ts index 49048122c2..5ee8812238 100644 --- a/src/renderer/src/aiCore/prepareParams/fileProcessor.ts +++ b/src/renderer/src/aiCore/prepareParams/fileProcessor.ts @@ -8,7 +8,7 @@ import { loggerService } from '@logger' import { getProviderByModel } from '@renderer/services/AssistantService' import type { FileMetadata, Message, Model } from '@renderer/types' import { FileTypes } from '@renderer/types' -import { FileMessageBlock } from '@renderer/types/newMessage' +import type { FileMessageBlock } from '@renderer/types/newMessage' import { findFileBlocks } from '@renderer/utils/messageUtils/find' import type { FilePart, TextPart } from 'ai' diff --git a/src/renderer/src/aiCore/prepareParams/messageConverter.ts b/src/renderer/src/aiCore/prepareParams/messageConverter.ts index 46cacb5b74..72f387d9a4 100644 --- a/src/renderer/src/aiCore/prepareParams/messageConverter.ts +++ b/src/renderer/src/aiCore/prepareParams/messageConverter.ts @@ -6,7 +6,7 @@ import { loggerService } from '@logger' import { isImageEnhancementModel, isVisionModel } from '@renderer/config/models' import type { Message, Model } from '@renderer/types' -import { FileMessageBlock, ImageMessageBlock, ThinkingMessageBlock } from '@renderer/types/newMessage' +import type { FileMessageBlock, ImageMessageBlock, ThinkingMessageBlock } from '@renderer/types/newMessage' import { findFileBlocks, findImageBlocks, diff --git a/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts b/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts index c693ed235d..d3fa1cb654 100644 --- a/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts +++ b/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts @@ -7,7 +7,7 @@ import { anthropic } from '@ai-sdk/anthropic' import { google } from '@ai-sdk/google' import { vertexAnthropic } from '@ai-sdk/google-vertex/anthropic/edge' import { vertex } from '@ai-sdk/google-vertex/edge' -import { WebSearchPluginConfig } from '@cherrystudio/ai-core/built-in/plugins' +import type { WebSearchPluginConfig } from '@cherrystudio/ai-core/built-in/plugins' import { isBaseProvider } from '@cherrystudio/ai-core/core/providers/schemas' import { loggerService } from '@logger' import { @@ -21,7 +21,7 @@ import { } from '@renderer/config/models' import { getAssistantSettings, getDefaultModel } from '@renderer/services/AssistantService' import store from '@renderer/store' -import { CherryWebSearchConfig } from '@renderer/store/websearch' +import type { CherryWebSearchConfig } from '@renderer/store/websearch' import { type Assistant, type MCPTool, type Provider } from '@renderer/types' import type { StreamTextParams } from '@renderer/types/aiCoreTypes' import { mapRegexToPatterns } from '@renderer/utils/blacklistMatchPattern' diff --git a/src/renderer/src/aiCore/provider/config/aihubmix.ts b/src/renderer/src/aiCore/provider/config/aihubmix.ts index 819e9cd28b..432be5ee31 100644 --- a/src/renderer/src/aiCore/provider/config/aihubmix.ts +++ b/src/renderer/src/aiCore/provider/config/aihubmix.ts @@ -2,7 +2,7 @@ * AiHubMix规则集 */ import { isOpenAILLMModel } from '@renderer/config/models' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { provider2Provider, startsWith } from './helper' import type { RuleSet } from './types' diff --git a/src/renderer/src/aiCore/provider/config/newApi.ts b/src/renderer/src/aiCore/provider/config/newApi.ts index 5277495cdb..97de62597d 100644 --- a/src/renderer/src/aiCore/provider/config/newApi.ts +++ b/src/renderer/src/aiCore/provider/config/newApi.ts @@ -1,7 +1,7 @@ /** * NewAPI规则集 */ -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { endpointIs, provider2Provider } from './helper' import type { RuleSet } from './types' diff --git a/src/renderer/src/aiCore/provider/factory.ts b/src/renderer/src/aiCore/provider/factory.ts index 62211100fe..4cdbfb6d40 100644 --- a/src/renderer/src/aiCore/provider/factory.ts +++ b/src/renderer/src/aiCore/provider/factory.ts @@ -1,7 +1,7 @@ import { hasProviderConfigByAlias, type ProviderId, resolveProviderConfigId } from '@cherrystudio/ai-core/provider' import { createProvider as createProviderCore } from '@cherrystudio/ai-core/provider' import { loggerService } from '@logger' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import type { Provider as AiSdkProvider } from 'ai' import { initializeNewProviders } from './providerInitialization' diff --git a/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts b/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts index f3a4761894..9a1a94f891 100644 --- a/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts +++ b/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts @@ -1,7 +1,7 @@ import { REFERENCE_PROMPT } from '@renderer/config/prompts' import { processKnowledgeSearch } from '@renderer/services/KnowledgeService' import type { Assistant, KnowledgeReference } from '@renderer/types' -import { ExtractResults, KnowledgeExtractResults } from '@renderer/utils/extract' +import type { ExtractResults, KnowledgeExtractResults } from '@renderer/utils/extract' import { type InferToolInput, type InferToolOutput, tool } from 'ai' import { isEmpty } from 'lodash' import * as z from 'zod' diff --git a/src/renderer/src/aiCore/tools/WebSearchTool.ts b/src/renderer/src/aiCore/tools/WebSearchTool.ts index 61d5d3b2c1..9545b64be7 100644 --- a/src/renderer/src/aiCore/tools/WebSearchTool.ts +++ b/src/renderer/src/aiCore/tools/WebSearchTool.ts @@ -1,7 +1,7 @@ import { REFERENCE_PROMPT } from '@renderer/config/prompts' import WebSearchService from '@renderer/services/WebSearchService' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' -import { ExtractResults } from '@renderer/utils/extract' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { ExtractResults } from '@renderer/utils/extract' import { type InferToolInput, type InferToolOutput, tool } from 'ai' import * as z from 'zod' diff --git a/src/renderer/src/aiCore/trace/AiSdkSpanAdapter.ts b/src/renderer/src/aiCore/trace/AiSdkSpanAdapter.ts index fc844b5fe5..732397de40 100644 --- a/src/renderer/src/aiCore/trace/AiSdkSpanAdapter.ts +++ b/src/renderer/src/aiCore/trace/AiSdkSpanAdapter.ts @@ -6,8 +6,9 @@ */ import { loggerService } from '@logger' -import { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' -import { Span, SpanKind, SpanStatusCode } from '@opentelemetry/api' +import type { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' +import type { Span } from '@opentelemetry/api' +import { SpanKind, SpanStatusCode } from '@opentelemetry/api' const logger = loggerService.withContext('AiSdkSpanAdapter') diff --git a/src/renderer/src/aiCore/utils/image.ts b/src/renderer/src/aiCore/utils/image.ts index 43d916640a..37dbe76a2c 100644 --- a/src/renderer/src/aiCore/utils/image.ts +++ b/src/renderer/src/aiCore/utils/image.ts @@ -1,4 +1,5 @@ -import { isSystemProvider, Model, Provider, SystemProviderIds } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' +import { isSystemProvider, SystemProviderIds } from '@renderer/types' export function buildGeminiGenerateImageParams(): Record { return { diff --git a/src/renderer/src/aiCore/utils/mcp.ts b/src/renderer/src/aiCore/utils/mcp.ts index 9606d9ea6e..84bc661aa0 100644 --- a/src/renderer/src/aiCore/utils/mcp.ts +++ b/src/renderer/src/aiCore/utils/mcp.ts @@ -1,10 +1,10 @@ import { loggerService } from '@logger' -import { MCPTool, MCPToolResponse } from '@renderer/types' +import type { MCPTool, MCPToolResponse } from '@renderer/types' import { callMCPTool, getMcpServerByTool, isToolAutoApproved } from '@renderer/utils/mcp-tools' import { requestToolConfirmation } from '@renderer/utils/userConfirmation' import { type Tool, type ToolSet } from 'ai' import { jsonSchema, tool } from 'ai' -import { JSONSchema7 } from 'json-schema' +import type { JSONSchema7 } from 'json-schema' const logger = loggerService.withContext('MCP-utils') diff --git a/src/renderer/src/aiCore/utils/options.ts b/src/renderer/src/aiCore/utils/options.ts index 087a9ef157..eaf4764c70 100644 --- a/src/renderer/src/aiCore/utils/options.ts +++ b/src/renderer/src/aiCore/utils/options.ts @@ -2,15 +2,13 @@ import { baseProviderIdSchema, customProviderIdSchema } from '@cherrystudio/ai-c import { isOpenAIModel, isQwenMTModel, isSupportFlexServiceTierModel } from '@renderer/config/models' import { isSupportServiceTierProvider } from '@renderer/config/providers' import { mapLanguageToQwenMTModel } from '@renderer/config/translate' +import type { Assistant, Model, Provider } from '@renderer/types' import { - Assistant, GroqServiceTiers, isGroqServiceTier, isOpenAIServiceTier, isTranslateAssistant, - Model, OpenAIServiceTiers, - Provider, SystemProviderIds } from '@renderer/types' import { t } from 'i18next' diff --git a/src/renderer/src/aiCore/utils/reasoning.ts b/src/renderer/src/aiCore/utils/reasoning.ts index 86a762897f..0246ac31cb 100644 --- a/src/renderer/src/aiCore/utils/reasoning.ts +++ b/src/renderer/src/aiCore/utils/reasoning.ts @@ -30,9 +30,10 @@ import { import { isSupportEnableThinkingProvider } from '@renderer/config/providers' import { getStoreSetting } from '@renderer/hooks/useSettings' import { getAssistantSettings, getProviderByModel } from '@renderer/services/AssistantService' -import { SettingsState } from '@renderer/store/settings' -import { Assistant, EFFORT_RATIO, isSystemProvider, Model, SystemProviderIds } from '@renderer/types' -import { ReasoningEffortOptionalParams } from '@renderer/types/sdk' +import type { SettingsState } from '@renderer/store/settings' +import type { Assistant, Model } from '@renderer/types' +import { EFFORT_RATIO, isSystemProvider, SystemProviderIds } from '@renderer/types' +import type { ReasoningEffortOptionalParams } from '@renderer/types/sdk' import { toInteger } from 'lodash' const logger = loggerService.withContext('reasoning') diff --git a/src/renderer/src/aiCore/utils/websearch.ts b/src/renderer/src/aiCore/utils/websearch.ts index 0ab41d5ad3..fde4ff534d 100644 --- a/src/renderer/src/aiCore/utils/websearch.ts +++ b/src/renderer/src/aiCore/utils/websearch.ts @@ -1,12 +1,12 @@ -import { +import type { AnthropicSearchConfig, OpenAISearchConfig, WebSearchPluginConfig } from '@cherrystudio/ai-core/core/plugins/built-in/webSearchPlugin/helper' -import { BaseProviderId } from '@cherrystudio/ai-core/provider' +import type { BaseProviderId } from '@cherrystudio/ai-core/provider' import { isOpenAIDeepResearchModel, isOpenAIWebSearchChatCompletionOnlyModel } from '@renderer/config/models' -import { CherryWebSearchConfig } from '@renderer/store/websearch' -import { Model } from '@renderer/types' +import type { CherryWebSearchConfig } from '@renderer/store/websearch' +import type { Model } from '@renderer/types' import { mapRegexToPatterns } from '@renderer/utils/blacklistMatchPattern' export function getWebSearchParams(model: Model): Record { diff --git a/src/renderer/src/api/agent.ts b/src/renderer/src/api/agent.ts index ecc772464d..cc997e77b5 100644 --- a/src/renderer/src/api/agent.ts +++ b/src/renderer/src/api/agent.ts @@ -1,37 +1,40 @@ import { loggerService } from '@logger' import { formatAgentServerError } from '@renderer/utils/error' -import { +import type { AddAgentForm, - AgentServerErrorSchema, ApiModelsFilter, ApiModelsResponse, - ApiModelsResponseSchema, CreateAgentRequest, CreateAgentResponse, - CreateAgentResponseSchema, CreateAgentSessionResponse, - CreateAgentSessionResponseSchema, CreateSessionForm, CreateSessionRequest, GetAgentResponse, - GetAgentResponseSchema, GetAgentSessionResponse, - GetAgentSessionResponseSchema, ListAgentSessionsResponse, - ListAgentSessionsResponseSchema, - type ListAgentsResponse, - ListAgentsResponseSchema, ListOptions, - objectEntries, - objectKeys, UpdateAgentForm, UpdateAgentRequest, UpdateAgentResponse, - UpdateAgentResponseSchema, UpdateSessionForm, UpdateSessionRequest } from '@types' -import axios, { Axios, AxiosRequestConfig, isAxiosError } from 'axios' +import { + AgentServerErrorSchema, + ApiModelsResponseSchema, + CreateAgentResponseSchema, + CreateAgentSessionResponseSchema, + GetAgentResponseSchema, + GetAgentSessionResponseSchema, + ListAgentSessionsResponseSchema, + type ListAgentsResponse, + ListAgentsResponseSchema, + objectEntries, + objectKeys, + UpdateAgentResponseSchema +} from '@types' +import type { Axios, AxiosRequestConfig } from 'axios' +import axios, { isAxiosError } from 'axios' import { ZodError } from 'zod' type ApiVersion = 'v1' diff --git a/src/renderer/src/components/ActionTools/__tests__/useToolManager.test.ts b/src/renderer/src/components/ActionTools/__tests__/useToolManager.test.ts index 86ec67b760..d910a15796 100644 --- a/src/renderer/src/components/ActionTools/__tests__/useToolManager.test.ts +++ b/src/renderer/src/components/ActionTools/__tests__/useToolManager.test.ts @@ -1,4 +1,5 @@ -import { ActionTool, useToolManager } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' +import { useToolManager } from '@renderer/components/ActionTools' import { act, renderHook } from '@testing-library/react' import { useState } from 'react' import { describe, expect, it } from 'vitest' diff --git a/src/renderer/src/components/ActionTools/constants.ts b/src/renderer/src/components/ActionTools/constants.ts index c2b4966e5f..bade7d123a 100644 --- a/src/renderer/src/components/ActionTools/constants.ts +++ b/src/renderer/src/components/ActionTools/constants.ts @@ -1,4 +1,4 @@ -import { ActionToolSpec } from './types' +import type { ActionToolSpec } from './types' export const TOOL_SPECS: Record = { // Core tools diff --git a/src/renderer/src/components/ActionTools/hooks/useImageTools.tsx b/src/renderer/src/components/ActionTools/hooks/useImageTools.tsx index 3481b92797..f998470403 100644 --- a/src/renderer/src/components/ActionTools/hooks/useImageTools.tsx +++ b/src/renderer/src/components/ActionTools/hooks/useImageTools.tsx @@ -3,7 +3,8 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { ImagePreviewService } from '@renderer/services/ImagePreviewService' import { download as downloadFile } from '@renderer/utils/download' import { svgToPngBlob, svgToSvgBlob } from '@renderer/utils/image' -import { RefObject, useCallback, useEffect, useRef } from 'react' +import type { RefObject } from 'react' +import { useCallback, useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' const logger = loggerService.withContext('usePreviewToolHandlers') diff --git a/src/renderer/src/components/ActionTools/hooks/useToolManager.ts b/src/renderer/src/components/ActionTools/hooks/useToolManager.ts index ae73fcdb5d..b3d85aaa2f 100644 --- a/src/renderer/src/components/ActionTools/hooks/useToolManager.ts +++ b/src/renderer/src/components/ActionTools/hooks/useToolManager.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' -import { ActionTool, ToolRegisterProps } from '../types' +import type { ActionTool, ToolRegisterProps } from '../types' export const useToolManager = (setTools?: ToolRegisterProps['setTools']) => { // 注册工具,如果已存在同ID工具则替换 diff --git a/src/renderer/src/components/ApiModelLabel.tsx b/src/renderer/src/components/ApiModelLabel.tsx index c101689ff9..3e36083a69 100644 --- a/src/renderer/src/components/ApiModelLabel.tsx +++ b/src/renderer/src/components/ApiModelLabel.tsx @@ -1,6 +1,6 @@ import { Avatar, cn } from '@heroui/react' import { getModelLogoById } from '@renderer/config/models' -import { ApiModel } from '@renderer/types' +import type { ApiModel } from '@renderer/types' import React from 'react' import Ellipsis from './Ellipsis' diff --git a/src/renderer/src/components/Avatar/ModelAvatar.tsx b/src/renderer/src/components/Avatar/ModelAvatar.tsx index 04e8615fbb..ef4f37c2d1 100644 --- a/src/renderer/src/components/Avatar/ModelAvatar.tsx +++ b/src/renderer/src/components/Avatar/ModelAvatar.tsx @@ -1,8 +1,9 @@ import { getModelLogo } from '@renderer/config/models' -import { Model } from '@renderer/types' -import { Avatar, AvatarProps } from 'antd' +import type { Model } from '@renderer/types' +import type { AvatarProps } from 'antd' +import { Avatar } from 'antd' import { first } from 'lodash' -import { FC } from 'react' +import type { FC } from 'react' interface Props { model?: Model diff --git a/src/renderer/src/components/Buttons/ActionIconButton.tsx b/src/renderer/src/components/Buttons/ActionIconButton.tsx index 1448008090..9f5c98abf0 100644 --- a/src/renderer/src/components/Buttons/ActionIconButton.tsx +++ b/src/renderer/src/components/Buttons/ActionIconButton.tsx @@ -1,5 +1,6 @@ import { cn } from '@heroui/react' -import { Button, ButtonProps } from 'antd' +import type { ButtonProps } from 'antd' +import { Button } from 'antd' import React, { memo } from 'react' interface ActionIconButtonProps extends ButtonProps { diff --git a/src/renderer/src/components/CodeBlockView/HtmlArtifactsCard.tsx b/src/renderer/src/components/CodeBlockView/HtmlArtifactsCard.tsx index 9f5ab59988..8751382044 100644 --- a/src/renderer/src/components/CodeBlockView/HtmlArtifactsCard.tsx +++ b/src/renderer/src/components/CodeBlockView/HtmlArtifactsCard.tsx @@ -1,11 +1,12 @@ import { CodeOutlined } from '@ant-design/icons' import { loggerService } from '@logger' import { useTheme } from '@renderer/context/ThemeProvider' -import { ThemeMode } from '@renderer/types' +import type { ThemeMode } from '@renderer/types' import { extractHtmlTitle, getFileNameFromHtmlTitle } from '@renderer/utils/formats' import { Button } from 'antd' import { Code, DownloadIcon, Globe, LinkIcon, Sparkles } from 'lucide-react' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { ClipLoader } from 'react-spinners' import styled, { keyframes } from 'styled-components' diff --git a/src/renderer/src/components/CodeBlockView/HtmlArtifactsPopup.tsx b/src/renderer/src/components/CodeBlockView/HtmlArtifactsPopup.tsx index 9453866f20..2cd8171d08 100644 --- a/src/renderer/src/components/CodeBlockView/HtmlArtifactsPopup.tsx +++ b/src/renderer/src/components/CodeBlockView/HtmlArtifactsPopup.tsx @@ -1,4 +1,5 @@ -import CodeEditor, { CodeEditorHandles } from '@renderer/components/CodeEditor' +import type { CodeEditorHandles } from '@renderer/components/CodeEditor' +import CodeEditor from '@renderer/components/CodeEditor' import { CopyIcon, FilePngIcon } from '@renderer/components/Icons' import { isMac } from '@renderer/config/constant' import { useTemporaryValue } from '@renderer/hooks/useTemporaryValue' diff --git a/src/renderer/src/components/CodeBlockView/StatusBar.tsx b/src/renderer/src/components/CodeBlockView/StatusBar.tsx index defd070ac8..72589b9045 100644 --- a/src/renderer/src/components/CodeBlockView/StatusBar.tsx +++ b/src/renderer/src/components/CodeBlockView/StatusBar.tsx @@ -1,5 +1,6 @@ import { Flex } from 'antd' -import { FC, memo, ReactNode } from 'react' +import type { FC, ReactNode } from 'react' +import { memo } from 'react' import styled from 'styled-components' interface Props { diff --git a/src/renderer/src/components/CodeBlockView/view.tsx b/src/renderer/src/components/CodeBlockView/view.tsx index 939095262e..2ba94d0ef2 100644 --- a/src/renderer/src/components/CodeBlockView/view.tsx +++ b/src/renderer/src/components/CodeBlockView/view.tsx @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import { ActionTool } from '@renderer/components/ActionTools' -import CodeEditor, { CodeEditorHandles } from '@renderer/components/CodeEditor' +import type { ActionTool } from '@renderer/components/ActionTools' +import type { CodeEditorHandles } from '@renderer/components/CodeEditor' +import CodeEditor from '@renderer/components/CodeEditor' import { CodeToolbar, useCopyTool, @@ -14,7 +15,7 @@ import { } from '@renderer/components/CodeToolbar' import CodeViewer from '@renderer/components/CodeViewer' import ImageViewer from '@renderer/components/ImageViewer' -import { BasicPreviewHandles } from '@renderer/components/Preview' +import type { BasicPreviewHandles } from '@renderer/components/Preview' import { MAX_COLLAPSED_CODE_HEIGHT } from '@renderer/config/constant' import { useSettings } from '@renderer/hooks/useSettings' import { pyodideService } from '@renderer/services/PyodideService' @@ -27,7 +28,7 @@ import styled, { css } from 'styled-components' import { SPECIAL_VIEW_COMPONENTS, SPECIAL_VIEWS } from './constants' import StatusBar from './StatusBar' -import { ViewMode } from './types' +import type { ViewMode } from './types' const logger = loggerService.withContext('CodeBlockView') diff --git a/src/renderer/src/components/CodeEditor/hooks.ts b/src/renderer/src/components/CodeEditor/hooks.ts index 65c18a5a0f..b502c6e9da 100644 --- a/src/renderer/src/components/CodeEditor/hooks.ts +++ b/src/renderer/src/components/CodeEditor/hooks.ts @@ -1,7 +1,8 @@ import { linter } from '@codemirror/lint' // statically imported by @uiw/codemirror-extensions-basic-setup import { EditorView } from '@codemirror/view' import { loggerService } from '@logger' -import { Extension, keymap } from '@uiw/react-codemirror' +import type { Extension } from '@uiw/react-codemirror' +import { keymap } from '@uiw/react-codemirror' import { useCallback, useEffect, useMemo, useState } from 'react' import { getNormalizedExtension } from './utils' diff --git a/src/renderer/src/components/CodeEditor/index.tsx b/src/renderer/src/components/CodeEditor/index.tsx index 31c4ce798c..128e1b1fe4 100644 --- a/src/renderer/src/components/CodeEditor/index.tsx +++ b/src/renderer/src/components/CodeEditor/index.tsx @@ -1,6 +1,7 @@ import { useCodeStyle } from '@renderer/context/CodeStyleProvider' import { useSettings } from '@renderer/hooks/useSettings' -import CodeMirror, { Annotation, BasicSetupOptions, EditorView, Extension } from '@uiw/react-codemirror' +import type { BasicSetupOptions, Extension } from '@uiw/react-codemirror' +import CodeMirror, { Annotation, EditorView } from '@uiw/react-codemirror' import diff from 'fast-diff' import { useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react' import { memo } from 'react' diff --git a/src/renderer/src/components/CodeToolbar/__tests__/CodeToolButton.test.tsx b/src/renderer/src/components/CodeToolbar/__tests__/CodeToolButton.test.tsx index 045d242158..2a5f43f7f1 100644 --- a/src/renderer/src/components/CodeToolbar/__tests__/CodeToolButton.test.tsx +++ b/src/renderer/src/components/CodeToolbar/__tests__/CodeToolButton.test.tsx @@ -1,4 +1,4 @@ -import { ActionTool } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' import { fireEvent, render, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/CodeToolbar/__tests__/CodeToolbar.test.tsx b/src/renderer/src/components/CodeToolbar/__tests__/CodeToolbar.test.tsx index 5c38de461b..4f75409c8a 100644 --- a/src/renderer/src/components/CodeToolbar/__tests__/CodeToolbar.test.tsx +++ b/src/renderer/src/components/CodeToolbar/__tests__/CodeToolbar.test.tsx @@ -1,4 +1,4 @@ -import { ActionTool } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' import { fireEvent, render, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/CodeToolbar/__tests__/useCopyTool.test.tsx b/src/renderer/src/components/CodeToolbar/__tests__/useCopyTool.test.tsx index 2b39950eab..67c8cc48f3 100644 --- a/src/renderer/src/components/CodeToolbar/__tests__/useCopyTool.test.tsx +++ b/src/renderer/src/components/CodeToolbar/__tests__/useCopyTool.test.tsx @@ -1,5 +1,5 @@ import { useCopyTool } from '@renderer/components/CodeToolbar/hooks/useCopyTool' -import { BasicPreviewHandles } from '@renderer/components/Preview' +import type { BasicPreviewHandles } from '@renderer/components/Preview' import { act, renderHook } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/CodeToolbar/__tests__/useDownloadTool.test.tsx b/src/renderer/src/components/CodeToolbar/__tests__/useDownloadTool.test.tsx index 0181dfc5fe..0cc5d8c4ee 100644 --- a/src/renderer/src/components/CodeToolbar/__tests__/useDownloadTool.test.tsx +++ b/src/renderer/src/components/CodeToolbar/__tests__/useDownloadTool.test.tsx @@ -1,5 +1,5 @@ import { useDownloadTool } from '@renderer/components/CodeToolbar/hooks/useDownloadTool' -import { BasicPreviewHandles } from '@renderer/components/Preview' +import type { BasicPreviewHandles } from '@renderer/components/Preview' import { act, renderHook } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/CodeToolbar/__tests__/useSplitViewTool.test.tsx b/src/renderer/src/components/CodeToolbar/__tests__/useSplitViewTool.test.tsx index fbe52bbb35..ef408c562f 100644 --- a/src/renderer/src/components/CodeToolbar/__tests__/useSplitViewTool.test.tsx +++ b/src/renderer/src/components/CodeToolbar/__tests__/useSplitViewTool.test.tsx @@ -1,4 +1,4 @@ -import { ViewMode } from '@renderer/components/CodeBlockView/types' +import type { ViewMode } from '@renderer/components/CodeBlockView/types' import { useSplitViewTool } from '@renderer/components/CodeToolbar/hooks/useSplitViewTool' import { act, renderHook } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/CodeToolbar/__tests__/useViewSourceTool.test.tsx b/src/renderer/src/components/CodeToolbar/__tests__/useViewSourceTool.test.tsx index 9bac34c57a..a35a063426 100644 --- a/src/renderer/src/components/CodeToolbar/__tests__/useViewSourceTool.test.tsx +++ b/src/renderer/src/components/CodeToolbar/__tests__/useViewSourceTool.test.tsx @@ -1,4 +1,4 @@ -import { ViewMode } from '@renderer/components/CodeBlockView/types' +import type { ViewMode } from '@renderer/components/CodeBlockView/types' import { useViewSourceTool } from '@renderer/components/CodeToolbar/hooks/useViewSourceTool' import { act, renderHook } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/CodeToolbar/button.tsx b/src/renderer/src/components/CodeToolbar/button.tsx index 1488752726..874407aed8 100644 --- a/src/renderer/src/components/CodeToolbar/button.tsx +++ b/src/renderer/src/components/CodeToolbar/button.tsx @@ -1,4 +1,4 @@ -import { ActionTool } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' import { Dropdown, Tooltip } from 'antd' import { memo, useMemo } from 'react' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useCopyTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useCopyTool.tsx index ea928df4fd..0f5d3f08e8 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useCopyTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useCopyTool.tsx @@ -1,6 +1,7 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' import { CopyIcon } from '@renderer/components/Icons' -import { BasicPreviewHandles } from '@renderer/components/Preview' +import type { BasicPreviewHandles } from '@renderer/components/Preview' import { useTemporaryValue } from '@renderer/hooks/useTemporaryValue' import { Check, Image } from 'lucide-react' import { useCallback, useEffect } from 'react' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useDownloadTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useDownloadTool.tsx index 397c51c921..835c01efbb 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useDownloadTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useDownloadTool.tsx @@ -1,6 +1,7 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' import { FilePngIcon, FileSvgIcon } from '@renderer/components/Icons' -import { BasicPreviewHandles } from '@renderer/components/Preview' +import type { BasicPreviewHandles } from '@renderer/components/Preview' import { Download, FileCode } from 'lucide-react' import { useEffect } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useExpandTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useExpandTool.tsx index 6428a9c543..0cf2e25008 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useExpandTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useExpandTool.tsx @@ -1,4 +1,5 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' import { ChevronsDownUp, ChevronsUpDown } from 'lucide-react' import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useRunTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useRunTool.tsx index 4c46681a4d..0da586d4cf 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useRunTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useRunTool.tsx @@ -1,4 +1,5 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' import { LoadingIcon } from '@renderer/components/Icons' import { CirclePlay } from 'lucide-react' import { useEffect } from 'react' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useSaveTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useSaveTool.tsx index c847b6ca90..62895bbdd4 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useSaveTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useSaveTool.tsx @@ -1,5 +1,6 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' -import { CodeEditorHandles } from '@renderer/components/CodeEditor' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { CodeEditorHandles } from '@renderer/components/CodeEditor' import { useTemporaryValue } from '@renderer/hooks/useTemporaryValue' import { Check, SaveIcon } from 'lucide-react' import { useCallback, useEffect } from 'react' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useSplitViewTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useSplitViewTool.tsx index 63367d692f..64b3c0af44 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useSplitViewTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useSplitViewTool.tsx @@ -1,5 +1,6 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' -import { ViewMode } from '@renderer/components/CodeBlockView/types' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { ViewMode } from '@renderer/components/CodeBlockView/types' import { Square, SquareSplitHorizontal } from 'lucide-react' import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useViewSourceTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useViewSourceTool.tsx index a3a6da0152..fa6d71ea67 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useViewSourceTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useViewSourceTool.tsx @@ -1,5 +1,6 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' -import { ViewMode } from '@renderer/components/CodeBlockView/types' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { ViewMode } from '@renderer/components/CodeBlockView/types' import { CodeXml, Eye, SquarePen } from 'lucide-react' import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/CodeToolbar/hooks/useWrapTool.tsx b/src/renderer/src/components/CodeToolbar/hooks/useWrapTool.tsx index bea1e4a5b5..d4bfa6e273 100644 --- a/src/renderer/src/components/CodeToolbar/hooks/useWrapTool.tsx +++ b/src/renderer/src/components/CodeToolbar/hooks/useWrapTool.tsx @@ -1,4 +1,5 @@ -import { ActionTool, TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' +import { TOOL_SPECS, useToolManager } from '@renderer/components/ActionTools' import { Text as UnWrapIcon, WrapText as WrapIcon } from 'lucide-react' import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/CodeToolbar/toolbar.tsx b/src/renderer/src/components/CodeToolbar/toolbar.tsx index 7b17a6f0e8..7b78d8e536 100644 --- a/src/renderer/src/components/CodeToolbar/toolbar.tsx +++ b/src/renderer/src/components/CodeToolbar/toolbar.tsx @@ -1,4 +1,4 @@ -import { ActionTool } from '@renderer/components/ActionTools' +import type { ActionTool } from '@renderer/components/ActionTools' import { HStack } from '@renderer/components/Layout' import { Tooltip } from 'antd' import { EllipsisVertical } from 'lucide-react' diff --git a/src/renderer/src/components/CodeViewer.tsx b/src/renderer/src/components/CodeViewer.tsx index ac7a14e0ac..af60633672 100644 --- a/src/renderer/src/components/CodeViewer.tsx +++ b/src/renderer/src/components/CodeViewer.tsx @@ -6,7 +6,7 @@ import { getReactStyleFromToken } from '@renderer/utils/shiki' import { useVirtualizer } from '@tanstack/react-virtual' import { debounce } from 'lodash' import React, { memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react' -import { ThemedToken } from 'shiki/core' +import type { ThemedToken } from 'shiki/core' import styled from 'styled-components' interface CodeViewerProps { diff --git a/src/renderer/src/components/CollapsibleSearchBar.tsx b/src/renderer/src/components/CollapsibleSearchBar.tsx index 04b838e37a..2b7eb1e277 100644 --- a/src/renderer/src/components/CollapsibleSearchBar.tsx +++ b/src/renderer/src/components/CollapsibleSearchBar.tsx @@ -1,5 +1,6 @@ import i18n from '@renderer/i18n' -import { Input, InputRef, Tooltip } from 'antd' +import type { InputRef } from 'antd' +import { Input, Tooltip } from 'antd' import { Search } from 'lucide-react' import { motion } from 'motion/react' import React, { memo, useCallback, useEffect, useRef, useState } from 'react' diff --git a/src/renderer/src/components/ConfirmDialog.tsx b/src/renderer/src/components/ConfirmDialog.tsx index 3f2313b178..5ac0ae1273 100644 --- a/src/renderer/src/components/ConfirmDialog.tsx +++ b/src/renderer/src/components/ConfirmDialog.tsx @@ -1,6 +1,6 @@ import { Button } from '@heroui/react' import { CheckIcon, XIcon } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { createPortal } from 'react-dom' interface Props { diff --git a/src/renderer/src/components/CopyButton.tsx b/src/renderer/src/components/CopyButton.tsx index cfa80a02c5..173a1fddf8 100644 --- a/src/renderer/src/components/CopyButton.tsx +++ b/src/renderer/src/components/CopyButton.tsx @@ -1,6 +1,6 @@ import { Tooltip } from 'antd' import { Copy } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/CustomCollapse.tsx b/src/renderer/src/components/CustomCollapse.tsx index 8362d8a479..4e8e7a9494 100644 --- a/src/renderer/src/components/CustomCollapse.tsx +++ b/src/renderer/src/components/CustomCollapse.tsx @@ -1,7 +1,8 @@ import { Collapse } from 'antd' import { merge } from 'lodash' import { ChevronRight } from 'lucide-react' -import { FC, memo, useMemo, useState } from 'react' +import type { FC } from 'react' +import { memo, useMemo, useState } from 'react' interface CustomCollapseProps { label: React.ReactNode diff --git a/src/renderer/src/components/DividerWithText.tsx b/src/renderer/src/components/DividerWithText.tsx index 764550381f..30f287e9f8 100644 --- a/src/renderer/src/components/DividerWithText.tsx +++ b/src/renderer/src/components/DividerWithText.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties } from 'react' +import type { CSSProperties } from 'react' +import React from 'react' import styled from 'styled-components' interface DividerWithTextProps { diff --git a/src/renderer/src/components/DraggableList/__tests__/useDraggableReorder.test.ts b/src/renderer/src/components/DraggableList/__tests__/useDraggableReorder.test.ts index a9ffd3d889..c2f566aad2 100644 --- a/src/renderer/src/components/DraggableList/__tests__/useDraggableReorder.test.ts +++ b/src/renderer/src/components/DraggableList/__tests__/useDraggableReorder.test.ts @@ -1,4 +1,4 @@ -import { DropResult } from '@hello-pangea/dnd' +import type { DropResult } from '@hello-pangea/dnd' import { act, renderHook } from '@testing-library/react' import { describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/DraggableList/list.tsx b/src/renderer/src/components/DraggableList/list.tsx index fbb5f29762..62a7c636c0 100644 --- a/src/renderer/src/components/DraggableList/list.tsx +++ b/src/renderer/src/components/DraggableList/list.tsx @@ -1,15 +1,14 @@ -import { - DragDropContext, - Draggable, - Droppable, +import type { DroppableProps, DropResult, OnDragEndResponder, OnDragStartResponder, ResponderProvided } from '@hello-pangea/dnd' +import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import { droppableReorder } from '@renderer/utils' -import { HTMLAttributes, Key, useCallback } from 'react' +import type { HTMLAttributes, Key } from 'react' +import { useCallback } from 'react' interface Props { list: T[] diff --git a/src/renderer/src/components/DraggableList/useDraggableReorder.ts b/src/renderer/src/components/DraggableList/useDraggableReorder.ts index 5438635cd6..7f7ed902cf 100644 --- a/src/renderer/src/components/DraggableList/useDraggableReorder.ts +++ b/src/renderer/src/components/DraggableList/useDraggableReorder.ts @@ -1,5 +1,6 @@ -import { DropResult } from '@hello-pangea/dnd' -import { Key, useCallback, useMemo } from 'react' +import type { DropResult } from '@hello-pangea/dnd' +import type { Key } from 'react' +import { useCallback, useMemo } from 'react' interface UseDraggableReorderParams { /** 原始的、完整的数据列表 */ diff --git a/src/renderer/src/components/DraggableList/virtual-list.tsx b/src/renderer/src/components/DraggableList/virtual-list.tsx index b2efe7c247..e6f08e4c71 100644 --- a/src/renderer/src/components/DraggableList/virtual-list.tsx +++ b/src/renderer/src/components/DraggableList/virtual-list.tsx @@ -1,13 +1,11 @@ -import { - DragDropContext, - Draggable, - Droppable, +import type { DroppableProps, DropResult, OnDragEndResponder, OnDragStartResponder, ResponderProvided } from '@hello-pangea/dnd' +import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import Scrollbar from '@renderer/components/Scrollbar' import { droppableReorder } from '@renderer/utils' import { type ScrollToOptions, useVirtualizer, type VirtualItem } from '@tanstack/react-virtual' diff --git a/src/renderer/src/components/EditableNumber/index.tsx b/src/renderer/src/components/EditableNumber/index.tsx index a428dfc04c..6102a3a897 100644 --- a/src/renderer/src/components/EditableNumber/index.tsx +++ b/src/renderer/src/components/EditableNumber/index.tsx @@ -1,5 +1,6 @@ import { InputNumber } from 'antd' -import { FC, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useRef, useState } from 'react' import styled from 'styled-components' export interface EditableNumberProps { diff --git a/src/renderer/src/components/EmojiIcon.tsx b/src/renderer/src/components/EmojiIcon.tsx index 6cd06b8715..e8a787c9b0 100644 --- a/src/renderer/src/components/EmojiIcon.tsx +++ b/src/renderer/src/components/EmojiIcon.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' interface EmojiIconProps { diff --git a/src/renderer/src/components/EmojiPicker/index.tsx b/src/renderer/src/components/EmojiPicker/index.tsx index 69ac7ccdaa..8ba9d3e967 100644 --- a/src/renderer/src/components/EmojiPicker/index.tsx +++ b/src/renderer/src/components/EmojiPicker/index.tsx @@ -1,7 +1,8 @@ import TwemojiCountryFlagsWoff2 from '@renderer/assets/fonts/country-flag-fonts/TwemojiCountryFlags.woff2?url' import { useTheme } from '@renderer/context/ThemeProvider' import { polyfillCountryFlagEmojis } from 'country-flag-emoji-polyfill' -import { FC, useEffect, useRef } from 'react' +import type { FC } from 'react' +import { useEffect, useRef } from 'react' interface Props { onEmojiClick: (emoji: string) => void diff --git a/src/renderer/src/components/ErrorBoundary.tsx b/src/renderer/src/components/ErrorBoundary.tsx index 1ee3967e9c..12e9ab5935 100644 --- a/src/renderer/src/components/ErrorBoundary.tsx +++ b/src/renderer/src/components/ErrorBoundary.tsx @@ -1,8 +1,9 @@ import { Button } from '@heroui/button' import { formatErrorMessage } from '@renderer/utils/error' import { Alert, Space } from 'antd' -import { ComponentType, ReactNode } from 'react' -import { ErrorBoundary, FallbackProps } from 'react-error-boundary' +import type { ComponentType, ReactNode } from 'react' +import type { FallbackProps } from 'react-error-boundary' +import { ErrorBoundary } from 'react-error-boundary' import { useTranslation } from 'react-i18next' import styled from 'styled-components' const DefaultFallback: ComponentType = (props: FallbackProps): ReactNode => { diff --git a/src/renderer/src/components/FreeTrialModelTag.tsx b/src/renderer/src/components/FreeTrialModelTag.tsx index 2e294d9303..ad142ae0cf 100644 --- a/src/renderer/src/components/FreeTrialModelTag.tsx +++ b/src/renderer/src/components/FreeTrialModelTag.tsx @@ -1,8 +1,8 @@ import { getProviderLabel } from '@renderer/i18n/label' import NavigationService from '@renderer/services/NavigationService' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { ArrowUpRight } from 'lucide-react' -import { FC, MouseEvent } from 'react' +import type { FC, MouseEvent } from 'react' import styled from 'styled-components' import IndicatorLight from './IndicatorLight' diff --git a/src/renderer/src/components/HealthStatusIndicator/indicator.tsx b/src/renderer/src/components/HealthStatusIndicator/indicator.tsx index 9dce1c21be..2807549e28 100644 --- a/src/renderer/src/components/HealthStatusIndicator/indicator.tsx +++ b/src/renderer/src/components/HealthStatusIndicator/indicator.tsx @@ -3,7 +3,7 @@ import { Flex, Tooltip, Typography } from 'antd' import React, { memo } from 'react' import styled from 'styled-components' -import { HealthResult } from './types' +import type { HealthResult } from './types' import { useHealthStatus } from './useHealthStatus' export interface HealthStatusIndicatorProps { diff --git a/src/renderer/src/components/HealthStatusIndicator/types.ts b/src/renderer/src/components/HealthStatusIndicator/types.ts index f87376b781..87bff48c1c 100644 --- a/src/renderer/src/components/HealthStatusIndicator/types.ts +++ b/src/renderer/src/components/HealthStatusIndicator/types.ts @@ -1,4 +1,4 @@ -import { HealthStatus } from '@renderer/types/healthCheck' +import type { HealthStatus } from '@renderer/types/healthCheck' /** * 用于展示单个健康检查结果的必要数据 diff --git a/src/renderer/src/components/HealthStatusIndicator/useHealthStatus.tsx b/src/renderer/src/components/HealthStatusIndicator/useHealthStatus.tsx index 456961c97f..1027324eeb 100644 --- a/src/renderer/src/components/HealthStatusIndicator/useHealthStatus.tsx +++ b/src/renderer/src/components/HealthStatusIndicator/useHealthStatus.tsx @@ -3,7 +3,7 @@ import { Flex } from 'antd' import React from 'react' import { useTranslation } from 'react-i18next' -import { HealthResult } from './types' +import type { HealthResult } from './types' interface UseHealthStatusProps { results: HealthResult[] diff --git a/src/renderer/src/components/HighlightText.tsx b/src/renderer/src/components/HighlightText.tsx index debf02c924..d24b9c607c 100644 --- a/src/renderer/src/components/HighlightText.tsx +++ b/src/renderer/src/components/HighlightText.tsx @@ -1,4 +1,5 @@ -import { FC, memo, useMemo } from 'react' +import type { FC } from 'react' +import { memo, useMemo } from 'react' interface HighlightTextProps { text: string diff --git a/src/renderer/src/components/Icons/FileIcons.tsx b/src/renderer/src/components/Icons/FileIcons.tsx index 0fbfcdebf5..fd095335a8 100644 --- a/src/renderer/src/components/Icons/FileIcons.tsx +++ b/src/renderer/src/components/Icons/FileIcons.tsx @@ -1,4 +1,4 @@ -import { CSSProperties, SVGProps } from 'react' +import type { CSSProperties, SVGProps } from 'react' interface BaseFileIconProps extends SVGProps { size?: string | number diff --git a/src/renderer/src/components/Icons/MinAppIcon.tsx b/src/renderer/src/components/Icons/MinAppIcon.tsx index 98974da745..58da46a723 100644 --- a/src/renderer/src/components/Icons/MinAppIcon.tsx +++ b/src/renderer/src/components/Icons/MinAppIcon.tsx @@ -1,6 +1,6 @@ import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' -import { MinAppType } from '@renderer/types' -import { FC } from 'react' +import type { MinAppType } from '@renderer/types' +import type { FC } from 'react' interface Props { app: MinAppType diff --git a/src/renderer/src/components/Icons/OcrIcon.tsx b/src/renderer/src/components/Icons/OcrIcon.tsx index 41367445a7..9f73867a0c 100644 --- a/src/renderer/src/components/Icons/OcrIcon.tsx +++ b/src/renderer/src/components/Icons/OcrIcon.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react' +import type { FC } from 'react' const OcrIcon: FC, HTMLElement>> = (props) => { return diff --git a/src/renderer/src/components/Icons/ReasoningIcon.tsx b/src/renderer/src/components/Icons/ReasoningIcon.tsx index 4f98f5735c..8d7aa94fed 100644 --- a/src/renderer/src/components/Icons/ReasoningIcon.tsx +++ b/src/renderer/src/components/Icons/ReasoningIcon.tsx @@ -1,5 +1,6 @@ import { Tooltip } from 'antd' -import React, { FC } from 'react' +import type { FC } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/Icons/SVGIcon.tsx b/src/renderer/src/components/Icons/SVGIcon.tsx index b17f7397c0..ad503f0e38 100644 --- a/src/renderer/src/components/Icons/SVGIcon.tsx +++ b/src/renderer/src/components/Icons/SVGIcon.tsx @@ -1,6 +1,6 @@ import { lightbulbVariants } from '@renderer/utils/motionVariants' import { motion } from 'motion/react' -import { SVGProps } from 'react' +import type { SVGProps } from 'react' export const StreamlineGoodHealthAndWellBeing = ( props: SVGProps & { diff --git a/src/renderer/src/components/Icons/SvgSpinners180Ring.tsx b/src/renderer/src/components/Icons/SvgSpinners180Ring.tsx index 6cebfa3332..7efa37a66f 100644 --- a/src/renderer/src/components/Icons/SvgSpinners180Ring.tsx +++ b/src/renderer/src/components/Icons/SvgSpinners180Ring.tsx @@ -1,4 +1,4 @@ -import { SVGProps } from 'react' +import type { SVGProps } from 'react' export function SvgSpinners180Ring(props: SVGProps & { size?: number | string }) { const { size = '1em', ...svgProps } = props diff --git a/src/renderer/src/components/Icons/ToolIcon.tsx b/src/renderer/src/components/Icons/ToolIcon.tsx index 69f8da260c..2d7b5d6146 100644 --- a/src/renderer/src/components/Icons/ToolIcon.tsx +++ b/src/renderer/src/components/Icons/ToolIcon.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react' +import type { FC } from 'react' const ToolIcon: FC, HTMLElement>> = (props) => { return diff --git a/src/renderer/src/components/Icons/ToolsCallingIcon.tsx b/src/renderer/src/components/Icons/ToolsCallingIcon.tsx index 7a591d2316..36b831e715 100644 --- a/src/renderer/src/components/Icons/ToolsCallingIcon.tsx +++ b/src/renderer/src/components/Icons/ToolsCallingIcon.tsx @@ -1,6 +1,7 @@ import { ToolOutlined } from '@ant-design/icons' import { Tooltip } from 'antd' -import React, { FC } from 'react' +import type { FC } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/Icons/VisionIcon.tsx b/src/renderer/src/components/Icons/VisionIcon.tsx index 4ab4c408c1..d1f2b4e180 100644 --- a/src/renderer/src/components/Icons/VisionIcon.tsx +++ b/src/renderer/src/components/Icons/VisionIcon.tsx @@ -1,6 +1,7 @@ import { Tooltip } from 'antd' import { ImageIcon } from 'lucide-react' -import React, { FC } from 'react' +import type { FC } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/Icons/WebSearchIcon.tsx b/src/renderer/src/components/Icons/WebSearchIcon.tsx index 6dc99000ae..156ea1307b 100644 --- a/src/renderer/src/components/Icons/WebSearchIcon.tsx +++ b/src/renderer/src/components/Icons/WebSearchIcon.tsx @@ -1,6 +1,7 @@ import { GlobalOutlined } from '@ant-design/icons' import { Tooltip } from 'antd' -import React, { FC } from 'react' +import type { FC } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/ImageViewer.tsx b/src/renderer/src/components/ImageViewer.tsx index 179babeaf6..757a694419 100644 --- a/src/renderer/src/components/ImageViewer.tsx +++ b/src/renderer/src/components/ImageViewer.tsx @@ -10,7 +10,8 @@ import { } from '@ant-design/icons' import { loggerService } from '@logger' import { download } from '@renderer/utils/download' -import { Dropdown, Image as AntImage, ImageProps as AntImageProps, Space } from 'antd' +import type { ImageProps as AntImageProps } from 'antd' +import { Dropdown, Image as AntImage, Space } from 'antd' import { Base64 } from 'js-base64' import { DownloadIcon, ImageIcon } from 'lucide-react' import mime from 'mime' diff --git a/src/renderer/src/components/InfoPopover.tsx b/src/renderer/src/components/InfoPopover.tsx index 888aefc702..04ea1e7c3d 100644 --- a/src/renderer/src/components/InfoPopover.tsx +++ b/src/renderer/src/components/InfoPopover.tsx @@ -1,4 +1,5 @@ -import { Popover, PopoverProps } from 'antd' +import type { PopoverProps } from 'antd' +import { Popover } from 'antd' import { Info } from 'lucide-react' type InheritedPopoverProps = Omit diff --git a/src/renderer/src/components/InputEmbeddingDimension.tsx b/src/renderer/src/components/InputEmbeddingDimension.tsx index 056ebaea50..8e6357a91d 100644 --- a/src/renderer/src/components/InputEmbeddingDimension.tsx +++ b/src/renderer/src/components/InputEmbeddingDimension.tsx @@ -2,7 +2,7 @@ import { loggerService } from '@logger' import AiProvider from '@renderer/aiCore' import { RefreshIcon } from '@renderer/components/Icons' import { useProvider } from '@renderer/hooks/useProvider' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { getErrorMessage } from '@renderer/utils' import { Button, InputNumber, Space, Tooltip } from 'antd' import { memo, useCallback, useMemo, useState } from 'react' diff --git a/src/renderer/src/components/LanguageSelect.tsx b/src/renderer/src/components/LanguageSelect.tsx index cc18294712..e9799096a7 100644 --- a/src/renderer/src/components/LanguageSelect.tsx +++ b/src/renderer/src/components/LanguageSelect.tsx @@ -1,8 +1,10 @@ import { UNKNOWN } from '@renderer/config/translate' import useTranslate from '@renderer/hooks/useTranslate' -import { TranslateLanguage, TranslateLanguageCode } from '@renderer/types' -import { Select, SelectProps, Space } from 'antd' -import { ReactNode, useCallback, useMemo } from 'react' +import type { TranslateLanguage, TranslateLanguageCode } from '@renderer/types' +import type { SelectProps } from 'antd' +import { Select, Space } from 'antd' +import type { ReactNode } from 'react' +import { useCallback, useMemo } from 'react' export type LanguageOption = { value: TranslateLanguageCode diff --git a/src/renderer/src/components/ListItem/index.tsx b/src/renderer/src/components/ListItem/index.tsx index 2574573627..3ab38bcb41 100644 --- a/src/renderer/src/components/ListItem/index.tsx +++ b/src/renderer/src/components/ListItem/index.tsx @@ -1,5 +1,5 @@ import { Typography } from 'antd' -import { ReactNode } from 'react' +import type { ReactNode } from 'react' import styled from 'styled-components' interface ListItemProps { diff --git a/src/renderer/src/components/MarkdownEditor/index.tsx b/src/renderer/src/components/MarkdownEditor/index.tsx index 427ff1ccc8..5b5ab445e9 100644 --- a/src/renderer/src/components/MarkdownEditor/index.tsx +++ b/src/renderer/src/components/MarkdownEditor/index.tsx @@ -1,6 +1,7 @@ import 'katex/dist/katex.min.css' -import React, { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import ReactMarkdown from 'react-markdown' import rehypeKatex from 'rehype-katex' diff --git a/src/renderer/src/components/MaxContextCount.tsx b/src/renderer/src/components/MaxContextCount.tsx index be9c9f293c..b07564da71 100644 --- a/src/renderer/src/components/MaxContextCount.tsx +++ b/src/renderer/src/components/MaxContextCount.tsx @@ -1,6 +1,6 @@ import { MAX_CONTEXT_COUNT } from '@renderer/config/constant' import { Infinity as InfinityIcon } from 'lucide-react' -import { CSSProperties } from 'react' +import type { CSSProperties } from 'react' type Props = { maxContext: number diff --git a/src/renderer/src/components/MinApp/MinApp.tsx b/src/renderer/src/components/MinApp/MinApp.tsx index 5833ed9b1a..b6a623d309 100644 --- a/src/renderer/src/components/MinApp/MinApp.tsx +++ b/src/renderer/src/components/MinApp/MinApp.tsx @@ -7,10 +7,10 @@ import { useMinapps } from '@renderer/hooks/useMinapps' import { useRuntime } from '@renderer/hooks/useRuntime' import { useNavbarPosition } from '@renderer/hooks/useSettings' import { setOpenedKeepAliveMinapps } from '@renderer/store/runtime' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import type { MenuProps } from 'antd' import { Dropdown } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { useNavigate } from 'react-router-dom' diff --git a/src/renderer/src/components/MinApp/MinAppTabsPool.tsx b/src/renderer/src/components/MinApp/MinAppTabsPool.tsx index af2c255f5f..5c5633636a 100644 --- a/src/renderer/src/components/MinApp/MinAppTabsPool.tsx +++ b/src/renderer/src/components/MinApp/MinAppTabsPool.tsx @@ -3,7 +3,7 @@ import WebviewContainer from '@renderer/components/MinApp/WebviewContainer' import { useRuntime } from '@renderer/hooks/useRuntime' import { useNavbarPosition } from '@renderer/hooks/useSettings' import { getWebviewLoaded, setWebviewLoaded } from '@renderer/utils/webviewStateManager' -import { WebviewTag } from 'electron' +import type { WebviewTag } from 'electron' import React, { useEffect, useRef } from 'react' import { useLocation } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/components/MinApp/MinappPopupContainer.tsx b/src/renderer/src/components/MinApp/MinappPopupContainer.tsx index 57e5141048..8e361f0bc7 100644 --- a/src/renderer/src/components/MinApp/MinappPopupContainer.tsx +++ b/src/renderer/src/components/MinApp/MinappPopupContainer.tsx @@ -23,11 +23,11 @@ import { useNavbarPosition, useSettings } from '@renderer/hooks/useSettings' import { useTimer } from '@renderer/hooks/useTimer' import { useAppDispatch } from '@renderer/store' import { setMinappsOpenLinkExternal } from '@renderer/store/settings' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import { delay } from '@renderer/utils' import { clearWebviewState, getWebviewLoaded, setWebviewLoaded } from '@renderer/utils/webviewStateManager' import { Alert, Avatar, Button, Drawer, Tooltip } from 'antd' -import { WebviewTag } from 'electron' +import type { WebviewTag } from 'electron' import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import BeatLoader from 'react-spinners/BeatLoader' diff --git a/src/renderer/src/components/MinApp/WebviewContainer.tsx b/src/renderer/src/components/MinApp/WebviewContainer.tsx index 545772ef08..66bb9e554d 100644 --- a/src/renderer/src/components/MinApp/WebviewContainer.tsx +++ b/src/renderer/src/components/MinApp/WebviewContainer.tsx @@ -1,6 +1,6 @@ import { loggerService } from '@logger' import { useSettings } from '@renderer/hooks/useSettings' -import { WebviewTag } from 'electron' +import type { WebviewTag } from 'electron' import { memo, useEffect, useRef } from 'react' const logger = loggerService.withContext('WebviewContainer') diff --git a/src/renderer/src/components/ModelIdWithTags.tsx b/src/renderer/src/components/ModelIdWithTags.tsx index bf902ae1c4..76e7f99e15 100644 --- a/src/renderer/src/components/ModelIdWithTags.tsx +++ b/src/renderer/src/components/ModelIdWithTags.tsx @@ -1,4 +1,4 @@ -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { Tooltip, Typography } from 'antd' import { memo } from 'react' import styled from 'styled-components' diff --git a/src/renderer/src/components/ModelSelectButton.tsx b/src/renderer/src/components/ModelSelectButton.tsx index d803f5dbdb..00f081bb13 100644 --- a/src/renderer/src/components/ModelSelectButton.tsx +++ b/src/renderer/src/components/ModelSelectButton.tsx @@ -1,5 +1,6 @@ -import { Model } from '@renderer/types' -import { Button, Tooltip, TooltipProps } from 'antd' +import type { Model } from '@renderer/types' +import type { TooltipProps } from 'antd' +import { Button, Tooltip } from 'antd' import { useCallback, useMemo } from 'react' import ModelAvatar from './Avatar/ModelAvatar' diff --git a/src/renderer/src/components/ModelSelector.tsx b/src/renderer/src/components/ModelSelector.tsx index 98fa195fb6..12666b4d4b 100644 --- a/src/renderer/src/components/ModelSelector.tsx +++ b/src/renderer/src/components/ModelSelector.tsx @@ -1,11 +1,12 @@ import ModelAvatar from '@renderer/components/Avatar/ModelAvatar' import { getModelUniqId } from '@renderer/services/ModelService' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { matchKeywordsInString } from '@renderer/utils' import { getFancyProviderName } from '@renderer/utils/naming' -import { Avatar, Select, SelectProps } from 'antd' +import type { SelectProps } from 'antd' +import { Avatar, Select } from 'antd' import { sortBy } from 'lodash' -import { BaseSelectRef } from 'rc-select' +import type { BaseSelectRef } from 'rc-select' import { memo, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/ModelTagsWithLabel.tsx b/src/renderer/src/components/ModelTagsWithLabel.tsx index 263292dcad..93e52f6a0c 100644 --- a/src/renderer/src/components/ModelTagsWithLabel.tsx +++ b/src/renderer/src/components/ModelTagsWithLabel.tsx @@ -7,9 +7,10 @@ import { isWebSearchModel } from '@renderer/config/models' import i18n from '@renderer/i18n' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { isFreeModel } from '@renderer/utils/model' -import { FC, memo, useLayoutEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { memo, useLayoutEffect, useMemo, useRef, useState } from 'react' import styled from 'styled-components' import { diff --git a/src/renderer/src/components/OAuth/OAuthButton.tsx b/src/renderer/src/components/OAuth/OAuthButton.tsx index 3368f60afe..b8e485a8e6 100644 --- a/src/renderer/src/components/OAuth/OAuthButton.tsx +++ b/src/renderer/src/components/OAuth/OAuthButton.tsx @@ -1,5 +1,5 @@ import { getProviderLabel } from '@renderer/i18n/label' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { oauthWith302AI, oauthWithAihubmix, @@ -8,8 +8,9 @@ import { oauthWithSiliconFlow, oauthWithTokenFlux } from '@renderer/utils/oauth' -import { Button, ButtonProps } from 'antd' -import { FC } from 'react' +import type { ButtonProps } from 'antd' +import { Button } from 'antd' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' interface Props extends ButtonProps { diff --git a/src/renderer/src/components/Popups/AddAssistantPopup.tsx b/src/renderer/src/components/Popups/AddAssistantPopup.tsx index e795de400f..8c10f0f6bf 100644 --- a/src/renderer/src/components/Popups/AddAssistantPopup.tsx +++ b/src/renderer/src/components/Popups/AddAssistantPopup.tsx @@ -5,9 +5,10 @@ import { useTimer } from '@renderer/hooks/useTimer' import { useSystemAssistantPresets } from '@renderer/pages/store/assistants/presets' import { createAssistantFromAgent } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { Assistant, AssistantPreset } from '@renderer/types' +import type { Assistant, AssistantPreset } from '@renderer/types' import { uuid } from '@renderer/utils' -import { Divider, Input, InputRef, Modal, Tag } from 'antd' +import type { InputRef } from 'antd' +import { Divider, Input, Modal, Tag } from 'antd' import { take } from 'lodash' import { Search } from 'lucide-react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' diff --git a/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts b/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts index e69341a864..f28e034bda 100644 --- a/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts +++ b/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts @@ -3,23 +3,18 @@ import { isEmbeddingModel, isRerankModel } from '@renderer/config/models' import SelectProviderModelPopup from '@renderer/pages/settings/ProviderSettings/SelectProviderModelPopup' import { checkApi } from '@renderer/services/ApiService' import WebSearchService from '@renderer/services/WebSearchService' -import { - isPreprocessProviderId, - isWebSearchProviderId, - Model, - PreprocessProvider, - Provider, - WebSearchProvider -} from '@renderer/types' -import { ApiKeyConnectivity, ApiKeyWithStatus, HealthStatus } from '@renderer/types/healthCheck' +import type { Model, PreprocessProvider, Provider, WebSearchProvider } from '@renderer/types' +import { isPreprocessProviderId, isWebSearchProviderId } from '@renderer/types' +import type { ApiKeyConnectivity, ApiKeyWithStatus } from '@renderer/types/healthCheck' +import { HealthStatus } from '@renderer/types/healthCheck' import { formatApiKeys, splitApiKeyString } from '@renderer/utils/api' import { formatErrorMessage } from '@renderer/utils/error' -import { TFunction } from 'i18next' +import type { TFunction } from 'i18next' import { isEmpty } from 'lodash' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { ApiKeyValidity, ApiProvider, UpdateApiProviderFunc } from './types' +import type { ApiKeyValidity, ApiProvider, UpdateApiProviderFunc } from './types' interface UseApiKeysProps { provider: ApiProvider diff --git a/src/renderer/src/components/Popups/ApiKeyListPopup/item.tsx b/src/renderer/src/components/Popups/ApiKeyListPopup/item.tsx index 83c9389935..3ddcc383cd 100644 --- a/src/renderer/src/components/Popups/ApiKeyListPopup/item.tsx +++ b/src/renderer/src/components/Popups/ApiKeyListPopup/item.tsx @@ -1,15 +1,17 @@ import { type HealthResult, HealthStatusIndicator } from '@renderer/components/HealthStatusIndicator' import { EditIcon } from '@renderer/components/Icons' import { StreamlineGoodHealthAndWellBeing } from '@renderer/components/Icons/SVGIcon' -import { ApiKeyWithStatus } from '@renderer/types/healthCheck' +import type { ApiKeyWithStatus } from '@renderer/types/healthCheck' import { maskApiKey } from '@renderer/utils/api' -import { Button, Flex, Input, InputRef, List, Popconfirm, Tooltip, Typography } from 'antd' +import type { InputRef } from 'antd' +import { Button, Flex, Input, List, Popconfirm, Tooltip, Typography } from 'antd' import { Check, Minus, X } from 'lucide-react' -import { FC, memo, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { memo, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' -import { ApiKeyValidity } from './types' +import type { ApiKeyValidity } from './types' export interface ApiKeyItemProps { keyStatus: ApiKeyWithStatus diff --git a/src/renderer/src/components/Popups/ApiKeyListPopup/list.tsx b/src/renderer/src/components/Popups/ApiKeyListPopup/list.tsx index 86076b4ca8..6611416333 100644 --- a/src/renderer/src/components/Popups/ApiKeyListPopup/list.tsx +++ b/src/renderer/src/components/Popups/ApiKeyListPopup/list.tsx @@ -6,17 +6,19 @@ import { useProvider } from '@renderer/hooks/useProvider' import { useWebSearchProvider } from '@renderer/hooks/useWebSearchProviders' import { SettingHelpText } from '@renderer/pages/settings' import { isProviderSupportAuth } from '@renderer/services/ProviderService' -import { PreprocessProviderId, WebSearchProviderId } from '@renderer/types' -import { ApiKeyWithStatus, HealthStatus } from '@renderer/types/healthCheck' +import type { PreprocessProviderId, WebSearchProviderId } from '@renderer/types' +import type { ApiKeyWithStatus } from '@renderer/types/healthCheck' +import { HealthStatus } from '@renderer/types/healthCheck' import { Button, Card, Flex, List, Popconfirm, Space, Tooltip, Typography } from 'antd' import { Plus } from 'lucide-react' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import { isLlmProvider, useApiKeys } from './hook' import ApiKeyItem from './item' -import { ApiProvider, UpdateApiProviderFunc } from './types' +import type { ApiProvider, UpdateApiProviderFunc } from './types' interface ApiKeyListProps { provider: ApiProvider diff --git a/src/renderer/src/components/Popups/ApiKeyListPopup/types.ts b/src/renderer/src/components/Popups/ApiKeyListPopup/types.ts index ad713b40fb..f90c4240d5 100644 --- a/src/renderer/src/components/Popups/ApiKeyListPopup/types.ts +++ b/src/renderer/src/components/Popups/ApiKeyListPopup/types.ts @@ -1,4 +1,4 @@ -import { PreprocessProvider, Provider, WebSearchProvider } from '@renderer/types' +import type { PreprocessProvider, Provider, WebSearchProvider } from '@renderer/types' /** * API key 格式有效性 diff --git a/src/renderer/src/components/Popups/GeneralPopup.tsx b/src/renderer/src/components/Popups/GeneralPopup.tsx index 3307b10162..f68d132a1d 100644 --- a/src/renderer/src/components/Popups/GeneralPopup.tsx +++ b/src/renderer/src/components/Popups/GeneralPopup.tsx @@ -1,6 +1,8 @@ import { TopView } from '@renderer/components/TopView' -import { Modal, ModalProps } from 'antd' -import { ReactNode, useState } from 'react' +import type { ModalProps } from 'antd' +import { Modal } from 'antd' +import type { ReactNode } from 'react' +import { useState } from 'react' interface ShowParams extends ModalProps { content: ReactNode diff --git a/src/renderer/src/components/Popups/MultiSelectionPopup.tsx b/src/renderer/src/components/Popups/MultiSelectionPopup.tsx index 4560ac74e2..7594d6a200 100644 --- a/src/renderer/src/components/Popups/MultiSelectionPopup.tsx +++ b/src/renderer/src/components/Popups/MultiSelectionPopup.tsx @@ -1,9 +1,9 @@ import { CopyIcon, DeleteIcon } from '@renderer/components/Icons' import { useChatContext } from '@renderer/hooks/useChatContext' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import { Button, Tooltip } from 'antd' import { Save, X } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/Popups/ObsidianExportPopup.tsx b/src/renderer/src/components/Popups/ObsidianExportPopup.tsx index 9a00e311cf..f84fcb96bb 100644 --- a/src/renderer/src/components/Popups/ObsidianExportPopup.tsx +++ b/src/renderer/src/components/Popups/ObsidianExportPopup.tsx @@ -1,4 +1,5 @@ -import { ObsidianProcessingMethod, PopupContainer } from '@renderer/components/ObsidianExportDialog' +import type { ObsidianProcessingMethod } from '@renderer/components/ObsidianExportDialog' +import { PopupContainer } from '@renderer/components/ObsidianExportDialog' import { TopView } from '@renderer/components/TopView' import type { Topic } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' diff --git a/src/renderer/src/components/Popups/PromptPopup.tsx b/src/renderer/src/components/Popups/PromptPopup.tsx index 0d254d3fb9..fe70d32e86 100644 --- a/src/renderer/src/components/Popups/PromptPopup.tsx +++ b/src/renderer/src/components/Popups/PromptPopup.tsx @@ -1,6 +1,7 @@ import { Input, Modal } from 'antd' -import { TextAreaProps } from 'antd/es/input' -import { ReactNode, useRef, useState } from 'react' +import type { TextAreaProps } from 'antd/es/input' +import type { ReactNode } from 'react' +import { useRef, useState } from 'react' import { Box } from '../Layout' import { TopView } from '../TopView' diff --git a/src/renderer/src/components/Popups/RichEditPopup.tsx b/src/renderer/src/components/Popups/RichEditPopup.tsx index ed7c3d407c..de5a949480 100644 --- a/src/renderer/src/components/Popups/RichEditPopup.tsx +++ b/src/renderer/src/components/Popups/RichEditPopup.tsx @@ -1,6 +1,7 @@ import RichEditor from '@renderer/components/RichEditor' -import { RichEditorRef } from '@renderer/components/RichEditor/types' -import { Modal, ModalProps } from 'antd' +import type { RichEditorRef } from '@renderer/components/RichEditor/types' +import type { ModalProps } from 'antd' +import { Modal } from 'antd' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx b/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx index cea3aca7cb..892c30e331 100644 --- a/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx +++ b/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx @@ -2,18 +2,16 @@ import { loggerService } from '@logger' import CustomTag from '@renderer/components/Tags/CustomTag' import { TopView } from '@renderer/components/TopView' import { useKnowledge, useKnowledgeBases } from '@renderer/hooks/useKnowledge' -import { Topic } from '@renderer/types' -import { Message } from '@renderer/types/newMessage' -import { NotesTreeNode } from '@renderer/types/note' +import type { Topic } from '@renderer/types' +import type { Message } from '@renderer/types/newMessage' +import type { NotesTreeNode } from '@renderer/types/note' +import type { ContentType, MessageContentStats, TopicContentStats } from '@renderer/utils/knowledge' import { analyzeMessageContent, analyzeTopicContent, CONTENT_TYPES, - ContentType, - MessageContentStats, processMessageContent, - processTopicContent, - TopicContentStats + processTopicContent } from '@renderer/utils/knowledge' import { Flex, Form, Modal, Select, Tooltip, Typography } from 'antd' import { Check, CircleHelp } from 'lucide-react' diff --git a/src/renderer/src/components/Popups/SelectModelPopup/TagFilterSection.tsx b/src/renderer/src/components/Popups/SelectModelPopup/TagFilterSection.tsx index aec91bd803..19fe49e1b9 100644 --- a/src/renderer/src/components/Popups/SelectModelPopup/TagFilterSection.tsx +++ b/src/renderer/src/components/Popups/SelectModelPopup/TagFilterSection.tsx @@ -8,7 +8,7 @@ import { VisionTag, WebSearchTag } from '@renderer/components/Tags/Model' -import { ModelTag } from '@renderer/types' +import type { ModelTag } from '@renderer/types' import { Flex } from 'antd' import React, { startTransition, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/Popups/SelectModelPopup/api-model-popup.tsx b/src/renderer/src/components/Popups/SelectModelPopup/api-model-popup.tsx index 3871e593d7..df4dbb0485 100644 --- a/src/renderer/src/components/Popups/SelectModelPopup/api-model-popup.tsx +++ b/src/renderer/src/components/Popups/SelectModelPopup/api-model-popup.tsx @@ -7,7 +7,8 @@ import { getModelLogoById } from '@renderer/config/models' import { useApiModels } from '@renderer/hooks/agents/useModels' import { getModelUniqId } from '@renderer/services/ModelService' import { getProviderNameById } from '@renderer/services/ProviderService' -import { AdaptedApiModel, ApiModel, ApiModelsFilter, Model, ModelType, objectEntries } from '@renderer/types' +import type { AdaptedApiModel, ApiModel, ApiModelsFilter, Model, ModelType } from '@renderer/types' +import { objectEntries } from '@renderer/types' import { classNames, filterModelsByKeywords } from '@renderer/utils' import { apiModelAdapter, getModelTags } from '@renderer/utils/model' import { Avatar, Divider, Empty, Modal } from 'antd' @@ -27,7 +28,7 @@ import styled from 'styled-components' import { useModelTagFilter } from './filters' import SelectModelSearchBar from './searchbar' import TagFilterSection from './TagFilterSection' -import { FlatListApiItem, FlatListApiModel } from './types' +import type { FlatListApiItem, FlatListApiModel } from './types' const PAGE_SIZE = 12 const ITEM_HEIGHT = 36 diff --git a/src/renderer/src/components/Popups/SelectModelPopup/filters.ts b/src/renderer/src/components/Popups/SelectModelPopup/filters.ts index d2ee6c7742..f43d86f79e 100644 --- a/src/renderer/src/components/Popups/SelectModelPopup/filters.ts +++ b/src/renderer/src/components/Popups/SelectModelPopup/filters.ts @@ -6,7 +6,8 @@ import { isVisionModel, isWebSearchModel } from '@renderer/config/models' -import { Model, ModelTag, objectEntries } from '@renderer/types' +import type { Model, ModelTag } from '@renderer/types' +import { objectEntries } from '@renderer/types' import { isFreeModel } from '@renderer/utils/model' import { useCallback, useMemo, useState } from 'react' diff --git a/src/renderer/src/components/Popups/SelectModelPopup/popup.tsx b/src/renderer/src/components/Popups/SelectModelPopup/popup.tsx index 60ebc3fe77..eb982ffe9d 100644 --- a/src/renderer/src/components/Popups/SelectModelPopup/popup.tsx +++ b/src/renderer/src/components/Popups/SelectModelPopup/popup.tsx @@ -8,7 +8,8 @@ import { getModelLogo } from '@renderer/config/models' import { usePinnedModels } from '@renderer/hooks/usePinnedModels' import { useProviders } from '@renderer/hooks/useProvider' import { getModelUniqId } from '@renderer/services/ModelService' -import { Model, ModelType, objectEntries, Provider } from '@renderer/types' +import type { Model, ModelType, Provider } from '@renderer/types' +import { objectEntries } from '@renderer/types' import { classNames, filterModelsByKeywords, getFancyProviderName } from '@renderer/utils' import { getModelTags } from '@renderer/utils/model' import { Avatar, Divider, Empty, Modal, Tooltip } from 'antd' @@ -30,7 +31,7 @@ import styled from 'styled-components' import { useModelTagFilter } from './filters' import SelectModelSearchBar from './searchbar' import TagFilterSection from './TagFilterSection' -import { FlatListItem, FlatListModel } from './types' +import type { FlatListItem, FlatListModel } from './types' const PAGE_SIZE = 12 const ITEM_HEIGHT = 36 diff --git a/src/renderer/src/components/Popups/SelectModelPopup/searchbar.tsx b/src/renderer/src/components/Popups/SelectModelPopup/searchbar.tsx index ab641cf14b..8f8b981704 100644 --- a/src/renderer/src/components/Popups/SelectModelPopup/searchbar.tsx +++ b/src/renderer/src/components/Popups/SelectModelPopup/searchbar.tsx @@ -1,5 +1,6 @@ import { HStack } from '@renderer/components/Layout' -import { Input, InputRef } from 'antd' +import type { InputRef } from 'antd' +import { Input } from 'antd' import { Search } from 'lucide-react' import React, { memo, useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/Popups/SelectModelPopup/types.ts b/src/renderer/src/components/Popups/SelectModelPopup/types.ts index 6c6e3c2cac..a811930fc3 100644 --- a/src/renderer/src/components/Popups/SelectModelPopup/types.ts +++ b/src/renderer/src/components/Popups/SelectModelPopup/types.ts @@ -1,5 +1,5 @@ -import { AdaptedApiModel, Model } from '@renderer/types' -import { ReactNode } from 'react' +import type { AdaptedApiModel, Model } from '@renderer/types' +import type { ReactNode } from 'react' /** * 滚动触发来源类型 diff --git a/src/renderer/src/components/Popups/TextEditPopup.tsx b/src/renderer/src/components/Popups/TextEditPopup.tsx index 49dca0254a..6ae6cb575b 100644 --- a/src/renderer/src/components/Popups/TextEditPopup.tsx +++ b/src/renderer/src/components/Popups/TextEditPopup.tsx @@ -3,10 +3,11 @@ import { loggerService } from '@logger' import { useSettings } from '@renderer/hooks/useSettings' import useTranslate from '@renderer/hooks/useTranslate' import { translateText } from '@renderer/services/TranslateService' -import { Modal, ModalProps } from 'antd' +import type { ModalProps } from 'antd' +import { Modal } from 'antd' import TextArea from 'antd/es/input/TextArea' -import { TextAreaProps } from 'antd/lib/input' -import { TextAreaRef } from 'antd/lib/input/TextArea' +import type { TextAreaProps } from 'antd/lib/input' +import type { TextAreaRef } from 'antd/lib/input/TextArea' import { Languages } from 'lucide-react' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/Popups/VideoPopup.tsx b/src/renderer/src/components/Popups/VideoPopup.tsx index 3cb33b43c3..06b3f1bcd8 100644 --- a/src/renderer/src/components/Popups/VideoPopup.tsx +++ b/src/renderer/src/components/Popups/VideoPopup.tsx @@ -1,7 +1,7 @@ import { UploadOutlined } from '@ant-design/icons' import FileManager from '@renderer/services/FileManager' import { loggerService } from '@renderer/services/LoggerService' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { mime2type, uuid } from '@renderer/utils' import { Modal, Space, Upload } from 'antd' import type { UploadFile } from 'antd/es/upload/interface' diff --git a/src/renderer/src/components/Popups/agent/AgentModal.tsx b/src/renderer/src/components/Popups/agent/AgentModal.tsx index d49dbb812b..cb53879fcc 100644 --- a/src/renderer/src/components/Popups/agent/AgentModal.tsx +++ b/src/renderer/src/components/Popups/agent/AgentModal.tsx @@ -1,3 +1,4 @@ +import type { SelectedItemProps } from '@heroui/react' import { Button, Form, @@ -8,7 +9,6 @@ import { ModalFooter, ModalHeader, Select, - SelectedItemProps, SelectItem, Textarea, useDisclosure @@ -21,23 +21,24 @@ import { agentModelFilter, getModelLogoById } from '@renderer/config/models' import { useAgents } from '@renderer/hooks/agents/useAgents' import { useApiModels } from '@renderer/hooks/agents/useModels' import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' -import { +import type { AddAgentForm, - AgentConfigurationSchema, AgentEntity, AgentType, BaseAgentForm, - isAgentType, PermissionMode, Tool, UpdateAgentForm } from '@renderer/types' +import { AgentConfigurationSchema, isAgentType } from '@renderer/types' import { AlertTriangleIcon } from 'lucide-react' -import { ChangeEvent, FormEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { ChangeEvent, FormEvent } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { ErrorBoundary } from '../../ErrorBoundary' -import { BaseOption, ModelOption, Option, renderOption } from './shared' +import type { BaseOption, ModelOption } from './shared' +import { Option, renderOption } from './shared' const logger = loggerService.withContext('AddAgentPopup') diff --git a/src/renderer/src/components/Popups/agent/SessionModal.tsx b/src/renderer/src/components/Popups/agent/SessionModal.tsx index 80ca25f475..368c943a1c 100644 --- a/src/renderer/src/components/Popups/agent/SessionModal.tsx +++ b/src/renderer/src/components/Popups/agent/SessionModal.tsx @@ -17,7 +17,7 @@ import { AllowedToolsSelect } from '@renderer/components/agent' import { useAgent } from '@renderer/hooks/agents/useAgent' import { useSessions } from '@renderer/hooks/agents/useSessions' import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' -import { +import type { AgentEntity, AgentSessionEntity, BaseSessionForm, @@ -25,7 +25,8 @@ import { Tool, UpdateSessionForm } from '@renderer/types' -import { FormEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FormEvent, ReactNode } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { ErrorBoundary } from '../../ErrorBoundary' diff --git a/src/renderer/src/components/Popups/agent/shared.tsx b/src/renderer/src/components/Popups/agent/shared.tsx index 5de33d0bc8..d85e26ac92 100644 --- a/src/renderer/src/components/Popups/agent/shared.tsx +++ b/src/renderer/src/components/Popups/agent/shared.tsx @@ -1,4 +1,5 @@ -import { Avatar, SelectedItemProps, SelectedItems } from '@heroui/react' +import type { SelectedItemProps, SelectedItems } from '@heroui/react' +import { Avatar } from '@heroui/react' import { getProviderLabel } from '@renderer/i18n/label' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/Preview/GraphvizPreview.tsx b/src/renderer/src/components/Preview/GraphvizPreview.tsx index 578a35450b..05c4371c74 100644 --- a/src/renderer/src/components/Preview/GraphvizPreview.tsx +++ b/src/renderer/src/components/Preview/GraphvizPreview.tsx @@ -4,7 +4,7 @@ import React, { memo, useCallback } from 'react' import { useDebouncedRender } from './hooks/useDebouncedRender' import ImagePreviewLayout from './ImagePreviewLayout' import { ShadowWhiteContainer } from './styles' -import { BasicPreviewHandles, BasicPreviewProps } from './types' +import type { BasicPreviewHandles, BasicPreviewProps } from './types' import { renderSvgInShadowHost } from './utils' // 管理 viz 实例 diff --git a/src/renderer/src/components/Preview/ImagePreviewLayout.tsx b/src/renderer/src/components/Preview/ImagePreviewLayout.tsx index cff446e250..2c1b7c4287 100644 --- a/src/renderer/src/components/Preview/ImagePreviewLayout.tsx +++ b/src/renderer/src/components/Preview/ImagePreviewLayout.tsx @@ -5,7 +5,7 @@ import { memo, useImperativeHandle } from 'react' import ImageToolbar from './ImageToolbar' import { PreviewContainer, PreviewError } from './styles' -import { BasicPreviewHandles } from './types' +import type { BasicPreviewHandles } from './types' interface ImagePreviewLayoutProps { children: React.ReactNode diff --git a/src/renderer/src/components/Preview/MermaidPreview.tsx b/src/renderer/src/components/Preview/MermaidPreview.tsx index 60708fbee8..fcb09af64a 100644 --- a/src/renderer/src/components/Preview/MermaidPreview.tsx +++ b/src/renderer/src/components/Preview/MermaidPreview.tsx @@ -5,7 +5,7 @@ import React, { memo, useCallback, useEffect, useRef, useState } from 'react' import { useDebouncedRender } from './hooks/useDebouncedRender' import ImagePreviewLayout from './ImagePreviewLayout' import { ShadowTransparentContainer } from './styles' -import { BasicPreviewHandles, BasicPreviewProps } from './types' +import type { BasicPreviewHandles, BasicPreviewProps } from './types' import { renderSvgInShadowHost } from './utils' /** diff --git a/src/renderer/src/components/Preview/PlantUmlPreview.tsx b/src/renderer/src/components/Preview/PlantUmlPreview.tsx index f29a0c1ffc..2653805f1b 100644 --- a/src/renderer/src/components/Preview/PlantUmlPreview.tsx +++ b/src/renderer/src/components/Preview/PlantUmlPreview.tsx @@ -5,7 +5,7 @@ import React, { memo, useCallback, useEffect } from 'react' import { useDebouncedRender } from './hooks/useDebouncedRender' import ImagePreviewLayout from './ImagePreviewLayout' import { ShadowWhiteContainer } from './styles' -import { BasicPreviewHandles, BasicPreviewProps } from './types' +import type { BasicPreviewHandles, BasicPreviewProps } from './types' import { renderSvgInShadowHost } from './utils' const logger = loggerService.withContext('PlantUmlPreview') diff --git a/src/renderer/src/components/Preview/SvgPreview.tsx b/src/renderer/src/components/Preview/SvgPreview.tsx index 673d7ded05..396a651c0d 100644 --- a/src/renderer/src/components/Preview/SvgPreview.tsx +++ b/src/renderer/src/components/Preview/SvgPreview.tsx @@ -3,7 +3,7 @@ import { memo, useCallback } from 'react' import { useDebouncedRender } from './hooks/useDebouncedRender' import ImagePreviewLayout from './ImagePreviewLayout' import { ShadowTransparentContainer } from './styles' -import { BasicPreviewHandles } from './types' +import type { BasicPreviewHandles } from './types' import { renderSvgInShadowHost } from './utils' interface SvgPreviewProps { diff --git a/src/renderer/src/components/ProviderAvatar.tsx b/src/renderer/src/components/ProviderAvatar.tsx index 82ad032532..1861539040 100644 --- a/src/renderer/src/components/ProviderAvatar.tsx +++ b/src/renderer/src/components/ProviderAvatar.tsx @@ -1,6 +1,6 @@ import { PoeLogo } from '@renderer/components/Icons' import { getProviderLogo } from '@renderer/config/providers' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { generateColorFromChar, getFirstCharacter, getForegroundColor } from '@renderer/utils' import { Avatar } from 'antd' import React from 'react' diff --git a/src/renderer/src/components/ProviderLogoPicker/index.tsx b/src/renderer/src/components/ProviderLogoPicker/index.tsx index 630d4f7c9e..d38ab741c7 100644 --- a/src/renderer/src/components/ProviderLogoPicker/index.tsx +++ b/src/renderer/src/components/ProviderLogoPicker/index.tsx @@ -3,7 +3,8 @@ import { ProviderAvatarPrimitive } from '@renderer/components/ProviderAvatar' import { PROVIDER_LOGO_MAP } from '@renderer/config/providers' import { getProviderLabel } from '@renderer/i18n/label' import { Input, Tooltip } from 'antd' -import { FC, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useMemo, useState } from 'react' import styled from 'styled-components' interface Props { diff --git a/src/renderer/src/components/QuickPanel/provider.tsx b/src/renderer/src/components/QuickPanel/provider.tsx index 57eae70ef2..cda1d0fa9b 100644 --- a/src/renderer/src/components/QuickPanel/provider.tsx +++ b/src/renderer/src/components/QuickPanel/provider.tsx @@ -1,6 +1,6 @@ import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { +import type { QuickPanelCallBackOptions, QuickPanelCloseAction, QuickPanelContextType, diff --git a/src/renderer/src/components/QuickPanel/view.tsx b/src/renderer/src/components/QuickPanel/view.tsx index 6ad34b4557..47a0c6299e 100644 --- a/src/renderer/src/components/QuickPanel/view.tsx +++ b/src/renderer/src/components/QuickPanel/view.tsx @@ -13,7 +13,7 @@ import styled from 'styled-components' import * as tinyPinyin from 'tiny-pinyin' import { QuickPanelContext } from './provider' -import { +import type { QuickPanelCallBackOptions, QuickPanelCloseAction, QuickPanelListItem, diff --git a/src/renderer/src/components/RichEditor/components/ActionMenu.tsx b/src/renderer/src/components/RichEditor/components/ActionMenu.tsx index 5f35799da6..3d0eb5b7de 100644 --- a/src/renderer/src/components/RichEditor/components/ActionMenu.tsx +++ b/src/renderer/src/components/RichEditor/components/ActionMenu.tsx @@ -1,5 +1,6 @@ import { Menu } from 'antd' -import React, { FC, useCallback, useEffect, useMemo, useRef } from 'react' +import type { FC } from 'react' +import React, { useCallback, useEffect, useMemo, useRef } from 'react' import { createPortal } from 'react-dom' export interface ActionMenuItem { diff --git a/src/renderer/src/components/RichEditor/components/PlusButton.tsx b/src/renderer/src/components/RichEditor/components/PlusButton.tsx index b1ac0b9030..a0cea425c9 100644 --- a/src/renderer/src/components/RichEditor/components/PlusButton.tsx +++ b/src/renderer/src/components/RichEditor/components/PlusButton.tsx @@ -4,7 +4,8 @@ import React from 'react' import { type ReactNode, useEffect, useRef, useState } from 'react' import { defaultComputePositionConfig } from '../extensions/plus-button' -import { PlusButtonPlugin, plusButtonPluginDefaultKey, PlusButtonPluginOptions } from '../plugins/plusButtonPlugin' +import type { PlusButtonPluginOptions } from '../plugins/plusButtonPlugin' +import { PlusButtonPlugin, plusButtonPluginDefaultKey } from '../plugins/plusButtonPlugin' type Optional = Pick, K> & Omit diff --git a/src/renderer/src/components/RichEditor/components/TableActionMenu.tsx b/src/renderer/src/components/RichEditor/components/TableActionMenu.tsx index bc0282aac0..317d5772ef 100644 --- a/src/renderer/src/components/RichEditor/components/TableActionMenu.tsx +++ b/src/renderer/src/components/RichEditor/components/TableActionMenu.tsx @@ -1,4 +1,5 @@ -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { createPortal } from 'react-dom' export interface TableAction { diff --git a/src/renderer/src/components/RichEditor/components/placeholder/ImagePlaceholderNodeView.tsx b/src/renderer/src/components/RichEditor/components/placeholder/ImagePlaceholderNodeView.tsx index a838782ece..ce8ff28f10 100644 --- a/src/renderer/src/components/RichEditor/components/placeholder/ImagePlaceholderNodeView.tsx +++ b/src/renderer/src/components/RichEditor/components/placeholder/ImagePlaceholderNodeView.tsx @@ -1,4 +1,4 @@ -import { Editor } from '@tiptap/core' +import type { Editor } from '@tiptap/core' import { NodeViewWrapper } from '@tiptap/react' import { Image as ImageIcon } from 'lucide-react' import React, { useCallback } from 'react' diff --git a/src/renderer/src/components/RichEditor/extensions/code-block-shiki/CodeBlockNodeView.tsx b/src/renderer/src/components/RichEditor/extensions/code-block-shiki/CodeBlockNodeView.tsx index 75ccf6befb..fafd1e447b 100644 --- a/src/renderer/src/components/RichEditor/extensions/code-block-shiki/CodeBlockNodeView.tsx +++ b/src/renderer/src/components/RichEditor/extensions/code-block-shiki/CodeBlockNodeView.tsx @@ -2,7 +2,8 @@ import { CopyOutlined } from '@ant-design/icons' import { DEFAULT_LANGUAGES, getHighlighter, getShiki } from '@renderer/utils/shiki' import { NodeViewContent, NodeViewWrapper, type ReactNodeViewProps, ReactNodeViewRenderer } from '@tiptap/react' import { Button, Select, Tooltip } from 'antd' -import { FC, useCallback, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' const CodeBlockNodeView: FC = (props) => { const { node, updateAttributes } = props diff --git a/src/renderer/src/components/RichEditor/extensions/code-block-shiki/shikijsPlugin.ts b/src/renderer/src/components/RichEditor/extensions/code-block-shiki/shikijsPlugin.ts index c37064f8f3..443c3bef75 100644 --- a/src/renderer/src/components/RichEditor/extensions/code-block-shiki/shikijsPlugin.ts +++ b/src/renderer/src/components/RichEditor/extensions/code-block-shiki/shikijsPlugin.ts @@ -5,7 +5,8 @@ let cachedHighlighter: HighlighterGeneric | null = null import { getHighlighter, loadLanguageIfNeeded, loadThemeIfNeeded } from '@renderer/utils/shiki' import { findChildren } from '@tiptap/core' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' -import { Plugin, PluginKey, PluginView } from '@tiptap/pm/state' +import type { PluginView } from '@tiptap/pm/state' +import { Plugin, PluginKey } from '@tiptap/pm/state' import { Decoration, DecorationSet } from '@tiptap/pm/view' const logger = loggerService.withContext('RichEditor:CodeBlockShiki') diff --git a/src/renderer/src/components/RichEditor/extensions/placeholder.ts b/src/renderer/src/components/RichEditor/extensions/placeholder.ts index c0d2dcf1c4..1df06262ad 100644 --- a/src/renderer/src/components/RichEditor/extensions/placeholder.ts +++ b/src/renderer/src/components/RichEditor/extensions/placeholder.ts @@ -1,7 +1,8 @@ -import { Editor, Extension } from '@tiptap/core' +import type { Editor } from '@tiptap/core' +import { Extension } from '@tiptap/core' import { Plugin, PluginKey } from '@tiptap/pm/state' import { Decoration, DecorationSet } from '@tiptap/pm/view' -import { Node } from 'prosemirror-model' +import type { Node } from 'prosemirror-model' export interface PlaceholderOptions { placeholder: ((props: { editor: Editor; node: Node; pos: number; hasAnchor: boolean }) => string) | string | undefined diff --git a/src/renderer/src/components/RichEditor/extensions/plus-button.ts b/src/renderer/src/components/RichEditor/extensions/plus-button.ts index 160948cdaa..bdf3bc69fe 100644 --- a/src/renderer/src/components/RichEditor/extensions/plus-button.ts +++ b/src/renderer/src/components/RichEditor/extensions/plus-button.ts @@ -1,6 +1,7 @@ import { type ComputePositionConfig } from '@floating-ui/dom' -import { Editor, Extension } from '@tiptap/core' -import { Node } from '@tiptap/pm/model' +import type { Editor } from '@tiptap/core' +import { Extension } from '@tiptap/core' +import type { Node } from '@tiptap/pm/model' import { TextSelection } from '@tiptap/pm/state' import { PlusButtonPlugin } from '../plugins/plusButtonPlugin' diff --git a/src/renderer/src/components/RichEditor/toolbar.tsx b/src/renderer/src/components/RichEditor/toolbar.tsx index ebed37349e..9b28979ba2 100644 --- a/src/renderer/src/components/RichEditor/toolbar.tsx +++ b/src/renderer/src/components/RichEditor/toolbar.tsx @@ -1,7 +1,8 @@ import { Tooltip } from 'antd' import type { TFunction } from 'i18next' -import { LucideProps } from 'lucide-react' -import React, { ForwardRefExoticComponent, RefAttributes, useEffect, useState } from 'react' +import type { LucideProps } from 'lucide-react' +import type { ForwardRefExoticComponent, RefAttributes } from 'react' +import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { getCommandsByGroup } from './command' diff --git a/src/renderer/src/components/RichEditor/types.ts b/src/renderer/src/components/RichEditor/types.ts index 15727e1a8d..8dcadbb664 100644 --- a/src/renderer/src/components/RichEditor/types.ts +++ b/src/renderer/src/components/RichEditor/types.ts @@ -241,7 +241,7 @@ export interface ToolbarProps { // Command System Types for Slash Commands import type { Editor } from '@tiptap/core' -import { LucideIcon } from 'lucide-react' +import type { LucideIcon } from 'lucide-react' export enum CommandCategory { TEXT = 'text', diff --git a/src/renderer/src/components/Scrollbar/index.tsx b/src/renderer/src/components/Scrollbar/index.tsx index e50e128d50..493628f076 100644 --- a/src/renderer/src/components/Scrollbar/index.tsx +++ b/src/renderer/src/components/Scrollbar/index.tsx @@ -1,5 +1,6 @@ import { throttle } from 'lodash' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import styled from 'styled-components' export interface ScrollbarProps extends Omit, 'onScroll'> { diff --git a/src/renderer/src/components/Selector.tsx b/src/renderer/src/components/Selector.tsx index 58b587f6e3..e30bc64193 100644 --- a/src/renderer/src/components/Selector.tsx +++ b/src/renderer/src/components/Selector.tsx @@ -1,6 +1,8 @@ -import { Dropdown, DropdownProps } from 'antd' +import type { DropdownProps } from 'antd' +import { Dropdown } from 'antd' import { Check, ChevronsUpDown } from 'lucide-react' -import { ReactNode, useEffect, useMemo, useRef, useState } from 'react' +import type { ReactNode } from 'react' +import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' diff --git a/src/renderer/src/components/Tab/TabContainer.tsx b/src/renderer/src/components/Tab/TabContainer.tsx index 6747066c6e..8fdaf3ac5e 100644 --- a/src/renderer/src/components/Tab/TabContainer.tsx +++ b/src/renderer/src/components/Tab/TabContainer.tsx @@ -13,10 +13,11 @@ import tabsService from '@renderer/services/TabsService' import { useAppDispatch, useAppSelector } from '@renderer/store' import type { Tab } from '@renderer/store/tabs' import { addTab, removeTab, setActiveTab, setTabs } from '@renderer/store/tabs' -import { MinAppType, ThemeMode } from '@renderer/types' +import type { MinAppType } from '@renderer/types' +import { ThemeMode } from '@renderer/types' import { classNames } from '@renderer/utils' import { Tooltip } from 'antd' -import { LRUCache } from 'lru-cache' +import type { LRUCache } from 'lru-cache' import { FileSearch, Folder, diff --git a/src/renderer/src/components/Tags/CustomTag.tsx b/src/renderer/src/components/Tags/CustomTag.tsx index 4873a3ba7d..5bb38c99f1 100644 --- a/src/renderer/src/components/Tags/CustomTag.tsx +++ b/src/renderer/src/components/Tags/CustomTag.tsx @@ -1,6 +1,7 @@ import { CloseOutlined } from '@ant-design/icons' import { Tooltip } from 'antd' -import { CSSProperties, FC, memo, MouseEventHandler, useMemo } from 'react' +import type { CSSProperties, FC, MouseEventHandler } from 'react' +import { memo, useMemo } from 'react' import styled from 'styled-components' export interface CustomTagProps { diff --git a/src/renderer/src/components/Tags/Model/EmbeddingTag.tsx b/src/renderer/src/components/Tags/Model/EmbeddingTag.tsx index 8a2e5e2a33..01fe51db32 100644 --- a/src/renderer/src/components/Tags/Model/EmbeddingTag.tsx +++ b/src/renderer/src/components/Tags/Model/EmbeddingTag.tsx @@ -1,6 +1,7 @@ import { useTranslation } from 'react-i18next' -import CustomTag, { CustomTagProps } from '../CustomTag' +import type { CustomTagProps } from '../CustomTag' +import CustomTag from '../CustomTag' type Props = { size?: number diff --git a/src/renderer/src/components/Tags/Model/FreeTag.tsx b/src/renderer/src/components/Tags/Model/FreeTag.tsx index 44b19012e0..4bbbe46801 100644 --- a/src/renderer/src/components/Tags/Model/FreeTag.tsx +++ b/src/renderer/src/components/Tags/Model/FreeTag.tsx @@ -1,6 +1,7 @@ import { useTranslation } from 'react-i18next' -import CustomTag, { CustomTagProps } from '../CustomTag' +import type { CustomTagProps } from '../CustomTag' +import CustomTag from '../CustomTag' type Props = { size?: number diff --git a/src/renderer/src/components/Tags/Model/ReasoningTag.tsx b/src/renderer/src/components/Tags/Model/ReasoningTag.tsx index 8e6d94bea7..9cab2ed585 100644 --- a/src/renderer/src/components/Tags/Model/ReasoningTag.tsx +++ b/src/renderer/src/components/Tags/Model/ReasoningTag.tsx @@ -1,6 +1,7 @@ import { useTranslation } from 'react-i18next' -import CustomTag, { CustomTagProps } from '../CustomTag' +import type { CustomTagProps } from '../CustomTag' +import CustomTag from '../CustomTag' type Props = { size?: number diff --git a/src/renderer/src/components/Tags/Model/RerankerTag.tsx b/src/renderer/src/components/Tags/Model/RerankerTag.tsx index 6d6811f77f..f317a736e3 100644 --- a/src/renderer/src/components/Tags/Model/RerankerTag.tsx +++ b/src/renderer/src/components/Tags/Model/RerankerTag.tsx @@ -1,6 +1,7 @@ import { useTranslation } from 'react-i18next' -import CustomTag, { CustomTagProps } from '../CustomTag' +import type { CustomTagProps } from '../CustomTag' +import CustomTag from '../CustomTag' type Props = { size?: number diff --git a/src/renderer/src/components/Tags/Model/ToolsCallingTag.tsx b/src/renderer/src/components/Tags/Model/ToolsCallingTag.tsx index 1532564be1..311d7e806d 100644 --- a/src/renderer/src/components/Tags/Model/ToolsCallingTag.tsx +++ b/src/renderer/src/components/Tags/Model/ToolsCallingTag.tsx @@ -1,7 +1,8 @@ import { ToolOutlined } from '@ant-design/icons' import { useTranslation } from 'react-i18next' -import CustomTag, { CustomTagProps } from '../CustomTag' +import type { CustomTagProps } from '../CustomTag' +import CustomTag from '../CustomTag' type Props = { size?: number diff --git a/src/renderer/src/components/Tags/Model/VisionTag.tsx b/src/renderer/src/components/Tags/Model/VisionTag.tsx index 4ff219cfc5..ae0d8bc440 100644 --- a/src/renderer/src/components/Tags/Model/VisionTag.tsx +++ b/src/renderer/src/components/Tags/Model/VisionTag.tsx @@ -1,7 +1,8 @@ import { EyeOutlined } from '@ant-design/icons' import { useTranslation } from 'react-i18next' -import CustomTag, { CustomTagProps } from '../CustomTag' +import type { CustomTagProps } from '../CustomTag' +import CustomTag from '../CustomTag' type Props = { size?: number diff --git a/src/renderer/src/components/Tags/Model/WebSearchTag.tsx b/src/renderer/src/components/Tags/Model/WebSearchTag.tsx index 099c9b3839..b7b3777ef8 100644 --- a/src/renderer/src/components/Tags/Model/WebSearchTag.tsx +++ b/src/renderer/src/components/Tags/Model/WebSearchTag.tsx @@ -1,7 +1,8 @@ import { GlobalOutlined } from '@ant-design/icons' import { useTranslation } from 'react-i18next' -import CustomTag, { CustomTagProps } from '../CustomTag' +import type { CustomTagProps } from '../CustomTag' +import CustomTag from '../CustomTag' type Props = { size?: number diff --git a/src/renderer/src/components/TextBadge.tsx b/src/renderer/src/components/TextBadge.tsx index 1945810b25..d531d425e4 100644 --- a/src/renderer/src/components/TextBadge.tsx +++ b/src/renderer/src/components/TextBadge.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' interface Props { diff --git a/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx b/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx index 6ce75d5140..d0de56dbe6 100644 --- a/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx +++ b/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx @@ -1,4 +1,5 @@ -import { Tooltip, TooltipProps } from 'antd' +import type { TooltipProps } from 'antd' +import { Tooltip } from 'antd' import { HelpCircle } from 'lucide-react' type InheritedTooltipProps = Omit diff --git a/src/renderer/src/components/TooltipIcons/InfoTooltip.tsx b/src/renderer/src/components/TooltipIcons/InfoTooltip.tsx index 7a0e608a31..b69e59c8b2 100644 --- a/src/renderer/src/components/TooltipIcons/InfoTooltip.tsx +++ b/src/renderer/src/components/TooltipIcons/InfoTooltip.tsx @@ -1,4 +1,5 @@ -import { Tooltip, TooltipProps } from 'antd' +import type { TooltipProps } from 'antd' +import { Tooltip } from 'antd' import { Info } from 'lucide-react' type InheritedTooltipProps = Omit diff --git a/src/renderer/src/components/TooltipIcons/WarnTooltip.tsx b/src/renderer/src/components/TooltipIcons/WarnTooltip.tsx index b5292365db..b78fb0746c 100644 --- a/src/renderer/src/components/TooltipIcons/WarnTooltip.tsx +++ b/src/renderer/src/components/TooltipIcons/WarnTooltip.tsx @@ -1,4 +1,5 @@ -import { Tooltip, TooltipProps } from 'antd' +import type { TooltipProps } from 'antd' +import { Tooltip } from 'antd' import { AlertTriangle } from 'lucide-react' type InheritedTooltipProps = Omit diff --git a/src/renderer/src/components/TopView/index.tsx b/src/renderer/src/components/TopView/index.tsx index d37f9d5077..cd1dff1436 100644 --- a/src/renderer/src/components/TopView/index.tsx +++ b/src/renderer/src/components/TopView/index.tsx @@ -3,7 +3,8 @@ import TopViewMinappContainer from '@renderer/components/MinApp/TopViewMinappCon import { useAppInit } from '@renderer/hooks/useAppInit' import { useShortcuts } from '@renderer/hooks/useShortcuts' import { Modal } from 'antd' -import React, { PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react' +import type { PropsWithChildren } from 'react' +import React, { useCallback, useEffect, useRef, useState } from 'react' import { Box } from '../Layout' import { getToastUtilities } from './toast' diff --git a/src/renderer/src/components/TopView/toast.ts b/src/renderer/src/components/TopView/toast.ts index b5108315fa..d1e5726310 100644 --- a/src/renderer/src/components/TopView/toast.ts +++ b/src/renderer/src/components/TopView/toast.ts @@ -1,5 +1,5 @@ import { addToast, closeAll, closeToast, getToastQueue, isToastClosing } from '@heroui/toast' -import { RequireSome } from '@renderer/types' +import type { RequireSome } from '@renderer/types' type AddToastProps = Parameters[0] type ToastPropsColored = Omit diff --git a/src/renderer/src/components/TranslateButton.tsx b/src/renderer/src/components/TranslateButton.tsx index f8231d348e..4f3c8ec652 100644 --- a/src/renderer/src/components/TranslateButton.tsx +++ b/src/renderer/src/components/TranslateButton.tsx @@ -5,7 +5,8 @@ import useTranslate from '@renderer/hooks/useTranslate' import { translateText } from '@renderer/services/TranslateService' import { Button, Tooltip } from 'antd' import { Languages } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/UpdateDialog.tsx b/src/renderer/src/components/UpdateDialog.tsx index e5cc8fa144..ee87265c0d 100644 --- a/src/renderer/src/components/UpdateDialog.tsx +++ b/src/renderer/src/components/UpdateDialog.tsx @@ -1,7 +1,7 @@ import { Button, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, ScrollShadow } from '@heroui/react' import { loggerService } from '@logger' import { handleSaveData } from '@renderer/store' -import { ReleaseNoteInfo, UpdateInfo } from 'builder-util-runtime' +import type { ReleaseNoteInfo, UpdateInfo } from 'builder-util-runtime' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import Markdown from 'react-markdown' diff --git a/src/renderer/src/components/WindowControls/index.tsx b/src/renderer/src/components/WindowControls/index.tsx index c31476a881..02212222ed 100644 --- a/src/renderer/src/components/WindowControls/index.tsx +++ b/src/renderer/src/components/WindowControls/index.tsx @@ -1,8 +1,8 @@ import { isLinux, isWin } from '@renderer/config/constant' import { Tooltip } from 'antd' import { Minus, Square, X } from 'lucide-react' +import type { SVGProps } from 'react' import { useEffect, useState } from 'react' -import { SVGProps } from 'react' import { useTranslation } from 'react-i18next' import { ControlButton, WindowControlsContainer } from './WindowControls.styled' diff --git a/src/renderer/src/components/__tests__/ModelSelector.test.tsx b/src/renderer/src/components/__tests__/ModelSelector.test.tsx index 2504bba01f..3880f33e31 100644 --- a/src/renderer/src/components/__tests__/ModelSelector.test.tsx +++ b/src/renderer/src/components/__tests__/ModelSelector.test.tsx @@ -24,7 +24,7 @@ vi.mock('@renderer/utils/naming', () => ({ })) // Import after mocking -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import ModelSelector, { modelSelectFilter } from '../ModelSelector' diff --git a/src/renderer/src/components/__tests__/QuickPanelView.test.tsx b/src/renderer/src/components/__tests__/QuickPanelView.test.tsx index 4e904efeb8..ee64ef13d1 100644 --- a/src/renderer/src/components/__tests__/QuickPanelView.test.tsx +++ b/src/renderer/src/components/__tests__/QuickPanelView.test.tsx @@ -5,11 +5,12 @@ import React, { useEffect } from 'react' import { Provider } from 'react-redux' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { QuickPanelListItem, QuickPanelProvider, QuickPanelView, useQuickPanel } from '../QuickPanel' +import type { QuickPanelListItem } from '../QuickPanel' +import { QuickPanelProvider, QuickPanelView, useQuickPanel } from '../QuickPanel' // Mock the DynamicVirtualList component vi.mock('@renderer/components/VirtualList', async (importOriginal) => { - const mod = await importOriginal() + const mod = (await importOriginal()) as any return { ...mod, DynamicVirtualList: ({ ref, list, children, scrollerStyle }: any & { ref?: React.RefObject }) => { diff --git a/src/renderer/src/components/agent/AllowedToolsSelect.tsx b/src/renderer/src/components/agent/AllowedToolsSelect.tsx index 775ae24b83..0ca6320b45 100644 --- a/src/renderer/src/components/agent/AllowedToolsSelect.tsx +++ b/src/renderer/src/components/agent/AllowedToolsSelect.tsx @@ -1,5 +1,6 @@ -import { Chip, cn, Select, SelectedItems, SelectItem, SelectProps } from '@heroui/react' -import { Tool } from '@renderer/types' +import type { SelectedItems, SelectProps } from '@heroui/react' +import { Chip, cn, Select, SelectItem } from '@heroui/react' +import type { Tool } from '@renderer/types' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/components/app/PinnedMinapps.tsx b/src/renderer/src/components/app/PinnedMinapps.tsx index 730192d443..d2e1287759 100644 --- a/src/renderer/src/components/app/PinnedMinapps.tsx +++ b/src/renderer/src/components/app/PinnedMinapps.tsx @@ -3,10 +3,11 @@ import { useMinappPopup } from '@renderer/hooks/useMinappPopup' import { useMinapps } from '@renderer/hooks/useMinapps' import { useRuntime } from '@renderer/hooks/useRuntime' import { useNavbarPosition, useSettings } from '@renderer/hooks/useSettings' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import type { MenuProps } from 'antd' import { Dropdown, Tooltip } from 'antd' -import { FC, useEffect } from 'react' +import type { FC } from 'react' +import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx index 8de40ff15c..56a095f7d3 100644 --- a/src/renderer/src/components/app/Sidebar.tsx +++ b/src/renderer/src/components/app/Sidebar.tsx @@ -28,7 +28,7 @@ import { Sparkle, Sun } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/components/dnd/ItemRenderer.tsx b/src/renderer/src/components/dnd/ItemRenderer.tsx index d13e298963..607458f822 100644 --- a/src/renderer/src/components/dnd/ItemRenderer.tsx +++ b/src/renderer/src/components/dnd/ItemRenderer.tsx @@ -1,10 +1,11 @@ -import { DraggableSyntheticListeners } from '@dnd-kit/core' -import { CSS, Transform } from '@dnd-kit/utilities' +import type { DraggableSyntheticListeners } from '@dnd-kit/core' +import type { Transform } from '@dnd-kit/utilities' +import { CSS } from '@dnd-kit/utilities' import { classNames } from '@renderer/utils' import React, { useEffect } from 'react' import styled from 'styled-components' -import { RenderItemType } from './types' +import type { RenderItemType } from './types' interface ItemRendererProps { ref?: React.Ref diff --git a/src/renderer/src/components/dnd/Sortable.tsx b/src/renderer/src/components/dnd/Sortable.tsx index 8a681e337a..24ef2752b5 100644 --- a/src/renderer/src/components/dnd/Sortable.tsx +++ b/src/renderer/src/components/dnd/Sortable.tsx @@ -1,14 +1,10 @@ +import type { Active, DropAnimation, Modifier, Over, UniqueIdentifier } from '@dnd-kit/core' import { - Active, defaultDropAnimationSideEffects, DndContext, DragOverlay, - DropAnimation, KeyboardSensor, - Modifier, - Over, TouchSensor, - UniqueIdentifier, useSensor, useSensors } from '@dnd-kit/core' @@ -31,7 +27,7 @@ import styled from 'styled-components' import { ItemRenderer } from './ItemRenderer' import { SortableItem } from './SortableItem' -import { RenderItemType } from './types' +import type { RenderItemType } from './types' import { PortalSafePointerSensor } from './utils' interface SortableProps { diff --git a/src/renderer/src/components/dnd/SortableItem.tsx b/src/renderer/src/components/dnd/SortableItem.tsx index ec91f54da8..2b8d2ee905 100644 --- a/src/renderer/src/components/dnd/SortableItem.tsx +++ b/src/renderer/src/components/dnd/SortableItem.tsx @@ -1,7 +1,7 @@ import { useSortable } from '@dnd-kit/sortable' import { ItemRenderer } from './ItemRenderer' -import { RenderItemType } from './types' +import type { RenderItemType } from './types' interface SortableItemProps { item: T diff --git a/src/renderer/src/components/dnd/useDndReorder.ts b/src/renderer/src/components/dnd/useDndReorder.ts index 60beaf925a..0651a1ae6a 100644 --- a/src/renderer/src/components/dnd/useDndReorder.ts +++ b/src/renderer/src/components/dnd/useDndReorder.ts @@ -1,4 +1,5 @@ -import { Key, useCallback, useMemo } from 'react' +import type { Key } from 'react' +import { useCallback, useMemo } from 'react' interface UseDndReorderParams { /** 原始的、完整的数据列表 */ diff --git a/src/renderer/src/config/__test__/models.test.ts b/src/renderer/src/config/__test__/models.test.ts index 53a9b5c424..d55a3b9dd7 100644 --- a/src/renderer/src/config/__test__/models.test.ts +++ b/src/renderer/src/config/__test__/models.test.ts @@ -6,7 +6,7 @@ import { isVisionModel, isWebSearchModel } from '@renderer/config/models' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { beforeEach, describe, expect, test, vi } from 'vitest' // Suggested test cases diff --git a/src/renderer/src/config/agent.ts b/src/renderer/src/config/agent.ts index e6ae3902b1..1757c74b20 100644 --- a/src/renderer/src/config/agent.ts +++ b/src/renderer/src/config/agent.ts @@ -1,6 +1,6 @@ import ClaudeAvatar from '@renderer/assets/images/models/claude.png' -import { AgentBase, AgentType } from '@renderer/types' -import { PermissionModeCard } from '@renderer/types/agent' +import type { AgentBase, AgentType } from '@renderer/types' +import type { PermissionModeCard } from '@renderer/types/agent' // base agent config. no default config for now. const DEFAULT_AGENT_CONFIG: Omit = { diff --git a/src/renderer/src/config/endpointTypes.ts b/src/renderer/src/config/endpointTypes.ts index 4340e5628f..e82f741632 100644 --- a/src/renderer/src/config/endpointTypes.ts +++ b/src/renderer/src/config/endpointTypes.ts @@ -1,4 +1,4 @@ -import { EndpointType } from '@renderer/types' +import type { EndpointType } from '@renderer/types' export const endpointTypeOptions: { label: string; value: EndpointType }[] = [ { value: 'openai', label: 'endpoint_type.openai' }, diff --git a/src/renderer/src/config/minapps.ts b/src/renderer/src/config/minapps.ts index 6b0f1689ed..815b3f4760 100644 --- a/src/renderer/src/config/minapps.ts +++ b/src/renderer/src/config/minapps.ts @@ -57,7 +57,7 @@ import OpenAiProviderLogo from '@renderer/assets/images/providers/openai.png?url import SiliconFlowProviderLogo from '@renderer/assets/images/providers/silicon.png?url' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png?url' import i18n from '@renderer/i18n' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' const logger = loggerService.withContext('Config:minapps') diff --git a/src/renderer/src/config/models/default.ts b/src/renderer/src/config/models/default.ts index 4133e8eb8c..5b242f297d 100644 --- a/src/renderer/src/config/models/default.ts +++ b/src/renderer/src/config/models/default.ts @@ -1,4 +1,4 @@ -import { Model, SystemProviderId } from '@renderer/types' +import type { Model, SystemProviderId } from '@renderer/types' export const glm45FlashModel: Model = { id: 'glm-4.5-flash', diff --git a/src/renderer/src/config/models/embedding.ts b/src/renderer/src/config/models/embedding.ts index 7aa48a6d07..5eb9cd6ff3 100644 --- a/src/renderer/src/config/models/embedding.ts +++ b/src/renderer/src/config/models/embedding.ts @@ -1,4 +1,4 @@ -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { getLowerBaseModelName, isUserSelectedModelType } from '@renderer/utils' // Embedding models diff --git a/src/renderer/src/config/models/logo.ts b/src/renderer/src/config/models/logo.ts index 9e1ef2ce21..ce592ad466 100644 --- a/src/renderer/src/config/models/logo.ts +++ b/src/renderer/src/config/models/logo.ts @@ -156,7 +156,7 @@ import ZhipuModelLogoDark from '@renderer/assets/images/models/zhipu_dark.png' import YoudaoLogo from '@renderer/assets/images/providers/netease-youdao.svg' import NomicLogo from '@renderer/assets/images/providers/nomic.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' export function getModelLogoById(modelId: string): string | undefined { const isLight = true diff --git a/src/renderer/src/config/models/reasoning.ts b/src/renderer/src/config/models/reasoning.ts index b3d7ae6efc..3a4d97e592 100644 --- a/src/renderer/src/config/models/reasoning.ts +++ b/src/renderer/src/config/models/reasoning.ts @@ -1,4 +1,4 @@ -import { +import type { Model, ReasoningEffortConfig, SystemProviderId, diff --git a/src/renderer/src/config/models/tooluse.ts b/src/renderer/src/config/models/tooluse.ts index cd81842514..76c441e9fc 100644 --- a/src/renderer/src/config/models/tooluse.ts +++ b/src/renderer/src/config/models/tooluse.ts @@ -1,4 +1,5 @@ -import { isSystemProviderId, Model } from '@renderer/types' +import type { Model } from '@renderer/types' +import { isSystemProviderId } from '@renderer/types' import { getLowerBaseModelName, isUserSelectedModelType } from '@renderer/utils' import { isEmbeddingModel, isRerankModel } from './embedding' diff --git a/src/renderer/src/config/models/utils.ts b/src/renderer/src/config/models/utils.ts index 5d8be539dd..743f722528 100644 --- a/src/renderer/src/config/models/utils.ts +++ b/src/renderer/src/config/models/utils.ts @@ -1,6 +1,6 @@ -import OpenAI from '@cherrystudio/openai' +import type OpenAI from '@cherrystudio/openai' import { isEmbeddingModel, isRerankModel } from '@renderer/config/models/embedding' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { getLowerBaseModelName } from '@renderer/utils' import { WEB_SEARCH_PROMPT_FOR_OPENROUTER } from '../prompts' diff --git a/src/renderer/src/config/models/vision.ts b/src/renderer/src/config/models/vision.ts index 19e6ce6047..18b3480710 100644 --- a/src/renderer/src/config/models/vision.ts +++ b/src/renderer/src/config/models/vision.ts @@ -1,5 +1,5 @@ import { getProviderByModel } from '@renderer/services/AssistantService' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { getLowerBaseModelName, isUserSelectedModelType } from '@renderer/utils' import { isEmbeddingModel, isRerankModel } from './embedding' diff --git a/src/renderer/src/config/models/websearch.ts b/src/renderer/src/config/models/websearch.ts index 0327e611e2..418c81133d 100644 --- a/src/renderer/src/config/models/websearch.ts +++ b/src/renderer/src/config/models/websearch.ts @@ -1,5 +1,6 @@ import { getProviderByModel } from '@renderer/services/AssistantService' -import { Model, SystemProviderIds } from '@renderer/types' +import type { Model } from '@renderer/types' +import { SystemProviderIds } from '@renderer/types' import { getLowerBaseModelName, isUserSelectedModelType } from '@renderer/utils' import { isGeminiProvider, isNewApiProvider, isOpenAICompatibleProvider, isOpenAIProvider } from '../providers' diff --git a/src/renderer/src/config/ocr.ts b/src/renderer/src/config/ocr.ts index 6eb52f1ad3..2f5141c0f0 100644 --- a/src/renderer/src/config/ocr.ts +++ b/src/renderer/src/config/ocr.ts @@ -1,4 +1,4 @@ -import { +import type { BuiltinOcrProvider, BuiltinOcrProviderId, OcrOvProvider, diff --git a/src/renderer/src/config/preprocessProviders.ts b/src/renderer/src/config/preprocessProviders.ts index c01880eb95..7f41235c19 100644 --- a/src/renderer/src/config/preprocessProviders.ts +++ b/src/renderer/src/config/preprocessProviders.ts @@ -1,7 +1,7 @@ import Doc2xLogo from '@renderer/assets/images/ocr/doc2x.png' import MinerULogo from '@renderer/assets/images/ocr/mineru.jpg' import MistralLogo from '@renderer/assets/images/providers/mistral.png' -import { PreprocessProviderId } from '@renderer/types' +import type { PreprocessProviderId } from '@renderer/types' export function getPreprocessProviderLogo(providerId: PreprocessProviderId) { switch (providerId) { diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 7c9a77a190..4c25dfff99 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -56,16 +56,15 @@ import VoyageAIProviderLogo from '@renderer/assets/images/providers/voyageai.png import XirangProviderLogo from '@renderer/assets/images/providers/xirang.png' import ZeroOneProviderLogo from '@renderer/assets/images/providers/zero-one.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' -import { +import type { AtLeast, AzureOpenAIProvider, - isSystemProvider, - OpenAIServiceTiers, Provider, ProviderType, SystemProvider, SystemProviderId } from '@renderer/types' +import { isSystemProvider, OpenAIServiceTiers } from '@renderer/types' import { TOKENFLUX_HOST } from './constant' import { glm45FlashModel, qwen38bModel, SYSTEM_MODELS } from './models' diff --git a/src/renderer/src/config/sidebar.ts b/src/renderer/src/config/sidebar.ts index 637dc34382..5fd5aecff9 100644 --- a/src/renderer/src/config/sidebar.ts +++ b/src/renderer/src/config/sidebar.ts @@ -1,4 +1,4 @@ -import { SidebarIcon } from '@renderer/types' +import type { SidebarIcon } from '@renderer/types' /** * 默认显示的侧边栏图标 diff --git a/src/renderer/src/config/tools.ts b/src/renderer/src/config/tools.ts index f7c06a4efe..98cb5f7a18 100644 --- a/src/renderer/src/config/tools.ts +++ b/src/renderer/src/config/tools.ts @@ -1,5 +1,5 @@ -import { ChatCompletionTool } from '@cherrystudio/openai/resources' -import { Model } from '@renderer/types' +import type { ChatCompletionTool } from '@cherrystudio/openai/resources' +import type { Model } from '@renderer/types' import { WEB_SEARCH_PROMPT_FOR_ZHIPU } from './prompts' diff --git a/src/renderer/src/config/translate.ts b/src/renderer/src/config/translate.ts index 05a5e825b9..22659b73e5 100644 --- a/src/renderer/src/config/translate.ts +++ b/src/renderer/src/config/translate.ts @@ -1,5 +1,5 @@ import i18n from '@renderer/i18n' -import { TranslateLanguage } from '@renderer/types' +import type { TranslateLanguage } from '@renderer/types' export const UNKNOWN: TranslateLanguage = { value: 'Unknown', diff --git a/src/renderer/src/config/webSearchProviders.ts b/src/renderer/src/config/webSearchProviders.ts index abeac52938..1ce3297afb 100644 --- a/src/renderer/src/config/webSearchProviders.ts +++ b/src/renderer/src/config/webSearchProviders.ts @@ -1,4 +1,4 @@ -import { WebSearchProvider, WebSearchProviderId } from '@renderer/types' +import type { WebSearchProvider, WebSearchProviderId } from '@renderer/types' type WebSearchProviderConfig = { websites: { diff --git a/src/renderer/src/context/AntdProvider.tsx b/src/renderer/src/context/AntdProvider.tsx index 1c95067f5e..685b3b0fbd 100644 --- a/src/renderer/src/context/AntdProvider.tsx +++ b/src/renderer/src/context/AntdProvider.tsx @@ -1,5 +1,5 @@ import { useSettings } from '@renderer/hooks/useSettings' -import { LanguageVarious } from '@renderer/types' +import type { LanguageVarious } from '@renderer/types' import { ConfigProvider, theme } from 'antd' import deDE from 'antd/locale/de_DE' import elGR from 'antd/locale/el_GR' @@ -11,7 +11,7 @@ import ptPT from 'antd/locale/pt_PT' import ruRU from 'antd/locale/ru_RU' import zhCN from 'antd/locale/zh_CN' import zhTW from 'antd/locale/zh_TW' -import { FC, PropsWithChildren } from 'react' +import type { FC, PropsWithChildren } from 'react' import { useTheme } from './ThemeProvider' diff --git a/src/renderer/src/context/CodeStyleProvider.tsx b/src/renderer/src/context/CodeStyleProvider.tsx index 1ef41d1eba..ec369aaa68 100644 --- a/src/renderer/src/context/CodeStyleProvider.tsx +++ b/src/renderer/src/context/CodeStyleProvider.tsx @@ -1,7 +1,8 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { useMermaid } from '@renderer/hooks/useMermaid' import { useSettings } from '@renderer/hooks/useSettings' -import { HighlightChunkResult, ShikiPreProperties, shikiStreamService } from '@renderer/services/ShikiStreamService' +import type { HighlightChunkResult, ShikiPreProperties } from '@renderer/services/ShikiStreamService' +import { shikiStreamService } from '@renderer/services/ShikiStreamService' import { ThemeMode } from '@renderer/types' import { getHighlighter, getMarkdownIt, getShiki, loadLanguageIfNeeded, loadThemeIfNeeded } from '@renderer/utils/shiki' import * as cmThemes from '@uiw/codemirror-themes-all' diff --git a/src/renderer/src/context/MessageEditingContext.tsx b/src/renderer/src/context/MessageEditingContext.tsx index 5c864908b6..90a9037c61 100644 --- a/src/renderer/src/context/MessageEditingContext.tsx +++ b/src/renderer/src/context/MessageEditingContext.tsx @@ -1,4 +1,5 @@ -import { createContext, ReactNode, use, useState } from 'react' +import type { ReactNode } from 'react' +import { createContext, use, useState } from 'react' interface MessageEditingContextType { editingMessageId: string | null diff --git a/src/renderer/src/context/NotificationProvider.tsx b/src/renderer/src/context/NotificationProvider.tsx index c6de09b722..8db0b980b0 100644 --- a/src/renderer/src/context/NotificationProvider.tsx +++ b/src/renderer/src/context/NotificationProvider.tsx @@ -1,5 +1,5 @@ import { NotificationQueue } from '@renderer/queue/NotificationQueue' -import { Notification } from '@renderer/types/notification' +import type { Notification } from '@renderer/types/notification' import { isFocused } from '@renderer/utils/window' import { notification } from 'antd' import React, { createContext, use, useEffect, useMemo } from 'react' diff --git a/src/renderer/src/context/ThemeProvider.tsx b/src/renderer/src/context/ThemeProvider.tsx index 226caefca1..eab4bd1380 100644 --- a/src/renderer/src/context/ThemeProvider.tsx +++ b/src/renderer/src/context/ThemeProvider.tsx @@ -3,7 +3,8 @@ import { useNavbarPosition, useSettings } from '@renderer/hooks/useSettings' import useUserTheme from '@renderer/hooks/useUserTheme' import { ThemeMode } from '@renderer/types' import { IpcChannel } from '@shared/IpcChannel' -import React, { createContext, PropsWithChildren, use, useEffect, useState } from 'react' +import type { PropsWithChildren } from 'react' +import React, { createContext, use, useEffect, useState } from 'react' interface ThemeContextType { theme: ThemeMode diff --git a/src/renderer/src/databases/index.ts b/src/renderer/src/databases/index.ts index 83ad6b663d..fc47e37cb7 100644 --- a/src/renderer/src/databases/index.ts +++ b/src/renderer/src/databases/index.ts @@ -1,4 +1,4 @@ -import { +import type { CustomTranslateLanguage, FileMetadata, KnowledgeNoteItem, diff --git a/src/renderer/src/databases/upgrades.ts b/src/renderer/src/databases/upgrades.ts index 79a36419de..8f952e245b 100644 --- a/src/renderer/src/databases/upgrades.ts +++ b/src/renderer/src/databases/upgrades.ts @@ -9,7 +9,7 @@ import type { MessageBlock } from '@renderer/types/newMessage' import { AssistantMessageStatus, MessageBlockStatus } from '@renderer/types/newMessage' -import { Transaction } from 'dexie' +import type { Transaction } from 'dexie' import { isEmpty } from 'lodash' import { diff --git a/src/renderer/src/env.d.ts b/src/renderer/src/env.d.ts index b07d74d876..563d74cb8d 100644 --- a/src/renderer/src/env.d.ts +++ b/src/renderer/src/env.d.ts @@ -1,12 +1,12 @@ /// import type { PermissionUpdate } from '@anthropic-ai/claude-agent-sdk' -import { addToast, closeAll, closeToast, getToastQueue, isToastClosing } from '@heroui/toast' +import type { addToast, closeAll, closeToast, getToastQueue, isToastClosing } from '@heroui/toast' import type KeyvStorage from '@kangfenmao/keyv-storage' -import { HookAPI } from 'antd/es/modal/useModal' -import { NavigateFunction } from 'react-router-dom' +import type { HookAPI } from 'antd/es/modal/useModal' +import type { NavigateFunction } from 'react-router-dom' -import { error, info, loading, success, warning } from './components/TopView/toast' +import type { error, info, loading, success, warning } from './components/TopView/toast' interface ImportMetaEnv { VITE_RENDERER_INTEGRATED_MODEL: string diff --git a/src/renderer/src/hooks/agents/useAgents.ts b/src/renderer/src/hooks/agents/useAgents.ts index 3f5dcb6e35..7b00811262 100644 --- a/src/renderer/src/hooks/agents/useAgents.ts +++ b/src/renderer/src/hooks/agents/useAgents.ts @@ -1,6 +1,6 @@ import { useAppDispatch } from '@renderer/store' import { setActiveAgentId, setActiveSessionIdAction } from '@renderer/store/runtime' -import { AddAgentForm, CreateAgentResponse } from '@renderer/types' +import type { AddAgentForm, CreateAgentResponse } from '@renderer/types' import { formatErrorMessageWithPrefix } from '@renderer/utils/error' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/agents/useModel.ts b/src/renderer/src/hooks/agents/useModel.ts index 17c1b02147..87070fce5f 100644 --- a/src/renderer/src/hooks/agents/useModel.ts +++ b/src/renderer/src/hooks/agents/useModel.ts @@ -1,4 +1,4 @@ -import { ApiModelsFilter } from '@renderer/types' +import type { ApiModelsFilter } from '@renderer/types' import { useApiModels } from './useModels' diff --git a/src/renderer/src/hooks/agents/useModels.ts b/src/renderer/src/hooks/agents/useModels.ts index c23a056c7d..78d1c59044 100644 --- a/src/renderer/src/hooks/agents/useModels.ts +++ b/src/renderer/src/hooks/agents/useModels.ts @@ -1,4 +1,4 @@ -import { ApiModel, ApiModelsFilter } from '@renderer/types' +import type { ApiModel, ApiModelsFilter } from '@renderer/types' import { merge } from 'lodash' import { useCallback } from 'react' import useSWR from 'swr' diff --git a/src/renderer/src/hooks/agents/useSessions.ts b/src/renderer/src/hooks/agents/useSessions.ts index 2be85d5eba..a9977ba2e3 100644 --- a/src/renderer/src/hooks/agents/useSessions.ts +++ b/src/renderer/src/hooks/agents/useSessions.ts @@ -1,4 +1,4 @@ -import { CreateAgentSessionResponse, CreateSessionForm, GetAgentSessionResponse } from '@renderer/types' +import type { CreateAgentSessionResponse, CreateSessionForm, GetAgentSessionResponse } from '@renderer/types' import { formatErrorMessageWithPrefix } from '@renderer/utils/error' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/agents/useUpdateAgent.ts b/src/renderer/src/hooks/agents/useUpdateAgent.ts index 76d3fbd9ec..abbe1ed46f 100644 --- a/src/renderer/src/hooks/agents/useUpdateAgent.ts +++ b/src/renderer/src/hooks/agents/useUpdateAgent.ts @@ -1,5 +1,5 @@ -import { AgentEntity, ListAgentsResponse, UpdateAgentForm } from '@renderer/types' -import { UpdateAgentBaseOptions, UpdateAgentFunction } from '@renderer/types/agent' +import type { AgentEntity, ListAgentsResponse, UpdateAgentForm } from '@renderer/types' +import type { UpdateAgentBaseOptions, UpdateAgentFunction } from '@renderer/types/agent' import { formatErrorMessageWithPrefix } from '@renderer/utils/error' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/agents/useUpdateSession.ts b/src/renderer/src/hooks/agents/useUpdateSession.ts index 44a5839d7e..759b7d25ff 100644 --- a/src/renderer/src/hooks/agents/useUpdateSession.ts +++ b/src/renderer/src/hooks/agents/useUpdateSession.ts @@ -1,5 +1,5 @@ -import { AgentSessionEntity, ListAgentSessionsResponse, UpdateSessionForm } from '@renderer/types' -import { UpdateAgentBaseOptions, UpdateAgentSessionFunction } from '@renderer/types/agent' +import type { AgentSessionEntity, ListAgentSessionsResponse, UpdateSessionForm } from '@renderer/types' +import type { UpdateAgentBaseOptions, UpdateAgentSessionFunction } from '@renderer/types/agent' import { getErrorMessage } from '@renderer/utils/error' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/useAssistant.ts b/src/renderer/src/hooks/useAssistant.ts index 8a038bec31..dc0f5c28e3 100644 --- a/src/renderer/src/hooks/useAssistant.ts +++ b/src/renderer/src/hooks/useAssistant.ts @@ -25,7 +25,7 @@ import { updateTopics } from '@renderer/store/assistants' import { setDefaultModel, setQuickModel, setTranslateModel } from '@renderer/store/llm' -import { Assistant, AssistantSettings, Model, ThinkingOption, Topic } from '@renderer/types' +import type { Assistant, AssistantSettings, Model, ThinkingOption, Topic } from '@renderer/types' import { uuid } from '@renderer/utils' import { useCallback, useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/useAssistantPresets.ts b/src/renderer/src/hooks/useAssistantPresets.ts index b6db1dffac..a92bc99897 100644 --- a/src/renderer/src/hooks/useAssistantPresets.ts +++ b/src/renderer/src/hooks/useAssistantPresets.ts @@ -7,7 +7,7 @@ import { updateAssistantPreset, updateAssistantPresetSettings } from '@renderer/store/assistants' -import { AssistantPreset, AssistantSettings } from '@renderer/types' +import type { AssistantPreset, AssistantSettings } from '@renderer/types' const logger = loggerService.withContext('useAssistantPresets') diff --git a/src/renderer/src/hooks/useChatContext.ts b/src/renderer/src/hooks/useChatContext.ts index 415ab0c616..2e829cb859 100644 --- a/src/renderer/src/hooks/useChatContext.ts +++ b/src/renderer/src/hooks/useChatContext.ts @@ -1,11 +1,11 @@ import { loggerService } from '@logger' import { useMessageOperations } from '@renderer/hooks/useMessageOperations' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { RootState } from '@renderer/store' +import type { RootState } from '@renderer/store' import { messageBlocksSelectors } from '@renderer/store/messageBlock' import { selectMessagesForTopic } from '@renderer/store/newMessage' import { setActiveTopic, setSelectedMessageIds, toggleMultiSelectMode } from '@renderer/store/runtime' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector, useStore } from 'react-redux' diff --git a/src/renderer/src/hooks/useCodeHighlight.ts b/src/renderer/src/hooks/useCodeHighlight.ts index 4ae5e9e97e..7e6e40b6ef 100644 --- a/src/renderer/src/hooks/useCodeHighlight.ts +++ b/src/renderer/src/hooks/useCodeHighlight.ts @@ -1,6 +1,6 @@ import { useCodeStyle } from '@renderer/context/CodeStyleProvider' import { useCallback, useEffect, useRef, useState } from 'react' -import { ThemedToken } from 'shiki/core' +import type { ThemedToken } from 'shiki/core' interface UseCodeHighlightOptions { rawLines: string[] diff --git a/src/renderer/src/hooks/useCodeTools.ts b/src/renderer/src/hooks/useCodeTools.ts index 44ffd29d9c..2468587688 100644 --- a/src/renderer/src/hooks/useCodeTools.ts +++ b/src/renderer/src/hooks/useCodeTools.ts @@ -11,7 +11,7 @@ import { setSelectedModel, setSelectedTerminal } from '@renderer/store/codeTools' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { codeTools } from '@shared/config/constant' import { useCallback } from 'react' diff --git a/src/renderer/src/hooks/useFiles.ts b/src/renderer/src/hooks/useFiles.ts index 19e6d98e77..958d41b277 100644 --- a/src/renderer/src/hooks/useFiles.ts +++ b/src/renderer/src/hooks/useFiles.ts @@ -1,4 +1,4 @@ -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { filterSupportedFiles } from '@renderer/utils' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/useKnowledge.ts b/src/renderer/src/hooks/useKnowledge.ts index e4dc8f12fb..464195aff3 100644 --- a/src/renderer/src/hooks/useKnowledge.ts +++ b/src/renderer/src/hooks/useKnowledge.ts @@ -1,7 +1,8 @@ import { db } from '@renderer/databases' import KnowledgeQueue from '@renderer/queue/KnowledgeQueue' import { getKnowledgeBaseParams } from '@renderer/services/KnowledgeService' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { addBase, clearAllProcessing, @@ -16,16 +17,8 @@ import { updateNotes } from '@renderer/store/knowledge' import { addFilesThunk, addItemThunk, addNoteThunk, addVedioThunk } from '@renderer/store/thunk/knowledgeThunk' -import { - FileMetadata, - isKnowledgeFileItem, - isKnowledgeNoteItem, - isKnowledgeVideoItem, - KnowledgeBase, - KnowledgeItem, - KnowledgeNoteItem, - ProcessingStatus -} from '@renderer/types' +import type { FileMetadata, KnowledgeBase, KnowledgeItem, KnowledgeNoteItem, ProcessingStatus } from '@renderer/types' +import { isKnowledgeFileItem, isKnowledgeNoteItem, isKnowledgeVideoItem } from '@renderer/types' import { runAsyncFunction, uuid } from '@renderer/utils' import dayjs from 'dayjs' import { cloneDeep } from 'lodash' diff --git a/src/renderer/src/hooks/useKnowledgeBaseForm.ts b/src/renderer/src/hooks/useKnowledgeBaseForm.ts index 70dc83c27b..a42fc90fa0 100644 --- a/src/renderer/src/hooks/useKnowledgeBaseForm.ts +++ b/src/renderer/src/hooks/useKnowledgeBaseForm.ts @@ -2,7 +2,7 @@ import { getEmbeddingMaxContext } from '@renderer/config/embedings' import { usePreprocessProviders } from '@renderer/hooks/usePreprocess' import { useProviders } from '@renderer/hooks/useProvider' import { getModelUniqId } from '@renderer/services/ModelService' -import { KnowledgeBase } from '@renderer/types' +import type { KnowledgeBase } from '@renderer/types' import { nanoid } from 'nanoid' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/useKnowledgeFiles.tsx b/src/renderer/src/hooks/useKnowledgeFiles.tsx index 57b454e6b7..a14591c520 100644 --- a/src/renderer/src/hooks/useKnowledgeFiles.tsx +++ b/src/renderer/src/hooks/useKnowledgeFiles.tsx @@ -1,5 +1,5 @@ import FileManager from '@renderer/services/FileManager' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { isEmpty } from 'lodash' import { useEffect, useState } from 'react' diff --git a/src/renderer/src/hooks/useMCPServerTrust.tsx b/src/renderer/src/hooks/useMCPServerTrust.tsx index 817ae03105..ee3fefba65 100644 --- a/src/renderer/src/hooks/useMCPServerTrust.tsx +++ b/src/renderer/src/hooks/useMCPServerTrust.tsx @@ -3,7 +3,7 @@ import { ensureServerTrusted as ensureServerTrustedCore, getCommandPreview } from '@renderer/pages/settings/MCPSettings/utils' -import { MCPServer } from '@renderer/types' +import type { MCPServer } from '@renderer/types' import { modalConfirm } from '@renderer/utils' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/useMCPServers.ts b/src/renderer/src/hooks/useMCPServers.ts index c4f2815f45..26731e14fd 100644 --- a/src/renderer/src/hooks/useMCPServers.ts +++ b/src/renderer/src/hooks/useMCPServers.ts @@ -1,8 +1,9 @@ import { createSelector } from '@reduxjs/toolkit' import NavigationService from '@renderer/services/NavigationService' -import store, { RootState, useAppDispatch, useAppSelector } from '@renderer/store' +import type { RootState } from '@renderer/store' +import store, { useAppDispatch, useAppSelector } from '@renderer/store' import { addMCPServer, deleteMCPServer, setMCPServers, updateMCPServer } from '@renderer/store/mcp' -import { MCPServer } from '@renderer/types' +import type { MCPServer } from '@renderer/types' import { IpcChannel } from '@shared/IpcChannel' // Listen for server changes from main process diff --git a/src/renderer/src/hooks/useMinappPopup.ts b/src/renderer/src/hooks/useMinappPopup.ts index 99b49e43e8..9d372a6b3c 100644 --- a/src/renderer/src/hooks/useMinappPopup.ts +++ b/src/renderer/src/hooks/useMinappPopup.ts @@ -10,7 +10,7 @@ import { setOpenedKeepAliveMinapps, setOpenedOneOffMinapp } from '@renderer/store/runtime' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import { clearWebviewState } from '@renderer/utils/webviewStateManager' import { LRUCache } from 'lru-cache' import { useCallback } from 'react' diff --git a/src/renderer/src/hooks/useMinapps.ts b/src/renderer/src/hooks/useMinapps.ts index 4a8fe5a440..77ea3cb89e 100644 --- a/src/renderer/src/hooks/useMinapps.ts +++ b/src/renderer/src/hooks/useMinapps.ts @@ -1,7 +1,8 @@ import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' -import { RootState, useAppDispatch, useAppSelector } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch, useAppSelector } from '@renderer/store' import { setDisabledMinApps, setMinApps, setPinnedMinApps } from '@renderer/store/minapps' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' export const useMinapps = () => { const { enabled, disabled, pinned } = useAppSelector((state: RootState) => state.minapps) diff --git a/src/renderer/src/hooks/useNotesQuery.ts b/src/renderer/src/hooks/useNotesQuery.ts index aba2d0078d..822623679f 100644 --- a/src/renderer/src/hooks/useNotesQuery.ts +++ b/src/renderer/src/hooks/useNotesQuery.ts @@ -1,6 +1,6 @@ import { useAppSelector } from '@renderer/store' import { selectActiveFilePath } from '@renderer/store/note' -import { NotesTreeNode } from '@renderer/types/note' +import type { NotesTreeNode } from '@renderer/types/note' import { useQuery, useQueryClient } from '@tanstack/react-query' import { useCallback, useMemo } from 'react' diff --git a/src/renderer/src/hooks/useNotesSettings.ts b/src/renderer/src/hooks/useNotesSettings.ts index f72b1e7d26..21a4fee586 100644 --- a/src/renderer/src/hooks/useNotesSettings.ts +++ b/src/renderer/src/hooks/useNotesSettings.ts @@ -1,11 +1,6 @@ import { useAppDispatch, useAppSelector } from '@renderer/store' -import { - NotesSettings, - selectNotesPath, - selectNotesSettings, - setNotesPath, - updateNotesSettings -} from '@renderer/store/note' +import type { NotesSettings } from '@renderer/store/note' +import { selectNotesPath, selectNotesSettings, setNotesPath, updateNotesSettings } from '@renderer/store/note' export const useNotesSettings = () => { const dispatch = useAppDispatch() diff --git a/src/renderer/src/hooks/useOcr.ts b/src/renderer/src/hooks/useOcr.ts index 284b31695b..84db7c5237 100644 --- a/src/renderer/src/hooks/useOcr.ts +++ b/src/renderer/src/hooks/useOcr.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' import * as OcrService from '@renderer/services/ocr/OcrService' -import { ImageFileMetadata, isImageFileMetadata, SupportedOcrFile } from '@renderer/types' +import type { ImageFileMetadata, SupportedOcrFile } from '@renderer/types' +import { isImageFileMetadata } from '@renderer/types' import { formatErrorMessage } from '@renderer/utils/error' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/hooks/useOcrProvider.tsx b/src/renderer/src/hooks/useOcrProvider.tsx index bd597e2267..accc6df002 100644 --- a/src/renderer/src/hooks/useOcrProvider.tsx +++ b/src/renderer/src/hooks/useOcrProvider.tsx @@ -6,14 +6,8 @@ import { BUILTIN_OCR_PROVIDERS_MAP, DEFAULT_OCR_PROVIDER } from '@renderer/confi import { getBuiltinOcrProviderLabel } from '@renderer/i18n/label' import { useAppSelector } from '@renderer/store' import { addOcrProvider, removeOcrProvider, setImageOcrProviderId, updateOcrProviderConfig } from '@renderer/store/ocr' -import { - ImageOcrProvider, - isBuiltinOcrProvider, - isBuiltinOcrProviderId, - isImageOcrProvider, - OcrProvider, - OcrProviderConfig -} from '@renderer/types' +import type { ImageOcrProvider, OcrProvider, OcrProviderConfig } from '@renderer/types' +import { isBuiltinOcrProvider, isBuiltinOcrProviderId, isImageOcrProvider } from '@renderer/types' import { Avatar } from 'antd' import { FileQuestionMarkIcon, MonitorIcon } from 'lucide-react' import { useCallback, useEffect, useState } from 'react' diff --git a/src/renderer/src/hooks/usePaintings.ts b/src/renderer/src/hooks/usePaintings.ts index e7c7f22359..978cb5cb3b 100644 --- a/src/renderer/src/hooks/usePaintings.ts +++ b/src/renderer/src/hooks/usePaintings.ts @@ -1,7 +1,7 @@ import FileManager from '@renderer/services/FileManager' import { useAppDispatch, useAppSelector } from '@renderer/store' import { addPainting, removePainting, updatePainting, updatePaintings } from '@renderer/store/paintings' -import { PaintingAction, PaintingsState } from '@renderer/types' +import type { PaintingAction, PaintingsState } from '@renderer/types' export function usePaintings() { const siliconflow_paintings = useAppSelector((state) => state.paintings.siliconflow_paintings) diff --git a/src/renderer/src/hooks/usePreprocess.ts b/src/renderer/src/hooks/usePreprocess.ts index 96e01ec407..19d422ac92 100644 --- a/src/renderer/src/hooks/usePreprocess.ts +++ b/src/renderer/src/hooks/usePreprocess.ts @@ -1,11 +1,11 @@ -import { RootState } from '@renderer/store' +import type { RootState } from '@renderer/store' import { syncPreprocessProvider as _syncPreprocessProvider } from '@renderer/store/knowledge' import { setDefaultPreprocessProvider as _setDefaultPreprocessProvider, updatePreprocessProvider as _updatePreprocessProvider, updatePreprocessProviders as _updatePreprocessProviders } from '@renderer/store/preprocess' -import { PreprocessProvider, PreprocessProviderId } from '@renderer/types' +import type { PreprocessProvider, PreprocessProviderId } from '@renderer/types' import { useDispatch, useSelector } from 'react-redux' export const usePreprocessProvider = (id: PreprocessProviderId) => { diff --git a/src/renderer/src/hooks/useProvider.ts b/src/renderer/src/hooks/useProvider.ts index 96120d4dc8..be4ed772fb 100644 --- a/src/renderer/src/hooks/useProvider.ts +++ b/src/renderer/src/hooks/useProvider.ts @@ -11,7 +11,8 @@ import { updateProvider, updateProviders } from '@renderer/store/llm' -import { Assistant, isSystemProvider, Model, Provider } from '@renderer/types' +import type { Assistant, Model, Provider } from '@renderer/types' +import { isSystemProvider } from '@renderer/types' import { useDefaultModel } from './useAssistant' diff --git a/src/renderer/src/hooks/useSelectionAssistant.ts b/src/renderer/src/hooks/useSelectionAssistant.ts index 93a51b2c70..74e72065de 100644 --- a/src/renderer/src/hooks/useSelectionAssistant.ts +++ b/src/renderer/src/hooks/useSelectionAssistant.ts @@ -12,7 +12,7 @@ import { setSelectionEnabled, setTriggerMode } from '@renderer/store/selectionStore' -import { ActionItem, FilterMode, TriggerMode } from '@renderer/types/selectionTypes' +import type { ActionItem, FilterMode, TriggerMode } from '@renderer/types/selectionTypes' export function useSelectionAssistant() { const dispatch = useAppDispatch() diff --git a/src/renderer/src/hooks/useSettings.ts b/src/renderer/src/hooks/useSettings.ts index 2b9178f4ad..55d40e435d 100644 --- a/src/renderer/src/hooks/useSettings.ts +++ b/src/renderer/src/hooks/useSettings.ts @@ -1,7 +1,6 @@ import store, { useAppDispatch, useAppSelector } from '@renderer/store' +import type { AssistantIconType, SendMessageShortcut, SettingsState } from '@renderer/store/settings' import { - AssistantIconType, - SendMessageShortcut, setAssistantIconType, setAutoCheckUpdate as _setAutoCheckUpdate, setDisableHardwareAcceleration, @@ -16,14 +15,13 @@ import { setTestChannel as _setTestChannel, setTestPlan as _setTestPlan, setTheme, - SettingsState, setTopicPosition, setTray as _setTray, setTrayOnClose, setWindowStyle } from '@renderer/store/settings' -import { SidebarIcon, ThemeMode, TranslateLanguageCode } from '@renderer/types' -import { UpgradeChannel } from '@shared/config/constant' +import type { SidebarIcon, ThemeMode, TranslateLanguageCode } from '@renderer/types' +import type { UpgradeChannel } from '@shared/config/constant' export function useSettings() { const settings = useAppSelector((state) => state.settings) diff --git a/src/renderer/src/hooks/useSidebarIcon.ts b/src/renderer/src/hooks/useSidebarIcon.ts index 0bd252d8ef..5c2ed91f5a 100644 --- a/src/renderer/src/hooks/useSidebarIcon.ts +++ b/src/renderer/src/hooks/useSidebarIcon.ts @@ -1,4 +1,4 @@ -import { SidebarIcon } from '@renderer/types' +import type { SidebarIcon } from '@renderer/types' import { useSettings } from './useSettings' diff --git a/src/renderer/src/hooks/useStore.ts b/src/renderer/src/hooks/useStore.ts index 53e4646450..bb77e1f0da 100644 --- a/src/renderer/src/hooks/useStore.ts +++ b/src/renderer/src/hooks/useStore.ts @@ -7,7 +7,7 @@ import { toggleShowAssistants, toggleShowTopics } from '@renderer/store/settings' -import { AssistantsSortType } from '@renderer/types' +import type { AssistantsSortType } from '@renderer/types' export function useShowAssistants() { const showAssistants = useAppSelector((state) => state.settings.showAssistants) diff --git a/src/renderer/src/hooks/useTags.ts b/src/renderer/src/hooks/useTags.ts index cdd0af5246..0a0bb134c5 100644 --- a/src/renderer/src/hooks/useTags.ts +++ b/src/renderer/src/hooks/useTags.ts @@ -1,5 +1,6 @@ import { createSelector } from '@reduxjs/toolkit' -import { RootState, useAppDispatch, useAppSelector } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch, useAppSelector } from '@renderer/store' import { setTagsOrder, updateTagCollapse } from '@renderer/store/assistants' import { flatMap, groupBy, uniq } from 'lodash' import { useCallback, useMemo } from 'react' diff --git a/src/renderer/src/hooks/useTopic.ts b/src/renderer/src/hooks/useTopic.ts index b8a3dc977c..15ecb99d88 100644 --- a/src/renderer/src/hooks/useTopic.ts +++ b/src/renderer/src/hooks/useTopic.ts @@ -7,7 +7,7 @@ import store from '@renderer/store' import { updateTopic } from '@renderer/store/assistants' import { setNewlyRenamedTopics, setRenamingTopics } from '@renderer/store/runtime' import { loadTopicMessagesThunk } from '@renderer/store/thunk/messageThunk' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { findMainTextBlocks } from '@renderer/utils/messageUtils/find' import { find, isEmpty } from 'lodash' import { type Dispatch, type SetStateAction, useEffect, useState } from 'react' diff --git a/src/renderer/src/hooks/useTranslate.ts b/src/renderer/src/hooks/useTranslate.ts index 5f5f1cbded..6191560d3d 100644 --- a/src/renderer/src/hooks/useTranslate.ts +++ b/src/renderer/src/hooks/useTranslate.ts @@ -1,8 +1,9 @@ import { loggerService } from '@logger' import { builtinLanguages, UNKNOWN } from '@renderer/config/translate' import { useAppSelector } from '@renderer/store' -import { TranslateState, updateSettings } from '@renderer/store/translate' -import { TranslateLanguage } from '@renderer/types' +import type { TranslateState } from '@renderer/store/translate' +import { updateSettings } from '@renderer/store/translate' +import type { TranslateLanguage } from '@renderer/types' import { runAsyncFunction } from '@renderer/utils' import { getTranslateOptions } from '@renderer/utils/translate' import { useCallback, useEffect, useState } from 'react' diff --git a/src/renderer/src/hooks/useUserTheme.ts b/src/renderer/src/hooks/useUserTheme.ts index 177d23a524..5958026e70 100644 --- a/src/renderer/src/hooks/useUserTheme.ts +++ b/src/renderer/src/hooks/useUserTheme.ts @@ -1,5 +1,6 @@ import { useAppDispatch, useAppSelector } from '@renderer/store' -import { setUserTheme, UserTheme } from '@renderer/store/settings' +import type { UserTheme } from '@renderer/store/settings' +import { setUserTheme } from '@renderer/store/settings' import Color from 'color' export default function useUserTheme() { diff --git a/src/renderer/src/hooks/useVertexAI.ts b/src/renderer/src/hooks/useVertexAI.ts index 76539e1727..17b83118f3 100644 --- a/src/renderer/src/hooks/useVertexAI.ts +++ b/src/renderer/src/hooks/useVertexAI.ts @@ -5,7 +5,7 @@ import { setVertexAIServiceAccountClientEmail, setVertexAIServiceAccountPrivateKey } from '@renderer/store/llm' -import { Provider, VertexProvider } from '@renderer/types' +import type { Provider, VertexProvider } from '@renderer/types' import { useDispatch } from 'react-redux' export function useVertexAISettings() { diff --git a/src/renderer/src/hooks/useWebSearchProviders.ts b/src/renderer/src/hooks/useWebSearchProviders.ts index 34ee07403e..d34990062b 100644 --- a/src/renderer/src/hooks/useWebSearchProviders.ts +++ b/src/renderer/src/hooks/useWebSearchProviders.ts @@ -11,7 +11,7 @@ import { updateWebSearchProvider, updateWebSearchProviders } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderId } from '@renderer/types' +import type { WebSearchProvider, WebSearchProviderId } from '@renderer/types' export const useDefaultWebSearchProvider = () => { const defaultProvider = useAppSelector((state) => state.websearch.defaultProvider) diff --git a/src/renderer/src/i18n/label.ts b/src/renderer/src/i18n/label.ts index 64125c2a8d..3736437fc8 100644 --- a/src/renderer/src/i18n/label.ts +++ b/src/renderer/src/i18n/label.ts @@ -5,13 +5,8 @@ */ import { loggerService } from '@logger' -import { - AgentType, - BuiltinMCPServerName, - BuiltinMCPServerNames, - BuiltinOcrProviderId, - ThinkingOption -} from '@renderer/types' +import type { AgentType, BuiltinMCPServerName, BuiltinOcrProviderId, ThinkingOption } from '@renderer/types' +import { BuiltinMCPServerNames } from '@renderer/types' import i18n from './index' diff --git a/src/renderer/src/pages/code/CodeToolsPage.tsx b/src/renderer/src/pages/code/CodeToolsPage.tsx index ff63510e69..3d62a82d0e 100644 --- a/src/renderer/src/pages/code/CodeToolsPage.tsx +++ b/src/renderer/src/pages/code/CodeToolsPage.tsx @@ -13,12 +13,14 @@ import { loggerService } from '@renderer/services/LoggerService' import { getModelUniqId } from '@renderer/services/ModelService' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setIsBunInstalled } from '@renderer/store/mcp' -import { EndpointType, Model } from '@renderer/types' +import type { EndpointType, Model } from '@renderer/types' import { getClaudeSupportedProviders } from '@renderer/utils/provider' -import { codeTools, terminalApps, TerminalConfig } from '@shared/config/constant' +import type { TerminalConfig } from '@shared/config/constant' +import { codeTools, terminalApps } from '@shared/config/constant' import { Alert, Avatar, Button, Checkbox, Input, Popover, Select, Space, Tooltip } from 'antd' import { ArrowUpRight, Download, FolderOpen, HelpCircle, Terminal, X } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/code/index.ts b/src/renderer/src/pages/code/index.ts index b2ddeb9d6f..c0a00a02c5 100644 --- a/src/renderer/src/pages/code/index.ts +++ b/src/renderer/src/pages/code/index.ts @@ -1,4 +1,4 @@ -import { EndpointType, Model, Provider } from '@renderer/types' +import type { EndpointType, Model, Provider } from '@renderer/types' import { codeTools } from '@shared/config/constant' export interface LaunchValidationResult { diff --git a/src/renderer/src/pages/files/ContentView.tsx b/src/renderer/src/pages/files/ContentView.tsx index a1c1f00aaa..1901489333 100644 --- a/src/renderer/src/pages/files/ContentView.tsx +++ b/src/renderer/src/pages/files/ContentView.tsx @@ -1,5 +1,6 @@ import FileManager from '@renderer/services/FileManager' -import { FileMetadata, FileTypes } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' +import { FileTypes } from '@renderer/types' import { formatFileSize } from '@renderer/utils' import { Col, Image, Row, Spin, Table } from 'antd' import React, { memo } from 'react' diff --git a/src/renderer/src/pages/files/FileList.tsx b/src/renderer/src/pages/files/FileList.tsx index d6ec0d850b..b6ffb5db92 100644 --- a/src/renderer/src/pages/files/FileList.tsx +++ b/src/renderer/src/pages/files/FileList.tsx @@ -3,7 +3,8 @@ import { DeleteIcon } from '@renderer/components/Icons' import { DynamicVirtualList } from '@renderer/components/VirtualList' import { handleDelete } from '@renderer/services/FileAction' import FileManager from '@renderer/services/FileManager' -import { FileMetadata, FileTypes } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' +import { FileTypes } from '@renderer/types' import { formatFileSize } from '@renderer/utils' import { Col, Image, Row, Spin } from 'antd' import { t } from 'i18next' diff --git a/src/renderer/src/pages/files/FilesPage.tsx b/src/renderer/src/pages/files/FilesPage.tsx index 190a103898..74d29d116a 100644 --- a/src/renderer/src/pages/files/FilesPage.tsx +++ b/src/renderer/src/pages/files/FilesPage.tsx @@ -8,7 +8,8 @@ import { getFileFieldLabel } from '@renderer/i18n/label' import { handleDelete, handleRename, sortFiles, tempFilesSort } from '@renderer/services/FileAction' import FileManager from '@renderer/services/FileManager' import store from '@renderer/store' -import { FileMetadata, FileTypes } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' +import { FileTypes } from '@renderer/types' import { formatFileSize } from '@renderer/utils' import { Button, Checkbox, Dropdown, Empty, Flex, Popconfirm } from 'antd' import dayjs from 'dayjs' @@ -21,7 +22,8 @@ import { FileText, FileType as FileTypeIcon } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/history/HistoryPage.tsx b/src/renderer/src/pages/history/HistoryPage.tsx index c8c493740e..71324cf7fd 100644 --- a/src/renderer/src/pages/history/HistoryPage.tsx +++ b/src/renderer/src/pages/history/HistoryPage.tsx @@ -1,12 +1,14 @@ import { HStack } from '@renderer/components/Layout' import { useAppDispatch } from '@renderer/store' import { loadTopicMessagesThunk } from '@renderer/store/thunk/messageThunk' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' -import { Divider, Input, InputRef } from 'antd' +import type { InputRef } from 'antd' +import { Divider, Input } from 'antd' import { last } from 'lodash' import { ChevronLeft, CornerDownLeft, Search } from 'lucide-react' -import { FC, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/history/components/SearchMessage.tsx b/src/renderer/src/pages/history/components/SearchMessage.tsx index 9ba138cde4..026bf85021 100644 --- a/src/renderer/src/pages/history/components/SearchMessage.tsx +++ b/src/renderer/src/pages/history/components/SearchMessage.tsx @@ -4,12 +4,13 @@ import { getTopicById } from '@renderer/hooks/useTopic' import { default as MessageItem } from '@renderer/pages/home/Messages/Message' import { locateToMessage } from '@renderer/services/MessagesService' import NavigationService from '@renderer/services/NavigationService' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' import { runAsyncFunction } from '@renderer/utils' import { Button } from 'antd' import { Forward } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/history/components/SearchResults.tsx b/src/renderer/src/pages/history/components/SearchResults.tsx index a88e97dd0e..e0ffba8b2a 100644 --- a/src/renderer/src/pages/history/components/SearchResults.tsx +++ b/src/renderer/src/pages/history/components/SearchResults.tsx @@ -2,11 +2,12 @@ import { LoadingIcon } from '@renderer/components/Icons' import db from '@renderer/databases' import useScrollPosition from '@renderer/hooks/useScrollPosition' import { selectTopicsMap } from '@renderer/store/assistants' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import { type Message, MessageBlockType } from '@renderer/types/newMessage' import { List, Spin, Typography } from 'antd' import { useLiveQuery } from 'dexie-react-hooks' -import { FC, memo, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useEffect, useRef, useState } from 'react' import { useSelector } from 'react-redux' import styled from 'styled-components' diff --git a/src/renderer/src/pages/history/components/TopicMessages.tsx b/src/renderer/src/pages/history/components/TopicMessages.tsx index 9f5111a254..36b1fc35d6 100644 --- a/src/renderer/src/pages/history/components/TopicMessages.tsx +++ b/src/renderer/src/pages/history/components/TopicMessages.tsx @@ -10,12 +10,13 @@ import { getAssistantById } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { isGenerating, locateToMessage } from '@renderer/services/MessagesService' import NavigationService from '@renderer/services/NavigationService' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import { classNames, runAsyncFunction } from '@renderer/utils' import { Button, Divider, Empty } from 'antd' import { t } from 'i18next' import { Forward } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import styled from 'styled-components' import { default as MessageItem } from '../../home/Messages/Message' diff --git a/src/renderer/src/pages/history/components/TopicsHistory.tsx b/src/renderer/src/pages/history/components/TopicsHistory.tsx index 37113891f2..d307200ce5 100644 --- a/src/renderer/src/pages/history/components/TopicsHistory.tsx +++ b/src/renderer/src/pages/history/components/TopicsHistory.tsx @@ -2,7 +2,7 @@ import { SearchOutlined } from '@ant-design/icons' import { VStack } from '@renderer/components/Layout' import useScrollPosition from '@renderer/hooks/useScrollPosition' import { selectAllTopics } from '@renderer/store/assistants' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import { Button, Divider, Empty, Segmented } from 'antd' import dayjs from 'dayjs' import { groupBy, isEmpty, orderBy } from 'lodash' diff --git a/src/renderer/src/pages/home/Chat.tsx b/src/renderer/src/pages/home/Chat.tsx index c90d21c8ce..8a02918656 100644 --- a/src/renderer/src/pages/home/Chat.tsx +++ b/src/renderer/src/pages/home/Chat.tsx @@ -1,6 +1,7 @@ import { Alert } from '@heroui/react' import { loggerService } from '@logger' -import { ContentSearch, ContentSearchRef } from '@renderer/components/ContentSearch' +import type { ContentSearchRef } from '@renderer/components/ContentSearch' +import { ContentSearch } from '@renderer/components/ContentSearch' import { HStack } from '@renderer/components/Layout' import MultiSelectActionPopup from '@renderer/components/Popups/MultiSelectionPopup' import PromptPopup from '@renderer/components/Popups/PromptPopup' @@ -14,12 +15,13 @@ import { useShortcut } from '@renderer/hooks/useShortcuts' import { useShowAssistants, useShowTopics } from '@renderer/hooks/useStore' import { useTimer } from '@renderer/hooks/useTimer' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { classNames } from '@renderer/utils' import { Flex } from 'antd' import { debounce } from 'lodash' import { AnimatePresence, motion } from 'motion/react' -import React, { FC, useCallback, useMemo, useState } from 'react' +import type { FC } from 'react' +import React, { useCallback, useMemo, useState } from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/ChatNavbar.tsx b/src/renderer/src/pages/home/ChatNavbar.tsx index 43d04cd1a4..bdc000f223 100644 --- a/src/renderer/src/pages/home/ChatNavbar.tsx +++ b/src/renderer/src/pages/home/ChatNavbar.tsx @@ -9,12 +9,12 @@ import { useShowAssistants, useShowTopics } from '@renderer/hooks/useStore' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { useAppDispatch } from '@renderer/store' import { setNarrowMode } from '@renderer/store/settings' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { Tooltip } from 'antd' import { t } from 'i18next' import { Menu, PanelLeftClose, PanelRightClose, Search } from 'lucide-react' import { AnimatePresence, motion } from 'motion/react' -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' import AssistantsDrawer from './components/AssistantsDrawer' diff --git a/src/renderer/src/pages/home/HomePage.tsx b/src/renderer/src/pages/home/HomePage.tsx index 3825630ba1..712c78712e 100644 --- a/src/renderer/src/pages/home/HomePage.tsx +++ b/src/renderer/src/pages/home/HomePage.tsx @@ -7,10 +7,11 @@ import { useActiveTopic } from '@renderer/hooks/useTopic' import NavigationService from '@renderer/services/NavigationService' import { newMessagesActions } from '@renderer/store/newMessage' import { setActiveAgentId, setActiveTopicOrSessionAction } from '@renderer/store/runtime' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH, SECOND_MIN_WINDOW_WIDTH } from '@shared/config/constant' import { AnimatePresence, motion } from 'motion/react' -import { FC, startTransition, useCallback, useEffect, useState } from 'react' +import type { FC } from 'react' +import { startTransition, useCallback, useEffect, useState } from 'react' import { useDispatch } from 'react-redux' import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Inputbar/AgentSessionInputbar.tsx b/src/renderer/src/pages/home/Inputbar/AgentSessionInputbar.tsx index 153f921d54..e98dd0ac6e 100644 --- a/src/renderer/src/pages/home/Inputbar/AgentSessionInputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/AgentSessionInputbar.tsx @@ -15,16 +15,19 @@ import { useAppDispatch, useAppSelector } from '@renderer/store' import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage' import { sendMessage as dispatchSendMessage } from '@renderer/store/thunk/messageThunk' import type { Assistant, Message, Model, Topic } from '@renderer/types' -import { MessageBlock, MessageBlockStatus } from '@renderer/types/newMessage' +import type { MessageBlock } from '@renderer/types/newMessage' +import { MessageBlockStatus } from '@renderer/types/newMessage' import { classNames } from '@renderer/utils' import { abortCompletion } from '@renderer/utils/abortController' import { buildAgentSessionTopicId } from '@renderer/utils/agentSession' import { getSendMessageShortcutLabel, isSendMessageKeyPressed } from '@renderer/utils/input' import { createMainTextBlock, createMessage } from '@renderer/utils/messageUtils/create' -import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' +import type { TextAreaRef } from 'antd/es/input/TextArea' +import TextArea from 'antd/es/input/TextArea' import { isEmpty } from 'lodash' import { CirclePause, MessageSquareDiff } from 'lucide-react' -import React, { CSSProperties, FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { CSSProperties, FC } from 'react' +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import { v4 as uuid } from 'uuid' diff --git a/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx b/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx index df0dbf9f5a..a2ccd40e43 100644 --- a/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx @@ -1,12 +1,13 @@ import { ActionIconButton } from '@renderer/components/Buttons' import { QuickPanelReservedSymbol, useQuickPanel } from '@renderer/components/QuickPanel' import { useKnowledgeBases } from '@renderer/hooks/useKnowledge' -import { FileType, KnowledgeBase, KnowledgeItem } from '@renderer/types' +import type { FileType, KnowledgeBase, KnowledgeItem } from '@renderer/types' import { filterSupportedFiles, formatFileSize } from '@renderer/utils/file' import { Tooltip } from 'antd' import dayjs from 'dayjs' import { FileSearch, FileText, Paperclip, Upload } from 'lucide-react' -import { Dispatch, FC, SetStateAction, useCallback, useImperativeHandle, useMemo, useState } from 'react' +import type { Dispatch, FC, SetStateAction } from 'react' +import { useCallback, useImperativeHandle, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' export interface AttachmentButtonRef { diff --git a/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx b/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx index b6962c0f95..6570037503 100644 --- a/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx +++ b/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx @@ -16,11 +16,12 @@ import ConfirmDialog from '@renderer/components/ConfirmDialog' import CustomTag from '@renderer/components/Tags/CustomTag' import { useAttachment } from '@renderer/hooks/useAttachment' import FileManager from '@renderer/services/FileManager' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { formatFileSize } from '@renderer/utils' import { Flex, Image, Tooltip } from 'antd' import { isEmpty } from 'lodash' -import { FC, MouseEvent, useState } from 'react' +import type { FC, MouseEvent } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx b/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx index dc6553188c..683c1fef62 100644 --- a/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx @@ -1,9 +1,9 @@ import { ActionIconButton } from '@renderer/components/Buttons' import { isGenerateImageModel } from '@renderer/config/models' -import { Assistant, Model } from '@renderer/types' +import type { Assistant, Model } from '@renderer/types' import { Tooltip } from 'antd' import { Image } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' interface Props { diff --git a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx index 0206053eb8..aea8a5758f 100644 --- a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx @@ -33,7 +33,7 @@ import WebSearchService from '@renderer/services/WebSearchService' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setSearching } from '@renderer/store/runtime' import { sendMessage as _sendMessage } from '@renderer/store/thunk/messageThunk' -import { Assistant, FileType, KnowledgeBase, Model, Topic } from '@renderer/types' +import type { Assistant, FileType, KnowledgeBase, Model, Topic } from '@renderer/types' import type { MessageInputBaseParams } from '@renderer/types/newMessage' import { classNames, delay, filterSupportedFiles } from '@renderer/utils' import { formatQuotedText } from '@renderer/utils/formats' @@ -46,16 +46,19 @@ import { import { documentExts, imageExts, textExts } from '@shared/config/constant' import { IpcChannel } from '@shared/IpcChannel' import { Tooltip } from 'antd' -import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' +import type { TextAreaRef } from 'antd/es/input/TextArea' +import TextArea from 'antd/es/input/TextArea' import { debounce, isEmpty } from 'lodash' import { CirclePause } from 'lucide-react' -import React, { CSSProperties, FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { CSSProperties, FC } from 'react' +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import NarrowLayout from '../Messages/NarrowLayout' import AttachmentPreview from './AttachmentPreview' -import InputbarTools, { InputbarToolsRef } from './InputbarTools' +import type { InputbarToolsRef } from './InputbarTools' +import InputbarTools from './InputbarTools' import KnowledgeBaseInput from './KnowledgeBaseInput' import MentionModelsInput from './MentionModelsInput' import SendMessageButton from './SendMessageButton' diff --git a/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx b/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx index fa87973a36..a24d63e8ba 100644 --- a/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx +++ b/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx @@ -1,7 +1,8 @@ -import { DragDropContext, Draggable, Droppable, DropResult } from '@hello-pangea/dnd' +import type { DropResult } from '@hello-pangea/dnd' +import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import { loggerService } from '@logger' import { ActionIconButton } from '@renderer/components/Buttons' -import { QuickPanelListItem } from '@renderer/components/QuickPanel' +import type { QuickPanelListItem } from '@renderer/components/QuickPanel' import { isAnthropicModel, isGeminiModel, @@ -19,12 +20,13 @@ import { getProviderByModel } from '@renderer/services/AssistantService' import { getModelUniqId } from '@renderer/services/ModelService' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setIsCollapsed, setToolOrder } from '@renderer/store/inputTools' -import { FileType, FileTypes, KnowledgeBase, Model } from '@renderer/types' -import { InputBarToolType } from '@renderer/types/chat' +import type { FileType, KnowledgeBase, Model } from '@renderer/types' +import { FileTypes } from '@renderer/types' +import type { InputBarToolType } from '@renderer/types/chat' import { classNames } from '@renderer/utils' import { isPromptToolUse, isSupportedToolUse } from '@renderer/utils/mcp-tools' import { Divider, Dropdown, Tooltip } from 'antd' -import { ItemType } from 'antd/es/menu/interface' +import type { ItemType } from 'antd/es/menu/interface' import { AtSign, Check, @@ -41,21 +43,30 @@ import { Paperclip, Zap } from 'lucide-react' -import { Dispatch, ReactNode, SetStateAction, useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react' +import type { Dispatch, ReactNode, SetStateAction } from 'react' +import { useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import styled from 'styled-components' -import AttachmentButton, { AttachmentButtonRef } from './AttachmentButton' +import type { AttachmentButtonRef } from './AttachmentButton' +import AttachmentButton from './AttachmentButton' import GenerateImageButton from './GenerateImageButton' -import KnowledgeBaseButton, { KnowledgeBaseButtonRef } from './KnowledgeBaseButton' -import MCPToolsButton, { MCPToolsButtonRef } from './MCPToolsButton' -import MentionModelsButton, { MentionModelsButtonRef } from './MentionModelsButton' +import type { KnowledgeBaseButtonRef } from './KnowledgeBaseButton' +import KnowledgeBaseButton from './KnowledgeBaseButton' +import type { MCPToolsButtonRef } from './MCPToolsButton' +import MCPToolsButton from './MCPToolsButton' +import type { MentionModelsButtonRef } from './MentionModelsButton' +import MentionModelsButton from './MentionModelsButton' import NewContextButton from './NewContextButton' -import QuickPhrasesButton, { QuickPhrasesButtonRef } from './QuickPhrasesButton' -import ThinkingButton, { ThinkingButtonRef } from './ThinkingButton' -import UrlContextButton, { UrlContextButtonRef } from './UrlContextbutton' -import WebSearchButton, { WebSearchButtonRef } from './WebSearchButton' +import type { QuickPhrasesButtonRef } from './QuickPhrasesButton' +import QuickPhrasesButton from './QuickPhrasesButton' +import type { ThinkingButtonRef } from './ThinkingButton' +import ThinkingButton from './ThinkingButton' +import type { UrlContextButtonRef } from './UrlContextbutton' +import UrlContextButton from './UrlContextbutton' +import type { WebSearchButtonRef } from './WebSearchButton' +import WebSearchButton from './WebSearchButton' const logger = loggerService.withContext('InputbarTools') diff --git a/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx b/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx index 552017e424..daa2df9c7a 100644 --- a/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx @@ -1,10 +1,12 @@ import { ActionIconButton } from '@renderer/components/Buttons' -import { QuickPanelListItem, QuickPanelReservedSymbol, useQuickPanel } from '@renderer/components/QuickPanel' +import type { QuickPanelListItem } from '@renderer/components/QuickPanel' +import { QuickPanelReservedSymbol, useQuickPanel } from '@renderer/components/QuickPanel' import { useAppSelector } from '@renderer/store' -import { KnowledgeBase } from '@renderer/types' +import type { KnowledgeBase } from '@renderer/types' import { Tooltip } from 'antd' import { CircleX, FileSearch, Plus } from 'lucide-react' -import { FC, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' diff --git a/src/renderer/src/pages/home/Inputbar/KnowledgeBaseInput.tsx b/src/renderer/src/pages/home/Inputbar/KnowledgeBaseInput.tsx index 711288f4b4..473da6f31f 100644 --- a/src/renderer/src/pages/home/Inputbar/KnowledgeBaseInput.tsx +++ b/src/renderer/src/pages/home/Inputbar/KnowledgeBaseInput.tsx @@ -1,8 +1,8 @@ import { FileSearchOutlined } from '@ant-design/icons' import HorizontalScrollContainer from '@renderer/components/HorizontalScrollContainer' import CustomTag from '@renderer/components/Tags/CustomTag' -import { KnowledgeBase } from '@renderer/types' -import { FC } from 'react' +import type { KnowledgeBase } from '@renderer/types' +import type { FC } from 'react' import styled from 'styled-components' const KnowledgeBaseInput: FC<{ diff --git a/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx b/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx index 6680177b24..4d28b4824b 100644 --- a/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx @@ -1,5 +1,6 @@ import { ActionIconButton } from '@renderer/components/Buttons' -import { QuickPanelListItem, QuickPanelReservedSymbol, useQuickPanel } from '@renderer/components/QuickPanel' +import type { QuickPanelListItem } from '@renderer/components/QuickPanel' +import { QuickPanelReservedSymbol, useQuickPanel } from '@renderer/components/QuickPanel' import { isGeminiModel } from '@renderer/config/models' import { isGeminiWebSearchProvider, isSupportUrlContextProvider } from '@renderer/config/providers' import { useAssistant } from '@renderer/hooks/useAssistant' @@ -7,11 +8,12 @@ import { useMCPServers } from '@renderer/hooks/useMCPServers' import { useTimer } from '@renderer/hooks/useTimer' import { getProviderByModel } from '@renderer/services/AssistantService' import { EventEmitter } from '@renderer/services/EventService' -import { MCPPrompt, MCPResource, MCPServer } from '@renderer/types' +import type { MCPPrompt, MCPResource, MCPServer } from '@renderer/types' import { isToolUseModeFunction } from '@renderer/utils/assistant' import { Form, Input, Tooltip } from 'antd' import { CircleX, Hammer, Plus } from 'lucide-react' -import React, { FC, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' diff --git a/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx b/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx index 1122fef0d8..ffb7072428 100644 --- a/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx @@ -5,13 +5,14 @@ import { getModelLogo, isEmbeddingModel, isRerankModel, isVisionModel } from '@r import db from '@renderer/databases' import { useProviders } from '@renderer/hooks/useProvider' import { getModelUniqId } from '@renderer/services/ModelService' -import { FileType, Model } from '@renderer/types' +import type { FileType, Model } from '@renderer/types' import { getFancyProviderName } from '@renderer/utils' import { Avatar, Tooltip } from 'antd' import { useLiveQuery } from 'dexie-react-hooks' import { first, sortBy } from 'lodash' import { AtSign, CircleX, Plus } from 'lucide-react' -import { FC, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Inputbar/MentionModelsInput.tsx b/src/renderer/src/pages/home/Inputbar/MentionModelsInput.tsx index 70af60976b..755c678bd0 100644 --- a/src/renderer/src/pages/home/Inputbar/MentionModelsInput.tsx +++ b/src/renderer/src/pages/home/Inputbar/MentionModelsInput.tsx @@ -2,9 +2,9 @@ import HorizontalScrollContainer from '@renderer/components/HorizontalScrollCont import CustomTag from '@renderer/components/Tags/CustomTag' import { useProviders } from '@renderer/hooks/useProvider' import { getModelUniqId } from '@renderer/services/ModelService' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { getFancyProviderName } from '@renderer/utils' -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' const MentionModelsInput: FC<{ diff --git a/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx b/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx index 7cf9237a20..f4dd1886a1 100644 --- a/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx @@ -2,7 +2,7 @@ import { ActionIconButton } from '@renderer/components/Buttons' import { useShortcut, useShortcutDisplay } from '@renderer/hooks/useShortcuts' import { Tooltip } from 'antd' import { Eraser } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' interface Props { onNewContext: () => void diff --git a/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx b/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx index e01447b3fa..17d54ce246 100644 --- a/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx @@ -8,7 +8,7 @@ import { useQuickPanel } from '@renderer/components/QuickPanel' import { useAssistant } from '@renderer/hooks/useAssistant' import { useTimer } from '@renderer/hooks/useTimer' import QuickPhraseService from '@renderer/services/QuickPhraseService' -import { QuickPhrase } from '@renderer/types' +import type { QuickPhrase } from '@renderer/types' import { Input, Modal, Radio, Space, Tooltip } from 'antd' import { BotMessageSquare, Plus, Zap } from 'lucide-react' import { memo, useCallback, useEffect, useImperativeHandle, useMemo, useState } from 'react' diff --git a/src/renderer/src/pages/home/Inputbar/SendMessageButton.tsx b/src/renderer/src/pages/home/Inputbar/SendMessageButton.tsx index 32f8b26b0c..7405752868 100644 --- a/src/renderer/src/pages/home/Inputbar/SendMessageButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/SendMessageButton.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react' +import type { FC } from 'react' interface Props { disabled: boolean diff --git a/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx b/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx index 7e2b7edd38..e5d31a1167 100644 --- a/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx @@ -17,9 +17,10 @@ import { } from '@renderer/config/models' import { useAssistant } from '@renderer/hooks/useAssistant' import { getReasoningEffortOptionsLabel } from '@renderer/i18n/label' -import { Model, ThinkingOption } from '@renderer/types' +import type { Model, ThinkingOption } from '@renderer/types' import { Tooltip } from 'antd' -import { FC, ReactElement, useCallback, useImperativeHandle, useMemo } from 'react' +import type { FC, ReactElement } from 'react' +import { useCallback, useImperativeHandle, useMemo } from 'react' import { useTranslation } from 'react-i18next' export interface ThinkingButtonRef { diff --git a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx index 7316e3549f..4340d7a58c 100644 --- a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx +++ b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx @@ -3,7 +3,7 @@ import MaxContextCount from '@renderer/components/MaxContextCount' import { useSettings } from '@renderer/hooks/useSettings' import { Divider, Popover } from 'antd' import { ArrowUp, MenuIcon } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Inputbar/UrlContextbutton.tsx b/src/renderer/src/pages/home/Inputbar/UrlContextbutton.tsx index 3b96d0cd0f..8cdc568fc5 100644 --- a/src/renderer/src/pages/home/Inputbar/UrlContextbutton.tsx +++ b/src/renderer/src/pages/home/Inputbar/UrlContextbutton.tsx @@ -4,7 +4,8 @@ import { useTimer } from '@renderer/hooks/useTimer' import { isToolUseModeFunction } from '@renderer/utils/assistant' import { Tooltip } from 'antd' import { Link } from 'lucide-react' -import { FC, memo, useCallback } from 'react' +import type { FC } from 'react' +import { memo, useCallback } from 'react' import { useTranslation } from 'react-i18next' export interface UrlContextButtonRef { diff --git a/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx b/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx index 807781bac4..b4107d7de8 100644 --- a/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx @@ -2,7 +2,8 @@ import { BaiduOutlined, GoogleOutlined } from '@ant-design/icons' import { loggerService } from '@logger' import { ActionIconButton } from '@renderer/components/Buttons' import { BingLogo, BochaLogo, ExaLogo, SearXNGLogo, TavilyLogo, ZhipuLogo } from '@renderer/components/Icons' -import { QuickPanelListItem, QuickPanelReservedSymbol, useQuickPanel } from '@renderer/components/QuickPanel' +import type { QuickPanelListItem } from '@renderer/components/QuickPanel' +import { QuickPanelReservedSymbol, useQuickPanel } from '@renderer/components/QuickPanel' import { isGeminiModel, isGPT5SeriesReasoningModel, @@ -15,12 +16,13 @@ import { useTimer } from '@renderer/hooks/useTimer' import { useWebSearchProviders } from '@renderer/hooks/useWebSearchProviders' import { getProviderByModel } from '@renderer/services/AssistantService' import WebSearchService from '@renderer/services/WebSearchService' -import { WebSearchProvider, WebSearchProviderId } from '@renderer/types' +import type { WebSearchProvider, WebSearchProviderId } from '@renderer/types' import { hasObjectKey } from '@renderer/utils' import { isToolUseModeFunction } from '@renderer/utils/assistant' import { Tooltip } from 'antd' import { Globe } from 'lucide-react' -import { FC, memo, useCallback, useImperativeHandle, useMemo } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useImperativeHandle, useMemo } from 'react' import { useTranslation } from 'react-i18next' export interface WebSearchButtonRef { diff --git a/src/renderer/src/pages/home/Markdown/Markdown.tsx b/src/renderer/src/pages/home/Markdown/Markdown.tsx index f2d65e9a7c..a20e090ad3 100644 --- a/src/renderer/src/pages/home/Markdown/Markdown.tsx +++ b/src/renderer/src/pages/home/Markdown/Markdown.tsx @@ -22,7 +22,7 @@ import remarkCjkFriendly from 'remark-cjk-friendly' import remarkGfm from 'remark-gfm' import remarkAlert from 'remark-github-blockquote-alert' import remarkMath from 'remark-math' -import { Pluggable } from 'unified' +import type { Pluggable } from 'unified' import CodeBlock from './CodeBlock' import Link from './Link' diff --git a/src/renderer/src/pages/home/Markdown/MarkdownSvgRenderer.tsx b/src/renderer/src/pages/home/Markdown/MarkdownSvgRenderer.tsx index 1313b95a45..754d4215ae 100644 --- a/src/renderer/src/pages/home/Markdown/MarkdownSvgRenderer.tsx +++ b/src/renderer/src/pages/home/Markdown/MarkdownSvgRenderer.tsx @@ -2,7 +2,8 @@ import { ImagePreviewService } from '@renderer/services/ImagePreviewService' import { makeSvgSizeAdaptive } from '@renderer/utils/image' import { Dropdown } from 'antd' import { Eye } from 'lucide-react' -import React, { FC, useCallback, useEffect, useMemo, useRef } from 'react' +import type { FC } from 'react' +import React, { useCallback, useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' interface SvgProps extends React.SVGProps { diff --git a/src/renderer/src/pages/home/Messages/Blocks/CitationBlock.tsx b/src/renderer/src/pages/home/Messages/Blocks/CitationBlock.tsx index 3f96c6f99a..da197240f5 100644 --- a/src/renderer/src/pages/home/Messages/Blocks/CitationBlock.tsx +++ b/src/renderer/src/pages/home/Messages/Blocks/CitationBlock.tsx @@ -1,4 +1,4 @@ -import { GroundingMetadata } from '@google/genai' +import type { GroundingMetadata } from '@google/genai' import Spinner from '@renderer/components/Spinner' import type { RootState } from '@renderer/store' import { selectFormattedCitationsByBlockId } from '@renderer/store/messageBlock' diff --git a/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx b/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx index 243bec8ccc..17613e9429 100644 --- a/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx +++ b/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx @@ -6,6 +6,7 @@ import { getHttpMessageLabel, getProviderLabel } from '@renderer/i18n/label' import { getProviderById } from '@renderer/services/ProviderService' import { useAppDispatch } from '@renderer/store' import { removeBlocksThunk } from '@renderer/store/thunk/messageThunk' +import type { SerializedAiSdkError, SerializedAiSdkErrorUnion, SerializedError } from '@renderer/types/error' import { isSerializedAiSdkAPICallError, isSerializedAiSdkDownloadError, @@ -28,10 +29,7 @@ import { isSerializedAiSdkTooManyEmbeddingValuesForCallError, isSerializedAiSdkTypeValidationError, isSerializedAiSdkUnsupportedFunctionalityError, - isSerializedError, - SerializedAiSdkError, - SerializedAiSdkErrorUnion, - SerializedError + isSerializedError } from '@renderer/types/error' import type { ErrorMessageBlock, Message } from '@renderer/types/newMessage' import { formatAiSdkError, formatError, safeToString } from '@renderer/utils/error' diff --git a/src/renderer/src/pages/home/Messages/ChatFlowHistory.tsx b/src/renderer/src/pages/home/Messages/ChatFlowHistory.tsx index 4559387437..6fe15023e3 100644 --- a/src/renderer/src/pages/home/Messages/ChatFlowHistory.tsx +++ b/src/renderer/src/pages/home/Messages/ChatFlowHistory.tsx @@ -9,16 +9,18 @@ import useAvatar from '@renderer/hooks/useAvatar' import { useSettings } from '@renderer/hooks/useSettings' import { useTimer } from '@renderer/hooks/useTimer' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { RootState } from '@renderer/store' +import type { RootState } from '@renderer/store' import { selectMessagesForTopic } from '@renderer/store/newMessage' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { isEmoji } from '@renderer/utils' import { getMainTextContent } from '@renderer/utils/messageUtils/find' +import type { Edge, Node, NodeTypes } from '@xyflow/react' import { Controls, Handle, MiniMap, ReactFlow, ReactFlowProvider } from '@xyflow/react' -import { Edge, Node, NodeTypes, Position, useEdgesState, useNodesState } from '@xyflow/react' +import { Position, useEdgesState, useNodesState } from '@xyflow/react' import { Avatar, Spin, Tooltip } from 'antd' import { isEqual } from 'lodash' -import { FC, memo, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/ChatNavigation.tsx b/src/renderer/src/pages/home/Messages/ChatNavigation.tsx index 4214abc5b6..4aeb275b6a 100644 --- a/src/renderer/src/pages/home/Messages/ChatNavigation.tsx +++ b/src/renderer/src/pages/home/Messages/ChatNavigation.tsx @@ -8,10 +8,11 @@ import { } from '@ant-design/icons' import { useSettings } from '@renderer/hooks/useSettings' import { useTimer } from '@renderer/hooks/useTimer' -import { RootState } from '@renderer/store' +import type { RootState } from '@renderer/store' // import { selectCurrentTopicId } from '@renderer/store/newMessage' import { Button, Drawer, Tooltip } from 'antd' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/CitationsList.tsx b/src/renderer/src/pages/home/Messages/CitationsList.tsx index 96765d3fbc..c9967d9f6b 100644 --- a/src/renderer/src/pages/home/Messages/CitationsList.tsx +++ b/src/renderer/src/pages/home/Messages/CitationsList.tsx @@ -2,7 +2,7 @@ import ContextMenu from '@renderer/components/ContextMenu' import Favicon from '@renderer/components/Icons/FallbackFavicon' import Scrollbar from '@renderer/components/Scrollbar' import { useTemporaryValue } from '@renderer/hooks/useTemporaryValue' -import { Citation } from '@renderer/types' +import type { Citation } from '@renderer/types' import { fetchWebContent } from '@renderer/utils/fetch' import { cleanMarkdownContent } from '@renderer/utils/formats' import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query' diff --git a/src/renderer/src/pages/home/Messages/Message.tsx b/src/renderer/src/pages/home/Messages/Message.tsx index 926aa66414..dcf4760047 100644 --- a/src/renderer/src/pages/home/Messages/Message.tsx +++ b/src/renderer/src/pages/home/Messages/Message.tsx @@ -13,12 +13,13 @@ import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { getMessageModelId } from '@renderer/services/MessagesService' import { getModelUniqId } from '@renderer/services/ModelService' import { estimateMessageUsage } from '@renderer/services/TokenService' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import type { Message, MessageBlock } from '@renderer/types/newMessage' import { classNames } from '@renderer/utils' import { isMessageProcessing } from '@renderer/utils/messageUtils/is' import { Divider } from 'antd' -import React, { Dispatch, FC, memo, SetStateAction, useCallback, useEffect, useRef } from 'react' +import type { Dispatch, FC, SetStateAction } from 'react' +import React, { memo, useCallback, useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/MessageAttachments.tsx b/src/renderer/src/pages/home/Messages/MessageAttachments.tsx index 73fcd4ea58..ea8787e114 100644 --- a/src/renderer/src/pages/home/Messages/MessageAttachments.tsx +++ b/src/renderer/src/pages/home/Messages/MessageAttachments.tsx @@ -4,7 +4,7 @@ import type { FileMessageBlock } from '@renderer/types/newMessage' import { parseFileTypes } from '@renderer/utils' import { Upload } from 'antd' import { t } from 'i18next' -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' interface Props { diff --git a/src/renderer/src/pages/home/Messages/MessageEditor.tsx b/src/renderer/src/pages/home/Messages/MessageEditor.tsx index 953dccaa29..a5e43cc53f 100644 --- a/src/renderer/src/pages/home/Messages/MessageEditor.tsx +++ b/src/renderer/src/pages/home/Messages/MessageEditor.tsx @@ -10,21 +10,26 @@ import FileManager from '@renderer/services/FileManager' import PasteService from '@renderer/services/PasteService' import { useAppSelector } from '@renderer/store' import { selectMessagesForTopic } from '@renderer/store/newMessage' -import { FileMetadata, FileTypes } from '@renderer/types' -import { Message, MessageBlock, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' +import type { FileMetadata } from '@renderer/types' +import { FileTypes } from '@renderer/types' +import type { Message, MessageBlock } from '@renderer/types/newMessage' +import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { classNames } from '@renderer/utils' import { getFilesFromDropEvent, isSendMessageKeyPressed } from '@renderer/utils/input' import { createFileBlock, createImageBlock } from '@renderer/utils/messageUtils/create' import { findAllBlocks } from '@renderer/utils/messageUtils/find' import { documentExts, imageExts, textExts } from '@shared/config/constant' import { Space, Tooltip } from 'antd' -import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' +import type { TextAreaRef } from 'antd/es/input/TextArea' +import TextArea from 'antd/es/input/TextArea' import { Save, Send, X } from 'lucide-react' -import { FC, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' -import AttachmentButton, { AttachmentButtonRef } from '../Inputbar/AttachmentButton' +import type { AttachmentButtonRef } from '../Inputbar/AttachmentButton' +import AttachmentButton from '../Inputbar/AttachmentButton' import { FileNameRender, getFileIcon } from '../Inputbar/AttachmentPreview' interface Props { diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index fde7ccd13a..8b4c35e103 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -6,7 +6,7 @@ import { useMessageOperations } from '@renderer/hooks/useMessageOperations' import { useSettings } from '@renderer/hooks/useSettings' import { useTimer } from '@renderer/hooks/useTimer' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { MultiModelMessageStyle } from '@renderer/store/settings' +import type { MultiModelMessageStyle } from '@renderer/store/settings' import type { Topic } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' import { classNames } from '@renderer/utils' diff --git a/src/renderer/src/pages/home/Messages/MessageGroupMenuBar.tsx b/src/renderer/src/pages/home/Messages/MessageGroupMenuBar.tsx index 0e7b7ab289..d4700f5028 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroupMenuBar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroupMenuBar.tsx @@ -9,13 +9,14 @@ import { import { HStack } from '@renderer/components/Layout' import { useAssistant } from '@renderer/hooks/useAssistant' import { useMessageOperations } from '@renderer/hooks/useMessageOperations' -import { MultiModelMessageStyle } from '@renderer/store/settings' +import type { MultiModelMessageStyle } from '@renderer/store/settings' import type { Topic } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' import { AssistantMessageStatus } from '@renderer/types/newMessage' import { getMainTextContent } from '@renderer/utils/messageUtils/find' import { Button, Tooltip } from 'antd' -import { FC, memo } from 'react' +import type { FC } from 'react' +import { memo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/MessageGroupModelList.tsx b/src/renderer/src/pages/home/Messages/MessageGroupModelList.tsx index 917184f161..c88157f668 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroupModelList.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroupModelList.tsx @@ -10,7 +10,8 @@ import { AssistantMessageStatus, type Message } from '@renderer/types/newMessage import { lightbulbSoftVariants } from '@renderer/utils/motionVariants' import { Avatar, Segmented as AntdSegmented, Tooltip } from 'antd' import { motion } from 'motion/react' -import { FC, memo, useCallback } from 'react' +import type { FC } from 'react' +import { memo, useCallback } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/MessageGroupSettings.tsx b/src/renderer/src/pages/home/Messages/MessageGroupSettings.tsx index 9ae20180f2..4705547fa1 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroupSettings.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroupSettings.tsx @@ -7,7 +7,8 @@ import { useAppDispatch } from '@renderer/store' import { setGridColumns, setGridPopoverTrigger } from '@renderer/store/settings' import { Col, Row, Slider } from 'antd' import { Popover } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' const MessageGroupSettings: FC = () => { diff --git a/src/renderer/src/pages/home/Messages/MessageHeader.tsx b/src/renderer/src/pages/home/Messages/MessageHeader.tsx index b43e12ce18..5f6a696632 100644 --- a/src/renderer/src/pages/home/Messages/MessageHeader.tsx +++ b/src/renderer/src/pages/home/Messages/MessageHeader.tsx @@ -18,7 +18,8 @@ import { firstLetter, isEmoji, removeLeadingEmoji } from '@renderer/utils' import { Avatar, Checkbox, Tooltip } from 'antd' import dayjs from 'dayjs' import { Sparkle } from 'lucide-react' -import { FC, memo, useCallback, useMemo } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/MessageImage.tsx b/src/renderer/src/pages/home/Messages/MessageImage.tsx index 52bb4a2278..444189c158 100644 --- a/src/renderer/src/pages/home/Messages/MessageImage.tsx +++ b/src/renderer/src/pages/home/Messages/MessageImage.tsx @@ -11,7 +11,7 @@ import { import { loggerService } from '@logger' import type { ImageMessageBlock } from '@renderer/types/newMessage' import { Image as AntdImage, Space } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 1383930409..bb7a17e051 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -5,12 +5,8 @@ import ObsidianExportPopup from '@renderer/components/Popups/ObsidianExportPopup import SaveToKnowledgePopup from '@renderer/components/Popups/SaveToKnowledgePopup' import { SelectModelPopup } from '@renderer/components/Popups/SelectModelPopup' import { isEmbeddingModel, isRerankModel, isVisionModel } from '@renderer/config/models' -import { - DEFAULT_MESSAGE_MENUBAR_SCOPE, - getMessageMenubarConfig, - MessageMenubarButtonId, - MessageMenubarScope -} from '@renderer/config/registry/messageMenubar' +import type { MessageMenubarButtonId, MessageMenubarScope } from '@renderer/config/registry/messageMenubar' +import { DEFAULT_MESSAGE_MENUBAR_SCOPE, getMessageMenubarConfig } from '@renderer/config/registry/messageMenubar' import { useMessageEditing } from '@renderer/context/MessageEditingContext' import { useChatContext } from '@renderer/hooks/useChatContext' import { useMessageOperations } from '@renderer/hooks/useMessageOperations' @@ -21,7 +17,8 @@ import useTranslate from '@renderer/hooks/useTranslate' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { getMessageTitle } from '@renderer/services/MessagesService' import { translateText } from '@renderer/services/TranslateService' -import store, { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import store, { useAppDispatch } from '@renderer/store' import { messageBlocksSelectors, removeOneBlock } from '@renderer/store/messageBlock' import { selectMessagesForTopic } from '@renderer/store/newMessage' import { TraceIcon } from '@renderer/trace/pages/Component' @@ -63,8 +60,8 @@ import { ThumbsUp, Upload } from 'lucide-react' -import type { Dispatch, ReactNode, SetStateAction } from 'react' -import { FC, Fragment, memo, useCallback, useMemo, useState } from 'react' +import type { Dispatch, FC, ReactNode, SetStateAction } from 'react' +import { Fragment, memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/MessageOutline.tsx b/src/renderer/src/pages/home/Messages/MessageOutline.tsx index 1f967a2f65..1327dd4a89 100644 --- a/src/renderer/src/pages/home/Messages/MessageOutline.tsx +++ b/src/renderer/src/pages/home/Messages/MessageOutline.tsx @@ -1,8 +1,10 @@ import Scrollbar from '@renderer/components/Scrollbar' -import { RootState } from '@renderer/store' +import type { RootState } from '@renderer/store' import { messageBlocksSelectors } from '@renderer/store/messageBlock' -import { Message, MessageBlockType } from '@renderer/types/newMessage' -import React, { FC, useMemo, useRef } from 'react' +import type { Message } from '@renderer/types/newMessage' +import { MessageBlockType } from '@renderer/types/newMessage' +import type { FC } from 'react' +import React, { useMemo, useRef } from 'react' import { useSelector } from 'react-redux' import remarkParse from 'remark-parse' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/MessageSelect.tsx b/src/renderer/src/pages/home/Messages/MessageSelect.tsx index d3d67fb7f0..b5e41d689a 100644 --- a/src/renderer/src/pages/home/Messages/MessageSelect.tsx +++ b/src/renderer/src/pages/home/Messages/MessageSelect.tsx @@ -1,7 +1,8 @@ import { useChatContext } from '@renderer/hooks/useChatContext' -import { Topic } from '@renderer/types' +import type { Topic } from '@renderer/types' import { Checkbox } from 'antd' -import { FC, ReactNode, useEffect, useRef } from 'react' +import type { FC, ReactNode } from 'react' +import { useEffect, useRef } from 'react' import styled from 'styled-components' interface SelectableMessageProps { diff --git a/src/renderer/src/pages/home/Messages/MessageTranslate.tsx b/src/renderer/src/pages/home/Messages/MessageTranslate.tsx index 91135ed737..dd0a02ecf8 100644 --- a/src/renderer/src/pages/home/Messages/MessageTranslate.tsx +++ b/src/renderer/src/pages/home/Messages/MessageTranslate.tsx @@ -2,7 +2,8 @@ import { TranslationOutlined } from '@ant-design/icons' import { LoadingIcon } from '@renderer/components/Icons' import type { TranslationMessageBlock } from '@renderer/types/newMessage' import { Divider } from 'antd' -import { FC, Fragment } from 'react' +import type { FC } from 'react' +import { Fragment } from 'react' import { useTranslation } from 'react-i18next' import Markdown from '../Markdown/Markdown' diff --git a/src/renderer/src/pages/home/Messages/MessageVideo.tsx b/src/renderer/src/pages/home/Messages/MessageVideo.tsx index 979b50ab6e..dd8438180a 100644 --- a/src/renderer/src/pages/home/Messages/MessageVideo.tsx +++ b/src/renderer/src/pages/home/Messages/MessageVideo.tsx @@ -1,6 +1,7 @@ import { loggerService } from '@renderer/services/LoggerService' -import { VideoMessageBlock } from '@renderer/types/newMessage' -import { FC, useRef } from 'react' +import type { VideoMessageBlock } from '@renderer/types/newMessage' +import type { FC } from 'react' +import { useRef } from 'react' import { useTranslation } from 'react-i18next' import ReactPlayer from 'react-player' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index 7bf037411e..7e0e03a774 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -20,7 +20,8 @@ import { messageBlocksSelectors, updateOneBlock } from '@renderer/store/messageB import { newMessagesActions } from '@renderer/store/newMessage' import { saveMessageAndBlocksToDB, updateMessageAndBlocksThunk } from '@renderer/store/thunk/messageThunk' import type { Assistant, Topic } from '@renderer/types' -import { type Message, MessageBlock, MessageBlockType } from '@renderer/types/newMessage' +import type { MessageBlock } from '@renderer/types/newMessage' +import { type Message, MessageBlockType } from '@renderer/types/newMessage' import { captureScrollableAsBlob, captureScrollableAsDataURL, diff --git a/src/renderer/src/pages/home/Messages/NarrowLayout.tsx b/src/renderer/src/pages/home/Messages/NarrowLayout.tsx index 7a7c641670..c5de99b358 100644 --- a/src/renderer/src/pages/home/Messages/NarrowLayout.tsx +++ b/src/renderer/src/pages/home/Messages/NarrowLayout.tsx @@ -1,5 +1,5 @@ import { useSettings } from '@renderer/hooks/useSettings' -import { FC, HTMLAttributes } from 'react' +import type { FC, HTMLAttributes } from 'react' import styled from 'styled-components' interface Props extends HTMLAttributes { diff --git a/src/renderer/src/pages/home/Messages/NewTopicButton.tsx b/src/renderer/src/pages/home/Messages/NewTopicButton.tsx index 350822053e..b80a45bf0d 100644 --- a/src/renderer/src/pages/home/Messages/NewTopicButton.tsx +++ b/src/renderer/src/pages/home/Messages/NewTopicButton.tsx @@ -4,7 +4,7 @@ import { EventEmitter } from '@renderer/services/EventService' import { EVENT_NAMES } from '@renderer/services/EventService' import { ThemeMode } from '@renderer/types' import { Button as AntdButton } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/Prompt.tsx b/src/renderer/src/pages/home/Messages/Prompt.tsx index e02389d915..1be9770593 100644 --- a/src/renderer/src/pages/home/Messages/Prompt.tsx +++ b/src/renderer/src/pages/home/Messages/Prompt.tsx @@ -1,9 +1,10 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { usePromptProcessor } from '@renderer/hooks/usePromptProcessor' import AssistantSettingsPopup from '@renderer/pages/settings/AssistantSettings' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { containsSupportedVariables } from '@renderer/utils/prompt' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GenericTools.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GenericTools.tsx index 11314e984f..9eaaf76f2c 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GenericTools.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GenericTools.tsx @@ -1,6 +1,6 @@ // 通用工具组件 - 减少重复代码 -import { ReactNode } from 'react' +import type { ReactNode } from 'react' // 生成 AccordionItem 的标题 export function ToolTitle({ diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx index 8b10508bf1..8d1f5eee8f 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx @@ -1,6 +1,6 @@ import { Accordion } from '@heroui/react' import { loggerService } from '@logger' -import { NormalToolResponse } from '@renderer/types' +import type { NormalToolResponse } from '@renderer/types' // 导出所有类型 export * from './types' @@ -20,7 +20,8 @@ import { SearchTool } from './SearchTool' import { SkillTool } from './SkillTool' import { TaskTool } from './TaskTool' import { TodoWriteTool } from './TodoWriteTool' -import { AgentToolsType, ToolInput, ToolOutput } from './types' +import type { ToolInput, ToolOutput } from './types' +import { AgentToolsType } from './types' import { UnknownToolRenderer } from './UnknownToolRenderer' import { WebFetchTool } from './WebFetchTool' import { WebSearchTool } from './WebSearchTool' diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageKnowledgeSearch.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageKnowledgeSearch.tsx index 19c3a135d7..08c8884a28 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageKnowledgeSearch.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageKnowledgeSearch.tsx @@ -1,7 +1,7 @@ -import { KnowledgeSearchToolInput, KnowledgeSearchToolOutput } from '@renderer/aiCore/tools/KnowledgeSearchTool' +import type { KnowledgeSearchToolInput, KnowledgeSearchToolOutput } from '@renderer/aiCore/tools/KnowledgeSearchTool' import Spinner from '@renderer/components/Spinner' import i18n from '@renderer/i18n' -import { NormalToolResponse } from '@renderer/types' +import type { NormalToolResponse } from '@renderer/types' import { Typography } from 'antd' import { FileSearch } from 'lucide-react' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx index 71d3c68b89..455e64d05d 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx @@ -4,11 +4,11 @@ import { useCodeStyle } from '@renderer/context/CodeStyleProvider' import { useMCPServers } from '@renderer/hooks/useMCPServers' import { useSettings } from '@renderer/hooks/useSettings' import { useTimer } from '@renderer/hooks/useTimer' -import { MCPToolResponse } from '@renderer/types' +import type { MCPToolResponse } from '@renderer/types' import type { ToolMessageBlock } from '@renderer/types/newMessage' import { isToolAutoApproved } from '@renderer/utils/mcp-tools' import { cancelToolAction, confirmToolAction } from '@renderer/utils/userConfirmation' -import { MCPProgressEvent } from '@shared/config/types' +import type { MCPProgressEvent } from '@shared/config/types' import { IpcChannel } from '@shared/IpcChannel' import { Button, @@ -35,7 +35,8 @@ import { TriangleAlert, X } from 'lucide-react' -import { FC, memo, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { memo, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageMemorySearch.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageMemorySearch.tsx index 2d49144633..86b1237ded 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageMemorySearch.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageMemorySearch.tsx @@ -1,6 +1,6 @@ -import { MemorySearchToolInput, MemorySearchToolOutput } from '@renderer/aiCore/tools/MemorySearchTool' +import type { MemorySearchToolInput, MemorySearchToolOutput } from '@renderer/aiCore/tools/MemorySearchTool' import Spinner from '@renderer/components/Spinner' -import { NormalToolResponse } from '@renderer/types' +import type { NormalToolResponse } from '@renderer/types' import { Typography } from 'antd' import { ChevronRight } from 'lucide-react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageTool.tsx index 20f7f01651..f78f5e221a 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageTool.tsx @@ -1,4 +1,4 @@ -import { NormalToolResponse } from '@renderer/types' +import type { NormalToolResponse } from '@renderer/types' import type { ToolMessageBlock } from '@renderer/types/newMessage' import { MessageAgentTools } from './MessageAgentTools' diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx index 5fe71bbae8..0f2cfe4ee0 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx @@ -1,6 +1,6 @@ -import { WebSearchToolInput, WebSearchToolOutput } from '@renderer/aiCore/tools/WebSearchTool' +import type { WebSearchToolInput, WebSearchToolOutput } from '@renderer/aiCore/tools/WebSearchTool' import Spinner from '@renderer/components/Spinner' -import { NormalToolResponse } from '@renderer/types' +import type { NormalToolResponse } from '@renderer/types' import { Typography } from 'antd' import { Search } from 'lucide-react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx b/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx index 1ef93a5343..e2678357ca 100644 --- a/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/ToolPermissionRequestCard.tsx @@ -3,7 +3,7 @@ import { Button, Chip, ScrollShadow } from '@heroui/react' import { loggerService } from '@logger' import { useAppDispatch, useAppSelector } from '@renderer/store' import { selectPendingPermissionByToolName, toolPermissionsActions } from '@renderer/store/toolPermissions' -import { NormalToolResponse } from '@renderer/types' +import type { NormalToolResponse } from '@renderer/types' import { ChevronDown, CirclePlay, CircleX } from 'lucide-react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/home/Navbar.tsx b/src/renderer/src/pages/home/Navbar.tsx index c643391d8a..dd3a215922 100644 --- a/src/renderer/src/pages/home/Navbar.tsx +++ b/src/renderer/src/pages/home/Navbar.tsx @@ -9,12 +9,12 @@ import { useShowAssistants, useShowTopics } from '@renderer/hooks/useStore' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { useAppDispatch } from '@renderer/store' import { setNarrowMode } from '@renderer/store/settings' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { Tooltip } from 'antd' import { t } from 'i18next' import { Menu, PanelLeftClose, PanelRightClose, Search } from 'lucide-react' import { AnimatePresence, motion } from 'motion/react' -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' import AssistantsDrawer from './components/AssistantsDrawer' diff --git a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx index 4eebe45bc3..383319a3b0 100644 --- a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx @@ -9,9 +9,10 @@ import { useAssistantsTabSortType } from '@renderer/hooks/useStore' import { useTags } from '@renderer/hooks/useTags' import { useAppDispatch } from '@renderer/store' import { addIknowAction } from '@renderer/store/runtime' -import { Assistant, AssistantsSortType, Topic } from '@renderer/types' +import type { Assistant, AssistantsSortType, Topic } from '@renderer/types' import { getErrorMessage } from '@renderer/utils' -import { FC, useCallback, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Tabs/SessionSettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SessionSettingsTab.tsx index 099d22a72e..346c3abb1d 100644 --- a/src/renderer/src/pages/home/Tabs/SessionSettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SessionSettingsTab.tsx @@ -1,10 +1,10 @@ import { Button, Divider } from '@heroui/react' -import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' +import type { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' import { SessionSettingsPopup } from '@renderer/pages/settings/AgentSettings' import AdvancedSettings from '@renderer/pages/settings/AgentSettings/AdvancedSettings' import EssentialSettings from '@renderer/pages/settings/AgentSettings/EssentialSettings' -import { GetAgentSessionResponse } from '@renderer/types' -import { FC } from 'react' +import type { GetAgentSessionResponse } from '@renderer/types' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' interface Props { diff --git a/src/renderer/src/pages/home/Tabs/SessionsTab.tsx b/src/renderer/src/pages/home/Tabs/SessionsTab.tsx index fed7668c0a..6241893c31 100644 --- a/src/renderer/src/pages/home/Tabs/SessionsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SessionsTab.tsx @@ -2,7 +2,8 @@ import { Alert, cn } from '@heroui/react' import { useRuntime } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import { AnimatePresence, motion } from 'framer-motion' -import { FC, memo } from 'react' +import type { FC } from 'react' +import { memo } from 'react' import { useTranslation } from 'react-i18next' import Sessions from './components/Sessions' diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 9aca265c40..8b39e766fd 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -22,8 +22,8 @@ import AssistantSettingsPopup from '@renderer/pages/settings/AssistantSettings' import { CollapsibleSettingGroup } from '@renderer/pages/settings/SettingGroup' import { getDefaultModel } from '@renderer/services/AssistantService' import { useAppDispatch } from '@renderer/store' +import type { SendMessageShortcut } from '@renderer/store/settings' import { - SendMessageShortcut, setAutoTranslateWithSpace, setCodeCollapsible, setCodeEditor, @@ -52,12 +52,14 @@ import { setShowTranslateConfirm, setThoughtAutoCollapse } from '@renderer/store/settings' -import { Assistant, AssistantSettings, CodeStyleVarious, MathEngine, ThemeMode } from '@renderer/types' +import type { Assistant, AssistantSettings, CodeStyleVarious, MathEngine } from '@renderer/types' +import { ThemeMode } from '@renderer/types' import { modalConfirm } from '@renderer/utils' import { getSendMessageShortcutLabel } from '@renderer/utils/input' import { Button, Col, InputNumber, Row, Slider, Switch } from 'antd' import { Settings2 } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx index ce413aaca7..6400630357 100644 --- a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx @@ -1,6 +1,6 @@ import { useRuntime } from '@renderer/hooks/useRuntime' -import { Assistant, Topic } from '@renderer/types' -import { FC } from 'react' +import type { Assistant, Topic } from '@renderer/types' +import type { FC } from 'react' import { Topics } from './components/Topics' import SessionsTab from './SessionsTab' diff --git a/src/renderer/src/pages/home/Tabs/components/AddButton.tsx b/src/renderer/src/pages/home/Tabs/components/AddButton.tsx index 99868861b5..62feecd226 100644 --- a/src/renderer/src/pages/home/Tabs/components/AddButton.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AddButton.tsx @@ -1,6 +1,7 @@ -import { Button, ButtonProps, cn } from '@heroui/react' +import type { ButtonProps } from '@heroui/react' +import { Button, cn } from '@heroui/react' import { PlusIcon } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' interface Props extends ButtonProps { children: React.ReactNode diff --git a/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx b/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx index 4ecc862ae3..59eafaa457 100644 --- a/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx @@ -5,10 +5,11 @@ import { useSettings } from '@renderer/hooks/useSettings' import AgentSettingsPopup from '@renderer/pages/settings/AgentSettings/AgentSettingsPopup' import { AgentLabel } from '@renderer/pages/settings/AgentSettings/shared' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { AgentEntity } from '@renderer/types' +import type { AgentEntity } from '@renderer/types' import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger } from '@renderer/ui/context-menu' import { Bot } from 'lucide-react' -import { FC, memo, useCallback } from 'react' +import type { FC } from 'react' +import { memo, useCallback } from 'react' import { useTranslation } from 'react-i18next' // const logger = loggerService.withContext('AgentItem') diff --git a/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx b/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx index faa00576d4..e18c3da9a8 100644 --- a/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx @@ -11,10 +11,11 @@ import { getDefaultModel } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { useAppDispatch } from '@renderer/store' import { setActiveTopicOrSessionAction } from '@renderer/store/runtime' -import { Assistant, AssistantsSortType } from '@renderer/types' +import type { Assistant, AssistantsSortType } from '@renderer/types' import { getLeadingEmoji, uuid } from '@renderer/utils' import { hasTopicPendingRequests } from '@renderer/utils/queue' -import { Dropdown, MenuProps } from 'antd' +import type { MenuProps } from 'antd' +import { Dropdown } from 'antd' import { omit } from 'lodash' import { AlignJustify, @@ -29,7 +30,8 @@ import { Tag, Tags } from 'lucide-react' -import { FC, memo, PropsWithChildren, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC, PropsWithChildren } from 'react' +import { memo, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import * as tinyPinyin from 'tiny-pinyin' diff --git a/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx b/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx index e3992d5b6b..e752f450b5 100644 --- a/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx +++ b/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx @@ -8,21 +8,16 @@ import { isSupportServiceTierProvider } from '@renderer/config/providers' import { useProvider } from '@renderer/hooks/useProvider' import { SettingDivider, SettingRow } from '@renderer/pages/settings' import { CollapsibleSettingGroup } from '@renderer/pages/settings/SettingGroup' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setOpenAISummaryText, setOpenAIVerbosity } from '@renderer/store/settings' -import { - GroqServiceTiers, - Model, - OpenAIServiceTier, - OpenAIServiceTiers, - OpenAISummaryText, - ServiceTier, - SystemProviderIds -} from '@renderer/types' -import { OpenAIVerbosity } from '@types' +import type { Model, OpenAIServiceTier, OpenAISummaryText, ServiceTier } from '@renderer/types' +import { GroqServiceTiers, OpenAIServiceTiers, SystemProviderIds } from '@renderer/types' +import type { OpenAIVerbosity } from '@types' import { Tooltip } from 'antd' import { CircleHelp } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx b/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx index f934c7a01d..d4dcc4cb95 100644 --- a/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx +++ b/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx @@ -9,7 +9,7 @@ import { SessionSettingsPopup } from '@renderer/pages/settings/AgentSettings' import { SessionLabel } from '@renderer/pages/settings/AgentSettings/shared' import { useAppDispatch, useAppSelector } from '@renderer/store' import { newMessagesActions } from '@renderer/store/newMessage' -import { AgentSessionEntity } from '@renderer/types' +import type { AgentSessionEntity } from '@renderer/types' import { ContextMenu, ContextMenuContent, @@ -23,7 +23,8 @@ import { classNames } from '@renderer/utils' import { buildAgentSessionTopicId } from '@renderer/utils/agentSession' import { Tooltip } from 'antd' import { MenuIcon, XIcon } from 'lucide-react' -import React, { FC, memo, startTransition, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import React, { memo, startTransition, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/Tabs/components/TagGroup.tsx b/src/renderer/src/pages/home/Tabs/components/TagGroup.tsx index 6f751e65d0..a5d1f3ef33 100644 --- a/src/renderer/src/pages/home/Tabs/components/TagGroup.tsx +++ b/src/renderer/src/pages/home/Tabs/components/TagGroup.tsx @@ -1,7 +1,7 @@ import { DownOutlined, RightOutlined } from '@ant-design/icons' import { cn } from '@heroui/react' import { Tooltip } from 'antd' -import { FC, ReactNode } from 'react' +import type { FC, ReactNode } from 'react' interface TagGroupProps { tag: string diff --git a/src/renderer/src/pages/home/Tabs/components/Topics.tsx b/src/renderer/src/pages/home/Tabs/components/Topics.tsx index ce2cd25d35..04e8bead7a 100644 --- a/src/renderer/src/pages/home/Tabs/components/Topics.tsx +++ b/src/renderer/src/pages/home/Tabs/components/Topics.tsx @@ -12,11 +12,11 @@ import { useSettings } from '@renderer/hooks/useSettings' import { finishTopicRenaming, startTopicRenaming, TopicManager } from '@renderer/hooks/useTopic' import { fetchMessagesSummary } from '@renderer/services/ApiService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' +import type { RootState } from '@renderer/store' import store from '@renderer/store' -import { RootState } from '@renderer/store' import { newMessagesActions } from '@renderer/store/newMessage' import { setGenerating } from '@renderer/store/runtime' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { classNames, removeSpecialCharactersForFileName } from '@renderer/utils' import { copyTopicAsMarkdown, copyTopicAsPlainText } from '@renderer/utils/copy' import { @@ -28,8 +28,9 @@ import { exportTopicToNotion, topicToMarkdown } from '@renderer/utils/export' -import { Dropdown, MenuProps, Tooltip } from 'antd' -import { ItemType, MenuItemType } from 'antd/es/menu/interface' +import type { MenuProps } from 'antd' +import { Dropdown, Tooltip } from 'antd' +import type { ItemType, MenuItemType } from 'antd/es/menu/interface' import dayjs from 'dayjs' import { findIndex } from 'lodash' import { diff --git a/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx b/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx index 433709d20b..2f382ec69a 100644 --- a/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx +++ b/src/renderer/src/pages/home/Tabs/components/UnifiedAddButton.tsx @@ -3,8 +3,9 @@ import AddAssistantOrAgentPopup from '@renderer/components/Popups/AddAssistantOr import { AgentModal } from '@renderer/components/Popups/agent/AgentModal' import { useAppDispatch } from '@renderer/store' import { setActiveTopicOrSessionAction } from '@renderer/store/runtime' -import { AgentEntity, Assistant, Topic } from '@renderer/types' -import { FC, useCallback } from 'react' +import type { AgentEntity, Assistant, Topic } from '@renderer/types' +import type { FC } from 'react' +import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import AddButton from './AddButton' diff --git a/src/renderer/src/pages/home/Tabs/components/UnifiedList.tsx b/src/renderer/src/pages/home/Tabs/components/UnifiedList.tsx index 2d8cef69e5..a5dda02fdd 100644 --- a/src/renderer/src/pages/home/Tabs/components/UnifiedList.tsx +++ b/src/renderer/src/pages/home/Tabs/components/UnifiedList.tsx @@ -1,8 +1,9 @@ import { DraggableList } from '@renderer/components/DraggableList' -import { Assistant, AssistantsSortType } from '@renderer/types' -import { FC, useCallback } from 'react' +import type { Assistant, AssistantsSortType } from '@renderer/types' +import type { FC } from 'react' +import { useCallback } from 'react' -import { UnifiedItem } from '../hooks/useUnifiedItems' +import type { UnifiedItem } from '../hooks/useUnifiedItems' import AgentItem from './AgentItem' import AssistantItem from './AssistantItem' diff --git a/src/renderer/src/pages/home/Tabs/components/UnifiedTagGroups.tsx b/src/renderer/src/pages/home/Tabs/components/UnifiedTagGroups.tsx index 6c3b1fe9a1..e27599e1fa 100644 --- a/src/renderer/src/pages/home/Tabs/components/UnifiedTagGroups.tsx +++ b/src/renderer/src/pages/home/Tabs/components/UnifiedTagGroups.tsx @@ -1,9 +1,10 @@ import { DraggableList } from '@renderer/components/DraggableList' -import { Assistant, AssistantsSortType } from '@renderer/types' -import { FC, useCallback } from 'react' +import type { Assistant, AssistantsSortType } from '@renderer/types' +import type { FC } from 'react' +import { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import { UnifiedItem } from '../hooks/useUnifiedItems' +import type { UnifiedItem } from '../hooks/useUnifiedItems' import AgentItem from './AgentItem' import AssistantItem from './AssistantItem' import { TagGroup } from './TagGroup' diff --git a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts index 90d2601f63..cff7b865eb 100644 --- a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts +++ b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedGrouping.ts @@ -1,11 +1,12 @@ import { createSelector } from '@reduxjs/toolkit' -import { RootState, useAppDispatch, useAppSelector } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch, useAppSelector } from '@renderer/store' import { setUnifiedListOrder } from '@renderer/store/assistants' -import { AgentEntity, Assistant } from '@renderer/types' +import type { AgentEntity, Assistant } from '@renderer/types' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { UnifiedItem } from './useUnifiedItems' +import type { UnifiedItem } from './useUnifiedItems' interface UseUnifiedGroupingOptions { unifiedItems: UnifiedItem[] diff --git a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedItems.ts b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedItems.ts index d9190b430d..1fd35c3b31 100644 --- a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedItems.ts +++ b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedItems.ts @@ -1,6 +1,6 @@ import { useAppDispatch, useAppSelector } from '@renderer/store' import { setUnifiedListOrder } from '@renderer/store/assistants' -import { AgentEntity, Assistant } from '@renderer/types' +import type { AgentEntity, Assistant } from '@renderer/types' import { useCallback, useMemo } from 'react' export type UnifiedItem = { type: 'agent'; data: AgentEntity } | { type: 'assistant'; data: Assistant } diff --git a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedSorting.ts b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedSorting.ts index 317376fa0d..533427813f 100644 --- a/src/renderer/src/pages/home/Tabs/hooks/useUnifiedSorting.ts +++ b/src/renderer/src/pages/home/Tabs/hooks/useUnifiedSorting.ts @@ -1,10 +1,10 @@ import { useAppDispatch } from '@renderer/store' import { setUnifiedListOrder } from '@renderer/store/assistants' -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' import { useCallback } from 'react' import * as tinyPinyin from 'tiny-pinyin' -import { UnifiedItem } from './useUnifiedItems' +import type { UnifiedItem } from './useUnifiedItems' interface UseUnifiedSortingOptions { unifiedItems: UnifiedItem[] diff --git a/src/renderer/src/pages/home/Tabs/index.tsx b/src/renderer/src/pages/home/Tabs/index.tsx index 4914ae1340..3b9e057d80 100644 --- a/src/renderer/src/pages/home/Tabs/index.tsx +++ b/src/renderer/src/pages/home/Tabs/index.tsx @@ -9,10 +9,11 @@ import { useShowTopics } from '@renderer/hooks/useStore' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { useAppDispatch } from '@renderer/store' import { setActiveAgentId, setActiveTopicOrSessionAction } from '@renderer/store/runtime' -import { Assistant, Topic } from '@renderer/types' -import { Tab } from '@renderer/types/chat' +import type { Assistant, Topic } from '@renderer/types' +import type { Tab } from '@renderer/types/chat' import { classNames, getErrorMessage, uuid } from '@renderer/utils' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/components/AssistantsDrawer.tsx b/src/renderer/src/pages/home/components/AssistantsDrawer.tsx index d37f39a234..97bfef4d8d 100644 --- a/src/renderer/src/pages/home/components/AssistantsDrawer.tsx +++ b/src/renderer/src/pages/home/components/AssistantsDrawer.tsx @@ -1,7 +1,7 @@ import { TopView } from '@renderer/components/TopView' import { isMac } from '@renderer/config/constant' import { useTimer } from '@renderer/hooks/useTimer' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import { Drawer } from 'antd' import { useState } from 'react' diff --git a/src/renderer/src/pages/home/components/ChatNavbarContent.tsx b/src/renderer/src/pages/home/components/ChatNavbarContent.tsx index 8f0f2b1197..65b9cdee11 100644 --- a/src/renderer/src/pages/home/components/ChatNavbarContent.tsx +++ b/src/renderer/src/pages/home/components/ChatNavbarContent.tsx @@ -4,11 +4,12 @@ import { useActiveAgent } from '@renderer/hooks/agents/useActiveAgent' import { useActiveSession } from '@renderer/hooks/agents/useActiveSession' import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' import { useRuntime } from '@renderer/hooks/useRuntime' -import { AgentEntity, AgentSessionEntity, ApiModel, Assistant } from '@renderer/types' +import type { AgentEntity, AgentSessionEntity, ApiModel, Assistant } from '@renderer/types' import { formatErrorMessageWithPrefix } from '@renderer/utils/error' import { t } from 'i18next' import { Folder } from 'lucide-react' -import { FC, ReactNode, useCallback } from 'react' +import type { FC, ReactNode } from 'react' +import { useCallback } from 'react' import { AgentSettingsPopup, SessionSettingsPopup } from '../../settings/AgentSettings' import { AgentLabel, SessionLabel } from '../../settings/AgentSettings/shared' diff --git a/src/renderer/src/pages/home/components/SelectAgentBaseModelButton.tsx b/src/renderer/src/pages/home/components/SelectAgentBaseModelButton.tsx index 0a2e6c1fbb..1d46335e1b 100644 --- a/src/renderer/src/pages/home/components/SelectAgentBaseModelButton.tsx +++ b/src/renderer/src/pages/home/components/SelectAgentBaseModelButton.tsx @@ -4,11 +4,12 @@ import { SelectApiModelPopup } from '@renderer/components/Popups/SelectModelPopu import { agentModelFilter } from '@renderer/config/models' import { useApiModel } from '@renderer/hooks/agents/useModel' import { getProviderNameById } from '@renderer/services/ProviderService' -import { AgentBaseWithId, ApiModel, isAgentEntity } from '@renderer/types' +import type { AgentBaseWithId, ApiModel } from '@renderer/types' +import { isAgentEntity } from '@renderer/types' import { getModelFilterByAgentType } from '@renderer/utils/agentSession' import { apiModelAdapter } from '@renderer/utils/model' import { ChevronsUpDown } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' interface Props { diff --git a/src/renderer/src/pages/home/components/SelectModelButton.tsx b/src/renderer/src/pages/home/components/SelectModelButton.tsx index 2d3ce4d34f..78892124b0 100644 --- a/src/renderer/src/pages/home/components/SelectModelButton.tsx +++ b/src/renderer/src/pages/home/components/SelectModelButton.tsx @@ -5,10 +5,11 @@ import { isEmbeddingModel, isRerankModel, isWebSearchModel } from '@renderer/con import { useAssistant } from '@renderer/hooks/useAssistant' import { useProvider } from '@renderer/hooks/useProvider' import { getProviderName } from '@renderer/services/ProviderService' -import { Assistant, Model } from '@renderer/types' +import type { Assistant, Model } from '@renderer/types' import { Button, Tag } from 'antd' import { ChevronsUpDown } from 'lucide-react' -import { FC, useEffect, useRef } from 'react' +import type { FC } from 'react' +import { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/home/components/UpdateAppButton.tsx b/src/renderer/src/pages/home/components/UpdateAppButton.tsx index 4d8f3f1261..afd5531093 100644 --- a/src/renderer/src/pages/home/components/UpdateAppButton.tsx +++ b/src/renderer/src/pages/home/components/UpdateAppButton.tsx @@ -4,7 +4,7 @@ import UpdateDialog from '@renderer/components/UpdateDialog' import { useRuntime } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import { Button } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx index 3a2225a2c2..c3b294e6e5 100644 --- a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx +++ b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx @@ -5,10 +5,11 @@ import CustomTag from '@renderer/components/Tags/CustomTag' import { useKnowledge } from '@renderer/hooks/useKnowledge' import { NavbarIcon } from '@renderer/pages/home/ChatNavbar' import { getProviderName } from '@renderer/services/ProviderService' -import { KnowledgeBase } from '@renderer/types' +import type { KnowledgeBase } from '@renderer/types' import { Button, Empty, Tabs, Tag, Tooltip } from 'antd' import { Book, Folder, Globe, Link, Notebook, Search, Settings, Video } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/KnowledgePage.tsx b/src/renderer/src/pages/knowledge/KnowledgePage.tsx index cf0fc5170a..5c62c22ac6 100644 --- a/src/renderer/src/pages/knowledge/KnowledgePage.tsx +++ b/src/renderer/src/pages/knowledge/KnowledgePage.tsx @@ -7,10 +7,12 @@ import Scrollbar from '@renderer/components/Scrollbar' import { useKnowledgeBases } from '@renderer/hooks/useKnowledge' import { useShortcut } from '@renderer/hooks/useShortcuts' import KnowledgeSearchPopup from '@renderer/pages/knowledge/components/KnowledgeSearchPopup' -import { KnowledgeBase } from '@renderer/types' -import { Dropdown, Empty, MenuProps } from 'antd' +import type { KnowledgeBase } from '@renderer/types' +import type { MenuProps } from 'antd' +import { Dropdown, Empty } from 'antd' import { Book, Plus, Settings } from 'lucide-react' -import { FC, useCallback, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/__tests__/GeneralSettingsPanel.test.tsx b/src/renderer/src/pages/knowledge/__tests__/GeneralSettingsPanel.test.tsx index 7d961b5a65..64c566ac2d 100644 --- a/src/renderer/src/pages/knowledge/__tests__/GeneralSettingsPanel.test.tsx +++ b/src/renderer/src/pages/knowledge/__tests__/GeneralSettingsPanel.test.tsx @@ -1,4 +1,4 @@ -import { KnowledgeBase, Model, PreprocessProvider } from '@renderer/types' +import type { KnowledgeBase, Model, PreprocessProvider } from '@renderer/types' import { fireEvent, render, screen } from '@testing-library/react' import { userEvent } from '@testing-library/user-event' import { beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/pages/knowledge/__tests__/KnowledgeBaseFormModal.test.tsx b/src/renderer/src/pages/knowledge/__tests__/KnowledgeBaseFormModal.test.tsx index ba85bcea34..4c9229cfcb 100644 --- a/src/renderer/src/pages/knowledge/__tests__/KnowledgeBaseFormModal.test.tsx +++ b/src/renderer/src/pages/knowledge/__tests__/KnowledgeBaseFormModal.test.tsx @@ -2,7 +2,8 @@ import { fireEvent, render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { beforeEach, describe, expect, it, vi } from 'vitest' -import KnowledgeBaseFormModal, { PanelConfig } from '../components/KnowledgeSettings/KnowledgeBaseFormModal' +import type { PanelConfig } from '../components/KnowledgeSettings/KnowledgeBaseFormModal' +import KnowledgeBaseFormModal from '../components/KnowledgeSettings/KnowledgeBaseFormModal' // Mock dependencies const mocks = vi.hoisted(() => ({ diff --git a/src/renderer/src/pages/knowledge/components/AddKnowledgeBasePopup.tsx b/src/renderer/src/pages/knowledge/components/AddKnowledgeBasePopup.tsx index b6a3819fd8..d7e2fa30b3 100644 --- a/src/renderer/src/pages/knowledge/components/AddKnowledgeBasePopup.tsx +++ b/src/renderer/src/pages/knowledge/components/AddKnowledgeBasePopup.tsx @@ -3,7 +3,7 @@ import { TopView } from '@renderer/components/TopView' import { useKnowledgeBases } from '@renderer/hooks/useKnowledge' import { useKnowledgeBaseForm } from '@renderer/hooks/useKnowledgeBaseForm' import { getKnowledgeBaseParams } from '@renderer/services/KnowledgeService' -import { KnowledgeBase } from '@renderer/types' +import type { KnowledgeBase } from '@renderer/types' import { formatErrorMessage } from '@renderer/utils/error' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/knowledge/components/EditKnowledgeBasePopup.tsx b/src/renderer/src/pages/knowledge/components/EditKnowledgeBasePopup.tsx index 82dfc02a9c..60a37dc4d7 100644 --- a/src/renderer/src/pages/knowledge/components/EditKnowledgeBasePopup.tsx +++ b/src/renderer/src/pages/knowledge/components/EditKnowledgeBasePopup.tsx @@ -4,7 +4,7 @@ import { TopView } from '@renderer/components/TopView' import { useKnowledge } from '@renderer/hooks/useKnowledge' import { useKnowledgeBaseForm } from '@renderer/hooks/useKnowledgeBaseForm' import { getModelUniqId } from '@renderer/services/ModelService' -import { KnowledgeBase } from '@renderer/types' +import type { KnowledgeBase } from '@renderer/types' import { formatErrorMessage } from '@renderer/utils/error' import { Flex } from 'antd' import { useCallback, useMemo, useState } from 'react' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/TextItem.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/TextItem.tsx index d50d758831..cf7b6f18bd 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/TextItem.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/TextItem.tsx @@ -1,6 +1,7 @@ -import { FileMetadata, KnowledgeSearchResult } from '@renderer/types' +import type { FileMetadata, KnowledgeSearchResult } from '@renderer/types' import { Typography } from 'antd' -import React, { FC } from 'react' +import type { FC } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' import { CopyButtonContainer, KnowledgeItemMetadata } from './components' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx index daef3d638a..4d3ec4c78a 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx @@ -1,6 +1,7 @@ -import { FileMetadata, KnowledgeSearchResult } from '@renderer/types' +import type { FileMetadata, KnowledgeSearchResult } from '@renderer/types' import { Typography } from 'antd' -import React, { FC, useRef } from 'react' +import type { FC } from 'react' +import React, { useRef } from 'react' import ReactPlayer from 'react-player' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/components.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/components.tsx index b11369fa83..35d0184198 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/components.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/components.tsx @@ -1,5 +1,5 @@ import { CopyOutlined } from '@ant-design/icons' -import { FileMetadata, KnowledgeSearchResult } from '@renderer/types' +import type { FileMetadata, KnowledgeSearchResult } from '@renderer/types' import { Tooltip, Typography } from 'antd' import React from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/hooks.ts b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/hooks.ts index 40b6513328..d5159363fb 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/hooks.ts +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/hooks.ts @@ -1,7 +1,8 @@ import { loggerService } from '@logger' import { isValidUrl } from '@renderer/utils/fetch' import { message } from 'antd' -import React, { ReactElement } from 'react' +import type { ReactElement } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' const logger = loggerService.withContext('KnowledgeSearchItem hooks') diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/index.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/index.tsx index a6fd8695bb..d7f8a9c6d6 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/index.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/index.tsx @@ -1,4 +1,4 @@ -import { FileMetadata, KnowledgeSearchResult } from '@renderer/types' +import type { FileMetadata, KnowledgeSearchResult } from '@renderer/types' import React from 'react' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx index 9cdb2546cf..a48b9b8225 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx @@ -2,8 +2,9 @@ import { loggerService } from '@logger' import { HStack } from '@renderer/components/Layout' import { TopView } from '@renderer/components/TopView' import { searchKnowledgeBase } from '@renderer/services/KnowledgeService' -import { FileMetadata, KnowledgeBase, KnowledgeSearchResult } from '@renderer/types' -import { Divider, Input, InputRef, List, Modal, Spin } from 'antd' +import type { FileMetadata, KnowledgeBase, KnowledgeSearchResult } from '@renderer/types' +import type { InputRef } from 'antd' +import { Divider, Input, List, Modal, Spin } from 'antd' import { Search } from 'lucide-react' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSettings/AdvancedSettingsPanel.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSettings/AdvancedSettingsPanel.tsx index d8682f7fb7..03b6d1b4e4 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSettings/AdvancedSettingsPanel.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSettings/AdvancedSettingsPanel.tsx @@ -1,5 +1,5 @@ import { InfoTooltip } from '@renderer/components/TooltipIcons' -import { KnowledgeBase } from '@renderer/types' +import type { KnowledgeBase } from '@renderer/types' import { Alert, InputNumber } from 'antd' import { TriangleAlert } from 'lucide-react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSettings/GeneralSettingsPanel.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSettings/GeneralSettingsPanel.tsx index c5125c4aff..f8fe0e61a4 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSettings/GeneralSettingsPanel.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSettings/GeneralSettingsPanel.tsx @@ -5,8 +5,9 @@ import { DEFAULT_KNOWLEDGE_DOCUMENT_COUNT } from '@renderer/config/constant' import { isEmbeddingModel, isRerankModel } from '@renderer/config/models' import { useProviders } from '@renderer/hooks/useProvider' import { getModelUniqId } from '@renderer/services/ModelService' -import { KnowledgeBase, PreprocessProvider } from '@renderer/types' -import { Input, Select, SelectProps, Slider } from 'antd' +import type { KnowledgeBase, PreprocessProvider } from '@renderer/types' +import type { SelectProps } from 'antd' +import { Input, Select, Slider } from 'antd' import { useTranslation } from 'react-i18next' import { SettingsItem, SettingsPanel } from './styles' diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSettings/KnowledgeBaseFormModal.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSettings/KnowledgeBaseFormModal.tsx index 25ee7cbe8c..6ea885da76 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSettings/KnowledgeBaseFormModal.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSettings/KnowledgeBaseFormModal.tsx @@ -1,5 +1,6 @@ import { HStack } from '@renderer/components/Layout' -import { Menu, Modal, ModalProps } from 'antd' +import type { ModalProps } from 'antd' +import { Menu, Modal } from 'antd' import React, { useState } from 'react' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/components/QuotaTag.tsx b/src/renderer/src/pages/knowledge/components/QuotaTag.tsx index b6f29ce5d1..f2f3fc29b0 100644 --- a/src/renderer/src/pages/knowledge/components/QuotaTag.tsx +++ b/src/renderer/src/pages/knowledge/components/QuotaTag.tsx @@ -2,9 +2,10 @@ import { loggerService } from '@logger' import { usePreprocessProvider } from '@renderer/hooks/usePreprocess' import { getStoreSetting } from '@renderer/hooks/useSettings' import { getKnowledgeBaseParams } from '@renderer/services/KnowledgeService' -import { KnowledgeBase, PreprocessProviderId } from '@renderer/types' +import type { KnowledgeBase, PreprocessProviderId } from '@renderer/types' import { Tag } from 'antd' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' const logger = loggerService.withContext('QuotaTag') diff --git a/src/renderer/src/pages/knowledge/components/StatusIcon.tsx b/src/renderer/src/pages/knowledge/components/StatusIcon.tsx index cfe21d50cb..e8ced30777 100644 --- a/src/renderer/src/pages/knowledge/components/StatusIcon.tsx +++ b/src/renderer/src/pages/knowledge/components/StatusIcon.tsx @@ -1,8 +1,9 @@ import { CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons' import { loggerService } from '@logger' -import { KnowledgeBase, ProcessingStatus } from '@renderer/types' +import type { KnowledgeBase, ProcessingStatus } from '@renderer/types' import { Progress, Tooltip } from 'antd' -import React, { FC, useMemo } from 'react' +import type { FC } from 'react' +import React, { useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/items/KnowledgeDirectories.tsx b/src/renderer/src/pages/knowledge/items/KnowledgeDirectories.tsx index 65b62f48fb..f021a95d47 100644 --- a/src/renderer/src/pages/knowledge/items/KnowledgeDirectories.tsx +++ b/src/renderer/src/pages/knowledge/items/KnowledgeDirectories.tsx @@ -5,11 +5,12 @@ import { DynamicVirtualList } from '@renderer/components/VirtualList' import { useKnowledge } from '@renderer/hooks/useKnowledge' import FileItem from '@renderer/pages/files/FileItem' import { getProviderName } from '@renderer/services/ProviderService' -import { KnowledgeBase, KnowledgeItem } from '@renderer/types' +import type { KnowledgeBase, KnowledgeItem } from '@renderer/types' import { Button, Tooltip } from 'antd' import dayjs from 'dayjs' import { PlusIcon } from 'lucide-react' -import { FC, useCallback, useMemo } from 'react' +import type { FC } from 'react' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/items/KnowledgeFiles.tsx b/src/renderer/src/pages/knowledge/items/KnowledgeFiles.tsx index eb7e519660..800a6f565e 100644 --- a/src/renderer/src/pages/knowledge/items/KnowledgeFiles.tsx +++ b/src/renderer/src/pages/knowledge/items/KnowledgeFiles.tsx @@ -6,12 +6,14 @@ import FileItem from '@renderer/pages/files/FileItem' import StatusIcon from '@renderer/pages/knowledge/components/StatusIcon' import FileManager from '@renderer/services/FileManager' import { getProviderName } from '@renderer/services/ProviderService' -import { FileMetadata, FileTypes, isKnowledgeFileItem, KnowledgeBase, KnowledgeItem } from '@renderer/types' +import type { FileMetadata, FileTypes, KnowledgeBase, KnowledgeItem } from '@renderer/types' +import { isKnowledgeFileItem } from '@renderer/types' import { formatFileSize, uuid } from '@renderer/utils' import { bookExts, documentExts, textExts, thirdPartyApplicationExts } from '@shared/config/constant' import { Button, Tooltip, Upload } from 'antd' import dayjs from 'dayjs' -import { FC, useCallback, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/items/KnowledgeNotes.tsx b/src/renderer/src/pages/knowledge/items/KnowledgeNotes.tsx index 86abec6b13..3224671112 100644 --- a/src/renderer/src/pages/knowledge/items/KnowledgeNotes.tsx +++ b/src/renderer/src/pages/knowledge/items/KnowledgeNotes.tsx @@ -4,12 +4,13 @@ import { DynamicVirtualList } from '@renderer/components/VirtualList' import { useKnowledge } from '@renderer/hooks/useKnowledge' import FileItem from '@renderer/pages/files/FileItem' import { getProviderName } from '@renderer/services/ProviderService' -import { KnowledgeBase, KnowledgeItem } from '@renderer/types' +import type { KnowledgeBase, KnowledgeItem } from '@renderer/types' import { isMarkdownContent, markdownToPreviewText } from '@renderer/utils/markdownConverter' import { Button } from 'antd' import dayjs from 'dayjs' import { PlusIcon } from 'lucide-react' -import { FC, useCallback, useMemo } from 'react' +import type { FC } from 'react' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx b/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx index ab46fead5f..2f8d32d222 100644 --- a/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx +++ b/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx @@ -6,11 +6,12 @@ import { DynamicVirtualList } from '@renderer/components/VirtualList' import { useKnowledge } from '@renderer/hooks/useKnowledge' import FileItem from '@renderer/pages/files/FileItem' import { getProviderName } from '@renderer/services/ProviderService' -import { KnowledgeBase, KnowledgeItem } from '@renderer/types' +import type { KnowledgeBase, KnowledgeItem } from '@renderer/types' import { Button, message, Tooltip } from 'antd' import dayjs from 'dayjs' import { PlusIcon } from 'lucide-react' -import { FC, useCallback, useMemo } from 'react' +import type { FC } from 'react' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/items/KnowledgeUrls.tsx b/src/renderer/src/pages/knowledge/items/KnowledgeUrls.tsx index a6b0b649e8..68bd13544e 100644 --- a/src/renderer/src/pages/knowledge/items/KnowledgeUrls.tsx +++ b/src/renderer/src/pages/knowledge/items/KnowledgeUrls.tsx @@ -5,11 +5,12 @@ import { DynamicVirtualList } from '@renderer/components/VirtualList' import { useKnowledge } from '@renderer/hooks/useKnowledge' import FileItem from '@renderer/pages/files/FileItem' import { getProviderName } from '@renderer/services/ProviderService' -import { KnowledgeBase, KnowledgeItem } from '@renderer/types' +import type { KnowledgeBase, KnowledgeItem } from '@renderer/types' import { Button, Dropdown, Tooltip } from 'antd' import dayjs from 'dayjs' import { PlusIcon } from 'lucide-react' -import { FC, useCallback, useMemo } from 'react' +import type { FC } from 'react' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/knowledge/items/KnowledgeVideos.tsx b/src/renderer/src/pages/knowledge/items/KnowledgeVideos.tsx index 0bf7355864..fe8f0c17aa 100644 --- a/src/renderer/src/pages/knowledge/items/KnowledgeVideos.tsx +++ b/src/renderer/src/pages/knowledge/items/KnowledgeVideos.tsx @@ -5,12 +5,14 @@ import VideoPopup from '@renderer/components/Popups/VideoPopup' import Scrollbar from '@renderer/components/Scrollbar' import { useKnowledge } from '@renderer/hooks/useKnowledge' import { getProviderName } from '@renderer/services/ProviderService' -import { FileTypes, isKnowledgeVideoItem, KnowledgeBase, KnowledgeItem } from '@renderer/types' +import type { KnowledgeBase, KnowledgeItem } from '@renderer/types' +import { FileTypes, isKnowledgeVideoItem } from '@renderer/types' import { Button, Tooltip } from 'antd' import dayjs from 'dayjs' import { Plus } from 'lucide-react' import VirtualList from 'rc-virtual-list' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/launchpad/LaunchpadPage.tsx b/src/renderer/src/pages/launchpad/LaunchpadPage.tsx index 4b51632b58..c1703cad59 100644 --- a/src/renderer/src/pages/launchpad/LaunchpadPage.tsx +++ b/src/renderer/src/pages/launchpad/LaunchpadPage.tsx @@ -3,7 +3,8 @@ import { useMinapps } from '@renderer/hooks/useMinapps' import { useRuntime } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import { Code, FileSearch, Folder, Languages, LayoutGrid, NotepadText, Palette, Sparkle } from 'lucide-react' -import { FC, useMemo } from 'react' +import type { FC } from 'react' +import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/memory/settings-modal.tsx b/src/renderer/src/pages/memory/settings-modal.tsx index bbfb68f170..996baebd1d 100644 --- a/src/renderer/src/pages/memory/settings-modal.tsx +++ b/src/renderer/src/pages/memory/settings-modal.tsx @@ -8,10 +8,11 @@ import { useModel } from '@renderer/hooks/useModel' import { useProviders } from '@renderer/hooks/useProvider' import { getModelUniqId } from '@renderer/services/ModelService' import { selectMemoryConfig, updateMemoryConfig } from '@renderer/store/memory' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { Flex, Form, Modal } from 'antd' import { t } from 'i18next' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' const logger = loggerService.withContext('MemoriesSettingsModal') diff --git a/src/renderer/src/pages/minapps/MinAppPage.tsx b/src/renderer/src/pages/minapps/MinAppPage.tsx index 75c6c284c2..e13a1059ce 100644 --- a/src/renderer/src/pages/minapps/MinAppPage.tsx +++ b/src/renderer/src/pages/minapps/MinAppPage.tsx @@ -6,8 +6,9 @@ import { useNavbarPosition } from '@renderer/hooks/useSettings' import TabsService from '@renderer/services/TabsService' import { getWebviewLoaded, onWebviewStateChange, setWebviewLoaded } from '@renderer/utils/webviewStateManager' import { Avatar } from 'antd' -import { WebviewTag } from 'electron' -import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { WebviewTag } from 'electron' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useNavigate, useParams } from 'react-router-dom' import BeatLoader from 'react-spinners/BeatLoader' import styled from 'styled-components' diff --git a/src/renderer/src/pages/minapps/MinAppsPage.tsx b/src/renderer/src/pages/minapps/MinAppsPage.tsx index 5aadc22020..57f9670e21 100644 --- a/src/renderer/src/pages/minapps/MinAppsPage.tsx +++ b/src/renderer/src/pages/minapps/MinAppsPage.tsx @@ -5,7 +5,8 @@ import { useMinapps } from '@renderer/hooks/useMinapps' import { useNavbarPosition } from '@renderer/hooks/useSettings' import { Button, Input } from 'antd' import { Search, SettingsIcon } from 'lucide-react' -import React, { FC, useState } from 'react' +import type { FC } from 'react' +import React, { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/minapps/MiniappSettings/MiniAppIconsManager.tsx b/src/renderer/src/pages/minapps/MiniappSettings/MiniAppIconsManager.tsx index 958a0e6ea1..426d25cf17 100644 --- a/src/renderer/src/pages/minapps/MiniappSettings/MiniAppIconsManager.tsx +++ b/src/renderer/src/pages/minapps/MiniappSettings/MiniAppIconsManager.tsx @@ -1,17 +1,12 @@ import { CloseOutlined } from '@ant-design/icons' -import { - DragDropContext, - Draggable, - DraggableProvided, - Droppable, - DroppableProvided, - DropResult -} from '@hello-pangea/dnd' +import type { DraggableProvided, DroppableProvided, DropResult } from '@hello-pangea/dnd' +import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' import { useMinapps } from '@renderer/hooks/useMinapps' import { getMiniappsStatusLabel } from '@renderer/i18n/label' -import { MinAppType } from '@renderer/types' -import { FC, useCallback } from 'react' +import type { MinAppType } from '@renderer/types' +import type { FC } from 'react' +import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx b/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx index 506d1092fb..d8b61603a1 100644 --- a/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx +++ b/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx @@ -10,7 +10,8 @@ import { setShowOpenedMinappsInSidebar } from '@renderer/store/settings' import { Button, message, Slider, Switch, Tooltip } from 'antd' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/minapps/NewAppButton.tsx b/src/renderer/src/pages/minapps/NewAppButton.tsx index 9b2eb30682..22d9f9345d 100644 --- a/src/renderer/src/pages/minapps/NewAppButton.tsx +++ b/src/renderer/src/pages/minapps/NewAppButton.tsx @@ -2,10 +2,11 @@ import { PlusOutlined, UploadOutlined } from '@ant-design/icons' import { loggerService } from '@logger' import { loadCustomMiniApp, ORIGIN_DEFAULT_MIN_APPS, updateDefaultMinApps } from '@renderer/config/minapps' import { useMinapps } from '@renderer/hooks/useMinapps' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import { Button, Form, Input, Modal, Radio, Upload } from 'antd' import type { UploadFile } from 'antd/es/upload/interface' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/minapps/components/MinAppFullPageView.tsx b/src/renderer/src/pages/minapps/components/MinAppFullPageView.tsx index 1265e693ff..24aca3db0c 100644 --- a/src/renderer/src/pages/minapps/components/MinAppFullPageView.tsx +++ b/src/renderer/src/pages/minapps/components/MinAppFullPageView.tsx @@ -1,11 +1,12 @@ import { loggerService } from '@logger' import WebviewContainer from '@renderer/components/MinApp/WebviewContainer' import { useSettings } from '@renderer/hooks/useSettings' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import { getWebviewLoaded, setWebviewLoaded } from '@renderer/utils/webviewStateManager' import { Avatar } from 'antd' -import { WebviewTag } from 'electron' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { WebviewTag } from 'electron' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import BeatLoader from 'react-spinners/BeatLoader' import styled from 'styled-components' diff --git a/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx b/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx index ef89fe6409..7cb80de1e9 100644 --- a/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx +++ b/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx @@ -15,10 +15,11 @@ import { useMinapps } from '@renderer/hooks/useMinapps' import { useSettings } from '@renderer/hooks/useSettings' import { useAppDispatch } from '@renderer/store' import { setMinappsOpenLinkExternal } from '@renderer/store/settings' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import { Tooltip } from 'antd' -import { WebviewTag } from 'electron' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { WebviewTag } from 'electron' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/minapps/components/WebviewSearch.tsx b/src/renderer/src/pages/minapps/components/WebviewSearch.tsx index a5340ee2c0..59499232d8 100644 --- a/src/renderer/src/pages/minapps/components/WebviewSearch.tsx +++ b/src/renderer/src/pages/minapps/components/WebviewSearch.tsx @@ -2,7 +2,8 @@ import { Button, Input } from '@heroui/react' import { loggerService } from '@logger' import type { WebviewTag } from 'electron' import { ChevronDown, ChevronUp, X } from 'lucide-react' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' type FoundInPageResult = Electron.FoundInPageResult diff --git a/src/renderer/src/pages/notes/MenuConfig.tsx b/src/renderer/src/pages/notes/MenuConfig.tsx index 2e637ab781..0f8f2b0128 100644 --- a/src/renderer/src/pages/notes/MenuConfig.tsx +++ b/src/renderer/src/pages/notes/MenuConfig.tsx @@ -1,6 +1,6 @@ -import { NotesSettings } from '@renderer/store/note' +import type { NotesSettings } from '@renderer/store/note' import { Copy, MonitorSpeaker, Type } from 'lucide-react' -import { ReactNode } from 'react' +import type { ReactNode } from 'react' export interface MenuItem { key: string diff --git a/src/renderer/src/pages/notes/NotesEditor.tsx b/src/renderer/src/pages/notes/NotesEditor.tsx index 66bbf22258..5ec76441ab 100644 --- a/src/renderer/src/pages/notes/NotesEditor.tsx +++ b/src/renderer/src/pages/notes/NotesEditor.tsx @@ -1,17 +1,19 @@ import ActionIconButton from '@renderer/components/Buttons/ActionIconButton' -import CodeEditor, { CodeEditorHandles } from '@renderer/components/CodeEditor' +import type { CodeEditorHandles } from '@renderer/components/CodeEditor' +import CodeEditor from '@renderer/components/CodeEditor' import { HSpaceBetweenStack } from '@renderer/components/Layout' import RichEditor from '@renderer/components/RichEditor' -import { RichEditorRef } from '@renderer/components/RichEditor/types' +import type { RichEditorRef } from '@renderer/components/RichEditor/types' import Selector from '@renderer/components/Selector' import { useNotesSettings } from '@renderer/hooks/useNotesSettings' import { useSettings } from '@renderer/hooks/useSettings' import { useAppDispatch } from '@renderer/store' import { setEnableSpellCheck } from '@renderer/store/settings' -import { EditorView } from '@renderer/types' +import type { EditorView } from '@renderer/types' import { Empty, Tooltip } from 'antd' import { SpellCheck } from 'lucide-react' -import { FC, memo, RefObject, useCallback, useMemo, useState } from 'react' +import type { FC, RefObject } from 'react' +import { memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/notes/NotesPage.tsx b/src/renderer/src/pages/notes/NotesPage.tsx index fb7df83bfd..105ceee36a 100644 --- a/src/renderer/src/pages/notes/NotesPage.tsx +++ b/src/renderer/src/pages/notes/NotesPage.tsx @@ -1,7 +1,7 @@ import { loggerService } from '@logger' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' -import { CodeEditorHandles } from '@renderer/components/CodeEditor' -import { RichEditorRef } from '@renderer/components/RichEditor/types' +import type { CodeEditorHandles } from '@renderer/components/CodeEditor' +import type { RichEditorRef } from '@renderer/components/RichEditor/types' import { useActiveNode, useFileContent, useFileContentSync } from '@renderer/hooks/useNotesQuery' import { useNotesSettings } from '@renderer/hooks/useNotesSettings' import { useShowWorkspace } from '@renderer/hooks/useShowWorkspace' @@ -37,11 +37,12 @@ import { setSortType, setStarredPaths } from '@renderer/store/note' -import { NotesSortType, NotesTreeNode } from '@renderer/types/note' -import { FileChangeEvent } from '@shared/config/types' +import type { NotesSortType, NotesTreeNode } from '@renderer/types/note' +import type { FileChangeEvent } from '@shared/config/types' import { debounce } from 'lodash' import { AnimatePresence, motion } from 'motion/react' -import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/notes/NotesSidebar.tsx b/src/renderer/src/pages/notes/NotesSidebar.tsx index d09c228f68..8663d9625d 100644 --- a/src/renderer/src/pages/notes/NotesSidebar.tsx +++ b/src/renderer/src/pages/notes/NotesSidebar.tsx @@ -9,14 +9,16 @@ import { useActiveNode } from '@renderer/hooks/useNotesQuery' import NotesSidebarHeader from '@renderer/pages/notes/NotesSidebarHeader' import { fetchNoteSummary } from '@renderer/services/ApiService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { SearchMatch, SearchResult } from '@renderer/services/NotesSearchService' -import { RootState, useAppSelector } from '@renderer/store' +import type { SearchMatch, SearchResult } from '@renderer/services/NotesSearchService' +import type { RootState } from '@renderer/store' +import { useAppSelector } from '@renderer/store' import { selectSortType } from '@renderer/store/note' -import { NotesSortType, NotesTreeNode } from '@renderer/types/note' +import type { NotesSortType, NotesTreeNode } from '@renderer/types/note' import { exportNote } from '@renderer/utils/export' import { useVirtualizer } from '@tanstack/react-virtual' -import { Dropdown, Input, InputRef, MenuProps } from 'antd' -import { ItemType, MenuItemType } from 'antd/es/menu/interface' +import type { InputRef, MenuProps } from 'antd' +import { Dropdown, Input } from 'antd' +import type { ItemType, MenuItemType } from 'antd/es/menu/interface' import { ChevronDown, ChevronRight, @@ -33,7 +35,8 @@ import { UploadIcon, X } from 'lucide-react' -import { FC, memo, Ref, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC, Ref } from 'react' +import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import styled from 'styled-components' diff --git a/src/renderer/src/pages/notes/NotesSidebarHeader.tsx b/src/renderer/src/pages/notes/NotesSidebarHeader.tsx index af40c672b3..20bb416009 100644 --- a/src/renderer/src/pages/notes/NotesSidebarHeader.tsx +++ b/src/renderer/src/pages/notes/NotesSidebarHeader.tsx @@ -1,8 +1,10 @@ import { CheckOutlined } from '@ant-design/icons' -import { NotesSortType } from '@renderer/types/note' -import { Dropdown, Input, MenuProps, Tooltip } from 'antd' +import type { NotesSortType } from '@renderer/types/note' +import type { MenuProps } from 'antd' +import { Dropdown, Input, Tooltip } from 'antd' import { ArrowLeft, ArrowUpNarrowWide, FilePlus2, FolderPlus, Search, Star } from 'lucide-react' -import { FC, useCallback } from 'react' +import type { FC } from 'react' +import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/notes/hooks/useFullTextSearch.ts b/src/renderer/src/pages/notes/hooks/useFullTextSearch.ts index 6a2d12c2cf..5877d8d961 100644 --- a/src/renderer/src/pages/notes/hooks/useFullTextSearch.ts +++ b/src/renderer/src/pages/notes/hooks/useFullTextSearch.ts @@ -1,5 +1,6 @@ -import { searchAllFiles, SearchOptions, SearchResult } from '@renderer/services/NotesSearchService' -import { NotesTreeNode } from '@renderer/types/note' +import type { SearchOptions, SearchResult } from '@renderer/services/NotesSearchService' +import { searchAllFiles } from '@renderer/services/NotesSearchService' +import type { NotesTreeNode } from '@renderer/types/note' import { useCallback, useEffect, useRef, useState } from 'react' export interface UseFullTextSearchOptions extends SearchOptions { diff --git a/src/renderer/src/pages/paintings/DmxapiPage.tsx b/src/renderer/src/pages/paintings/DmxapiPage.tsx index 976dc4f24d..ebc53c4f78 100644 --- a/src/renderer/src/pages/paintings/DmxapiPage.tsx +++ b/src/renderer/src/pages/paintings/DmxapiPage.tsx @@ -13,11 +13,12 @@ import { useAppDispatch } from '@renderer/store' import { setGenerating } from '@renderer/store/runtime' import type { FileMetadata } from '@renderer/types' import { convertToBase64, uuid } from '@renderer/utils' -import { DmxapiPainting } from '@types' +import type { DmxapiPainting } from '@types' import { Avatar, Button, Input, InputNumber, Segmented, Select, Switch, Tooltip } from 'antd' import TextArea from 'antd/es/input/TextArea' import { Info } from 'lucide-react' -import React, { FC, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import React, { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/paintings/NewApiPage.tsx b/src/renderer/src/pages/paintings/NewApiPage.tsx index 893736d4d2..eae48e5316 100644 --- a/src/renderer/src/pages/paintings/NewApiPage.tsx +++ b/src/renderer/src/pages/paintings/NewApiPage.tsx @@ -26,11 +26,12 @@ import { translateText } from '@renderer/services/TranslateService' import { useAppDispatch } from '@renderer/store' import { setGenerating } from '@renderer/store/runtime' import type { PaintingAction, PaintingsState } from '@renderer/types' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { getErrorMessage, uuid } from '@renderer/utils' import { Avatar, Button, Empty, InputNumber, Segmented, Select, Upload } from 'antd' import TextArea from 'antd/es/input/TextArea' -import React, { FC } from 'react' +import type { FC } from 'react' +import React from 'react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocation, useNavigate } from 'react-router-dom' diff --git a/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx b/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx index d3e8cd97a4..9c516560b6 100644 --- a/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx +++ b/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx @@ -3,8 +3,9 @@ import { isNewApiProvider } from '@renderer/config/providers' import { useAllProviders } from '@renderer/hooks/useProvider' import { useAppDispatch } from '@renderer/store' import { setDefaultPaintingProvider } from '@renderer/store/settings' -import { PaintingProvider, SystemProviderId } from '@renderer/types' -import { FC, useEffect, useMemo, useState } from 'react' +import type { PaintingProvider, SystemProviderId } from '@renderer/types' +import type { FC } from 'react' +import { useEffect, useMemo, useState } from 'react' import { Route, Routes, useParams } from 'react-router-dom' import AihubmixPage from './AihubmixPage' diff --git a/src/renderer/src/pages/paintings/ZhipuPage.tsx b/src/renderer/src/pages/paintings/ZhipuPage.tsx index 279f9d0a15..e8b25a3feb 100644 --- a/src/renderer/src/pages/paintings/ZhipuPage.tsx +++ b/src/renderer/src/pages/paintings/ZhipuPage.tsx @@ -14,7 +14,8 @@ import { setGenerating } from '@renderer/store/runtime' import { getErrorMessage, uuid } from '@renderer/utils' import { Avatar, Button, InputNumber, Radio, Select } from 'antd' import TextArea from 'antd/es/input/TextArea' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/paintings/components/Artboard.tsx b/src/renderer/src/pages/paintings/components/Artboard.tsx index 2c56c40c18..7e915450b0 100644 --- a/src/renderer/src/pages/paintings/components/Artboard.tsx +++ b/src/renderer/src/pages/paintings/components/Artboard.tsx @@ -1,8 +1,9 @@ import ImageViewer from '@renderer/components/ImageViewer' import FileManager from '@renderer/services/FileManager' -import { Painting } from '@renderer/types' +import type { Painting } from '@renderer/types' import { Button, Spin } from 'antd' -import React, { FC } from 'react' +import type { FC } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/paintings/components/ImageUploader.tsx b/src/renderer/src/pages/paintings/components/ImageUploader.tsx index 8d04640837..b1559c4ff3 100644 --- a/src/renderer/src/pages/paintings/components/ImageUploader.tsx +++ b/src/renderer/src/pages/paintings/components/ImageUploader.tsx @@ -1,7 +1,7 @@ import { DeleteOutlined } from '@ant-design/icons' import IcImageUp from '@renderer/assets/images/paintings/ic_ImageUp.svg' import { useTheme } from '@renderer/context/ThemeProvider' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { Popconfirm, Upload } from 'antd' import { Button } from 'antd' import type { RcFile, UploadProps } from 'antd/es/upload' diff --git a/src/renderer/src/pages/paintings/components/PaintingsList.tsx b/src/renderer/src/pages/paintings/components/PaintingsList.tsx index fc119af098..fab92e30d5 100644 --- a/src/renderer/src/pages/paintings/components/PaintingsList.tsx +++ b/src/renderer/src/pages/paintings/components/PaintingsList.tsx @@ -3,10 +3,11 @@ import { DraggableList } from '@renderer/components/DraggableList' import Scrollbar from '@renderer/components/Scrollbar' import { usePaintings } from '@renderer/hooks/usePaintings' import FileManager from '@renderer/services/FileManager' -import { Painting, PaintingsState } from '@renderer/types' +import type { Painting, PaintingsState } from '@renderer/types' import { classNames } from '@renderer/utils' import { Popconfirm } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/paintings/components/ProviderSelect.tsx b/src/renderer/src/pages/paintings/components/ProviderSelect.tsx index 4b5a7b7fb5..e047d878bf 100644 --- a/src/renderer/src/pages/paintings/components/ProviderSelect.tsx +++ b/src/renderer/src/pages/paintings/components/ProviderSelect.tsx @@ -3,8 +3,9 @@ import { ProviderAvatarPrimitive } from '@renderer/components/ProviderAvatar' import { getProviderLogo } from '@renderer/config/providers' import ImageStorage from '@renderer/services/ImageStorage' import { getProviderNameById } from '@renderer/services/ProviderService' -import { Provider } from '@types' -import React, { FC, useEffect, useState } from 'react' +import type { Provider } from '@types' +import type { FC } from 'react' +import React, { useEffect, useState } from 'react' type ProviderSelectProps = { provider: Provider diff --git a/src/renderer/src/pages/paintings/config/DmxapiConfig.ts b/src/renderer/src/pages/paintings/config/DmxapiConfig.ts index 090ae78855..7880f6305c 100644 --- a/src/renderer/src/pages/paintings/config/DmxapiConfig.ts +++ b/src/renderer/src/pages/paintings/config/DmxapiConfig.ts @@ -1,7 +1,8 @@ import { uuid } from '@renderer/utils' import { t } from 'i18next' -import { DmxapiPainting, generationModeType } from '../../../types' +import type { DmxapiPainting } from '../../../types' +import { generationModeType } from '../../../types' // 模型数据类型 export type DMXApiModelData = { diff --git a/src/renderer/src/pages/paintings/config/NewApiConfig.ts b/src/renderer/src/pages/paintings/config/NewApiConfig.ts index 1b8b3f04b5..1efa2f05f4 100644 --- a/src/renderer/src/pages/paintings/config/NewApiConfig.ts +++ b/src/renderer/src/pages/paintings/config/NewApiConfig.ts @@ -1,4 +1,4 @@ -import { GeneratePainting } from '@renderer/types' +import type { GeneratePainting } from '@renderer/types' import { uuid } from '@renderer/utils' export const SUPPORTED_MODELS = ['gpt-image-1'] diff --git a/src/renderer/src/pages/paintings/config/ZhipuConfig.ts b/src/renderer/src/pages/paintings/config/ZhipuConfig.ts index c88eff3a76..db119faa9f 100644 --- a/src/renderer/src/pages/paintings/config/ZhipuConfig.ts +++ b/src/renderer/src/pages/paintings/config/ZhipuConfig.ts @@ -1,4 +1,4 @@ -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { uuid } from '@renderer/utils' export const COURSE_URL = 'https://docs.bigmodel.cn/cn/guide/models/image-generation/cogview-4' diff --git a/src/renderer/src/pages/paintings/utils/TokenFluxService.ts b/src/renderer/src/pages/paintings/utils/TokenFluxService.ts index cbe7fa2cac..4b1e224a8a 100644 --- a/src/renderer/src/pages/paintings/utils/TokenFluxService.ts +++ b/src/renderer/src/pages/paintings/utils/TokenFluxService.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' import { CacheService } from '@renderer/services/CacheService' -import { FileMetadata, TokenFluxPainting } from '@renderer/types' +import type { FileMetadata, TokenFluxPainting } from '@renderer/types' import type { TokenFluxModel } from '../config/tokenFluxConfig' diff --git a/src/renderer/src/pages/paintings/utils/index.ts b/src/renderer/src/pages/paintings/utils/index.ts index ae26c0f152..8df6108c1e 100644 --- a/src/renderer/src/pages/paintings/utils/index.ts +++ b/src/renderer/src/pages/paintings/utils/index.ts @@ -1,5 +1,5 @@ -import { Provider } from '@renderer/types' -import { TFunction } from 'i18next' +import type { Provider } from '@renderer/types' +import type { TFunction } from 'i18next' import { isEmpty } from 'lodash' export function checkProviderEnabled(provider: Provider, t: TFunction): Promise { diff --git a/src/renderer/src/pages/settings/AboutSettings.tsx b/src/renderer/src/pages/settings/AboutSettings.tsx index dcf95324d0..ef8ecc11e8 100644 --- a/src/renderer/src/pages/settings/AboutSettings.tsx +++ b/src/renderer/src/pages/settings/AboutSettings.tsx @@ -15,11 +15,12 @@ import { ThemeMode } from '@renderer/types' import { runAsyncFunction } from '@renderer/utils' import { UpgradeChannel } from '@shared/config/constant' import { Avatar, Button, Progress, Radio, Row, Switch, Tag, Tooltip } from 'antd' -import { UpdateInfo } from 'builder-util-runtime' +import type { UpdateInfo } from 'builder-util-runtime' import { debounce } from 'lodash' import { Bug, Building2, Github, Globe, Mail, Rss } from 'lucide-react' import { BadgeQuestionMark } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import Markdown from 'react-markdown' import { Link } from 'react-router-dom' diff --git a/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx b/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx index fcdaee2319..a24c6cdb21 100644 --- a/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx @@ -1,6 +1,6 @@ import { Button, Tooltip } from '@heroui/react' import { loggerService } from '@logger' -import { AgentBaseWithId, UpdateAgentBaseForm, UpdateAgentFunctionUnion } from '@renderer/types' +import type { AgentBaseWithId, UpdateAgentBaseForm, UpdateAgentFunctionUnion } from '@renderer/types' import { Plus } from 'lucide-react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/AgentSettings/AdvancedSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/AdvancedSettings.tsx index 209258ce67..4241543605 100644 --- a/src/renderer/src/pages/settings/AgentSettings/AdvancedSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/AdvancedSettings.tsx @@ -1,13 +1,13 @@ import { Input, Tooltip } from '@heroui/react' -import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' -import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' -import { +import type { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' +import type { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' +import type { AgentConfiguration, - AgentConfigurationSchema, GetAgentResponse, GetAgentSessionResponse, UpdateAgentBaseForm } from '@renderer/types' +import { AgentConfigurationSchema } from '@renderer/types' import { Info } from 'lucide-react' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/AgentSettings/AvatarSetting.tsx b/src/renderer/src/pages/settings/AgentSettings/AvatarSetting.tsx index af0c92e723..be38bc14ab 100644 --- a/src/renderer/src/pages/settings/AgentSettings/AvatarSetting.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/AvatarSetting.tsx @@ -1,11 +1,6 @@ import { EmojiAvatarWithPicker } from '@renderer/components/Avatar/EmojiAvatarWithPicker' -import { - AgentConfigurationSchema, - AgentEntity, - isAgentType, - UpdateAgentForm, - UpdateAgentFunction -} from '@renderer/types' +import type { AgentEntity, UpdateAgentForm, UpdateAgentFunction } from '@renderer/types' +import { AgentConfigurationSchema, isAgentType } from '@renderer/types' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/AgentSettings/DescriptionSetting.tsx b/src/renderer/src/pages/settings/AgentSettings/DescriptionSetting.tsx index 4adeff9d0f..6ed63a773c 100644 --- a/src/renderer/src/pages/settings/AgentSettings/DescriptionSetting.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/DescriptionSetting.tsx @@ -1,5 +1,5 @@ import { Textarea } from '@heroui/react' -import { AgentBaseWithId, UpdateAgentBaseForm, UpdateAgentFunctionUnion } from '@renderer/types' +import type { AgentBaseWithId, UpdateAgentBaseForm, UpdateAgentFunctionUnion } from '@renderer/types' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/AgentSettings/EssentialSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/EssentialSettings.tsx index c21dca7689..97dd111a8a 100644 --- a/src/renderer/src/pages/settings/AgentSettings/EssentialSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/EssentialSettings.tsx @@ -1,10 +1,11 @@ import { Avatar } from '@heroui/react' import { getAgentTypeAvatar } from '@renderer/config/agent' -import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' -import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' +import type { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' +import type { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' import { getAgentTypeLabel } from '@renderer/i18n/label' -import { GetAgentResponse, GetAgentSessionResponse, isAgentEntity } from '@renderer/types' -import { FC } from 'react' +import type { GetAgentResponse, GetAgentSessionResponse } from '@renderer/types' +import { isAgentEntity } from '@renderer/types' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { AccessibleDirsSetting } from './AccessibleDirsSetting' diff --git a/src/renderer/src/pages/settings/AgentSettings/ModelSetting.tsx b/src/renderer/src/pages/settings/AgentSettings/ModelSetting.tsx index 6662b22e76..8bf32e76fb 100644 --- a/src/renderer/src/pages/settings/AgentSettings/ModelSetting.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/ModelSetting.tsx @@ -1,5 +1,5 @@ import SelectAgentBaseModelButton from '@renderer/pages/home/components/SelectAgentBaseModelButton' -import { AgentBaseWithId, ApiModel, UpdateAgentFunctionUnion } from '@renderer/types' +import type { AgentBaseWithId, ApiModel, UpdateAgentFunctionUnion } from '@renderer/types' import { useTranslation } from 'react-i18next' import { SettingsItem, SettingsTitle } from './shared' diff --git a/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx b/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx index 0cdc3e28b4..ea4ced54e1 100644 --- a/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx @@ -1,5 +1,5 @@ import { Input } from '@heroui/react' -import { AgentBaseWithId, UpdateAgentBaseForm, UpdateAgentFunctionUnion } from '@renderer/types' +import type { AgentBaseWithId, UpdateAgentBaseForm, UpdateAgentFunctionUnion } from '@renderer/types' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx index 74d63ecba3..3477912410 100644 --- a/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/PluginSettings.tsx @@ -1,7 +1,8 @@ import { Card, CardBody, Tab, Tabs } from '@heroui/react' import { useAvailablePlugins, useInstalledPlugins, usePluginActions } from '@renderer/hooks/usePlugins' -import { GetAgentResponse, GetAgentSessionResponse, UpdateAgentFunctionUnion } from '@renderer/types/agent' -import { FC, useCallback } from 'react' +import type { GetAgentResponse, GetAgentSessionResponse, UpdateAgentFunctionUnion } from '@renderer/types/agent' +import type { FC } from 'react' +import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { InstalledPluginsList } from './components/InstalledPluginsList' diff --git a/src/renderer/src/pages/settings/AgentSettings/PromptSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/PromptSettings.tsx index f931950128..463405fcb7 100644 --- a/src/renderer/src/pages/settings/AgentSettings/PromptSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/PromptSettings.tsx @@ -1,14 +1,15 @@ import CodeEditor from '@renderer/components/CodeEditor' import { HSpaceBetweenStack } from '@renderer/components/Layout' -import { RichEditorRef } from '@renderer/components/RichEditor/types' -import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' -import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' +import type { RichEditorRef } from '@renderer/components/RichEditor/types' +import type { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' +import type { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' import { usePromptProcessor } from '@renderer/hooks/usePromptProcessor' import { estimateTextTokens } from '@renderer/services/TokenService' -import { AgentEntity, AgentSessionEntity, UpdateAgentBaseForm } from '@renderer/types' +import type { AgentEntity, AgentSessionEntity, UpdateAgentBaseForm } from '@renderer/types' import { Button, Popover } from 'antd' import { Edit, HelpCircle, Save } from 'lucide-react' -import { FC, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import ReactMarkdown from 'react-markdown' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx index d828e921a6..f5e871f28f 100644 --- a/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/ToolingSettings.tsx @@ -2,9 +2,8 @@ import { Alert, Card, CardBody, CardHeader, Chip, Input, Switch } from '@heroui/ import { permissionModeCards } from '@renderer/config/agent' import { useMCPServers } from '@renderer/hooks/useMCPServers' import useScrollPosition from '@renderer/hooks/useScrollPosition' -import { +import type { AgentConfiguration, - AgentConfigurationSchema, GetAgentResponse, GetAgentSessionResponse, PermissionMode, @@ -13,9 +12,11 @@ import { UpdateAgentFunction, UpdateAgentSessionFunction } from '@renderer/types' +import { AgentConfigurationSchema } from '@renderer/types' import { Modal } from 'antd' import { ShieldAlert, ShieldCheck, Wrench } from 'lucide-react' -import { FC, useCallback, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingsContainer, SettingsItem, SettingsTitle } from './shared' diff --git a/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx b/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx index 1a6924a6d2..f1578f10af 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/InstalledPluginsList.tsx @@ -1,7 +1,8 @@ import { Button, Chip, Skeleton, Table, TableBody, TableCell, TableColumn, TableHeader, TableRow } from '@heroui/react' -import { InstalledPlugin } from '@renderer/types/plugin' +import type { InstalledPlugin } from '@renderer/types/plugin' import { Trash2 } from 'lucide-react' -import { FC, useCallback, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' export interface InstalledPluginsListProps { diff --git a/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx b/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx index fd106325fb..e84ef5108f 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/PluginBrowser.tsx @@ -1,7 +1,8 @@ import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Input, Tab, Tabs } from '@heroui/react' -import { InstalledPlugin, PluginMetadata } from '@renderer/types/plugin' +import type { InstalledPlugin, PluginMetadata } from '@renderer/types/plugin' import { Filter, Search } from 'lucide-react' -import { FC, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { PluginCard } from './PluginCard' diff --git a/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx b/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx index ee94bc0ad7..bf14c25e23 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/PluginCard.tsx @@ -1,8 +1,8 @@ import { Button, Card, CardBody, CardFooter, CardHeader, Chip, Spinner } from '@heroui/react' -import { PluginMetadata } from '@renderer/types/plugin' +import type { PluginMetadata } from '@renderer/types/plugin' import { upperFirst } from 'lodash' import { Download, Trash2 } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' export interface PluginCardProps { diff --git a/src/renderer/src/pages/settings/AgentSettings/components/PluginDetailModal.tsx b/src/renderer/src/pages/settings/AgentSettings/components/PluginDetailModal.tsx index 910cad4447..948b0c2123 100644 --- a/src/renderer/src/pages/settings/AgentSettings/components/PluginDetailModal.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/components/PluginDetailModal.tsx @@ -9,9 +9,10 @@ import { Spinner, Textarea } from '@heroui/react' -import { PluginMetadata } from '@renderer/types/plugin' +import type { PluginMetadata } from '@renderer/types/plugin' import { Download, Edit, Save, Trash2, X } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/AgentSettings/shared.tsx b/src/renderer/src/pages/settings/AgentSettings/shared.tsx index 143dcc755b..3549c59d47 100644 --- a/src/renderer/src/pages/settings/AgentSettings/shared.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/shared.tsx @@ -1,9 +1,10 @@ import { cn } from '@heroui/react' import EmojiIcon from '@renderer/components/EmojiIcon' import { getAgentTypeLabel } from '@renderer/i18n/label' -import { AgentEntity, AgentSessionEntity } from '@renderer/types' +import type { AgentEntity, AgentSessionEntity } from '@renderer/types' import { Menu, Modal } from 'antd' -import React, { ReactNode } from 'react' +import type { ReactNode } from 'react' +import React from 'react' import styled from 'styled-components' import { SettingDivider } from '..' diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantKnowledgeBaseSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantKnowledgeBaseSettings.tsx index 6dde8e5016..90bab1a5d9 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantKnowledgeBaseSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantKnowledgeBaseSettings.tsx @@ -1,8 +1,9 @@ import { CheckOutlined } from '@ant-design/icons' import { Box } from '@renderer/components/Layout' import { useAppSelector } from '@renderer/store' -import { Assistant, AssistantSettings } from '@renderer/types' -import { Row, Segmented, Select, SelectProps, Tooltip } from 'antd' +import type { Assistant, AssistantSettings } from '@renderer/types' +import type { SelectProps } from 'antd' +import { Row, Segmented, Select, Tooltip } from 'antd' import { CircleHelp } from 'lucide-react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx index a625663fb8..ac89141092 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx @@ -1,7 +1,7 @@ import { InfoCircleOutlined } from '@ant-design/icons' import { Box } from '@renderer/components/Layout' import { useMCPServers } from '@renderer/hooks/useMCPServers' -import { Assistant, AssistantSettings } from '@renderer/types' +import type { Assistant, AssistantSettings } from '@renderer/types' import { Empty, Switch, Tooltip } from 'antd' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx index b7ab156ca7..8987d31bcd 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx @@ -4,7 +4,7 @@ import { Box } from '@renderer/components/Layout' import MemoriesSettingsModal from '@renderer/pages/memory/settings-modal' import MemoryService from '@renderer/services/MemoryService' import { selectGlobalMemoryEnabled, selectMemoryConfig } from '@renderer/store/memory' -import { Assistant, AssistantSettings } from '@renderer/types' +import type { Assistant, AssistantSettings } from '@renderer/types' import { Alert, Button, Card, Space, Switch, Tooltip, Typography } from 'antd' import { useForm } from 'antd/es/form/Form' import { Settings2 } from 'lucide-react' diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index d340b6a673..c650011b07 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -9,12 +9,13 @@ import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE, MAX_CONTEXT_COUNT } from '@r import { isEmbeddingModel, isRerankModel } from '@renderer/config/models' import { useTimer } from '@renderer/hooks/useTimer' import { SettingRow } from '@renderer/pages/settings' -import { Assistant, AssistantSettingCustomParameters, AssistantSettings, Model } from '@renderer/types' +import type { Assistant, AssistantSettingCustomParameters, AssistantSettings, Model } from '@renderer/types' import { modalConfirm } from '@renderer/utils' import { Button, Col, Divider, Input, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd' import { isNull } from 'lodash' import { PlusIcon } from 'lucide-react' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantPromptSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantPromptSettings.tsx index a8f8da4ece..d03aee1855 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantPromptSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantPromptSettings.tsx @@ -4,10 +4,10 @@ import { CloseCircleFilled } from '@ant-design/icons' import CodeEditor from '@renderer/components/CodeEditor' import EmojiPicker from '@renderer/components/EmojiPicker' import { Box, HSpaceBetweenStack, HStack } from '@renderer/components/Layout' -import { RichEditorRef } from '@renderer/components/RichEditor/types' +import type { RichEditorRef } from '@renderer/components/RichEditor/types' import { usePromptProcessor } from '@renderer/hooks/usePromptProcessor' import { estimateTextTokens } from '@renderer/services/TokenService' -import { Assistant, AssistantSettings } from '@renderer/types' +import type { Assistant, AssistantSettings } from '@renderer/types' import { getLeadingEmoji } from '@renderer/utils' import { Button, Input, Popover } from 'antd' import { Edit, HelpCircle, Save } from 'lucide-react' diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantRegularPromptsSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantRegularPromptsSettings.tsx index b244f4e4c5..b75766789d 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantRegularPromptsSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantRegularPromptsSettings.tsx @@ -2,10 +2,11 @@ import { ExclamationCircleOutlined } from '@ant-design/icons' import { DraggableList } from '@renderer/components/DraggableList' import { DeleteIcon, EditIcon } from '@renderer/components/Icons' import FileItem from '@renderer/pages/files/FileItem' -import { Assistant, QuickPhrase } from '@renderer/types' +import type { Assistant, QuickPhrase } from '@renderer/types' import { Button, Flex, Input, Modal, Popconfirm, Space } from 'antd' import { PlusIcon } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import { v4 as uuidv4 } from 'uuid' diff --git a/src/renderer/src/pages/settings/AssistantSettings/index.tsx b/src/renderer/src/pages/settings/AssistantSettings/index.tsx index e26e8da64b..1c78be4bbc 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/index.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/index.tsx @@ -3,7 +3,7 @@ import { TopView } from '@renderer/components/TopView' import { useAssistant } from '@renderer/hooks/useAssistant' import { useAssistantPreset } from '@renderer/hooks/useAssistantPresets' import { useSidebarIconShow } from '@renderer/hooks/useSidebarIcon' -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' import { Menu, Modal } from 'antd' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/DataSettings/AgentsSubscribeUrlSettings.tsx b/src/renderer/src/pages/settings/DataSettings/AgentsSubscribeUrlSettings.tsx index b5af281334..ecf4fbc756 100755 --- a/src/renderer/src/pages/settings/DataSettings/AgentsSubscribeUrlSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/AgentsSubscribeUrlSettings.tsx @@ -4,7 +4,7 @@ import { useSettings } from '@renderer/hooks/useSettings' import { useAppDispatch } from '@renderer/store' import { setAgentssubscribeUrl } from '@renderer/store/settings' import Input from 'antd/es/input/Input' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx index aa6078b6b1..346834dd96 100644 --- a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx @@ -21,12 +21,13 @@ import { useTimer } from '@renderer/hooks/useTimer' import { reset } from '@renderer/services/BackupService' import store, { useAppDispatch } from '@renderer/store' import { setSkipBackupFile as _setSkipBackupFile } from '@renderer/store/settings' -import { AppInfo } from '@renderer/types' +import type { AppInfo } from '@renderer/types' import { formatFileSize } from '@renderer/utils' import { occupiedDirs } from '@shared/config/constant' import { Progress, Typography } from 'antd' import { FileText, FolderCog, FolderInput, FolderOpen, SaveIcon, Sparkle } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx b/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx index 243f534878..2062b57625 100644 --- a/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx @@ -1,8 +1,9 @@ import { useTheme } from '@renderer/context/ThemeProvider' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setExportMenuOptions } from '@renderer/store/settings' import { Switch } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx b/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx index cbd3d96c33..19f36fcead 100644 --- a/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx @@ -3,11 +3,12 @@ import { HStack } from '@renderer/components/Layout' import { AppLogo } from '@renderer/config/env' import { useTheme } from '@renderer/context/ThemeProvider' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setJoplinExportReasoning, setJoplinToken, setJoplinUrl } from '@renderer/store/settings' import { Button, Space, Switch, Tooltip } from 'antd' import { Input } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx index f967e381b8..48d987c526 100644 --- a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx @@ -15,7 +15,7 @@ import { setLocalBackupSkipBackupFile as _setLocalBackupSkipBackupFile, setLocalBackupSyncInterval as _setLocalBackupSyncInterval } from '@renderer/store/settings' -import { AppInfo } from '@renderer/types' +import type { AppInfo } from '@renderer/types' import { Button, Input, Switch, Tooltip } from 'antd' import dayjs from 'dayjs' import { useEffect, useState } from 'react' diff --git a/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx b/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx index 50b03b9ae4..bcc6d5170e 100644 --- a/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx @@ -1,7 +1,8 @@ import { DeleteOutlined, FolderOpenOutlined } from '@ant-design/icons' import { HStack } from '@renderer/components/Layout' import { useTheme } from '@renderer/context/ThemeProvider' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setExcludeCitationsInExport, setForceDollarMathInMarkdown, @@ -13,7 +14,7 @@ import { } from '@renderer/store/settings' import { Button, Switch } from 'antd' import Input from 'antd/es/input/Input' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx b/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx index eb0aff9e6c..907afc2024 100644 --- a/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx @@ -4,7 +4,8 @@ import { HStack } from '@renderer/components/Layout' import { AppLogo } from '@renderer/config/env' import { useTheme } from '@renderer/context/ThemeProvider' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setNotionApiKey, setNotionDatabaseID, @@ -13,7 +14,7 @@ import { } from '@renderer/store/settings' import { Button, Space, Switch, Tooltip } from 'antd' import { Input } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx b/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx index a5d2a7f77b..d79ba24fce 100644 --- a/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx @@ -28,7 +28,8 @@ import { modalConfirm } from '@renderer/utils' import { NUTSTORE_HOST } from '@shared/config/nutstore' import { Button, Input, Switch, Tooltip, Typography } from 'antd' import dayjs from 'dayjs' -import { FC, useCallback, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { type FileStat } from 'webdav' diff --git a/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx b/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx index a232fc7993..ce30d5a731 100644 --- a/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx @@ -4,7 +4,8 @@ import { useSettings } from '@renderer/hooks/useSettings' import { useAppDispatch } from '@renderer/store' import { setDefaultObsidianVault } from '@renderer/store/settings' import { Empty, Select, Spin } from 'antd' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx b/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx index 9ea3dbceac..fbb57cdec6 100644 --- a/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx @@ -10,10 +10,11 @@ import { useSettings } from '@renderer/hooks/useSettings' import { startAutoSync, stopAutoSync } from '@renderer/services/BackupService' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setS3Partial } from '@renderer/store/settings' -import { S3Config } from '@renderer/types' +import type { S3Config } from '@renderer/types' import { Button, Input, Switch, Tooltip } from 'antd' import dayjs from 'dayjs' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingDivider, SettingGroup, SettingHelpText, SettingRow, SettingRowTitle, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx b/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx index dc4f9b1d01..3a3b6ebb2e 100644 --- a/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx @@ -4,11 +4,12 @@ import { HStack } from '@renderer/components/Layout' import { AppLogo } from '@renderer/config/env' import { useTheme } from '@renderer/context/ThemeProvider' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setSiyuanApiUrl, setSiyuanBoxId, setSiyuanRootPath, setSiyuanToken } from '@renderer/store/settings' import { Button, Space, Tooltip } from 'antd' import { Input } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx b/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx index 729cdafe4c..77829c508c 100644 --- a/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx @@ -20,7 +20,8 @@ import { } from '@renderer/store/settings' import { Button, Input, Switch, Tooltip } from 'antd' import dayjs from 'dayjs' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingDivider, SettingGroup, SettingHelpText, SettingRow, SettingRowTitle, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/DataSettings/YuqueSettings.tsx b/src/renderer/src/pages/settings/DataSettings/YuqueSettings.tsx index 25cb87f2d6..aee3778600 100644 --- a/src/renderer/src/pages/settings/DataSettings/YuqueSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/YuqueSettings.tsx @@ -3,11 +3,12 @@ import { HStack } from '@renderer/components/Layout' import { AppLogo } from '@renderer/config/env' import { useTheme } from '@renderer/context/ThemeProvider' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setYuqueRepoId, setYuqueToken, setYuqueUrl } from '@renderer/store/settings' import { Button, Space, Tooltip } from 'antd' import { Input } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx index b1d670792c..49b3b386a9 100644 --- a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx +++ b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx @@ -8,8 +8,8 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { useNavbarPosition, useSettings } from '@renderer/hooks/useSettings' import useUserTheme from '@renderer/hooks/useUserTheme' import { useAppDispatch } from '@renderer/store' +import type { AssistantIconType } from '@renderer/store/settings' import { - AssistantIconType, setAssistantIconType, setClickAssistantToShowTopic, setCustomCss, @@ -20,7 +20,8 @@ import { import { ThemeMode } from '@renderer/types' import { Button, ColorPicker, Segmented, Select, Switch } from 'antd' import { Minus, Monitor, Moon, Plus, Sun } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx b/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx index 62887d8a7f..db55275bb9 100644 --- a/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx +++ b/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx @@ -1,16 +1,10 @@ import { CloseOutlined } from '@ant-design/icons' -import { - DragDropContext, - Draggable, - DraggableProvided, - Droppable, - DroppableProvided, - DropResult -} from '@hello-pangea/dnd' +import type { DraggableProvided, DroppableProvided, DropResult } from '@hello-pangea/dnd' +import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import { getSidebarIconLabel } from '@renderer/i18n/label' import { useAppDispatch } from '@renderer/store' import { setSidebarIcons } from '@renderer/store/settings' -import { SidebarIcon } from '@renderer/types' +import type { SidebarIcon } from '@renderer/types' import { message } from 'antd' import { Code, @@ -23,7 +17,8 @@ import { Palette, Sparkle } from 'lucide-react' -import { FC, ReactNode, useCallback, useMemo } from 'react' +import type { FC, ReactNode } from 'react' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/OcrImageSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/OcrImageSettings.tsx index 9050088d56..06908e80ee 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/OcrImageSettings.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/OcrImageSettings.tsx @@ -3,7 +3,8 @@ import { loggerService } from '@logger' import { ErrorTag } from '@renderer/components/Tags/ErrorTag' import { isMac, isWin } from '@renderer/config/constant' import { useOcrProviders } from '@renderer/hooks/useOcrProvider' -import { BuiltinOcrProviderIds, ImageOcrProvider, isImageOcrProvider, OcrProvider } from '@renderer/types' +import type { ImageOcrProvider, OcrProvider } from '@renderer/types' +import { BuiltinOcrProviderIds, isImageOcrProvider } from '@renderer/types' import { getErrorMessage } from '@renderer/utils' import { Select } from 'antd' import { useCallback, useEffect, useMemo } from 'react' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/OcrProviderSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/OcrProviderSettings.tsx index 482ff2b9e8..8dda4ab70e 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/OcrProviderSettings.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/OcrProviderSettings.tsx @@ -3,7 +3,8 @@ import { ErrorBoundary } from '@renderer/components/ErrorBoundary' import { isMac, isWin } from '@renderer/config/constant' import { useTheme } from '@renderer/context/ThemeProvider' import { useOcrProviders } from '@renderer/hooks/useOcrProvider' -import { isBuiltinOcrProvider, isOcrSystemProvider, OcrProvider } from '@renderer/types' +import type { OcrProvider } from '@renderer/types' +import { isBuiltinOcrProvider, isOcrSystemProvider } from '@renderer/types' import { Divider, Flex } from 'antd' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/OcrSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/OcrSettings.tsx index 409390b001..077451dd4d 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/OcrSettings.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/OcrSettings.tsx @@ -2,9 +2,11 @@ import { PictureOutlined } from '@ant-design/icons' import { ErrorBoundary } from '@renderer/components/ErrorBoundary' import { useTheme } from '@renderer/context/ThemeProvider' import { useOcrProviders } from '@renderer/hooks/useOcrProvider' -import { OcrProvider } from '@renderer/types' -import { Tabs, TabsProps } from 'antd' -import { FC, useState } from 'react' +import type { OcrProvider } from '@renderer/types' +import type { TabsProps } from 'antd' +import { Tabs } from 'antd' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingDivider, SettingGroup, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/OcrSystemSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/OcrSystemSettings.tsx index 8032b7e291..bd24326e2f 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/OcrSystemSettings.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/OcrSystemSettings.tsx @@ -4,7 +4,8 @@ import { InfoTooltip } from '@renderer/components/TooltipIcons' import { isMac, isWin } from '@renderer/config/constant' import { useOcrProvider } from '@renderer/hooks/useOcrProvider' import useTranslate from '@renderer/hooks/useTranslate' -import { BuiltinOcrProviderIds, isOcrSystemProvider, TranslateLanguageCode } from '@renderer/types' +import type { TranslateLanguageCode } from '@renderer/types' +import { BuiltinOcrProviderIds, isOcrSystemProvider } from '@renderer/types' import { Flex, Select } from 'antd' import { startTransition, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/OcrTesseractSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/OcrTesseractSettings.tsx index 4c0b5eb805..3c284656ab 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/OcrTesseractSettings.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/OcrTesseractSettings.tsx @@ -4,7 +4,8 @@ import { InfoTooltip } from '@renderer/components/TooltipIcons' import { TESSERACT_LANG_MAP } from '@renderer/config/ocr' import { useOcrProvider } from '@renderer/hooks/useOcrProvider' import useTranslate from '@renderer/hooks/useTranslate' -import { BuiltinOcrProviderIds, isOcrTesseractProvider, TesseractLangCode } from '@renderer/types' +import type { TesseractLangCode } from '@renderer/types' +import { BuiltinOcrProviderIds, isOcrTesseractProvider } from '@renderer/types' import { Flex, Select } from 'antd' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx index 56fea50ec8..4d6df731f8 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx @@ -2,12 +2,13 @@ import { ExportOutlined } from '@ant-design/icons' import { ApiKeyListPopup } from '@renderer/components/Popups/ApiKeyListPopup' import { getPreprocessProviderLogo, PREPROCESS_PROVIDER_CONFIG } from '@renderer/config/preprocessProviders' import { usePreprocessProvider } from '@renderer/hooks/usePreprocess' -import { PreprocessProvider } from '@renderer/types' +import type { PreprocessProvider } from '@renderer/types' import { formatApiKeys, hasObjectKey } from '@renderer/utils' import { Avatar, Button, Divider, Flex, Input, Tooltip } from 'antd' import Link from 'antd/es/typography/Link' import { List } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/PreprocessSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/PreprocessSettings.tsx index a09265a637..5172c68922 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/PreprocessSettings.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/PreprocessSettings.tsx @@ -1,8 +1,9 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { useDefaultPreprocessProvider, usePreprocessProviders } from '@renderer/hooks/usePreprocess' -import { PreprocessProvider } from '@renderer/types' +import type { PreprocessProvider } from '@renderer/types' import { Select } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/DocProcessSettings/index.tsx b/src/renderer/src/pages/settings/DocProcessSettings/index.tsx index 526f507fff..3553bdc26c 100644 --- a/src/renderer/src/pages/settings/DocProcessSettings/index.tsx +++ b/src/renderer/src/pages/settings/DocProcessSettings/index.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@renderer/context/ThemeProvider' -import { FC } from 'react' +import type { FC } from 'react' import { SettingContainer } from '..' import OcrSettings from './OcrSettings' diff --git a/src/renderer/src/pages/settings/GeneralSettings.tsx b/src/renderer/src/pages/settings/GeneralSettings.tsx index 3c7370343c..9588631ce1 100644 --- a/src/renderer/src/pages/settings/GeneralSettings.tsx +++ b/src/renderer/src/pages/settings/GeneralSettings.tsx @@ -6,7 +6,8 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { useEnableDeveloperMode, useSettings } from '@renderer/hooks/useSettings' import { useTimer } from '@renderer/hooks/useTimer' import i18n from '@renderer/i18n' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setEnableDataCollection, setEnableSpellCheck, @@ -17,13 +18,14 @@ import { setProxyUrl as _setProxyUrl, setSpellCheckLanguages } from '@renderer/store/settings' -import { LanguageVarious } from '@renderer/types' -import { NotificationSource } from '@renderer/types/notification' +import type { LanguageVarious } from '@renderer/types' +import type { NotificationSource } from '@renderer/types/notification' import { isValidProxyUrl } from '@renderer/utils' import { formatErrorMessage } from '@renderer/utils/error' import { defaultByPassRules, defaultLanguage } from '@shared/config/constant' import { Flex, Input, Switch, Tooltip } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' diff --git a/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx b/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx index 73a7993f63..fbd6e4067f 100644 --- a/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx @@ -5,11 +5,13 @@ import CodeEditor from '@renderer/components/CodeEditor' import { useTimer } from '@renderer/hooks/useTimer' import { useAppDispatch } from '@renderer/store' import { setMCPServerActive } from '@renderer/store/mcp' -import { MCPServer, objectKeys, safeValidateMcpConfig } from '@renderer/types' +import type { MCPServer } from '@renderer/types' +import { objectKeys, safeValidateMcpConfig } from '@renderer/types' import { parseJSON } from '@renderer/utils' import { formatZodError } from '@renderer/utils/error' import { Button, Form, Modal, Upload } from 'antd' -import { FC, useCallback, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' const logger = loggerService.withContext('AddMcpServerModal') diff --git a/src/renderer/src/pages/settings/MCPSettings/BuiltinMCPServerList.tsx b/src/renderer/src/pages/settings/MCPSettings/BuiltinMCPServerList.tsx index c5af5da067..617688fb22 100644 --- a/src/renderer/src/pages/settings/MCPSettings/BuiltinMCPServerList.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/BuiltinMCPServerList.tsx @@ -3,7 +3,7 @@ import { useMCPServers } from '@renderer/hooks/useMCPServers' import { getBuiltInMcpServerDescriptionLabel, getMcpTypeLabel } from '@renderer/i18n/label' import { builtinMCPServers } from '@renderer/store/mcp' import { Button, Popover, Tag } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx b/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx index 48df875fc8..0734a04d7d 100644 --- a/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx @@ -3,7 +3,8 @@ import CodeEditor from '@renderer/components/CodeEditor' import { TopView } from '@renderer/components/TopView' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setMCPServers } from '@renderer/store/mcp' -import { MCPServer, safeValidateMcpConfig } from '@renderer/types' +import type { MCPServer } from '@renderer/types' +import { safeValidateMcpConfig } from '@renderer/types' import { parseJSON } from '@renderer/utils' import { formatErrorMessage, formatZodError } from '@renderer/utils/error' import { Modal, Spin, Typography } from 'antd' diff --git a/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx b/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx index b213b982d6..b30ba5e7d7 100644 --- a/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx @@ -3,7 +3,8 @@ import { Center, VStack } from '@renderer/components/Layout' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setIsBunInstalled, setIsUvInstalled } from '@renderer/store/mcp' import { Alert, Button } from 'antd' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpDescription.tsx b/src/renderer/src/pages/settings/MCPSettings/McpDescription.tsx index 82597b5446..99c186e3ec 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpDescription.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpDescription.tsx @@ -1,7 +1,8 @@ import { useCodeStyle } from '@renderer/context/CodeStyleProvider' import { Card } from 'antd' import { npxFinder } from 'npx-scope-finder' -import { FC, memo, useEffect, useState } from 'react' +import type { FC } from 'react' +import { memo, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpMarketList.tsx b/src/renderer/src/pages/settings/MCPSettings/McpMarketList.tsx index 62fffd340e..274fa93686 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpMarketList.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpMarketList.tsx @@ -1,6 +1,6 @@ import ZhipuLogo from '@renderer/assets/images/providers/zhipu.png' import { ExternalLink } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpPrompt.tsx b/src/renderer/src/pages/settings/MCPSettings/McpPrompt.tsx index bbf869d66a..0d5e6e2865 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpPrompt.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpPrompt.tsx @@ -1,4 +1,4 @@ -import { MCPPrompt } from '@renderer/types' +import type { MCPPrompt } from '@renderer/types' import { Collapse, Descriptions, Empty, Flex, Tooltip, Typography } from 'antd' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpResource.tsx b/src/renderer/src/pages/settings/MCPSettings/McpResource.tsx index 80660c98a4..d97bffacbc 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpResource.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpResource.tsx @@ -1,4 +1,4 @@ -import { MCPResource } from '@renderer/types' +import type { MCPResource } from '@renderer/types' import { Collapse, Descriptions, Empty, Flex, Tag, Typography } from 'antd' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx b/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx index 683fe1437b..d7c5f314bf 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx @@ -3,12 +3,13 @@ import { DeleteIcon } from '@renderer/components/Icons' import GeneralPopup from '@renderer/components/Popups/GeneralPopup' import Scrollbar from '@renderer/components/Scrollbar' import { getMcpTypeLabel } from '@renderer/i18n/label' -import { MCPServer } from '@renderer/types' +import type { MCPServer } from '@renderer/types' import { formatErrorMessage } from '@renderer/utils/error' import { Alert, Button, Space, Switch, Tag, Tooltip, Typography } from 'antd' import { CircleXIcon, Settings2, SquareArrowOutUpRight } from 'lucide-react' -import { FC, useCallback } from 'react' -import { FallbackProps } from 'react-error-boundary' +import type { FC } from 'react' +import { useCallback } from 'react' +import type { FallbackProps } from 'react-error-boundary' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx b/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx index ec8de05f9a..f7d30d1cf5 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx @@ -6,12 +6,13 @@ import { EditIcon, RefreshIcon } from '@renderer/components/Icons' import Scrollbar from '@renderer/components/Scrollbar' import { useMCPServers } from '@renderer/hooks/useMCPServers' import { useMCPServerTrust } from '@renderer/hooks/useMCPServerTrust' -import { MCPServer } from '@renderer/types' +import type { MCPServer } from '@renderer/types' import { formatMcpError } from '@renderer/utils/error' import { matchKeywordsInString } from '@renderer/utils/match' import { Button, Dropdown, Empty } from 'antd' import { Plus } from 'lucide-react' -import { FC, startTransition, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { startTransition, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx b/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx index 55e86d98d2..d8f26610c9 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx @@ -5,9 +5,10 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { useMCPServer, useMCPServers } from '@renderer/hooks/useMCPServers' import { useMCPServerTrust } from '@renderer/hooks/useMCPServerTrust' import MCPDescription from '@renderer/pages/settings/MCPSettings/McpDescription' -import { MCPPrompt, MCPResource, MCPServer, MCPTool } from '@renderer/types' +import type { MCPPrompt, MCPResource, MCPServer, MCPTool } from '@renderer/types' import { formatMcpError } from '@renderer/utils/error' -import { Badge, Button, Flex, Form, Input, Radio, Select, Switch, Tabs, TabsProps } from 'antd' +import type { TabsProps } from 'antd' +import { Badge, Button, Flex, Form, Input, Radio, Select, Switch, Tabs } from 'antd' import TextArea from 'antd/es/input/TextArea' import { ChevronDown, SaveIcon } from 'lucide-react' import React, { useCallback, useEffect, useState } from 'react' diff --git a/src/renderer/src/pages/settings/MCPSettings/McpTool.tsx b/src/renderer/src/pages/settings/MCPSettings/McpTool.tsx index d5d8a7b4c3..bfd9992dc4 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpTool.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpTool.tsx @@ -1,7 +1,7 @@ -import { MCPServer, MCPTool } from '@renderer/types' +import type { MCPServer, MCPTool } from '@renderer/types' import { isToolAutoApproved } from '@renderer/utils/mcp-tools' import { Badge, Descriptions, Empty, Flex, Switch, Table, Tag, Tooltip, Typography } from 'antd' -import { ColumnsType } from 'antd/es/table' +import type { ColumnsType } from 'antd/es/table' import { Hammer, Info, Zap } from 'lucide-react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx b/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx index e2279e977f..7db63a2419 100644 --- a/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx @@ -3,7 +3,7 @@ import { nanoid } from '@reduxjs/toolkit' import logo from '@renderer/assets/images/cherry-text-logo.svg' import { Center, HStack } from '@renderer/components/Layout' import { useMCPServers } from '@renderer/hooks/useMCPServers' -import { MCPServer } from '@renderer/types' +import type { MCPServer } from '@renderer/types' import { getMcpConfigSampleFromReadme } from '@renderer/utils' import { Button, Card, Flex, Input, Space, Spin, Tag, Typography } from 'antd' import { npxFinder } from 'npx-scope-finder' diff --git a/src/renderer/src/pages/settings/MCPSettings/index.tsx b/src/renderer/src/pages/settings/MCPSettings/index.tsx index a3e2a680c8..9fe0a1cc62 100644 --- a/src/renderer/src/pages/settings/MCPSettings/index.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/index.tsx @@ -2,7 +2,7 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { ErrorBoundary } from '@renderer/components/ErrorBoundary' import { useTheme } from '@renderer/context/ThemeProvider' import { Button } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { Route, Routes, useLocation } from 'react-router' import { Link } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/MCPSettings/utils.ts b/src/renderer/src/pages/settings/MCPSettings/utils.ts index d137c669e4..729d8745ea 100644 --- a/src/renderer/src/pages/settings/MCPSettings/utils.ts +++ b/src/renderer/src/pages/settings/MCPSettings/utils.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { MCPServer } from '@renderer/types' +import type { MCPServer } from '@renderer/types' const logger = loggerService.withContext('MCPSettings/utils') diff --git a/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx b/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx index 0963274162..2b1bed5ebe 100644 --- a/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx +++ b/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx @@ -6,11 +6,12 @@ import { TopView } from '@renderer/components/TopView' import { DEFAULT_CONTEXTCOUNT, DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE } from '@renderer/config/constant' import { useTheme } from '@renderer/context/ThemeProvider' import { useDefaultAssistant } from '@renderer/hooks/useAssistant' -import { AssistantSettings as AssistantSettingsType } from '@renderer/types' +import type { AssistantSettings as AssistantSettingsType } from '@renderer/types' import { getLeadingEmoji, modalConfirm } from '@renderer/utils' import { Button, Col, Flex, Input, InputNumber, Modal, Popover, Row, Slider, Switch, Tooltip } from 'antd' import TextArea from 'antd/es/input/TextArea' -import { Dispatch, FC, SetStateAction, useState } from 'react' +import type { Dispatch, FC, SetStateAction } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx b/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx index e7b9ebb729..76ef0aa59f 100644 --- a/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx +++ b/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx @@ -11,11 +11,12 @@ import { useSettings } from '@renderer/hooks/useSettings' import { getModelUniqId, hasModel } from '@renderer/services/ModelService' import { useAppDispatch } from '@renderer/store' import { setTranslateModelPrompt } from '@renderer/store/settings' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { Button, Tooltip } from 'antd' import { find } from 'lodash' import { Languages, MessageSquareMore, Rocket, Settings2 } from 'lucide-react' -import { FC, useCallback, useMemo } from 'react' +import type { FC } from 'react' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { SettingContainer, SettingDescription, SettingGroup, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/NotesSettings.tsx b/src/renderer/src/pages/settings/NotesSettings.tsx index 99dc8ba1df..be36c0fe6e 100644 --- a/src/renderer/src/pages/settings/NotesSettings.tsx +++ b/src/renderer/src/pages/settings/NotesSettings.tsx @@ -2,10 +2,11 @@ import { loggerService } from '@logger' import Selector from '@renderer/components/Selector' import { useTheme } from '@renderer/context/ThemeProvider' import { useNotesSettings } from '@renderer/hooks/useNotesSettings' -import { EditorView } from '@renderer/types' +import type { EditorView } from '@renderer/types' import { Button, Input, message, Slider, Switch } from 'antd' import { FolderOpen } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx index 33bd80b513..e4923de1ba 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx @@ -5,10 +5,10 @@ import ProviderLogoPicker from '@renderer/components/ProviderLogoPicker' import { TopView } from '@renderer/components/TopView' import { PROVIDER_LOGO_MAP } from '@renderer/config/providers' import ImageStorage from '@renderer/services/ImageStorage' -import { Provider, ProviderType } from '@renderer/types' +import type { Provider, ProviderType } from '@renderer/types' import { compressImage, generateColorFromChar, getForegroundColor } from '@renderer/utils' import { Divider, Dropdown, Form, Input, Modal, Popover, Select, Upload } from 'antd' -import { ItemType } from 'antd/es/menu/interface' +import type { ItemType } from 'antd/es/menu/interface' import React, { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings/ApiOptionsSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings/ApiOptionsSettings.tsx index ae2cb1dda0..8a47152a83 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings/ApiOptionsSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings/ApiOptionsSettings.tsx @@ -1,7 +1,7 @@ import { HStack } from '@renderer/components/Layout' import { InfoTooltip } from '@renderer/components/TooltipIcons' import { useProvider } from '@renderer/hooks/useProvider' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { Flex, Switch } from 'antd' import { startTransition, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx index 1410ce067b..198765da9b 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx @@ -2,7 +2,8 @@ import { HStack } from '@renderer/components/Layout' import { PROVIDER_URLS } from '@renderer/config/providers' import { useAwsBedrockSettings } from '@renderer/hooks/useAwsBedrock' import { Alert, Input } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingHelpLink, SettingHelpText, SettingHelpTextRow, SettingSubtitle } from '..' diff --git a/src/renderer/src/pages/settings/ProviderSettings/CustomHeaderPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/CustomHeaderPopup.tsx index 80324fd997..9afd4b4135 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/CustomHeaderPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/CustomHeaderPopup.tsx @@ -2,7 +2,7 @@ import CodeEditor from '@renderer/components/CodeEditor' import { TopView } from '@renderer/components/TopView' import { useCopilot } from '@renderer/hooks/useCopilot' import { useProvider } from '@renderer/hooks/useProvider' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { Modal, Space } from 'antd' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/ProviderSettings/DMXAPISettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/DMXAPISettings.tsx index c2d4e2f203..ffdaff8955 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/DMXAPISettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/DMXAPISettings.tsx @@ -2,8 +2,10 @@ import DmxapiLogo from '@renderer/assets/images/providers/dmxapi-logo.webp' import DmxapiLogoDark from '@renderer/assets/images/providers/dmxapi-logo-dark.webp' import { useTheme } from '@renderer/context/ThemeProvider' import { useProvider } from '@renderer/hooks/useProvider' -import { Radio, RadioChangeEvent, Space } from 'antd' -import { FC, useCallback, useState } from 'react' +import type { RadioChangeEvent } from 'antd' +import { Radio, Space } from 'antd' +import type { FC } from 'react' +import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/EditModelPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/EditModelPopup.tsx index bcef2b6e36..ee82e16ef0 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/EditModelPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/EditModelPopup.tsx @@ -4,7 +4,7 @@ import { useProvider } from '@renderer/hooks/useProvider' import ModelEditContent from '@renderer/pages/settings/ProviderSettings/EditModelPopup/ModelEditContent' import { useAppDispatch } from '@renderer/store' import { setModel } from '@renderer/store/assistants' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import React, { useCallback, useState } from 'react' interface ShowParams { diff --git a/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelEditContent.tsx b/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelEditContent.tsx index fed30fddb3..820973441c 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelEditContent.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelEditContent.tsx @@ -19,25 +19,14 @@ import { } from '@renderer/config/models' import { isNewApiProvider } from '@renderer/config/providers' import { useDynamicLabelWidth } from '@renderer/hooks/useDynamicLabelWidth' -import { Model, ModelCapability, ModelType, Provider } from '@renderer/types' +import type { Model, ModelCapability, ModelType, Provider } from '@renderer/types' import { getDefaultGroupName, getDifference, getUnion, uniqueObjectArray } from '@renderer/utils' -import { - Button, - Divider, - Flex, - Form, - Input, - InputNumber, - message, - Modal, - ModalProps, - Select, - Switch, - Tooltip -} from 'antd' +import type { ModalProps } from 'antd' +import { Button, Divider, Flex, Form, Input, InputNumber, message, Modal, Select, Switch, Tooltip } from 'antd' import { cloneDeep } from 'lodash' import { ChevronDown, ChevronUp, RotateCcw, SaveIcon } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelTypeSelector.tsx b/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelTypeSelector.tsx index 1ee1832e04..b157c5373c 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelTypeSelector.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/EditModelPopup/ModelTypeSelector.tsx @@ -1,7 +1,8 @@ -import { ModelCapability, ModelType } from '@renderer/types' +import type { ModelCapability, ModelType } from '@renderer/types' import { getDifference, uniqueObjectArray } from '@renderer/utils' import { Button, Checkbox, Flex } from 'antd' -import { FC, useRef, useState } from 'react' +import type { FC } from 'react' +import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' interface ModelTypeSelectorProps { diff --git a/src/renderer/src/pages/settings/ProviderSettings/GPUStackSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/GPUStackSettings.tsx index 5dc9ec74cd..5928537e06 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/GPUStackSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/GPUStackSettings.tsx @@ -1,6 +1,7 @@ import { useGPUStackSettings } from '@renderer/hooks/useGPUStack' import { InputNumber } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx index eab065e544..826bc1ea7f 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx @@ -3,7 +3,8 @@ import { loggerService } from '@logger' import { useCopilot } from '@renderer/hooks/useCopilot' import { useProvider } from '@renderer/hooks/useProvider' import { Alert, Button, Input, Slider, Steps, Tooltip, Typography } from 'antd' -import { FC, useCallback, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/LMStudioSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/LMStudioSettings.tsx index 020cb42ba3..821afa6158 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/LMStudioSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/LMStudioSettings.tsx @@ -1,6 +1,7 @@ import { useLMStudioSettings } from '@renderer/hooks/useLMStudio' import { InputNumber } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/AddModelPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/AddModelPopup.tsx index 5a992074df..6fc79df479 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/AddModelPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/AddModelPopup.tsx @@ -1,9 +1,10 @@ import { TopView } from '@renderer/components/TopView' import { isNotSupportedTextDelta } from '@renderer/config/models' import { useProvider } from '@renderer/hooks/useProvider' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { getDefaultGroupName } from '@renderer/utils' -import { Button, Flex, Form, FormProps, Input, Modal } from 'antd' +import type { FormProps } from 'antd' +import { Button, Flex, Form, Input, Modal } from 'antd' import { find } from 'lodash' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/DownloadOVMSModelPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/DownloadOVMSModelPopup.tsx index 0efe081a20..518017d5b3 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/DownloadOVMSModelPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/DownloadOVMSModelPopup.tsx @@ -1,7 +1,8 @@ import { loggerService } from '@logger' import { TopView } from '@renderer/components/TopView' -import { Provider } from '@renderer/types' -import { AutoComplete, Button, Flex, Form, FormProps, Input, Modal, Progress, Select } from 'antd' +import type { Provider } from '@renderer/types' +import type { FormProps } from 'antd' +import { AutoComplete, Button, Flex, Form, Input, Modal, Progress, Select } from 'antd' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/HealthCheckPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/HealthCheckPopup.tsx index 4d36d14bed..9099561b08 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/HealthCheckPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/HealthCheckPopup.tsx @@ -1,6 +1,6 @@ import { Box } from '@renderer/components/Layout' import { TopView } from '@renderer/components/TopView' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { maskApiKey } from '@renderer/utils/api' import { Flex, InputNumber, Modal, Radio, Segmented, Typography } from 'antd' import { Alert } from 'antd' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsList.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsList.tsx index 064055129b..fed9433194 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsList.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsList.tsx @@ -6,7 +6,7 @@ import { getModelLogoById } from '@renderer/config/models' import { isNewApiProvider } from '@renderer/config/providers' import FileItem from '@renderer/pages/files/FileItem' import NewApiBatchAddModelPopup from '@renderer/pages/settings/ProviderSettings/ModelList/NewApiBatchAddModelPopup' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { Button, Flex, Tooltip } from 'antd' import { Avatar } from 'antd' import { ChevronRight, Minus, Plus } from 'lucide-react' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx index 706cd8bfce..27f5c67eae 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx @@ -18,7 +18,7 @@ import { useProvider } from '@renderer/hooks/useProvider' import NewApiAddModelPopup from '@renderer/pages/settings/ProviderSettings/ModelList/NewApiAddModelPopup' import NewApiBatchAddModelPopup from '@renderer/pages/settings/ProviderSettings/ModelList/NewApiBatchAddModelPopup' import { fetchModels } from '@renderer/services/ApiService' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { filterModelsByKeywords, getDefaultGroupName, getFancyProviderName } from '@renderer/utils' import { isFreeModel } from '@renderer/utils/model' import { Button, Empty, Flex, Modal, Spin, Tabs, Tooltip } from 'antd' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelList.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelList.tsx index 2e06cc6e73..ad7923c6bd 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelList.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelList.tsx @@ -11,7 +11,7 @@ import AddModelPopup from '@renderer/pages/settings/ProviderSettings/ModelList/A import DownloadOVMSModelPopup from '@renderer/pages/settings/ProviderSettings/ModelList/DownloadOVMSModelPopup' import ManageModelsPopup from '@renderer/pages/settings/ProviderSettings/ModelList/ManageModelsPopup' import NewApiAddModelPopup from '@renderer/pages/settings/ProviderSettings/ModelList/NewApiAddModelPopup' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { filterModelsByKeywords } from '@renderer/utils' import { Button, Flex, Spin, Tooltip } from 'antd' import { groupBy, isEmpty, sortBy, toPairs } from 'lodash' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx index e471aab64d..0185ef597d 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx @@ -1,7 +1,7 @@ import CustomCollapse from '@renderer/components/CustomCollapse' import { DynamicVirtualList, type DynamicVirtualListRef } from '@renderer/components/VirtualList' -import { Model } from '@renderer/types' -import { ModelWithStatus } from '@renderer/types/healthCheck' +import type { Model } from '@renderer/types' +import type { ModelWithStatus } from '@renderer/types/healthCheck' import { Button, Flex, Tooltip } from 'antd' import { Minus } from 'lucide-react' import React, { memo, useCallback, useRef } from 'react' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListItem.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListItem.tsx index 24d64fdfbe..e8fe90e7b8 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListItem.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListItem.tsx @@ -3,8 +3,8 @@ import { type HealthResult, HealthStatusIndicator } from '@renderer/components/H import { HStack } from '@renderer/components/Layout' import ModelIdWithTags from '@renderer/components/ModelIdWithTags' import { getModelLogo } from '@renderer/config/models' -import { Model } from '@renderer/types' -import { ModelWithStatus } from '@renderer/types/healthCheck' +import type { Model } from '@renderer/types' +import type { ModelWithStatus } from '@renderer/types/healthCheck' import { maskApiKey } from '@renderer/utils/api' import { Avatar, Button, Tooltip } from 'antd' import { Bolt, Minus } from 'lucide-react' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiAddModelPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiAddModelPopup.tsx index 8812a5926d..486753f78c 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiAddModelPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiAddModelPopup.tsx @@ -4,9 +4,10 @@ import { isNotSupportedTextDelta } from '@renderer/config/models' import { isNewApiProvider } from '@renderer/config/providers' import { useDynamicLabelWidth } from '@renderer/hooks/useDynamicLabelWidth' import { useProvider } from '@renderer/hooks/useProvider' -import { EndpointType, Model, Provider } from '@renderer/types' +import type { EndpointType, Model, Provider } from '@renderer/types' import { getDefaultGroupName } from '@renderer/utils' -import { Button, Flex, Form, FormProps, Input, Modal, Select } from 'antd' +import type { FormProps } from 'antd' +import { Button, Flex, Form, Input, Modal, Select } from 'antd' import { find } from 'lodash' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiBatchAddModelPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiBatchAddModelPopup.tsx index 40a4fb529c..73905197f6 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiBatchAddModelPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/NewApiBatchAddModelPopup.tsx @@ -3,8 +3,9 @@ import { endpointTypeOptions } from '@renderer/config/endpointTypes' import { isNotSupportedTextDelta } from '@renderer/config/models' import { useDynamicLabelWidth } from '@renderer/hooks/useDynamicLabelWidth' import { useProvider } from '@renderer/hooks/useProvider' -import { EndpointType, Model, Provider } from '@renderer/types' -import { Button, Flex, Form, FormProps, Modal, Select } from 'antd' +import type { EndpointType, Model, Provider } from '@renderer/types' +import type { FormProps } from 'antd' +import { Button, Flex, Form, Modal, Select } from 'antd' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/useHealthCheck.ts b/src/renderer/src/pages/settings/ProviderSettings/ModelList/useHealthCheck.ts index ca73ad8311..61c08ba286 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/useHealthCheck.ts +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/useHealthCheck.ts @@ -1,7 +1,8 @@ import { isRerankModel } from '@renderer/config/models' import { checkModelsHealth } from '@renderer/services/HealthCheckService' -import { Model, Provider } from '@renderer/types' -import { HealthStatus, ModelWithStatus } from '@renderer/types/healthCheck' +import type { Model, Provider } from '@renderer/types' +import type { ModelWithStatus } from '@renderer/types/healthCheck' +import { HealthStatus } from '@renderer/types/healthCheck' import { splitApiKeyString } from '@renderer/utils/api' import { summarizeHealthResults } from '@renderer/utils/healthCheck' import { isEmpty } from 'lodash' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/utils.ts b/src/renderer/src/pages/settings/ProviderSettings/ModelList/utils.ts index 3ced576219..0b484fdedc 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/utils.ts +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/utils.ts @@ -1,4 +1,4 @@ -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' // Check if the model exists in the provider's model list export const isModelInProvider = (provider: Provider, modelId: string): boolean => { diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelNotesPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelNotesPopup.tsx index 2635038539..dd0417612f 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelNotesPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelNotesPopup.tsx @@ -1,9 +1,10 @@ import MarkdownEditor from '@renderer/components/MarkdownEditor' import { TopView } from '@renderer/components/TopView' import { useProvider } from '@renderer/hooks/useProvider' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' import { Modal } from 'antd' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/OVMSSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/OVMSSettings.tsx index 057408375e..068b83ac82 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/OVMSSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/OVMSSettings.tsx @@ -1,6 +1,7 @@ import { VStack } from '@renderer/components/Layout' import { Alert, Button } from 'antd' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingRow, SettingSubtitle } from '..' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ProviderList.tsx b/src/renderer/src/pages/settings/ProviderSettings/ProviderList.tsx index 5dc53ca75a..7502e4d806 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ProviderList.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ProviderList.tsx @@ -1,4 +1,4 @@ -import { DropResult } from '@hello-pangea/dnd' +import type { DropResult } from '@hello-pangea/dnd' import { loggerService } from '@logger' import { DraggableVirtualList, @@ -10,11 +10,14 @@ import { ProviderAvatar } from '@renderer/components/ProviderAvatar' import { useAllProviders, useProviders } from '@renderer/hooks/useProvider' import { useTimer } from '@renderer/hooks/useTimer' import ImageStorage from '@renderer/services/ImageStorage' -import { isSystemProvider, Provider, ProviderType } from '@renderer/types' +import type { Provider, ProviderType } from '@renderer/types' +import { isSystemProvider } from '@renderer/types' import { getFancyProviderName, matchKeywordsInModel, matchKeywordsInProvider, uuid } from '@renderer/utils' -import { Button, Dropdown, Input, MenuProps, Tag } from 'antd' +import type { MenuProps } from 'antd' +import { Button, Dropdown, Input, Tag } from 'antd' import { GripVertical, PlusIcon, Search, UserPen } from 'lucide-react' -import { FC, startTransition, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { startTransition, useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ProviderOAuth.tsx b/src/renderer/src/pages/settings/ProviderSettings/ProviderOAuth.tsx index 2d8b38be81..f1ec95e432 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ProviderOAuth.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ProviderOAuth.tsx @@ -13,7 +13,7 @@ import { providerBills, providerCharge } from '@renderer/utils/oauth' import { Button } from 'antd' import { isEmpty } from 'lodash' import { CircleDollarSign, ReceiptText } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { Trans, useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx b/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx index af75729d61..3f8743b66e 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx @@ -25,8 +25,10 @@ import { checkApi } from '@renderer/services/ApiService' import { isProviderSupportAuth } from '@renderer/services/ProviderService' import { useAppDispatch } from '@renderer/store' import { updateWebSearchProvider } from '@renderer/store/websearch' -import { isSystemProvider, isSystemProviderId, SystemProviderId, SystemProviderIds } from '@renderer/types' -import { ApiKeyConnectivity, HealthStatus } from '@renderer/types/healthCheck' +import type { SystemProviderId } from '@renderer/types' +import { isSystemProvider, isSystemProviderId, SystemProviderIds } from '@renderer/types' +import type { ApiKeyConnectivity } from '@renderer/types/healthCheck' +import { HealthStatus } from '@renderer/types/healthCheck' import { formatApiHost, formatApiKeys, @@ -40,7 +42,8 @@ import { Button, Divider, Flex, Input, Select, Space, Switch, Tooltip } from 'an import Link from 'antd/es/typography/Link' import { debounce, isEmpty } from 'lodash' import { Bolt, Check, Settings2, SquareArrowOutUpRight, TriangleAlert } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx index 5811694882..299f689fc6 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx @@ -4,7 +4,7 @@ import { isRerankModel } from '@renderer/config/models' import { useTimer } from '@renderer/hooks/useTimer' import i18n from '@renderer/i18n' import { getModelUniqId } from '@renderer/services/ModelService' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { Modal } from 'antd' import { first } from 'lodash' import { useCallback, useMemo, useState } from 'react' diff --git a/src/renderer/src/pages/settings/ProviderSettings/UrlSchemaInfoPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/UrlSchemaInfoPopup.tsx index 77a06b222b..540e6bf7d4 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/UrlSchemaInfoPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/UrlSchemaInfoPopup.tsx @@ -1,6 +1,6 @@ import { TopView } from '@renderer/components/TopView' import { useAllProviders } from '@renderer/hooks/useProvider' -import { Provider, ProviderType } from '@renderer/types' +import type { Provider, ProviderType } from '@renderer/types' import { getFancyProviderName, maskApiKey } from '@renderer/utils' import { Button, Descriptions, Flex, Modal } from 'antd' import { Eye, EyeOff } from 'lucide-react' diff --git a/src/renderer/src/pages/settings/QuickAssistantSettings.tsx b/src/renderer/src/pages/settings/QuickAssistantSettings.tsx index a547a5450b..86ab83cb78 100644 --- a/src/renderer/src/pages/settings/QuickAssistantSettings.tsx +++ b/src/renderer/src/pages/settings/QuickAssistantSettings.tsx @@ -14,7 +14,8 @@ import { import { matchKeywordsInString } from '@renderer/utils' import HomeWindow from '@renderer/windows/mini/home/HomeWindow' import { Button, Select, Switch, Tooltip } from 'antd' -import { FC, useMemo } from 'react' +import type { FC } from 'react' +import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/QuickPhraseSettings.tsx b/src/renderer/src/pages/settings/QuickPhraseSettings.tsx index a8b395a2e2..72914260f3 100644 --- a/src/renderer/src/pages/settings/QuickPhraseSettings.tsx +++ b/src/renderer/src/pages/settings/QuickPhraseSettings.tsx @@ -4,10 +4,11 @@ import { DeleteIcon, EditIcon } from '@renderer/components/Icons' import { useTheme } from '@renderer/context/ThemeProvider' import FileItem from '@renderer/pages/files/FileItem' import QuickPhraseService from '@renderer/services/QuickPhraseService' -import { QuickPhrase } from '@renderer/types' +import type { QuickPhrase } from '@renderer/types' import { Button, Flex, Input, Modal, Popconfirm, Space } from 'antd' import { PlusIcon } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/SelectionAssistantSettings.tsx b/src/renderer/src/pages/settings/SelectionAssistantSettings/SelectionAssistantSettings.tsx index 1ca437aa17..aeff5907cd 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/SelectionAssistantSettings.tsx +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/SelectionAssistantSettings.tsx @@ -2,11 +2,12 @@ import { isMac, isWin } from '@renderer/config/constant' import { useTheme } from '@renderer/context/ThemeProvider' import { useSelectionAssistant } from '@renderer/hooks/useSelectionAssistant' import { getSelectionDescriptionLabel } from '@renderer/i18n/label' -import { FilterMode, TriggerMode } from '@renderer/types/selectionTypes' +import type { FilterMode, TriggerMode } from '@renderer/types/selectionTypes' import SelectionToolbar from '@renderer/windows/selection/toolbar/SelectionToolbar' import { Button, Radio, Row, Slider, Switch, Tooltip } from 'antd' import { CircleHelp, Edit2 } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/MacProcessTrustHintModal.tsx b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/MacProcessTrustHintModal.tsx index 4c5f9fa60a..f07ffd1654 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/MacProcessTrustHintModal.tsx +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/MacProcessTrustHintModal.tsx @@ -1,5 +1,5 @@ import { Button, Modal, Typography } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import { Trans, useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx index dbc6ef75fd..b433cd015e 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx @@ -2,7 +2,8 @@ import { loggerService } from '@logger' import type { ActionItem } from '@renderer/types/selectionTypes' import { Button, Form, Input, Modal, Select } from 'antd' import { Globe } from 'lucide-react' -import { FC, useEffect } from 'react' +import type { FC } from 'react' +import { useEffect } from 'react' import { useTranslation } from 'react-i18next' const logger = loggerService.withContext('SelectionActionSearchModal') diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionUserModal.tsx b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionUserModal.tsx index e1673e7cf4..24ac2b16ee 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionUserModal.tsx +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionUserModal.tsx @@ -6,7 +6,8 @@ import type { ActionItem } from '@renderer/types/selectionTypes' import { Col, Input, Modal, Radio, Row, Select, Space, Tooltip } from 'antd' import { CircleHelp, Dices, OctagonX } from 'lucide-react' import { DynamicIcon, iconNames } from 'lucide-react/dynamic' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionsList.tsx b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionsList.tsx index 3925dfbb5e..bc1a63c85c 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionsList.tsx +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionsList.tsx @@ -4,7 +4,7 @@ import { defaultActionItems } from '@renderer/store/selectionStore' import type { ActionItem } from '@renderer/types/selectionTypes' import SelectionToolbar from '@renderer/windows/selection/toolbar/SelectionToolbar' import { Row } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' import { SettingDivider, SettingGroup } from '../..' diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionFilterListModal.tsx b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionFilterListModal.tsx index ce267e5ab1..ccab63b8dc 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionFilterListModal.tsx +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionFilterListModal.tsx @@ -1,6 +1,7 @@ import { isWin } from '@renderer/config/constant' import { Button, Form, Input, Modal } from 'antd' -import { FC, useEffect } from 'react' +import type { FC } from 'react' +import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts b/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts index eaaa55806e..341ac8f9c6 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts @@ -1,4 +1,4 @@ -import { DropResult } from '@hello-pangea/dnd' +import type { DropResult } from '@hello-pangea/dnd' import { loggerService } from '@logger' import { defaultActionItems } from '@renderer/store/selectionStore' import type { ActionItem } from '@renderer/types/selectionTypes' diff --git a/src/renderer/src/pages/settings/SettingGroup.tsx b/src/renderer/src/pages/settings/SettingGroup.tsx index 575e672dac..3257b5d06a 100644 --- a/src/renderer/src/pages/settings/SettingGroup.tsx +++ b/src/renderer/src/pages/settings/SettingGroup.tsx @@ -1,4 +1,4 @@ -import { ThemeMode } from '@renderer/types' +import type { ThemeMode } from '@renderer/types' import { ChevronDown, ChevronRight } from 'lucide-react' import { AnimatePresence, motion } from 'motion/react' import { useState } from 'react' diff --git a/src/renderer/src/pages/settings/SettingsPage.tsx b/src/renderer/src/pages/settings/SettingsPage.tsx index ca83e149f0..a14e10973d 100644 --- a/src/renderer/src/pages/settings/SettingsPage.tsx +++ b/src/renderer/src/pages/settings/SettingsPage.tsx @@ -20,7 +20,7 @@ import { TextCursorInput, Zap } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { Link, Route, Routes, useLocation } from 'react-router-dom' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ShortcutSettings.tsx b/src/renderer/src/pages/settings/ShortcutSettings.tsx index 834f5e283a..72bb3c376c 100644 --- a/src/renderer/src/pages/settings/ShortcutSettings.tsx +++ b/src/renderer/src/pages/settings/ShortcutSettings.tsx @@ -7,10 +7,12 @@ import { useTimer } from '@renderer/hooks/useTimer' import { getShortcutLabel } from '@renderer/i18n/label' import { useAppDispatch } from '@renderer/store' import { initialState, resetShortcuts, toggleShortcut, updateShortcut } from '@renderer/store/shortcuts' -import { Shortcut } from '@renderer/types' -import { Button, Input, InputRef, Switch, Table as AntTable, Tooltip } from 'antd' +import type { Shortcut } from '@renderer/types' +import type { InputRef } from 'antd' +import { Button, Input, Switch, Table as AntTable, Tooltip } from 'antd' import type { ColumnsType } from 'antd/es/table' -import React, { FC, useRef, useState } from 'react' +import type { FC } from 'react' +import React, { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/ToolSettings/ApiServerSettings/ApiServerSettings.tsx b/src/renderer/src/pages/settings/ToolSettings/ApiServerSettings/ApiServerSettings.tsx index f89897d47b..9fdb471c30 100644 --- a/src/renderer/src/pages/settings/ToolSettings/ApiServerSettings/ApiServerSettings.tsx +++ b/src/renderer/src/pages/settings/ToolSettings/ApiServerSettings/ApiServerSettings.tsx @@ -1,12 +1,13 @@ // TODO: Refactor this component to use HeroUI import { useTheme } from '@renderer/context/ThemeProvider' import { useApiServer } from '@renderer/hooks/useApiServer' -import { RootState, useAppDispatch } from '@renderer/store' +import type { RootState } from '@renderer/store' +import { useAppDispatch } from '@renderer/store' import { setApiServerApiKey, setApiServerPort } from '@renderer/store/settings' import { formatErrorMessage } from '@renderer/utils/error' import { Button, Input, InputNumber, Tooltip, Typography } from 'antd' import { Copy, ExternalLink, Play, RotateCcw, Square } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageModal.tsx b/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageModal.tsx index 1a1965c10e..3d298c43a9 100644 --- a/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageModal.tsx +++ b/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageModal.tsx @@ -3,9 +3,10 @@ import EmojiPicker from '@renderer/components/EmojiPicker' import { InfoTooltip } from '@renderer/components/TooltipIcons' import useTranslate from '@renderer/hooks/useTranslate' import { addCustomLanguage, updateCustomLanguage } from '@renderer/services/TranslateService' -import { CustomTranslateLanguage } from '@renderer/types' +import type { CustomTranslateLanguage } from '@renderer/types' import { Button, Form, Input, Modal, Popover, Space } from 'antd' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' type Props = { diff --git a/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageSettings.tsx b/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageSettings.tsx index abe34eabf0..d898c09f9b 100644 --- a/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageSettings.tsx +++ b/src/renderer/src/pages/settings/TranslateSettingsPopup/CustomLanguageSettings.tsx @@ -2,8 +2,9 @@ import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons' import { loggerService } from '@logger' import { HStack } from '@renderer/components/Layout' import { deleteCustomLanguage, getAllCustomLanguages } from '@renderer/services/TranslateService' -import { CustomTranslateLanguage } from '@renderer/types' -import { Button, Popconfirm, Space, Table, TableProps } from 'antd' +import type { CustomTranslateLanguage } from '@renderer/types' +import type { TableProps } from 'antd' +import { Button, Popconfirm, Space, Table } from 'antd' import { memo, startTransition, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/WebSearchSettings/AddSubscribePopup.tsx b/src/renderer/src/pages/settings/WebSearchSettings/AddSubscribePopup.tsx index 4d975e825d..7aee235887 100644 --- a/src/renderer/src/pages/settings/WebSearchSettings/AddSubscribePopup.tsx +++ b/src/renderer/src/pages/settings/WebSearchSettings/AddSubscribePopup.tsx @@ -1,5 +1,6 @@ import { TopView } from '@renderer/components/TopView' -import { Button, Flex, Form, FormProps, Input, Modal } from 'antd' +import type { FormProps } from 'antd' +import { Button, Flex, Form, Input, Modal } from 'antd' import { useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx b/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx index 2f301ac957..95c0749126 100644 --- a/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx +++ b/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx @@ -5,7 +5,7 @@ import { setMaxResult, setSearchWithTime } from '@renderer/store/websearch' import { Slider, Switch, Tooltip } from 'antd' import { t } from 'i18next' import { Info } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/WebSearchSettings/BlacklistSettings.tsx b/src/renderer/src/pages/settings/WebSearchSettings/BlacklistSettings.tsx index 8486a62f42..b3304b03d1 100644 --- a/src/renderer/src/pages/settings/WebSearchSettings/BlacklistSettings.tsx +++ b/src/renderer/src/pages/settings/WebSearchSettings/BlacklistSettings.tsx @@ -6,10 +6,12 @@ import { useBlacklist } from '@renderer/hooks/useWebSearchProviders' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setExcludeDomains } from '@renderer/store/websearch' import { parseMatchPattern, parseSubscribeContent } from '@renderer/utils/blacklistMatchPattern' -import { Alert, Button, Table, TableProps } from 'antd' +import type { TableProps } from 'antd' +import { Alert, Button, Table } from 'antd' import TextArea from 'antd/es/input/TextArea' import { t } from 'i18next' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '..' import AddSubscribePopup from './AddSubscribePopup' diff --git a/src/renderer/src/pages/settings/WebSearchSettings/CompressionSettings/RagSettings.tsx b/src/renderer/src/pages/settings/WebSearchSettings/CompressionSettings/RagSettings.tsx index 325915f21d..ece17ebac1 100644 --- a/src/renderer/src/pages/settings/WebSearchSettings/CompressionSettings/RagSettings.tsx +++ b/src/renderer/src/pages/settings/WebSearchSettings/CompressionSettings/RagSettings.tsx @@ -7,7 +7,7 @@ import { useProviders } from '@renderer/hooks/useProvider' import { useWebSearchSettings } from '@renderer/hooks/useWebSearchProviders' import { SettingDivider, SettingRow, SettingRowTitle } from '@renderer/pages/settings' import { getModelUniqId } from '@renderer/services/ModelService' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { Slider, Tooltip } from 'antd' import { find } from 'lodash' import { Info } from 'lucide-react' diff --git a/src/renderer/src/pages/settings/WebSearchSettings/WebSearchProviderSetting.tsx b/src/renderer/src/pages/settings/WebSearchSettings/WebSearchProviderSetting.tsx index cb0f3fc8c0..438fc053d1 100644 --- a/src/renderer/src/pages/settings/WebSearchSettings/WebSearchProviderSetting.tsx +++ b/src/renderer/src/pages/settings/WebSearchSettings/WebSearchProviderSetting.tsx @@ -11,12 +11,13 @@ import { WEB_SEARCH_PROVIDER_CONFIG } from '@renderer/config/webSearchProviders' import { useTimer } from '@renderer/hooks/useTimer' import { useWebSearchProvider } from '@renderer/hooks/useWebSearchProviders' import WebSearchService from '@renderer/services/WebSearchService' -import { WebSearchProviderId } from '@renderer/types' +import type { WebSearchProviderId } from '@renderer/types' import { formatApiKeys, hasObjectKey } from '@renderer/utils' import { Button, Divider, Flex, Form, Input, Space, Tooltip } from 'antd' import Link from 'antd/es/typography/Link' import { Info, List } from 'lucide-react' -import { FC, useEffect, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/settings/WebSearchSettings/index.tsx b/src/renderer/src/pages/settings/WebSearchSettings/index.tsx index 1469008875..7867cb57e0 100644 --- a/src/renderer/src/pages/settings/WebSearchSettings/index.tsx +++ b/src/renderer/src/pages/settings/WebSearchSettings/index.tsx @@ -1,9 +1,10 @@ import Selector from '@renderer/components/Selector' import { useTheme } from '@renderer/context/ThemeProvider' import { useDefaultWebSearchProvider, useWebSearchProviders } from '@renderer/hooks/useWebSearchProviders' -import { WebSearchProvider } from '@renderer/types' +import type { WebSearchProvider } from '@renderer/types' import { hasObjectKey } from '@renderer/utils' -import { FC, useState } from 'react' +import type { FC } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingContainer, SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '..' diff --git a/src/renderer/src/pages/settings/index.tsx b/src/renderer/src/pages/settings/index.tsx index ae9697189b..245fce1107 100644 --- a/src/renderer/src/pages/settings/index.tsx +++ b/src/renderer/src/pages/settings/index.tsx @@ -1,7 +1,8 @@ -import { ThemeMode } from '@renderer/types' +import type { ThemeMode } from '@renderer/types' import { Divider } from 'antd' import Link from 'antd/es/typography/Link' -import styled, { CSSProp } from 'styled-components' +import type { CSSProp } from 'styled-components' +import styled from 'styled-components' export const SettingContainer = styled.div<{ theme?: ThemeMode }>` display: flex; diff --git a/src/renderer/src/pages/store/assistants/presets/AssistantPresetsPage.tsx b/src/renderer/src/pages/store/assistants/presets/AssistantPresetsPage.tsx index 4f78e94e04..b5fdc1d335 100644 --- a/src/renderer/src/pages/store/assistants/presets/AssistantPresetsPage.tsx +++ b/src/renderer/src/pages/store/assistants/presets/AssistantPresetsPage.tsx @@ -7,12 +7,13 @@ import CustomTag from '@renderer/components/Tags/CustomTag' import { useAssistantPresets } from '@renderer/hooks/useAssistantPresets' import { useNavbarPosition } from '@renderer/hooks/useSettings' import { createAssistantFromAgent } from '@renderer/services/AssistantService' -import { AssistantPreset } from '@renderer/types' +import type { AssistantPreset } from '@renderer/types' import { uuid } from '@renderer/utils' import { Button, Empty, Flex, Input } from 'antd' import { omit } from 'lodash' import { Search } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import ReactMarkdown from 'react-markdown' import styled from 'styled-components' diff --git a/src/renderer/src/pages/store/assistants/presets/components/AddAssistantPresetPopup.tsx b/src/renderer/src/pages/store/assistants/presets/components/AddAssistantPresetPopup.tsx index af82044874..d5558b8e88 100644 --- a/src/renderer/src/pages/store/assistants/presets/components/AddAssistantPresetPopup.tsx +++ b/src/renderer/src/pages/store/assistants/presets/components/AddAssistantPresetPopup.tsx @@ -11,9 +11,10 @@ import { fetchGenerate } from '@renderer/services/ApiService' import { getDefaultModel } from '@renderer/services/AssistantService' import { estimateTextTokens } from '@renderer/services/TokenService' import { useAppSelector } from '@renderer/store' -import { AssistantPreset, KnowledgeBase } from '@renderer/types' +import type { AssistantPreset, KnowledgeBase } from '@renderer/types' import { getLeadingEmoji, uuid } from '@renderer/utils' -import { Button, Form, FormInstance, Input, Modal, Popover, Select, SelectProps } from 'antd' +import type { FormInstance, SelectProps } from 'antd' +import { Button, Form, Input, Modal, Popover, Select } from 'antd' import TextArea from 'antd/es/input/TextArea' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetGroupIcon.tsx b/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetGroupIcon.tsx index a315a25794..37140f08c4 100644 --- a/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetGroupIcon.tsx +++ b/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetGroupIcon.tsx @@ -1,6 +1,7 @@ import { groupTranslations } from '@renderer/pages/store/assistants/presets/assistantPresetGroupTranslations' -import { DynamicIcon, IconName } from 'lucide-react/dynamic' -import { FC } from 'react' +import type { IconName } from 'lucide-react/dynamic' +import { DynamicIcon } from 'lucide-react/dynamic' +import type { FC } from 'react' import { useTranslation } from 'react-i18next' interface Props { diff --git a/src/renderer/src/pages/store/assistants/presets/components/ImportAssistantPresetPopup.tsx b/src/renderer/src/pages/store/assistants/presets/components/ImportAssistantPresetPopup.tsx index 3874719e62..9a76d1d02e 100644 --- a/src/renderer/src/pages/store/assistants/presets/components/ImportAssistantPresetPopup.tsx +++ b/src/renderer/src/pages/store/assistants/presets/components/ImportAssistantPresetPopup.tsx @@ -3,7 +3,7 @@ import { useAssistantPresets } from '@renderer/hooks/useAssistantPresets' import { useTimer } from '@renderer/hooks/useTimer' import { getDefaultModel } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { AssistantPreset } from '@renderer/types' +import type { AssistantPreset } from '@renderer/types' import { uuid } from '@renderer/utils' import { Button, Flex, Form, Input, Modal, Radio } from 'antd' import { useState } from 'react' diff --git a/src/renderer/src/pages/store/assistants/presets/index.ts b/src/renderer/src/pages/store/assistants/presets/index.ts index 5dd2604e5c..9df20bc883 100644 --- a/src/renderer/src/pages/store/assistants/presets/index.ts +++ b/src/renderer/src/pages/store/assistants/presets/index.ts @@ -2,7 +2,7 @@ import { loggerService } from '@logger' import { useRuntime } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import store from '@renderer/store' -import { AssistantPreset } from '@renderer/types' +import type { AssistantPreset } from '@renderer/types' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/translate/TranslateHistory.tsx b/src/renderer/src/pages/translate/TranslateHistory.tsx index e9a79200a5..df5b48d495 100644 --- a/src/renderer/src/pages/translate/TranslateHistory.tsx +++ b/src/renderer/src/pages/translate/TranslateHistory.tsx @@ -4,13 +4,14 @@ import { DynamicVirtualList } from '@renderer/components/VirtualList' import db from '@renderer/databases' import useTranslate from '@renderer/hooks/useTranslate' import { clearHistory, deleteHistory, updateTranslateHistory } from '@renderer/services/TranslateService' -import { TranslateHistory, TranslateLanguage } from '@renderer/types' +import type { TranslateHistory, TranslateLanguage } from '@renderer/types' import { Button, Drawer, Empty, Flex, Input, Popconfirm } from 'antd' import dayjs from 'dayjs' import { useLiveQuery } from 'dexie-react-hooks' import { isEmpty } from 'lodash' import { SearchIcon } from 'lucide-react' -import { FC, useCallback, useDeferredValue, useEffect, useMemo, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useDeferredValue, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/translate/TranslatePage.tsx b/src/renderer/src/pages/translate/TranslatePage.tsx index 76e50ce4b5..61b49893fa 100644 --- a/src/renderer/src/pages/translate/TranslatePage.tsx +++ b/src/renderer/src/pages/translate/TranslatePage.tsx @@ -20,12 +20,11 @@ import { saveTranslateHistory, translateText } from '@renderer/services/Translat import { useAppDispatch, useAppSelector } from '@renderer/store' import { setTranslateAbortKey, setTranslating as setTranslatingAction } from '@renderer/store/runtime' import { setTranslatedContent as setTranslatedContentAction, setTranslateInput } from '@renderer/store/translate' +import type { FileMetadata, SupportedOcrFile } from '@renderer/types' import { type AutoDetectionMethod, - FileMetadata, isSupportedOcrFile, type Model, - SupportedOcrFile, type TranslateHistory, type TranslateLanguage } from '@renderer/types' @@ -42,10 +41,12 @@ import { } from '@renderer/utils/translate' import { imageExts, MB, textExts } from '@shared/config/constant' import { Button, Flex, FloatButton, Popover, Tooltip, Typography } from 'antd' -import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' +import type { TextAreaRef } from 'antd/es/input/TextArea' +import TextArea from 'antd/es/input/TextArea' import { isEmpty, throttle } from 'lodash' import { Check, CirclePause, FolderClock, Settings2, UploadIcon } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/pages/translate/TranslateSettings.tsx b/src/renderer/src/pages/translate/TranslateSettings.tsx index fd149e0d4b..54bdd1961e 100644 --- a/src/renderer/src/pages/translate/TranslateSettings.tsx +++ b/src/renderer/src/pages/translate/TranslateSettings.tsx @@ -3,10 +3,11 @@ import LanguageSelect from '@renderer/components/LanguageSelect' import { HStack } from '@renderer/components/Layout' import db from '@renderer/databases' import useTranslate from '@renderer/hooks/useTranslate' -import { AutoDetectionMethod, Model, TranslateLanguage } from '@renderer/types' +import type { AutoDetectionMethod, Model, TranslateLanguage } from '@renderer/types' import { Button, Flex, Modal, Radio, Space, Tooltip } from 'antd' import { HelpCircle } from 'lucide-react' -import { FC, memo, useEffect, useState } from 'react' +import type { FC } from 'react' +import { memo, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import TranslateSettingsPopup from '../settings/TranslateSettingsPopup/TranslateSettingsPopup' diff --git a/src/renderer/src/providers/WebSearchProvider/BaseWebSearchProvider.ts b/src/renderer/src/providers/WebSearchProvider/BaseWebSearchProvider.ts index 558a328b5e..b3047dc7e1 100644 --- a/src/renderer/src/providers/WebSearchProvider/BaseWebSearchProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/BaseWebSearchProvider.ts @@ -1,5 +1,5 @@ -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' export default abstract class BaseWebSearchProvider { // @ts-ignore this diff --git a/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts b/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts index 81d85df5d3..af2313b1cc 100644 --- a/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' -import { BochaSearchParams, BochaSearchResponse } from '@renderer/utils/bocha' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { BochaSearchParams, BochaSearchResponse } from '@renderer/utils/bocha' import BaseWebSearchProvider from './BaseWebSearchProvider' diff --git a/src/renderer/src/providers/WebSearchProvider/DefaultProvider.ts b/src/renderer/src/providers/WebSearchProvider/DefaultProvider.ts index 25d2d46a43..abc5a8bbf2 100644 --- a/src/renderer/src/providers/WebSearchProvider/DefaultProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/DefaultProvider.ts @@ -1,4 +1,4 @@ -import { WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchProviderResponse } from '@renderer/types' import BaseWebSearchProvider from './BaseWebSearchProvider' diff --git a/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts b/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts index a01ba93543..4759d4df96 100644 --- a/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts @@ -1,7 +1,7 @@ import { ExaClient } from '@agentic/exa' import { loggerService } from '@logger' -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' import BaseWebSearchProvider from './BaseWebSearchProvider' diff --git a/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts index 47972e080e..614873f48e 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import LocalSearchProvider, { SearchItem } from './LocalSearchProvider' +import type { SearchItem } from './LocalSearchProvider' +import LocalSearchProvider from './LocalSearchProvider' const logger = loggerService.withContext('LocalBaiduProvider') diff --git a/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts index 7ed498b16d..d068bfc361 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import LocalSearchProvider, { SearchItem } from './LocalSearchProvider' +import type { SearchItem } from './LocalSearchProvider' +import LocalSearchProvider from './LocalSearchProvider' const logger = loggerService.withContext('LocalBingProvider') diff --git a/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts index 834f116556..29f4018f23 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import LocalSearchProvider, { SearchItem } from './LocalSearchProvider' +import type { SearchItem } from './LocalSearchProvider' +import LocalSearchProvider from './LocalSearchProvider' const logger = loggerService.withContext('LocalGoogleProvider') diff --git a/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts index 2a17dc3a26..4854855423 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts @@ -1,8 +1,8 @@ import { loggerService } from '@logger' import { nanoid } from '@reduxjs/toolkit' import store from '@renderer/store' -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse, WebSearchProviderResult } from '@renderer/types' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProvider, WebSearchProviderResponse, WebSearchProviderResult } from '@renderer/types' import { createAbortPromise } from '@renderer/utils/abortController' import { isAbortError } from '@renderer/utils/error' import { fetchWebContent, noContent } from '@renderer/utils/fetch' diff --git a/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts b/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts index cf3a75f84b..89fc03892f 100644 --- a/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts @@ -1,7 +1,7 @@ import { SearxngClient } from '@agentic/searxng' import { loggerService } from '@logger' -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' import { fetchWebContent, noContent } from '@renderer/utils/fetch' import axios from 'axios' import ky from 'ky' diff --git a/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts b/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts index 3ca9b0676d..40a5ce04ad 100644 --- a/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts @@ -1,7 +1,7 @@ import { TavilyClient } from '@agentic/tavily' import { loggerService } from '@logger' -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' import BaseWebSearchProvider from './BaseWebSearchProvider' diff --git a/src/renderer/src/providers/WebSearchProvider/WebSearchProviderFactory.ts b/src/renderer/src/providers/WebSearchProvider/WebSearchProviderFactory.ts index b389a98deb..0b961c23d8 100644 --- a/src/renderer/src/providers/WebSearchProvider/WebSearchProviderFactory.ts +++ b/src/renderer/src/providers/WebSearchProvider/WebSearchProviderFactory.ts @@ -1,6 +1,6 @@ -import { WebSearchProvider } from '@renderer/types' +import type { WebSearchProvider } from '@renderer/types' -import BaseWebSearchProvider from './BaseWebSearchProvider' +import type BaseWebSearchProvider from './BaseWebSearchProvider' import BochaProvider from './BochaProvider' import DefaultProvider from './DefaultProvider' import ExaProvider from './ExaProvider' diff --git a/src/renderer/src/providers/WebSearchProvider/ZhipuProvider.ts b/src/renderer/src/providers/WebSearchProvider/ZhipuProvider.ts index e7c95fb1ce..f434477f34 100644 --- a/src/renderer/src/providers/WebSearchProvider/ZhipuProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/ZhipuProvider.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' import BaseWebSearchProvider from './BaseWebSearchProvider' diff --git a/src/renderer/src/providers/WebSearchProvider/index.ts b/src/renderer/src/providers/WebSearchProvider/index.ts index e1fe8f185c..b5212bd803 100644 --- a/src/renderer/src/providers/WebSearchProvider/index.ts +++ b/src/renderer/src/providers/WebSearchProvider/index.ts @@ -1,9 +1,9 @@ import { withSpanResult } from '@renderer/services/SpanManagerService' import type { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' import { filterResultWithBlacklist } from '@renderer/utils/blacklistMatchPattern' -import BaseWebSearchProvider from './BaseWebSearchProvider' +import type BaseWebSearchProvider from './BaseWebSearchProvider' import WebSearchProviderFactory from './WebSearchProviderFactory' export default class WebSearchEngineProvider { diff --git a/src/renderer/src/queue/KnowledgeQueue.ts b/src/renderer/src/queue/KnowledgeQueue.ts index daabe9fb4c..7b23895b44 100644 --- a/src/renderer/src/queue/KnowledgeQueue.ts +++ b/src/renderer/src/queue/KnowledgeQueue.ts @@ -10,7 +10,7 @@ import { updateBaseItemUniqueId, updateItemProcessingStatus } from '@renderer/store/knowledge' -import { KnowledgeItem } from '@renderer/types' +import type { KnowledgeItem } from '@renderer/types' import { uuid } from '@renderer/utils' import type { LoaderReturn } from '@shared/config/types' import { t } from 'i18next' diff --git a/src/renderer/src/services/ApiService.ts b/src/renderer/src/services/ApiService.ts index 403fdc2cfe..cc0f94934a 100644 --- a/src/renderer/src/services/ApiService.ts +++ b/src/renderer/src/services/ApiService.ts @@ -3,19 +3,19 @@ */ import { loggerService } from '@logger' import AiProvider from '@renderer/aiCore' -import { CompletionsParams } from '@renderer/aiCore/legacy/middleware/schemas' -import { AiSdkMiddlewareConfig } from '@renderer/aiCore/middleware/AiSdkMiddlewareBuilder' +import type { CompletionsParams } from '@renderer/aiCore/legacy/middleware/schemas' +import type { AiSdkMiddlewareConfig } from '@renderer/aiCore/middleware/AiSdkMiddlewareBuilder' import { buildStreamTextParams } from '@renderer/aiCore/prepareParams' import { isDedicatedImageGenerationModel, isEmbeddingModel } from '@renderer/config/models' import { getStoreSetting } from '@renderer/hooks/useSettings' import i18n from '@renderer/i18n' import store from '@renderer/store' import type { FetchChatCompletionParams } from '@renderer/types' -import { Assistant, MCPServer, MCPTool, Model, Provider } from '@renderer/types' +import type { Assistant, MCPServer, MCPTool, Model, Provider } from '@renderer/types' import type { StreamTextParams } from '@renderer/types/aiCoreTypes' import { type Chunk, ChunkType } from '@renderer/types/chunk' -import { Message } from '@renderer/types/newMessage' -import { SdkModel } from '@renderer/types/sdk' +import type { Message } from '@renderer/types/newMessage' +import type { SdkModel } from '@renderer/types/sdk' import { removeSpecialCharactersForTopicName, uuid } from '@renderer/utils' import { abortCompletion, readyToAbort } from '@renderer/utils/abortController' import { isAbortError } from '@renderer/utils/error' @@ -25,7 +25,8 @@ import { findFileBlocks, getMainTextContent } from '@renderer/utils/messageUtils import { containsSupportedVariables, replacePromptVariables } from '@renderer/utils/prompt' import { isEmpty, takeRight } from 'lodash' -import AiProviderNew, { ModernAiProviderConfig } from '../aiCore/index_new' +import type { ModernAiProviderConfig } from '../aiCore/index_new' +import AiProviderNew from '../aiCore/index_new' import { // getAssistantProvider, // getAssistantSettings, diff --git a/src/renderer/src/services/BackupService.ts b/src/renderer/src/services/BackupService.ts index c168bd489b..1c97ebd087 100644 --- a/src/renderer/src/services/BackupService.ts +++ b/src/renderer/src/services/BackupService.ts @@ -4,7 +4,7 @@ import { upgradeToV7, upgradeToV8 } from '@renderer/databases/upgrades' import i18n from '@renderer/i18n' import store from '@renderer/store' import { setLocalBackupSyncState, setS3SyncState, setWebDAVSyncState } from '@renderer/store/backup' -import { S3Config, WebDavConfig } from '@renderer/types' +import type { S3Config, WebDavConfig } from '@renderer/types' import { uuid } from '@renderer/utils' import dayjs from 'dayjs' diff --git a/src/renderer/src/services/ConversationService.ts b/src/renderer/src/services/ConversationService.ts index a7f3fab13c..f9e3f4dea5 100644 --- a/src/renderer/src/services/ConversationService.ts +++ b/src/renderer/src/services/ConversationService.ts @@ -1,7 +1,7 @@ import { convertMessagesToSdkMessages } from '@renderer/aiCore/prepareParams' -import { Assistant, Message } from '@renderer/types' +import type { Assistant, Message } from '@renderer/types' import { filterAdjacentUserMessaegs, filterLastAssistantMessage } from '@renderer/utils/messageUtils/filters' -import { ModelMessage } from 'ai' +import type { ModelMessage } from 'ai' import { findLast, isEmpty, takeRight } from 'lodash' import { getAssistantSettings, getDefaultModel } from './AssistantService' diff --git a/src/renderer/src/services/FileAction.ts b/src/renderer/src/services/FileAction.ts index 8f54e8969c..149ea2f2a8 100644 --- a/src/renderer/src/services/FileAction.ts +++ b/src/renderer/src/services/FileAction.ts @@ -3,8 +3,8 @@ import TextEditPopup from '@renderer/components/Popups/TextEditPopup' import db from '@renderer/databases' import FileManager from '@renderer/services/FileManager' import store from '@renderer/store' -import { FileType } from '@renderer/types' -import { Message } from '@renderer/types/newMessage' +import type { FileType } from '@renderer/types' +import type { Message } from '@renderer/types/newMessage' import dayjs from 'dayjs' // 排序相关 diff --git a/src/renderer/src/services/FileManager.ts b/src/renderer/src/services/FileManager.ts index ec32535da7..40d61937f9 100644 --- a/src/renderer/src/services/FileManager.ts +++ b/src/renderer/src/services/FileManager.ts @@ -2,7 +2,7 @@ import { loggerService } from '@logger' import db from '@renderer/databases' import i18n from '@renderer/i18n' import store from '@renderer/store' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { getFileDirectory } from '@renderer/utils' import dayjs from 'dayjs' diff --git a/src/renderer/src/services/HealthCheckService.ts b/src/renderer/src/services/HealthCheckService.ts index 02c3217dcc..df814653f8 100644 --- a/src/renderer/src/services/HealthCheckService.ts +++ b/src/renderer/src/services/HealthCheckService.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import { Model, Provider } from '@renderer/types' -import { ApiKeyWithStatus, HealthStatus, ModelCheckOptions, ModelWithStatus } from '@renderer/types/healthCheck' +import type { Model, Provider } from '@renderer/types' +import type { ApiKeyWithStatus, ModelCheckOptions, ModelWithStatus } from '@renderer/types/healthCheck' +import { HealthStatus } from '@renderer/types/healthCheck' import { formatErrorMessage } from '@renderer/utils/error' import { aggregateApiKeyResults } from '@renderer/utils/healthCheck' diff --git a/src/renderer/src/services/KnowledgeService.ts b/src/renderer/src/services/KnowledgeService.ts index e49a7fca6c..ed065c3a1c 100644 --- a/src/renderer/src/services/KnowledgeService.ts +++ b/src/renderer/src/services/KnowledgeService.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { Span } from '@opentelemetry/api' +import type { Span } from '@opentelemetry/api' import { ModernAiProvider } from '@renderer/aiCore' import AiProvider from '@renderer/aiCore/legacy' import { DEFAULT_KNOWLEDGE_DOCUMENT_COUNT, DEFAULT_KNOWLEDGE_THRESHOLD } from '@renderer/config/constant' @@ -7,16 +7,17 @@ import { getEmbeddingMaxContext } from '@renderer/config/embedings' import { isAzureOpenAIProvider, isGeminiProvider } from '@renderer/config/providers' import { addSpan, endSpan } from '@renderer/services/SpanManagerService' import store from '@renderer/store' -import { +import type { FileMetadata, KnowledgeBase, KnowledgeBaseParams, KnowledgeReference, KnowledgeSearchResult } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { routeToEndpoint } from '@renderer/utils' -import { ExtractResults } from '@renderer/utils/extract' +import type { ExtractResults } from '@renderer/utils/extract' import { isEmpty } from 'lodash' import { getProviderByModel } from './AssistantService' diff --git a/src/renderer/src/services/MemoryProcessor.ts b/src/renderer/src/services/MemoryProcessor.ts index 28656e54ed..01ba5eeb77 100644 --- a/src/renderer/src/services/MemoryProcessor.ts +++ b/src/renderer/src/services/MemoryProcessor.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' import { getModel } from '@renderer/hooks/useModel' -import { AssistantMessage } from '@renderer/types' +import type { AssistantMessage } from '@renderer/types' import { FactRetrievalSchema, getFactRetrievalMessages, @@ -8,7 +8,7 @@ import { MemoryUpdateSchema, updateMemorySystemPrompt } from '@renderer/utils/memory-prompts' -import { MemoryConfig, MemoryItem } from '@types' +import type { MemoryConfig, MemoryItem } from '@types' import jaison from 'jaison/lib/index.js' import { fetchGenerate } from './ApiService' diff --git a/src/renderer/src/services/MemoryService.ts b/src/renderer/src/services/MemoryService.ts index 4307060aa6..8f572194df 100644 --- a/src/renderer/src/services/MemoryService.ts +++ b/src/renderer/src/services/MemoryService.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' import store from '@renderer/store' import { selectMemoryConfig } from '@renderer/store/memory' -import { +import type { AddMemoryOptions, AssistantMessage, MemoryHistoryItem, diff --git a/src/renderer/src/services/MessagesService.ts b/src/renderer/src/services/MessagesService.ts index bbb5263c1a..e213af7ff5 100644 --- a/src/renderer/src/services/MessagesService.ts +++ b/src/renderer/src/services/MessagesService.ts @@ -25,7 +25,7 @@ import { filterContextMessages } from '@renderer/utils/messageUtils/filters' import { getMainTextContent } from '@renderer/utils/messageUtils/find' import dayjs from 'dayjs' import { t } from 'i18next' -import { NavigateFunction } from 'react-router' +import type { NavigateFunction } from 'react-router' import { getAssistantById, getAssistantProvider, getDefaultModel } from './AssistantService' import { EVENT_NAMES, EventEmitter } from './EventService' diff --git a/src/renderer/src/services/ModelMessageService.ts b/src/renderer/src/services/ModelMessageService.ts index d5953db7c0..66d00e1c0a 100644 --- a/src/renderer/src/services/ModelMessageService.ts +++ b/src/renderer/src/services/ModelMessageService.ts @@ -1,5 +1,5 @@ -import { ChatCompletionContentPart, ChatCompletionMessageParam } from '@cherrystudio/openai/resources' -import { Model } from '@renderer/types' +import type { ChatCompletionContentPart, ChatCompletionMessageParam } from '@cherrystudio/openai/resources' +import type { Model } from '@renderer/types' import { findLast } from 'lodash' export function processReqMessages( diff --git a/src/renderer/src/services/ModelService.ts b/src/renderer/src/services/ModelService.ts index 266271e0bf..308dd09b56 100644 --- a/src/renderer/src/services/ModelService.ts +++ b/src/renderer/src/services/ModelService.ts @@ -1,5 +1,5 @@ import { getStoreProviders } from '@renderer/hooks/useStore' -import { Model } from '@renderer/types' +import type { Model } from '@renderer/types' import { pick } from 'lodash' import { getProviderName } from './ProviderService' diff --git a/src/renderer/src/services/NavigationService.ts b/src/renderer/src/services/NavigationService.ts index dc678825f4..3c4ae54abe 100644 --- a/src/renderer/src/services/NavigationService.ts +++ b/src/renderer/src/services/NavigationService.ts @@ -1,4 +1,4 @@ -import { NavigateFunction } from 'react-router-dom' +import type { NavigateFunction } from 'react-router-dom' interface INavigationService { navigate: NavigateFunction | null diff --git a/src/renderer/src/services/NotesSearchService.ts b/src/renderer/src/services/NotesSearchService.ts index f4331ff166..fa9c3e3186 100644 --- a/src/renderer/src/services/NotesSearchService.ts +++ b/src/renderer/src/services/NotesSearchService.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { NotesTreeNode } from '@renderer/types/note' +import type { NotesTreeNode } from '@renderer/types/note' const logger = loggerService.withContext('NotesSearchService') diff --git a/src/renderer/src/services/NotesService.ts b/src/renderer/src/services/NotesService.ts index a76df9d845..4cd73d12dd 100644 --- a/src/renderer/src/services/NotesService.ts +++ b/src/renderer/src/services/NotesService.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { NotesSortType, NotesTreeNode } from '@renderer/types/note' +import type { NotesSortType, NotesTreeNode } from '@renderer/types/note' import { getFileDirectory } from '@renderer/utils' const logger = loggerService.withContext('NotesService') diff --git a/src/renderer/src/services/NotesTreeService.ts b/src/renderer/src/services/NotesTreeService.ts index 676b4996aa..d5ccf0b56b 100644 --- a/src/renderer/src/services/NotesTreeService.ts +++ b/src/renderer/src/services/NotesTreeService.ts @@ -1,4 +1,4 @@ -import { NotesTreeNode } from '@renderer/types/note' +import type { NotesTreeNode } from '@renderer/types/note' export function normalizePathValue(path: string): string { return path.replace(/\\/g, '/') diff --git a/src/renderer/src/services/NutstoreService.ts b/src/renderer/src/services/NutstoreService.ts index 17dee74708..4d314d2e23 100644 --- a/src/renderer/src/services/NutstoreService.ts +++ b/src/renderer/src/services/NutstoreService.ts @@ -2,7 +2,7 @@ import { loggerService } from '@logger' import i18n from '@renderer/i18n' import store from '@renderer/store' import { setNutstoreSyncState } from '@renderer/store/nutstore' -import { WebDavConfig } from '@renderer/types' +import type { WebDavConfig } from '@renderer/types' import { NUTSTORE_HOST } from '@shared/config/nutstore' import dayjs from 'dayjs' import { type CreateDirectoryOptions } from 'webdav' diff --git a/src/renderer/src/services/OrchestrateService.ts b/src/renderer/src/services/OrchestrateService.ts index eef206d14e..1f365b39b6 100644 --- a/src/renderer/src/services/OrchestrateService.ts +++ b/src/renderer/src/services/OrchestrateService.ts @@ -1,5 +1,6 @@ -import { Assistant, Message } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { Assistant, Message } from '@renderer/types' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { replacePromptVariables } from '@renderer/utils/prompt' import { fetchChatCompletion } from './ApiService' diff --git a/src/renderer/src/services/PasteService.ts b/src/renderer/src/services/PasteService.ts index 25767dacd0..d12a736489 100644 --- a/src/renderer/src/services/PasteService.ts +++ b/src/renderer/src/services/PasteService.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import { getFileExtension, isSupportedFile } from '@renderer/utils' const logger = loggerService.withContext('PasteService') diff --git a/src/renderer/src/services/ProviderService.ts b/src/renderer/src/services/ProviderService.ts index 2d10581eb9..6ec4fa4cca 100644 --- a/src/renderer/src/services/ProviderService.ts +++ b/src/renderer/src/services/ProviderService.ts @@ -1,5 +1,5 @@ import { getStoreProviders } from '@renderer/hooks/useStore' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { getFancyProviderName } from '@renderer/utils' export function getProviderName(model?: Model) { diff --git a/src/renderer/src/services/QuickPhraseService.ts b/src/renderer/src/services/QuickPhraseService.ts index 31a0637272..b1e4c4fe43 100644 --- a/src/renderer/src/services/QuickPhraseService.ts +++ b/src/renderer/src/services/QuickPhraseService.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' import db from '@renderer/databases' -import { QuickPhrase } from '@renderer/types' +import type { QuickPhrase } from '@renderer/types' import { v4 as uuidv4 } from 'uuid' const logger = loggerService.withContext('QuickPhraseService') diff --git a/src/renderer/src/services/ShikiStreamService.ts b/src/renderer/src/services/ShikiStreamService.ts index 1a2c6e6335..4aacac1dd0 100644 --- a/src/renderer/src/services/ShikiStreamService.ts +++ b/src/renderer/src/services/ShikiStreamService.ts @@ -9,7 +9,8 @@ import { import { LRUCache } from 'lru-cache' import type { HighlighterGeneric, ThemedToken } from 'shiki/core' -import { ShikiStreamTokenizer, ShikiStreamTokenizerOptions } from './ShikiStreamTokenizer' +import type { ShikiStreamTokenizerOptions } from './ShikiStreamTokenizer' +import { ShikiStreamTokenizer } from './ShikiStreamTokenizer' const logger = loggerService.withContext('ShikiStreamService') diff --git a/src/renderer/src/services/SpanManagerService.ts b/src/renderer/src/services/SpanManagerService.ts index 331db38817..71f00d85b9 100644 --- a/src/renderer/src/services/SpanManagerService.ts +++ b/src/renderer/src/services/SpanManagerService.ts @@ -1,9 +1,10 @@ import { MessageStream } from '@anthropic-ai/sdk/resources/messages/messages' import { Stream } from '@cherrystudio/openai/streaming' import { loggerService } from '@logger' -import { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' +import type { SpanEntity, TokenUsage } from '@mcp-trace/trace-core' import { cleanContext, endContext, getContext, startContext } from '@mcp-trace/trace-web' -import { Context, context, Span, SpanStatusCode, trace } from '@opentelemetry/api' +import type { Context, Span } from '@opentelemetry/api' +import { context, SpanStatusCode, trace } from '@opentelemetry/api' import { isAsyncIterable } from '@renderer/aiCore/legacy/middleware/utils' import { db } from '@renderer/databases' import { getEnableDeveloperMode } from '@renderer/hooks/useSettings' @@ -12,11 +13,12 @@ import { handleAsyncIterable } from '@renderer/trace/dataHandler/AsyncIterableHa import { handleResult } from '@renderer/trace/dataHandler/CommonResultHandler' import { handleMessageStream } from '@renderer/trace/dataHandler/MessageStreamHandler' import { handleStream } from '@renderer/trace/dataHandler/StreamHandler' -import { EndSpanParams, ModelSpanEntity, StartSpanParams } from '@renderer/trace/types/ModelSpanEntity' -import { Model, Topic } from '@renderer/types' +import type { EndSpanParams, StartSpanParams } from '@renderer/trace/types/ModelSpanEntity' +import { ModelSpanEntity } from '@renderer/trace/types/ModelSpanEntity' +import type { Model, Topic } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' import { MessageBlockType } from '@renderer/types/newMessage' -import { SdkRawChunk } from '@renderer/types/sdk' +import type { SdkRawChunk } from '@renderer/types/sdk' const logger = loggerService.withContext('SpanManagerService') diff --git a/src/renderer/src/services/StoreSyncService.ts b/src/renderer/src/services/StoreSyncService.ts index 30def3a97a..e25b92bc49 100644 --- a/src/renderer/src/services/StoreSyncService.ts +++ b/src/renderer/src/services/StoreSyncService.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { Middleware } from '@reduxjs/toolkit' +import type { Middleware } from '@reduxjs/toolkit' import { IpcChannel } from '@shared/IpcChannel' import type { StoreSyncAction } from '@types' diff --git a/src/renderer/src/services/TabsService.ts b/src/renderer/src/services/TabsService.ts index a05220f1a3..a0c22c488b 100644 --- a/src/renderer/src/services/TabsService.ts +++ b/src/renderer/src/services/TabsService.ts @@ -1,9 +1,9 @@ import { loggerService } from '@logger' import store from '@renderer/store' import { removeTab, setActiveTab } from '@renderer/store/tabs' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' import { clearWebviewState } from '@renderer/utils/webviewStateManager' -import { LRUCache } from 'lru-cache' +import type { LRUCache } from 'lru-cache' import NavigationService from './NavigationService' diff --git a/src/renderer/src/services/TokenService.ts b/src/renderer/src/services/TokenService.ts index bb5a64621c..3dd6410234 100644 --- a/src/renderer/src/services/TokenService.ts +++ b/src/renderer/src/services/TokenService.ts @@ -1,4 +1,5 @@ -import { Assistant, FileMetadata, FileTypes, Usage } from '@renderer/types' +import type { Assistant, FileMetadata, Usage } from '@renderer/types' +import { FileTypes } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' import { findFileBlocks, getMainTextContent, getThinkingContent } from '@renderer/utils/messageUtils/find' import { flatten, takeRight } from 'lodash' diff --git a/src/renderer/src/services/TranslateService.ts b/src/renderer/src/services/TranslateService.ts index 0eb7fd24f7..f7abfdb3b9 100644 --- a/src/renderer/src/services/TranslateService.ts +++ b/src/renderer/src/services/TranslateService.ts @@ -1,13 +1,14 @@ import { loggerService } from '@logger' import { db } from '@renderer/databases' -import { +import type { CustomTranslateLanguage, FetchChatCompletionOptions, TranslateHistory, TranslateLanguage, TranslateLanguageCode } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { uuid } from '@renderer/utils' import { readyToAbort } from '@renderer/utils/abortController' import { isAbortError } from '@renderer/utils/error' diff --git a/src/renderer/src/services/WebSearchService.ts b/src/renderer/src/services/WebSearchService.ts index ed274b04a9..f92d2d90be 100644 --- a/src/renderer/src/services/WebSearchService.ts +++ b/src/renderer/src/services/WebSearchService.ts @@ -5,8 +5,8 @@ import WebSearchEngineProvider from '@renderer/providers/WebSearchProvider' import { addSpan, endSpan } from '@renderer/services/SpanManagerService' import store from '@renderer/store' import { setWebSearchStatus } from '@renderer/store/runtime' -import { CompressionConfig, WebSearchState } from '@renderer/store/websearch' -import { +import type { CompressionConfig, WebSearchState } from '@renderer/store/websearch' +import type { KnowledgeBase, KnowledgeItem, KnowledgeReference, @@ -18,7 +18,7 @@ import { import { hasObjectKey, removeSpecialCharactersForFileName, uuid } from '@renderer/utils' import { addAbortController } from '@renderer/utils/abortController' import { formatErrorMessage } from '@renderer/utils/error' -import { ExtractResults } from '@renderer/utils/extract' +import type { ExtractResults } from '@renderer/utils/extract' import { fetchWebContents } from '@renderer/utils/fetch' import { consolidateReferencesByUrl, selectReferences } from '@renderer/utils/websearch' import dayjs from 'dayjs' diff --git a/src/renderer/src/services/WebTraceService.ts b/src/renderer/src/services/WebTraceService.ts index 119da16d05..2a40772c2f 100644 --- a/src/renderer/src/services/WebTraceService.ts +++ b/src/renderer/src/services/WebTraceService.ts @@ -2,7 +2,7 @@ import { loggerService } from '@logger' import { convertSpanToSpanEntity, FunctionSpanExporter, FunctionSpanProcessor } from '@mcp-trace/trace-core' import { WebTracer } from '@mcp-trace/trace-web' import { trace } from '@opentelemetry/api' -import { ReadableSpan } from '@opentelemetry/sdk-trace-base' +import type { ReadableSpan } from '@opentelemetry/sdk-trace-base' const logger = loggerService.withContext('WebTraceService') diff --git a/src/renderer/src/services/__tests__/ApiService.test.ts b/src/renderer/src/services/__tests__/ApiService.test.ts index a5dabc1125..f94be936c1 100644 --- a/src/renderer/src/services/__tests__/ApiService.test.ts +++ b/src/renderer/src/services/__tests__/ApiService.test.ts @@ -1,35 +1,36 @@ -import { ToolUseBlock } from '@anthropic-ai/sdk/resources' -import { +import type { ToolUseBlock } from '@anthropic-ai/sdk/resources' +import type { TextBlock, TextDelta, Usage, WebSearchResultBlock, WebSearchToolResultError } from '@anthropic-ai/sdk/resources/messages' -import OpenAI from '@cherrystudio/openai' -import { ChatCompletionChunk } from '@cherrystudio/openai/resources' +import type OpenAI from '@cherrystudio/openai' +import type { ChatCompletionChunk } from '@cherrystudio/openai/resources' +import type { FunctionCall } from '@google/genai' import { FinishReason, MediaModality } from '@google/genai' -import { FunctionCall } from '@google/genai' import AiProvider from '@renderer/aiCore' -import { BaseApiClient, OpenAIAPIClient, ResponseChunkTransformerContext } from '@renderer/aiCore/legacy/clients' -import { AnthropicAPIClient } from '@renderer/aiCore/legacy/clients/anthropic/AnthropicAPIClient' +import type { BaseApiClient, OpenAIAPIClient, ResponseChunkTransformerContext } from '@renderer/aiCore/legacy/clients' +import type { AnthropicAPIClient } from '@renderer/aiCore/legacy/clients/anthropic/AnthropicAPIClient' import { ApiClientFactory } from '@renderer/aiCore/legacy/clients/ApiClientFactory' -import { GeminiAPIClient } from '@renderer/aiCore/legacy/clients/gemini/GeminiAPIClient' -import { OpenAIResponseAPIClient } from '@renderer/aiCore/legacy/clients/openai/OpenAIResponseAPIClient' -import { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas' +import type { GeminiAPIClient } from '@renderer/aiCore/legacy/clients/gemini/GeminiAPIClient' +import type { OpenAIResponseAPIClient } from '@renderer/aiCore/legacy/clients/openai/OpenAIResponseAPIClient' +import type { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas' import { isVisionModel } from '@renderer/config/models' -import { LlmState } from '@renderer/store/llm' -import { Assistant, MCPCallToolResponse, MCPToolResponse, Model, Provider, WebSearchSource } from '@renderer/types' -import { +import type { LlmState } from '@renderer/store/llm' +import type { Assistant, MCPCallToolResponse, MCPToolResponse, Model, Provider } from '@renderer/types' +import { WebSearchSource } from '@renderer/types' +import type { Chunk, - ChunkType, LLMResponseCompleteChunk, LLMWebSearchCompleteChunk, TextDeltaChunk, TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk' -import { +import { ChunkType } from '@renderer/types/chunk' +import type { AnthropicSdkRawChunk, GeminiSdkMessageParam, GeminiSdkRawChunk, diff --git a/src/renderer/src/services/__tests__/ModelMessageService.test.ts b/src/renderer/src/services/__tests__/ModelMessageService.test.ts index 4017f028ce..a54ac6f9ee 100644 --- a/src/renderer/src/services/__tests__/ModelMessageService.test.ts +++ b/src/renderer/src/services/__tests__/ModelMessageService.test.ts @@ -1,4 +1,4 @@ -import { ChatCompletionMessageParam } from '@cherrystudio/openai/resources' +import type { ChatCompletionMessageParam } from '@cherrystudio/openai/resources' import type { Model } from '@renderer/types' import { describe, expect, it } from 'vitest' diff --git a/src/renderer/src/services/__tests__/ShikiStreamTokenizer.test.ts b/src/renderer/src/services/__tests__/ShikiStreamTokenizer.test.ts index cb74ff4eaf..a87f1a80fd 100644 --- a/src/renderer/src/services/__tests__/ShikiStreamTokenizer.test.ts +++ b/src/renderer/src/services/__tests__/ShikiStreamTokenizer.test.ts @@ -1,4 +1,5 @@ -import { createHighlighter, HighlighterCore } from 'shiki' +import type { HighlighterCore } from 'shiki' +import { createHighlighter } from 'shiki' import { afterEach, beforeEach, describe, expect, it } from 'vitest' import { ShikiStreamTokenizer } from '../ShikiStreamTokenizer' diff --git a/src/renderer/src/services/__tests__/helpers/ShikiStreamTokenizer.helper.ts b/src/renderer/src/services/__tests__/helpers/ShikiStreamTokenizer.helper.ts index ab32c015d2..d9a6c5be9a 100644 --- a/src/renderer/src/services/__tests__/helpers/ShikiStreamTokenizer.helper.ts +++ b/src/renderer/src/services/__tests__/helpers/ShikiStreamTokenizer.helper.ts @@ -1,5 +1,6 @@ -import { ShikiStreamTokenizer } from '@renderer/services/ShikiStreamTokenizer' -import { getTokenStyleObject, HighlighterCore, stringifyTokenStyle, type ThemedToken } from 'shiki/core' +import type { ShikiStreamTokenizer } from '@renderer/services/ShikiStreamTokenizer' +import type { HighlighterCore } from 'shiki/core' +import { getTokenStyleObject, stringifyTokenStyle, type ThemedToken } from 'shiki/core' /** * 使用 ShikiStreamTokenizer 获取流式高亮代码 diff --git a/src/renderer/src/services/messageStreaming/BlockManager.ts b/src/renderer/src/services/messageStreaming/BlockManager.ts index c07c67f804..9e638ebf14 100644 --- a/src/renderer/src/services/messageStreaming/BlockManager.ts +++ b/src/renderer/src/services/messageStreaming/BlockManager.ts @@ -2,7 +2,8 @@ import { loggerService } from '@logger' import type { AppDispatch, RootState } from '@renderer/store' import { updateOneBlock, upsertOneBlock } from '@renderer/store/messageBlock' import { newMessagesActions } from '@renderer/store/newMessage' -import { MessageBlock, MessageBlockType } from '@renderer/types/newMessage' +import type { MessageBlock } from '@renderer/types/newMessage' +import { MessageBlockType } from '@renderer/types/newMessage' const logger = loggerService.withContext('BlockManager') diff --git a/src/renderer/src/services/messageStreaming/callbacks/baseCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/baseCallbacks.ts index e7d7f005f7..b38539acde 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/baseCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/baseCallbacks.ts @@ -7,21 +7,17 @@ import { estimateMessagesUsage } from '@renderer/services/TokenService' import { selectMessagesForTopic } from '@renderer/store/newMessage' import { newMessagesActions } from '@renderer/store/newMessage' import type { Assistant } from '@renderer/types' -import type { Response } from '@renderer/types/newMessage' -import { - AssistantMessageStatus, - MessageBlockStatus, - MessageBlockType, - PlaceholderMessageBlock -} from '@renderer/types/newMessage' +import type { PlaceholderMessageBlock, Response } from '@renderer/types/newMessage' +import { AssistantMessageStatus, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { uuid } from '@renderer/utils' import { isAbortError, serializeError } from '@renderer/utils/error' import { createBaseMessageBlock, createErrorBlock } from '@renderer/utils/messageUtils/create' import { findAllBlocks, getMainTextContent } from '@renderer/utils/messageUtils/find' import { isFocused, isOnHomePage } from '@renderer/utils/window' -import { AISDKError, NoOutputGeneratedError } from 'ai' +import type { AISDKError } from 'ai' +import { NoOutputGeneratedError } from 'ai' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' const logger = loggerService.withContext('BaseCallbacks') interface BaseCallbacksDependencies { diff --git a/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts index 56d0680839..9e99fe7520 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts @@ -1,10 +1,11 @@ import { loggerService } from '@logger' import type { ExternalToolResult } from '@renderer/types' -import { CitationMessageBlock, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' +import type { CitationMessageBlock } from '@renderer/types/newMessage' +import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { createCitationBlock } from '@renderer/utils/messageUtils/create' import { findMainTextBlocks } from '@renderer/utils/messageUtils/find' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' const logger = loggerService.withContext('CitationCallbacks') diff --git a/src/renderer/src/services/messageStreaming/callbacks/imageCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/imageCallbacks.ts index ca5c0060be..00624bc43e 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/imageCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/imageCallbacks.ts @@ -1,8 +1,9 @@ import { loggerService } from '@logger' -import { ImageMessageBlock, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' +import type { ImageMessageBlock } from '@renderer/types/newMessage' +import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { createImageBlock } from '@renderer/utils/messageUtils/create' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' const logger = loggerService.withContext('ImageCallbacks') diff --git a/src/renderer/src/services/messageStreaming/callbacks/index.ts b/src/renderer/src/services/messageStreaming/callbacks/index.ts index 18647745ee..4dc48b8738 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/index.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/index.ts @@ -1,6 +1,6 @@ import type { Assistant } from '@renderer/types' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' import { createBaseCallbacks } from './baseCallbacks' import { createCitationCallbacks } from './citationCallbacks' import { createImageCallbacks } from './imageCallbacks' diff --git a/src/renderer/src/services/messageStreaming/callbacks/textCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/textCallbacks.ts index 3756c88c82..9d479796e4 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/textCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/textCallbacks.ts @@ -1,9 +1,10 @@ import { loggerService } from '@logger' import { WebSearchSource } from '@renderer/types' -import { CitationMessageBlock, MessageBlock, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' +import type { CitationMessageBlock, MessageBlock } from '@renderer/types/newMessage' +import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { createMainTextBlock } from '@renderer/utils/messageUtils/create' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' const logger = loggerService.withContext('TextCallbacks') diff --git a/src/renderer/src/services/messageStreaming/callbacks/thinkingCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/thinkingCallbacks.ts index 605259b646..aeb160fd02 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/thinkingCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/thinkingCallbacks.ts @@ -1,8 +1,9 @@ import { loggerService } from '@logger' -import { MessageBlock, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' +import type { MessageBlock } from '@renderer/types/newMessage' +import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { createThinkingBlock } from '@renderer/utils/messageUtils/create' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' const logger = loggerService.withContext('ThinkingCallbacks') interface ThinkingCallbacksDependencies { diff --git a/src/renderer/src/services/messageStreaming/callbacks/toolCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/toolCallbacks.ts index ef65a4962a..ce64ea90a6 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/toolCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/toolCallbacks.ts @@ -1,10 +1,11 @@ import { loggerService } from '@logger' import type { MCPToolResponse } from '@renderer/types' import { WebSearchSource } from '@renderer/types' -import { MessageBlockStatus, MessageBlockType, ToolMessageBlock } from '@renderer/types/newMessage' +import type { ToolMessageBlock } from '@renderer/types/newMessage' +import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { createCitationBlock, createToolBlock } from '@renderer/utils/messageUtils/create' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' const logger = loggerService.withContext('ToolCallbacks') diff --git a/src/renderer/src/services/messageStreaming/callbacks/videoCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/videoCallbacks.ts index 88bde439b8..65fd201f5f 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/videoCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/videoCallbacks.ts @@ -2,7 +2,7 @@ import { loggerService } from '@logger' import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import { createVideoBlock } from '@renderer/utils/messageUtils/create' -import { BlockManager } from '../BlockManager' +import type { BlockManager } from '../BlockManager' const logger = loggerService.withContext('VideoCallbacks') diff --git a/src/renderer/src/services/ocr/OcrService.ts b/src/renderer/src/services/ocr/OcrService.ts index 74fcc0c64d..ba4122fa16 100644 --- a/src/renderer/src/services/ocr/OcrService.ts +++ b/src/renderer/src/services/ocr/OcrService.ts @@ -1,5 +1,6 @@ import { loggerService } from '@logger' -import { isOcrApiProvider, OcrProvider, OcrResult, SupportedOcrFile } from '@renderer/types' +import type { OcrProvider, OcrResult, SupportedOcrFile } from '@renderer/types' +import { isOcrApiProvider } from '@renderer/types' import { OcrApiClientFactory } from './clients/OcrApiClientFactory' diff --git a/src/renderer/src/services/ocr/clients/OcrApiClientFactory.ts b/src/renderer/src/services/ocr/clients/OcrApiClientFactory.ts index e685c0e3f9..1685d1764b 100644 --- a/src/renderer/src/services/ocr/clients/OcrApiClientFactory.ts +++ b/src/renderer/src/services/ocr/clients/OcrApiClientFactory.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' -import { OcrApiProvider } from '@renderer/types' +import type { OcrApiProvider } from '@renderer/types' -import { OcrBaseApiClient } from './OcrBaseApiClient' +import type { OcrBaseApiClient } from './OcrBaseApiClient' import { OcrExampleApiClient } from './OcrExampleApiClient' const logger = loggerService.withContext('OcrApiClientFactory') diff --git a/src/renderer/src/services/ocr/clients/OcrBaseApiClient.ts b/src/renderer/src/services/ocr/clients/OcrBaseApiClient.ts index c9605671ae..a81a3f972a 100644 --- a/src/renderer/src/services/ocr/clients/OcrBaseApiClient.ts +++ b/src/renderer/src/services/ocr/clients/OcrBaseApiClient.ts @@ -1,4 +1,4 @@ -import { OcrApiProvider, OcrHandler } from '@renderer/types' +import type { OcrApiProvider, OcrHandler } from '@renderer/types' export abstract class OcrBaseApiClient { public provider: OcrApiProvider diff --git a/src/renderer/src/services/ocr/clients/OcrExampleApiClient.ts b/src/renderer/src/services/ocr/clients/OcrExampleApiClient.ts index 34d28173bb..76a404cf9f 100644 --- a/src/renderer/src/services/ocr/clients/OcrExampleApiClient.ts +++ b/src/renderer/src/services/ocr/clients/OcrExampleApiClient.ts @@ -1,4 +1,4 @@ -import { OcrApiProvider, SupportedOcrFile } from '@renderer/types' +import type { OcrApiProvider, SupportedOcrFile } from '@renderer/types' import { OcrBaseApiClient } from './OcrBaseApiClient' diff --git a/src/renderer/src/store/assistants.ts b/src/renderer/src/store/assistants.ts index 98454097c4..9b3d7c0e01 100644 --- a/src/renderer/src/store/assistants.ts +++ b/src/renderer/src/store/assistants.ts @@ -1,11 +1,12 @@ -import { createSelector, createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSelector, createSlice } from '@reduxjs/toolkit' import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant' import { TopicManager } from '@renderer/hooks/useTopic' import { DEFAULT_ASSISTANT_SETTINGS, getDefaultAssistant, getDefaultTopic } from '@renderer/services/AssistantService' -import { Assistant, AssistantPreset, AssistantSettings, Model, Topic } from '@renderer/types' +import type { Assistant, AssistantPreset, AssistantSettings, Model, Topic } from '@renderer/types' import { isEmpty, uniqBy } from 'lodash' -import { RootState } from '.' +import type { RootState } from '.' export interface AssistantsState { defaultAssistant: Assistant diff --git a/src/renderer/src/store/backup.ts b/src/renderer/src/store/backup.ts index cf5d8e6e30..fbb3853a12 100644 --- a/src/renderer/src/store/backup.ts +++ b/src/renderer/src/store/backup.ts @@ -1,4 +1,5 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' export interface RemoteSyncState { lastSyncTime: number | null diff --git a/src/renderer/src/store/codeTools.ts b/src/renderer/src/store/codeTools.ts index fd23d9fff8..44070a76e4 100644 --- a/src/renderer/src/store/codeTools.ts +++ b/src/renderer/src/store/codeTools.ts @@ -1,5 +1,6 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { Model } from '@renderer/types' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' +import type { Model } from '@renderer/types' import { codeTools, terminalApps } from '@shared/config/constant' // 常量定义 diff --git a/src/renderer/src/store/copilot.ts b/src/renderer/src/store/copilot.ts index 5bcf142b1c..ab7e50ee84 100644 --- a/src/renderer/src/store/copilot.ts +++ b/src/renderer/src/store/copilot.ts @@ -1,4 +1,5 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' export interface CopilotState { username?: string diff --git a/src/renderer/src/store/inputTools.ts b/src/renderer/src/store/inputTools.ts index 4906bb58cc..0ecc8b003e 100644 --- a/src/renderer/src/store/inputTools.ts +++ b/src/renderer/src/store/inputTools.ts @@ -1,5 +1,6 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { InputBarToolType } from '@renderer/types/chat' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' +import type { InputBarToolType } from '@renderer/types/chat' type ToolOrder = { visible: InputBarToolType[] diff --git a/src/renderer/src/store/knowledge.ts b/src/renderer/src/store/knowledge.ts index f74752b21e..6280a99e8d 100644 --- a/src/renderer/src/store/knowledge.ts +++ b/src/renderer/src/store/knowledge.ts @@ -1,7 +1,8 @@ import { loggerService } from '@logger' -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' import FileManager from '@renderer/services/FileManager' -import { FileMetadata, KnowledgeBase, KnowledgeItem, PreprocessProvider, ProcessingStatus } from '@renderer/types' +import type { FileMetadata, KnowledgeBase, KnowledgeItem, PreprocessProvider, ProcessingStatus } from '@renderer/types' const logger = loggerService.withContext('Store:Knowledge') diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 6dd1b777a5..737de4440b 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -1,8 +1,9 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' import { isLocalAi } from '@renderer/config/env' import { SYSTEM_MODELS } from '@renderer/config/models' import { SYSTEM_PROVIDERS } from '@renderer/config/providers' -import { Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' import { uniqBy } from 'lodash' type LlmSettings = { diff --git a/src/renderer/src/store/messageBlock.ts b/src/renderer/src/store/messageBlock.ts index cddb8dcd68..ba0e11be0a 100644 --- a/src/renderer/src/store/messageBlock.ts +++ b/src/renderer/src/store/messageBlock.ts @@ -1,8 +1,9 @@ -import { WebSearchResultBlock } from '@anthropic-ai/sdk/resources' +import type { WebSearchResultBlock } from '@anthropic-ai/sdk/resources' import type OpenAI from '@cherrystudio/openai' import type { GroundingMetadata } from '@google/genai' import { createEntityAdapter, createSelector, createSlice, type PayloadAction } from '@reduxjs/toolkit' -import { AISDKWebSearchResult, Citation, WebSearchProviderResponse, WebSearchSource } from '@renderer/types' +import type { AISDKWebSearchResult, Citation, WebSearchProviderResponse } from '@renderer/types' +import { WebSearchSource } from '@renderer/types' import type { CitationMessageBlock, MessageBlock } from '@renderer/types/newMessage' import { MessageBlockType } from '@renderer/types/newMessage' diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 10c0c4e910..c6e3a9576c 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -21,24 +21,22 @@ import db from '@renderer/databases' import i18n from '@renderer/i18n' import { DEFAULT_ASSISTANT_SETTINGS } from '@renderer/services/AssistantService' import { defaultPreprocessProviders } from '@renderer/store/preprocess' -import { +import type { Assistant, BuiltinOcrProvider, - isBuiltinMCPServer, - isSystemProvider, Model, Provider, ProviderApiOptions, - SystemProviderIds, TranslateLanguageCode, WebSearchProvider } from '@renderer/types' +import { isBuiltinMCPServer, isSystemProvider, SystemProviderIds } from '@renderer/types' import { getDefaultGroupName, getLeadingEmoji, runAsyncFunction, uuid } from '@renderer/utils' import { defaultByPassRules, UpgradeChannel } from '@shared/config/constant' import { isEmpty } from 'lodash' import { createMigrate } from 'redux-persist' -import { RootState } from '.' +import type { RootState } from '.' import { DEFAULT_TOOL_ORDER } from './inputTools' import { initialState as llmInitialState, moveProvider } from './llm' import { mcpSlice } from './mcp' diff --git a/src/renderer/src/store/minapps.ts b/src/renderer/src/store/minapps.ts index 95fea71a09..8ca59a5bd2 100644 --- a/src/renderer/src/store/minapps.ts +++ b/src/renderer/src/store/minapps.ts @@ -1,6 +1,7 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' -import { MinAppType } from '@renderer/types' +import type { MinAppType } from '@renderer/types' export interface MinAppsState { enabled: MinAppType[] diff --git a/src/renderer/src/store/newMessage.ts b/src/renderer/src/store/newMessage.ts index 82b81adb8b..cd8c0dde83 100644 --- a/src/renderer/src/store/newMessage.ts +++ b/src/renderer/src/store/newMessage.ts @@ -1,5 +1,6 @@ import { loggerService } from '@logger' -import { createEntityAdapter, createSlice, EntityState, PayloadAction } from '@reduxjs/toolkit' +import type { EntityState, PayloadAction } from '@reduxjs/toolkit' +import { createEntityAdapter, createSlice } from '@reduxjs/toolkit' // Separate type-only imports from value imports import type { Message } from '@renderer/types/newMessage' import { AssistantMessageStatus, MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' diff --git a/src/renderer/src/store/note.ts b/src/renderer/src/store/note.ts index 38f331c76e..25347a8764 100644 --- a/src/renderer/src/store/note.ts +++ b/src/renderer/src/store/note.ts @@ -1,7 +1,8 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { RootState } from '@renderer/store/index' -import { EditorView } from '@renderer/types' -import { NotesSortType } from '@renderer/types/note' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' +import type { RootState } from '@renderer/store/index' +import type { EditorView } from '@renderer/types' +import type { NotesSortType } from '@renderer/types/note' export interface NotesSettings { isFullWidth: boolean diff --git a/src/renderer/src/store/nutstore.ts b/src/renderer/src/store/nutstore.ts index e2a05f021e..d494ec269f 100644 --- a/src/renderer/src/store/nutstore.ts +++ b/src/renderer/src/store/nutstore.ts @@ -1,6 +1,7 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' -import { RemoteSyncState } from './backup' +import type { RemoteSyncState } from './backup' export interface NutstoreSyncState extends RemoteSyncState {} diff --git a/src/renderer/src/store/ocr.ts b/src/renderer/src/store/ocr.ts index 6de861d7f5..8e997bd6d5 100644 --- a/src/renderer/src/store/ocr.ts +++ b/src/renderer/src/store/ocr.ts @@ -1,6 +1,7 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' import { BUILTIN_OCR_PROVIDERS, DEFAULT_OCR_PROVIDER } from '@renderer/config/ocr' -import { OcrProvider, OcrProviderConfig } from '@renderer/types' +import type { OcrProvider, OcrProviderConfig } from '@renderer/types' export interface OcrState { providers: OcrProvider[] diff --git a/src/renderer/src/store/paintings.ts b/src/renderer/src/store/paintings.ts index d144041311..e5fc6f59e2 100644 --- a/src/renderer/src/store/paintings.ts +++ b/src/renderer/src/store/paintings.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { PaintingAction, PaintingsState } from '@renderer/types' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' +import type { PaintingAction, PaintingsState } from '@renderer/types' const logger = loggerService.withContext('Store:paintings') diff --git a/src/renderer/src/store/preprocess.ts b/src/renderer/src/store/preprocess.ts index 2beab719f6..29fc2993b7 100644 --- a/src/renderer/src/store/preprocess.ts +++ b/src/renderer/src/store/preprocess.ts @@ -1,5 +1,6 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { PreprocessProvider } from '@renderer/types' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' +import type { PreprocessProvider } from '@renderer/types' export interface PreprocessState { providers: PreprocessProvider[] diff --git a/src/renderer/src/store/runtime.ts b/src/renderer/src/store/runtime.ts index f86a79cecb..c3487aaa18 100644 --- a/src/renderer/src/store/runtime.ts +++ b/src/renderer/src/store/runtime.ts @@ -1,4 +1,5 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' import { AppLogo, UserAvatar } from '@renderer/config/env' import type { MinAppType, Topic, WebSearchStatus } from '@renderer/types' import type { UpdateInfo } from 'builder-util-runtime' diff --git a/src/renderer/src/store/selectionStore.ts b/src/renderer/src/store/selectionStore.ts index 0eaecb25fa..fe63ae230e 100644 --- a/src/renderer/src/store/selectionStore.ts +++ b/src/renderer/src/store/selectionStore.ts @@ -1,5 +1,6 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { ActionItem, FilterMode, SelectionState, TriggerMode } from '@renderer/types/selectionTypes' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' +import type { ActionItem, FilterMode, SelectionState, TriggerMode } from '@renderer/types/selectionTypes' export const defaultActionItems: ActionItem[] = [ { id: 'translate', name: 'selection.action.builtin.translate', enabled: true, isBuiltIn: true, icon: 'languages' }, diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 273653aa0c..eccaf733d8 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -1,8 +1,9 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' import { isMac } from '@renderer/config/constant' import { TRANSLATE_PROMPT } from '@renderer/config/prompts' import { DEFAULT_SIDEBAR_ICONS } from '@renderer/config/sidebar' -import { +import type { ApiServerConfig, AssistantsSortType, CodeStyleVarious, @@ -13,14 +14,14 @@ import { PaintingProvider, S3Config, SidebarIcon, - ThemeMode, TranslateLanguageCode } from '@renderer/types' +import { ThemeMode } from '@renderer/types' import { uuid } from '@renderer/utils' import { UpgradeChannel } from '@shared/config/constant' -import { OpenAIVerbosity } from '@types' +import type { OpenAIVerbosity } from '@types' -import { RemoteSyncState } from './backup' +import type { RemoteSyncState } from './backup' export type SendMessageShortcut = 'Enter' | 'Shift+Enter' | 'Ctrl+Enter' | 'Command+Enter' | 'Alt+Enter' diff --git a/src/renderer/src/store/shortcuts.ts b/src/renderer/src/store/shortcuts.ts index 634a5fb4d0..9b4cc1341a 100644 --- a/src/renderer/src/store/shortcuts.ts +++ b/src/renderer/src/store/shortcuts.ts @@ -1,5 +1,6 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { Shortcut } from '@renderer/types' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' +import type { Shortcut } from '@renderer/types' import { ZOOM_SHORTCUTS } from '@shared/config/constant' export interface ShortcutsState { diff --git a/src/renderer/src/store/tabs.ts b/src/renderer/src/store/tabs.ts index 16195cd5f2..87d7342779 100644 --- a/src/renderer/src/store/tabs.ts +++ b/src/renderer/src/store/tabs.ts @@ -1,4 +1,5 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' export interface Tab { id: string diff --git a/src/renderer/src/store/thunk/__tests__/knowledgeThunk.test.ts b/src/renderer/src/store/thunk/__tests__/knowledgeThunk.test.ts index b5bb0a5d54..555e5706c0 100644 --- a/src/renderer/src/store/thunk/__tests__/knowledgeThunk.test.ts +++ b/src/renderer/src/store/thunk/__tests__/knowledgeThunk.test.ts @@ -1,5 +1,6 @@ import { addFiles as addFilesAction, addItem, updateNotes } from '@renderer/store/knowledge' -import { FileMetadata, FileTypes, KnowledgeItem } from '@renderer/types' +import type { FileMetadata, KnowledgeItem } from '@renderer/types' +import { FileTypes } from '@renderer/types' import { beforeEach, describe, expect, it, vi } from 'vitest' import { addFilesThunk, addItemThunk, addNoteThunk } from '../knowledgeThunk' diff --git a/src/renderer/src/store/thunk/knowledgeThunk.ts b/src/renderer/src/store/thunk/knowledgeThunk.ts index 169f05c728..97c435d169 100644 --- a/src/renderer/src/store/thunk/knowledgeThunk.ts +++ b/src/renderer/src/store/thunk/knowledgeThunk.ts @@ -1,10 +1,11 @@ import { loggerService } from '@logger' import { db } from '@renderer/databases' import { addFiles as addFilesAction, addItem, updateNotes } from '@renderer/store/knowledge' -import { FileMetadata, isKnowledgeNoteItem, KnowledgeItem } from '@renderer/types' +import type { FileMetadata, KnowledgeItem } from '@renderer/types' +import { isKnowledgeNoteItem } from '@renderer/types' import { v4 as uuidv4 } from 'uuid' -import { AppDispatch } from '..' +import type { AppDispatch } from '..' const logger = loggerService.withContext('knowledgeThunk') diff --git a/src/renderer/src/store/toolPermissions.ts b/src/renderer/src/store/toolPermissions.ts index dad8c13d40..a7ac87482e 100644 --- a/src/renderer/src/store/toolPermissions.ts +++ b/src/renderer/src/store/toolPermissions.ts @@ -1,5 +1,6 @@ import type { PermissionUpdate } from '@anthropic-ai/claude-agent-sdk' -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' export type ToolPermissionRequestPayload = { requestId: string diff --git a/src/renderer/src/store/translate.ts b/src/renderer/src/store/translate.ts index 999f7f6580..0e4c56e731 100644 --- a/src/renderer/src/store/translate.ts +++ b/src/renderer/src/store/translate.ts @@ -1,4 +1,5 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' export interface TranslateState { translateInput: string diff --git a/src/renderer/src/store/websearch.ts b/src/renderer/src/store/websearch.ts index 16029ccf47..f166bb1949 100644 --- a/src/renderer/src/store/websearch.ts +++ b/src/renderer/src/store/websearch.ts @@ -1,4 +1,5 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' +import { createSlice } from '@reduxjs/toolkit' import { WEB_SEARCH_PROVIDERS } from '@renderer/config/webSearchProviders' import type { Model, WebSearchProvider } from '@renderer/types' export interface SubscribeSource { diff --git a/src/renderer/src/tools/index.ts b/src/renderer/src/tools/index.ts index 69cddaae3e..2f5168c180 100644 --- a/src/renderer/src/tools/index.ts +++ b/src/renderer/src/tools/index.ts @@ -1,4 +1,4 @@ -import { MCPTool } from '@renderer/types' +import type { MCPTool } from '@renderer/types' import { thinkTool } from './think' diff --git a/src/renderer/src/tools/think.ts b/src/renderer/src/tools/think.ts index 1e17d3e865..4ca7fb4357 100644 --- a/src/renderer/src/tools/think.ts +++ b/src/renderer/src/tools/think.ts @@ -1,4 +1,4 @@ -import { MCPTool } from '@renderer/types' +import type { MCPTool } from '@renderer/types' export const thinkTool: MCPTool = { id: 'dummy-server-think', diff --git a/src/renderer/src/trace/dataHandler/AsyncIterableHandler.ts b/src/renderer/src/trace/dataHandler/AsyncIterableHandler.ts index 1bdcc679e5..ddc0a90f8d 100644 --- a/src/renderer/src/trace/dataHandler/AsyncIterableHandler.ts +++ b/src/renderer/src/trace/dataHandler/AsyncIterableHandler.ts @@ -1,7 +1,7 @@ -import { TokenUsage } from '@mcp-trace/trace-core' -import { Span } from '@opentelemetry/api' +import type { TokenUsage } from '@mcp-trace/trace-core' +import type { Span } from '@opentelemetry/api' import { endSpan } from '@renderer/services/SpanManagerService' -import { SdkRawChunk } from '@renderer/types/sdk' +import type { SdkRawChunk } from '@renderer/types/sdk' export class AsyncIterableHandler { private span: Span diff --git a/src/renderer/src/trace/dataHandler/CommonResultHandler.ts b/src/renderer/src/trace/dataHandler/CommonResultHandler.ts index c66528abb0..468555d948 100644 --- a/src/renderer/src/trace/dataHandler/CommonResultHandler.ts +++ b/src/renderer/src/trace/dataHandler/CommonResultHandler.ts @@ -1,6 +1,6 @@ -import { TokenUsage } from '@mcp-trace/trace-core' -import { Span } from '@opentelemetry/api' -import { CompletionsResult } from '@renderer/aiCore/legacy/middleware/schemas' +import type { TokenUsage } from '@mcp-trace/trace-core' +import type { Span } from '@opentelemetry/api' +import type { CompletionsResult } from '@renderer/aiCore/legacy/middleware/schemas' import { endSpan } from '@renderer/services/SpanManagerService' export class CompletionsResultHandler { diff --git a/src/renderer/src/trace/dataHandler/MessageStreamHandler.ts b/src/renderer/src/trace/dataHandler/MessageStreamHandler.ts index 347194983f..b000dfb5f4 100644 --- a/src/renderer/src/trace/dataHandler/MessageStreamHandler.ts +++ b/src/renderer/src/trace/dataHandler/MessageStreamHandler.ts @@ -1,6 +1,6 @@ -import { Message, MessageStream } from '@anthropic-ai/sdk/resources/messages/messages' -import { TokenUsage } from '@mcp-trace/trace-core' -import { Span } from '@opentelemetry/api' +import type { Message, MessageStream } from '@anthropic-ai/sdk/resources/messages/messages' +import type { TokenUsage } from '@mcp-trace/trace-core' +import type { Span } from '@opentelemetry/api' import { endSpan } from '@renderer/services/SpanManagerService' export class MessageStreamHandler { diff --git a/src/renderer/src/trace/dataHandler/StreamHandler.ts b/src/renderer/src/trace/dataHandler/StreamHandler.ts index c071bdacde..dddec93edc 100644 --- a/src/renderer/src/trace/dataHandler/StreamHandler.ts +++ b/src/renderer/src/trace/dataHandler/StreamHandler.ts @@ -1,7 +1,7 @@ -import { OpenAI } from '@cherrystudio/openai' -import { Stream } from '@cherrystudio/openai/streaming' -import { TokenUsage } from '@mcp-trace/trace-core' -import { Span } from '@opentelemetry/api' +import type { OpenAI } from '@cherrystudio/openai' +import type { Stream } from '@cherrystudio/openai/streaming' +import type { TokenUsage } from '@mcp-trace/trace-core' +import type { Span } from '@opentelemetry/api' import { endSpan } from '@renderer/services/SpanManagerService' export class StreamHandler { diff --git a/src/renderer/src/trace/pages/SpanDetail.tsx b/src/renderer/src/trace/pages/SpanDetail.tsx index 925dd0d5be..b4f80a8351 100644 --- a/src/renderer/src/trace/pages/SpanDetail.tsx +++ b/src/renderer/src/trace/pages/SpanDetail.tsx @@ -3,8 +3,9 @@ import './Trace.css' import { DoubleLeftOutlined } from '@ant-design/icons' import { loggerService } from '@logger' // import TraceModal from '@renderer/trace/TraceModal' -import { TraceModal } from '@renderer/trace/pages/TraceModel' -import { FC, useCallback, useEffect, useState } from 'react' +import type { TraceModal } from '@renderer/trace/pages/TraceModel' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import ReactJson from 'react-json-view' diff --git a/src/renderer/src/trace/pages/TraceModel.tsx b/src/renderer/src/trace/pages/TraceModel.tsx index 5fb8bc0c24..2ec92d7b48 100644 --- a/src/renderer/src/trace/pages/TraceModel.tsx +++ b/src/renderer/src/trace/pages/TraceModel.tsx @@ -1,4 +1,4 @@ -import { SpanEntity } from '@mcp-trace/trace-core' +import type { SpanEntity } from '@mcp-trace/trace-core' export interface TraceModal extends SpanEntity { children: TraceModal[] diff --git a/src/renderer/src/trace/pages/TraceTree.tsx b/src/renderer/src/trace/pages/TraceTree.tsx index 01384bc9cc..31f69f2436 100644 --- a/src/renderer/src/trace/pages/TraceTree.tsx +++ b/src/renderer/src/trace/pages/TraceTree.tsx @@ -1,4 +1,4 @@ -import { TraceModal } from '@renderer/trace/pages/TraceModel' +import type { TraceModal } from '@renderer/trace/pages/TraceModel' import { Divider } from 'antd/lib' import * as React from 'react' import { useEffect, useState } from 'react' diff --git a/src/renderer/src/trace/pages/index.tsx b/src/renderer/src/trace/pages/index.tsx index 507ce813a6..f83d160df9 100644 --- a/src/renderer/src/trace/pages/index.tsx +++ b/src/renderer/src/trace/pages/index.tsx @@ -1,7 +1,7 @@ import './Trace.css' -import { SpanEntity } from '@mcp-trace/trace-core' -import { TraceModal } from '@renderer/trace/pages/TraceModel' +import type { SpanEntity } from '@mcp-trace/trace-core' +import type { TraceModal } from '@renderer/trace/pages/TraceModel' import { Divider } from 'antd/lib' import React, { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/trace/types/ModelSpanEntity.ts b/src/renderer/src/trace/types/ModelSpanEntity.ts index 1fff3fb2c2..2e638e8eb2 100644 --- a/src/renderer/src/trace/types/ModelSpanEntity.ts +++ b/src/renderer/src/trace/types/ModelSpanEntity.ts @@ -1,4 +1,4 @@ -import { Span } from '@opentelemetry/api' +import type { Span } from '@opentelemetry/api' export interface StartSpanParams { topicId: string diff --git a/src/renderer/src/types/agent.ts b/src/renderer/src/types/agent.ts index cc04dc3f74..b66e7475b6 100644 --- a/src/renderer/src/types/agent.ts +++ b/src/renderer/src/types/agent.ts @@ -4,7 +4,7 @@ * * WARNING: Any null value will be converted to undefined from api. */ -import { ModelMessage, TextStreamPart } from 'ai' +import type { ModelMessage, TextStreamPart } from 'ai' import * as z from 'zod' import type { Message, MessageBlock } from './newMessage' diff --git a/src/renderer/src/types/aiCoreTypes.ts b/src/renderer/src/types/aiCoreTypes.ts index e93218ab9e..a2ff5a4cef 100644 --- a/src/renderer/src/types/aiCoreTypes.ts +++ b/src/renderer/src/types/aiCoreTypes.ts @@ -1,5 +1,5 @@ import type { ImageModel, LanguageModel } from 'ai' -import { generateObject, generateText, ModelMessage, streamObject, streamText } from 'ai' +import type { generateObject, generateText, ModelMessage, streamObject, streamText } from 'ai' export type StreamTextParams = Omit[0], 'model' | 'messages'> & ( diff --git a/src/renderer/src/types/apiModels.ts b/src/renderer/src/types/apiModels.ts index 68141bf68c..565eb9241a 100644 --- a/src/renderer/src/types/apiModels.ts +++ b/src/renderer/src/types/apiModels.ts @@ -1,4 +1,4 @@ -import { Model } from '@types' +import type { Model } from '@types' import * as z from 'zod' import { ProviderTypeSchema } from './provider' diff --git a/src/renderer/src/types/chunk.ts b/src/renderer/src/types/chunk.ts index 913f402876..345d8a385c 100644 --- a/src/renderer/src/types/chunk.ts +++ b/src/renderer/src/types/chunk.ts @@ -1,4 +1,4 @@ -import { +import type { ExternalToolResult, KnowledgeReference, MCPTool, @@ -7,8 +7,8 @@ import { ToolUseResponse, WebSearchResponse } from '.' -import { Response, ResponseError } from './newMessage' -import { SdkToolCall } from './sdk' +import type { Response, ResponseError } from './newMessage' +import type { SdkToolCall } from './sdk' // Define Enum for Chunk Types // 目前用到的,并没有列出完整的生命周期 diff --git a/src/renderer/src/types/error.ts b/src/renderer/src/types/error.ts index 78bfe0a526..440ad5f14f 100644 --- a/src/renderer/src/types/error.ts +++ b/src/renderer/src/types/error.ts @@ -1,4 +1,4 @@ -import { +import type { AISDKError, APICallError, DownloadError, @@ -20,8 +20,8 @@ import { UnsupportedFunctionalityError } from 'ai' -import { ProviderSpecificError } from './provider-specific-error' -import { Serializable } from './serialize' +import type { ProviderSpecificError } from './provider-specific-error' +import type { Serializable } from './serialize' export interface SerializedError { name: string | null diff --git a/src/renderer/src/types/healthCheck.ts b/src/renderer/src/types/healthCheck.ts index 840c4ef277..6cf9a29303 100644 --- a/src/renderer/src/types/healthCheck.ts +++ b/src/renderer/src/types/healthCheck.ts @@ -1,4 +1,4 @@ -import { Model, Provider } from '@types' +import type { Model, Provider } from '@types' /** * 健康检查的通用状态枚举 diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 20add5724f..28e0aff882 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -10,8 +10,8 @@ export * from './note' import type { StreamTextParams } from './aiCoreTypes' import type { Chunk } from './chunk' import type { FileMetadata } from './file' -import { KnowledgeBase, KnowledgeReference } from './knowledge' -import { MCPConfigSample, MCPServerInstallSource, McpServerType } from './mcp' +import type { KnowledgeBase, KnowledgeReference } from './knowledge' +import type { MCPConfigSample, MCPServerInstallSource, McpServerType } from './mcp' import type { Message } from './newMessage' import type { BaseTool, MCPTool } from './tool' diff --git a/src/renderer/src/types/knowledge.ts b/src/renderer/src/types/knowledge.ts index d168349c85..b584c31b8f 100644 --- a/src/renderer/src/types/knowledge.ts +++ b/src/renderer/src/types/knowledge.ts @@ -1,6 +1,6 @@ -import { ApiClient, Model } from '@types' +import type { ApiClient, Model } from '@types' -import { FileMetadata } from './file' +import type { FileMetadata } from './file' export type KnowledgeItemType = 'file' | 'url' | 'note' | 'sitemap' | 'directory' | 'memory' | 'video' diff --git a/src/renderer/src/types/newMessage.ts b/src/renderer/src/types/newMessage.ts index 4d0aa72f50..ac6169130b 100644 --- a/src/renderer/src/types/newMessage.ts +++ b/src/renderer/src/types/newMessage.ts @@ -17,7 +17,7 @@ import type { WebSearchResponse, WebSearchSource } from '.' -import { SerializedError } from './error' +import type { SerializedError } from './error' // MessageBlock 类型枚举 - 根据实际API返回特性优化 export enum MessageBlockType { diff --git a/src/renderer/src/types/ocr.ts b/src/renderer/src/types/ocr.ts index 765c4e411c..66e0f9616f 100644 --- a/src/renderer/src/types/ocr.ts +++ b/src/renderer/src/types/ocr.ts @@ -1,6 +1,7 @@ -import Tesseract from 'tesseract.js' +import type Tesseract from 'tesseract.js' -import { FileMetadata, ImageFileMetadata, isImageFileMetadata, TranslateLanguageCode } from '.' +import type { FileMetadata, ImageFileMetadata, TranslateLanguageCode } from '.' +import { isImageFileMetadata } from '.' export const BuiltinOcrProviderIds = { tesseract: 'tesseract', diff --git a/src/renderer/src/types/provider.ts b/src/renderer/src/types/provider.ts index 181a342f8f..e013d3d58a 100644 --- a/src/renderer/src/types/provider.ts +++ b/src/renderer/src/types/provider.ts @@ -1,4 +1,4 @@ -import { Model } from '@types' +import type { Model } from '@types' import * as z from 'zod' export const ProviderTypeSchema = z.enum([ diff --git a/src/renderer/src/types/sdk.ts b/src/renderer/src/types/sdk.ts index 83898429d3..f0ea796932 100644 --- a/src/renderer/src/types/sdk.ts +++ b/src/renderer/src/types/sdk.ts @@ -1,5 +1,5 @@ -import Anthropic from '@anthropic-ai/sdk' -import { +import type Anthropic from '@anthropic-ai/sdk' +import type { Message, MessageCreateParams, MessageParam, @@ -7,14 +7,15 @@ import { ToolUnion, ToolUseBlock } from '@anthropic-ai/sdk/resources' -import { MessageStream } from '@anthropic-ai/sdk/resources/messages/messages' -import AnthropicVertex from '@anthropic-ai/vertex-sdk' +import type { MessageStream } from '@anthropic-ai/sdk/resources/messages/messages' +import type AnthropicVertex from '@anthropic-ai/vertex-sdk' import type { BedrockClient } from '@aws-sdk/client-bedrock' import type { BedrockRuntimeClient } from '@aws-sdk/client-bedrock-runtime' -import OpenAI, { AzureOpenAI } from '@cherrystudio/openai' -import { ChatCompletionContentPartImage } from '@cherrystudio/openai/resources' -import { Stream } from '@cherrystudio/openai/streaming' -import { +import type { AzureOpenAI } from '@cherrystudio/openai' +import type OpenAI from '@cherrystudio/openai' +import type { ChatCompletionContentPartImage } from '@cherrystudio/openai/resources' +import type { Stream } from '@cherrystudio/openai/streaming' +import type { Content, CreateChatParameters, FunctionCall, @@ -26,7 +27,7 @@ import { Tool } from '@google/genai' -import { EndpointType } from './index' +import type { EndpointType } from './index' export type SdkInstance = OpenAI | AzureOpenAI | Anthropic | AnthropicVertex | GoogleGenAI | AwsBedrockSdkInstance export type SdkParams = diff --git a/src/renderer/src/utils/__tests__/assistant.test.ts b/src/renderer/src/utils/__tests__/assistant.test.ts index 1bc6fca8e3..9b0f07f8a2 100644 --- a/src/renderer/src/utils/__tests__/assistant.test.ts +++ b/src/renderer/src/utils/__tests__/assistant.test.ts @@ -1,4 +1,4 @@ -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' import { cloneDeep } from 'lodash' import { describe, expect, it } from 'vitest' diff --git a/src/renderer/src/utils/__tests__/citation.test.ts b/src/renderer/src/utils/__tests__/citation.test.ts index 4c877e285a..eb35e28218 100644 --- a/src/renderer/src/utils/__tests__/citation.test.ts +++ b/src/renderer/src/utils/__tests__/citation.test.ts @@ -1,5 +1,6 @@ -import { GroundingSupport } from '@google/genai' -import { Citation, WebSearchSource } from '@renderer/types' +import type { GroundingSupport } from '@google/genai' +import type { Citation } from '@renderer/types' +import { WebSearchSource } from '@renderer/types' import { describe, expect, it, vi } from 'vitest' import { diff --git a/src/renderer/src/utils/__tests__/copy.test.ts b/src/renderer/src/utils/__tests__/copy.test.ts index 5697fe6d66..7908010d1e 100644 --- a/src/renderer/src/utils/__tests__/copy.test.ts +++ b/src/renderer/src/utils/__tests__/copy.test.ts @@ -1,4 +1,4 @@ -import { Message, Topic } from '@renderer/types' +import type { Message, Topic } from '@renderer/types' import { beforeEach, describe, expect, it, vi } from 'vitest' import { copyMessageAsPlainText, copyTopicAsMarkdown, copyTopicAsPlainText } from '../copy' diff --git a/src/renderer/src/utils/__tests__/export.test.ts b/src/renderer/src/utils/__tests__/export.test.ts index 559e2e489a..c7a89207e9 100644 --- a/src/renderer/src/utils/__tests__/export.test.ts +++ b/src/renderer/src/utils/__tests__/export.test.ts @@ -75,7 +75,8 @@ vi.mock('@renderer/utils/markdown', async (importOriginal) => { }) // Import the functions to test AFTER setting up mocks -import { Topic, TopicType } from '@renderer/types' +import type { Topic } from '@renderer/types' +import { TopicType } from '@renderer/types' import { markdownToPlainText } from '@renderer/utils/markdown' import { copyMessageAsPlainText } from '../copy' diff --git a/src/renderer/src/utils/__tests__/model.test.ts b/src/renderer/src/utils/__tests__/model.test.ts index 4a854bf04a..fe1697e3ed 100644 --- a/src/renderer/src/utils/__tests__/model.test.ts +++ b/src/renderer/src/utils/__tests__/model.test.ts @@ -1,4 +1,4 @@ -import { Model, ModelTag } from '@renderer/types' +import type { Model, ModelTag } from '@renderer/types' import { describe, expect, it, vi } from 'vitest' import { getModelTags, isFreeModel } from '../model' diff --git a/src/renderer/src/utils/__tests__/naming.test.ts b/src/renderer/src/utils/__tests__/naming.test.ts index 0dfabedda1..411cd81480 100644 --- a/src/renderer/src/utils/__tests__/naming.test.ts +++ b/src/renderer/src/utils/__tests__/naming.test.ts @@ -1,4 +1,4 @@ -import { Provider, SystemProvider } from '@renderer/types' +import type { Provider, SystemProvider } from '@renderer/types' import { describe, expect, it } from 'vitest' import { diff --git a/src/renderer/src/utils/__tests__/tagExtraction.test.ts b/src/renderer/src/utils/__tests__/tagExtraction.test.ts index 6533bda3f0..2eac9247bb 100644 --- a/src/renderer/src/utils/__tests__/tagExtraction.test.ts +++ b/src/renderer/src/utils/__tests__/tagExtraction.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from 'vitest' -import { TagConfig, TagExtractor } from '../tagExtraction' +import type { TagConfig } from '../tagExtraction' +import { TagExtractor } from '../tagExtraction' describe('TagExtractor', () => { describe('基本标签提取', () => { diff --git a/src/renderer/src/utils/__tests__/websearch.test.ts b/src/renderer/src/utils/__tests__/websearch.test.ts index 2f807d111e..f5aa6c48fd 100644 --- a/src/renderer/src/utils/__tests__/websearch.test.ts +++ b/src/renderer/src/utils/__tests__/websearch.test.ts @@ -1,4 +1,4 @@ -import { KnowledgeReference, WebSearchProviderResult } from '@renderer/types' +import type { KnowledgeReference, WebSearchProviderResult } from '@renderer/types' import { describe, expect, it } from 'vitest' import { consolidateReferencesByUrl, selectReferences } from '../websearch' diff --git a/src/renderer/src/utils/agentSession.ts b/src/renderer/src/utils/agentSession.ts index df34413641..69cccfcc11 100644 --- a/src/renderer/src/utils/agentSession.ts +++ b/src/renderer/src/utils/agentSession.ts @@ -1,4 +1,4 @@ -import { AgentType, ApiModelsFilter } from '@renderer/types' +import type { AgentType, ApiModelsFilter } from '@renderer/types' const SESSION_TOPIC_PREFIX = 'agent-session:' diff --git a/src/renderer/src/utils/api.ts b/src/renderer/src/utils/api.ts index f02eb780e9..845187eb80 100644 --- a/src/renderer/src/utils/api.ts +++ b/src/renderer/src/utils/api.ts @@ -1,5 +1,5 @@ import store from '@renderer/store' -import { VertexProvider } from '@renderer/types' +import type { VertexProvider } from '@renderer/types' import { trim } from 'lodash' /** diff --git a/src/renderer/src/utils/assistant.ts b/src/renderer/src/utils/assistant.ts index e08214aee7..4a1fa62988 100644 --- a/src/renderer/src/utils/assistant.ts +++ b/src/renderer/src/utils/assistant.ts @@ -1,4 +1,4 @@ -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' export const isToolUseModeFunction = (assistant: Assistant) => { return assistant.settings?.toolUseMode === 'function' diff --git a/src/renderer/src/utils/blacklistMatchPattern.ts b/src/renderer/src/utils/blacklistMatchPattern.ts index b00e07a785..597e0e0b12 100644 --- a/src/renderer/src/utils/blacklistMatchPattern.ts +++ b/src/renderer/src/utils/blacklistMatchPattern.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' -import { WebSearchState } from '@renderer/store/websearch' -import { WebSearchProviderResponse } from '@renderer/types' +import type { WebSearchState } from '@renderer/store/websearch' +import type { WebSearchProviderResponse } from '@renderer/types' const logger = loggerService.withContext('BlacklistMatchPattern') diff --git a/src/renderer/src/utils/citation.ts b/src/renderer/src/utils/citation.ts index da2cee7706..8c97cbcde5 100644 --- a/src/renderer/src/utils/citation.ts +++ b/src/renderer/src/utils/citation.ts @@ -1,5 +1,6 @@ -import { GroundingSupport } from '@google/genai' -import { Citation, WebSearchSource } from '@renderer/types' +import type { GroundingSupport } from '@google/genai' +import type { Citation } from '@renderer/types' +import { WebSearchSource } from '@renderer/types' import { cleanMarkdownContent, encodeHTML } from './formats' diff --git a/src/renderer/src/utils/copy.ts b/src/renderer/src/utils/copy.ts index 04841a25ca..d58d9cfb28 100644 --- a/src/renderer/src/utils/copy.ts +++ b/src/renderer/src/utils/copy.ts @@ -1,4 +1,4 @@ -import { Message, Topic } from '@renderer/types' +import type { Message, Topic } from '@renderer/types' import i18next from 'i18next' import { messageToPlainText, topicToMarkdown, topicToPlainText } from './export' diff --git a/src/renderer/src/utils/dataLimit.ts b/src/renderer/src/utils/dataLimit.ts index 7678099be2..d5f9e572c1 100644 --- a/src/renderer/src/utils/dataLimit.ts +++ b/src/renderer/src/utils/dataLimit.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { AppInfo } from '@renderer/types' +import type { AppInfo } from '@renderer/types' import { GB, MB } from '@shared/config/constant' import { t } from 'i18next' diff --git a/src/renderer/src/utils/error.ts b/src/renderer/src/utils/error.ts index 2e7f10964e..ebf9671fbb 100644 --- a/src/renderer/src/utils/error.ts +++ b/src/renderer/src/utils/error.ts @@ -1,17 +1,20 @@ -import { McpError } from '@modelcontextprotocol/sdk/types.js' -import { AgentServerError, AgentServerErrorSchema } from '@renderer/types' -import { +import type { McpError } from '@modelcontextprotocol/sdk/types.js' +import type { AgentServerError } from '@renderer/types' +import { AgentServerErrorSchema } from '@renderer/types' +import type { AiSdkErrorUnion, - isSerializedAiSdkAPICallError, SerializedAiSdkError, SerializedAiSdkInvalidToolInputError, SerializedAiSdkNoSuchToolError, SerializedError } from '@renderer/types/error' -import { InvalidToolInputError, NoSuchToolError } from 'ai' -import { AxiosError, isAxiosError } from 'axios' +import { isSerializedAiSdkAPICallError } from '@renderer/types/error' +import type { NoSuchToolError } from 'ai' +import { InvalidToolInputError } from 'ai' +import type { AxiosError } from 'axios' +import { isAxiosError } from 'axios' import { t } from 'i18next' -import * as z from 'zod' +import type * as z from 'zod' import { ZodError } from 'zod' import { parseJSON } from './json' diff --git a/src/renderer/src/utils/fetch.ts b/src/renderer/src/utils/fetch.ts index b18378beff..52c91c0896 100644 --- a/src/renderer/src/utils/fetch.ts +++ b/src/renderer/src/utils/fetch.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' import { Readability } from '@mozilla/readability' import { nanoid } from '@reduxjs/toolkit' -import { WebSearchProviderResult } from '@renderer/types' +import type { WebSearchProviderResult } from '@renderer/types' import { createAbortPromise } from '@renderer/utils/abortController' import { isAbortError } from '@renderer/utils/error' import TurndownService from 'turndown' diff --git a/src/renderer/src/utils/file.ts b/src/renderer/src/utils/file.ts index a02d6c3a6e..1d4bf4577c 100644 --- a/src/renderer/src/utils/file.ts +++ b/src/renderer/src/utils/file.ts @@ -1,4 +1,5 @@ -import { FileMetadata, FileTypes } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' +import { FileTypes } from '@renderer/types' import { audioExts, documentExts, imageExts, KB, MB, textExts, videoExts } from '@shared/config/constant' import mime from 'mime-types' diff --git a/src/renderer/src/utils/healthCheck.ts b/src/renderer/src/utils/healthCheck.ts index f453cd7592..66b68c0d3a 100644 --- a/src/renderer/src/utils/healthCheck.ts +++ b/src/renderer/src/utils/healthCheck.ts @@ -1,5 +1,6 @@ import i18n from '@renderer/i18n' -import { ApiKeyWithStatus, HealthStatus, ModelWithStatus } from '@renderer/types/healthCheck' +import type { ApiKeyWithStatus, ModelWithStatus } from '@renderer/types/healthCheck' +import { HealthStatus } from '@renderer/types/healthCheck' /** * 聚合多个 API 密钥检查结果,得到模型健康检查的整体状态 diff --git a/src/renderer/src/utils/index.ts b/src/renderer/src/utils/index.ts index f690782865..91d4961ec6 100644 --- a/src/renderer/src/utils/index.ts +++ b/src/renderer/src/utils/index.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' -import { Model, ModelType } from '@renderer/types' -import { ModalFuncProps } from 'antd' +import type { Model, ModelType } from '@renderer/types' +import type { ModalFuncProps } from 'antd' import { isEqual } from 'lodash' import { v4 as uuidv4 } from 'uuid' diff --git a/src/renderer/src/utils/input.ts b/src/renderer/src/utils/input.ts index 85eb804255..8778f43ec5 100644 --- a/src/renderer/src/utils/input.ts +++ b/src/renderer/src/utils/input.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' import { isMac, isWin } from '@renderer/config/constant' import type { SendMessageShortcut } from '@renderer/store/settings' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' const logger = loggerService.withContext('Utils:Input') diff --git a/src/renderer/src/utils/markdownConverter.ts b/src/renderer/src/utils/markdownConverter.ts index 51d684612d..ac55d16ed4 100644 --- a/src/renderer/src/utils/markdownConverter.ts +++ b/src/renderer/src/utils/markdownConverter.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' import { MARKDOWN_SOURCE_LINE_ATTR } from '@renderer/components/RichEditor/constants' -import { TurndownPlugin } from '@truto/turndown-plugin-gfm' +import type { TurndownPlugin } from '@truto/turndown-plugin-gfm' import he from 'he' import htmlTags, { type HtmlTags } from 'html-tags' import * as htmlparser2 from 'htmlparser2' diff --git a/src/renderer/src/utils/match.ts b/src/renderer/src/utils/match.ts index 55d39df9ec..a7a405f9dd 100644 --- a/src/renderer/src/utils/match.ts +++ b/src/renderer/src/utils/match.ts @@ -1,5 +1,6 @@ import { getProviderLabel } from '@renderer/i18n/label' -import { isSystemProvider, Model, Provider } from '@renderer/types' +import type { Model, Provider } from '@renderer/types' +import { isSystemProvider } from '@renderer/types' /** * 判断一个字符串是否包含由另一个字符串表示的 keywords diff --git a/src/renderer/src/utils/mcp-tools.ts b/src/renderer/src/utils/mcp-tools.ts index 934d4d8824..49628628d4 100644 --- a/src/renderer/src/utils/mcp-tools.ts +++ b/src/renderer/src/utils/mcp-tools.ts @@ -1,21 +1,21 @@ -import { ContentBlockParam, MessageParam, ToolUnion, ToolUseBlock } from '@anthropic-ai/sdk/resources' -import OpenAI from '@cherrystudio/openai' -import { +import type { ContentBlockParam, MessageParam, ToolUnion, ToolUseBlock } from '@anthropic-ai/sdk/resources' +import type OpenAI from '@cherrystudio/openai' +import type { ChatCompletionContentPart, ChatCompletionMessageParam, ChatCompletionMessageToolCall, ChatCompletionTool } from '@cherrystudio/openai/resources' -import { Content, FunctionCall, Part, Tool, Type as GeminiSchemaType } from '@google/genai' +import type { Content, FunctionCall, Part, Tool } from '@google/genai' +import { Type as GeminiSchemaType } from '@google/genai' import { loggerService } from '@logger' import { isFunctionCallingModel, isVisionModel } from '@renderer/config/models' import i18n from '@renderer/i18n' import { currentSpan } from '@renderer/services/SpanManagerService' import store from '@renderer/store' import { addMCPServer } from '@renderer/store/mcp' -import { +import type { Assistant, - BuiltinMCPServerNames, MCPCallToolResponse, MCPServer, MCPTool, @@ -23,9 +23,10 @@ import { Model, ToolUseResponse } from '@renderer/types' +import { BuiltinMCPServerNames } from '@renderer/types' import type { MCPToolCompleteChunk, MCPToolInProgressChunk, MCPToolPendingChunk } from '@renderer/types/chunk' import { ChunkType } from '@renderer/types/chunk' -import { AwsBedrockSdkMessageParam, AwsBedrockSdkTool, AwsBedrockSdkToolCall } from '@renderer/types/sdk' +import type { AwsBedrockSdkMessageParam, AwsBedrockSdkTool, AwsBedrockSdkToolCall } from '@renderer/types/sdk' import { t } from 'i18next' import { nanoid } from 'nanoid' diff --git a/src/renderer/src/utils/messageUtils/create.ts b/src/renderer/src/utils/messageUtils/create.ts index faeb094f11..c367b8f114 100644 --- a/src/renderer/src/utils/messageUtils/create.ts +++ b/src/renderer/src/utils/messageUtils/create.ts @@ -1,7 +1,7 @@ import { loggerService } from '@logger' import type { Assistant, FileMetadata, Topic } from '@renderer/types' import { FileTypes } from '@renderer/types' -import { SerializedError } from '@renderer/types/error' +import type { SerializedError } from '@renderer/types/error' import type { BaseMessageBlock, CitationMessageBlock, diff --git a/src/renderer/src/utils/messageUtils/find.ts b/src/renderer/src/utils/messageUtils/find.ts index 811c7960b6..06b2aedaf2 100644 --- a/src/renderer/src/utils/messageUtils/find.ts +++ b/src/renderer/src/utils/messageUtils/find.ts @@ -1,6 +1,6 @@ import store from '@renderer/store' import { formatCitationsFromBlock, messageBlocksSelectors } from '@renderer/store/messageBlock' -import { FileMetadata } from '@renderer/types' +import type { FileMetadata } from '@renderer/types' import type { CitationMessageBlock, FileMessageBlock, diff --git a/src/renderer/src/utils/messageUtils/is.ts b/src/renderer/src/utils/messageUtils/is.ts index b874f08ae2..2bc7896d1b 100644 --- a/src/renderer/src/utils/messageUtils/is.ts +++ b/src/renderer/src/utils/messageUtils/is.ts @@ -1,3 +1,4 @@ +import type { Message } from '@renderer/types/newMessage' import { AssistantMessageStatus, type CitationMessageBlock, @@ -6,7 +7,6 @@ import { type FileMessageBlock, type ImageMessageBlock, type MainTextMessageBlock, - Message, type MessageBlock, MessageBlockType, type PlaceholderMessageBlock, diff --git a/src/renderer/src/utils/model.ts b/src/renderer/src/utils/model.ts index 1319fe4326..a74ffab25f 100644 --- a/src/renderer/src/utils/model.ts +++ b/src/renderer/src/utils/model.ts @@ -6,7 +6,8 @@ import { isVisionModel, isWebSearchModel } from '@renderer/config/models' -import { AdaptedApiModel, ApiModel, Model, ModelTag, objectKeys } from '@renderer/types' +import type { AdaptedApiModel, ApiModel, Model, ModelTag } from '@renderer/types' +import { objectKeys } from '@renderer/types' /** * 获取模型标签的状态 diff --git a/src/renderer/src/utils/naming.ts b/src/renderer/src/utils/naming.ts index 3cc02aadf4..bc24bc7db8 100644 --- a/src/renderer/src/utils/naming.ts +++ b/src/renderer/src/utils/naming.ts @@ -1,5 +1,6 @@ import { getProviderLabel } from '@renderer/i18n/label' -import { isSystemProvider, Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' +import { isSystemProvider } from '@renderer/types' /** * 从模型 ID 中提取默认组名。 diff --git a/src/renderer/src/utils/prompt.ts b/src/renderer/src/utils/prompt.ts index 85766953ba..5db92d06a5 100644 --- a/src/renderer/src/utils/prompt.ts +++ b/src/renderer/src/utils/prompt.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' import store from '@renderer/store' -import { MCPTool } from '@renderer/types' +import type { MCPTool } from '@renderer/types' const logger = loggerService.withContext('Utils:Prompt') diff --git a/src/renderer/src/utils/provider.ts b/src/renderer/src/utils/provider.ts index 1ff8badb8f..b8d761f8a9 100644 --- a/src/renderer/src/utils/provider.ts +++ b/src/renderer/src/utils/provider.ts @@ -1,5 +1,5 @@ import { CLAUDE_SUPPORTED_PROVIDERS } from '@renderer/pages/code' -import { Provider } from '@renderer/types' +import type { Provider } from '@renderer/types' export const getClaudeSupportedProviders = (providers: Provider[]) => { return providers.filter((p) => p.type === 'anthropic' || CLAUDE_SUPPORTED_PROVIDERS.includes(p.id)) diff --git a/src/renderer/src/utils/shiki.ts b/src/renderer/src/utils/shiki.ts index 2b56c878e1..dab4e17737 100644 --- a/src/renderer/src/utils/shiki.ts +++ b/src/renderer/src/utils/shiki.ts @@ -1,6 +1,7 @@ import { loggerService } from '@logger' -import { BundledLanguage, BundledTheme } from 'shiki/bundle/web' -import { getTokenStyleObject, type HighlighterGeneric, SpecialLanguage, ThemedToken } from 'shiki/core' +import type { BundledLanguage, BundledTheme } from 'shiki/bundle/web' +import type { SpecialLanguage, ThemedToken } from 'shiki/core' +import { getTokenStyleObject, type HighlighterGeneric } from 'shiki/core' import { AsyncInitializer } from './asyncInitializer' diff --git a/src/renderer/src/utils/style.ts b/src/renderer/src/utils/style.ts index a95fa93dd2..7e6d52be70 100644 --- a/src/renderer/src/utils/style.ts +++ b/src/renderer/src/utils/style.ts @@ -1,4 +1,5 @@ -import { HexColor, isHexColor } from '@renderer/types' +import type { HexColor } from '@renderer/types' +import { isHexColor } from '@renderer/types' type ClassValue = string | number | boolean | undefined | null | ClassDictionary | ClassArray diff --git a/src/renderer/src/utils/translate.ts b/src/renderer/src/utils/translate.ts index f717ee015a..4e01649369 100644 --- a/src/renderer/src/utils/translate.ts +++ b/src/renderer/src/utils/translate.ts @@ -8,10 +8,12 @@ import { fetchChatCompletion } from '@renderer/services/ApiService' import { getDefaultAssistant, getDefaultModel, getQuickModel } from '@renderer/services/AssistantService' import { estimateTextTokens } from '@renderer/services/TokenService' import { getAllCustomLanguages } from '@renderer/services/TranslateService' -import { Assistant, TranslateLanguage, TranslateLanguageCode } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { Assistant, TranslateLanguage, TranslateLanguageCode } from '@renderer/types' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { franc } from 'franc-min' -import React, { RefObject } from 'react' +import type { RefObject } from 'react' +import React from 'react' import { sliceByTokens } from 'tokenx' const logger = loggerService.withContext('Utils:translate') diff --git a/src/renderer/src/utils/websearch.ts b/src/renderer/src/utils/websearch.ts index 05f82861c8..52f1698cef 100644 --- a/src/renderer/src/utils/websearch.ts +++ b/src/renderer/src/utils/websearch.ts @@ -1,4 +1,4 @@ -import { KnowledgeReference, WebSearchProviderResult } from '@renderer/types' +import type { KnowledgeReference, WebSearchProviderResult } from '@renderer/types' /** * 将检索到的知识片段按源URL整合为搜索结果 diff --git a/src/renderer/src/windows/mini/chat/ChatWindow.tsx b/src/renderer/src/windows/mini/chat/ChatWindow.tsx index ff57494428..bb7fde16a2 100644 --- a/src/renderer/src/windows/mini/chat/ChatWindow.tsx +++ b/src/renderer/src/windows/mini/chat/ChatWindow.tsx @@ -1,6 +1,6 @@ import Scrollbar from '@renderer/components/Scrollbar' -import { Assistant, Topic } from '@renderer/types' -import { FC } from 'react' +import type { Assistant, Topic } from '@renderer/types' +import type { FC } from 'react' import styled from 'styled-components' import Messages from './components/Messages' diff --git a/src/renderer/src/windows/mini/chat/components/Message.tsx b/src/renderer/src/windows/mini/chat/components/Message.tsx index 93671fac45..0a2f80ccde 100644 --- a/src/renderer/src/windows/mini/chat/components/Message.tsx +++ b/src/renderer/src/windows/mini/chat/components/Message.tsx @@ -5,7 +5,8 @@ import MessageErrorBoundary from '@renderer/pages/home/Messages/MessageErrorBoun // import { LegacyMessage } from '@renderer/types' import type { Message } from '@renderer/types/newMessage' import { classNames } from '@renderer/utils' -import { FC, memo, useRef } from 'react' +import type { FC } from 'react' +import { memo, useRef } from 'react' import styled from 'styled-components' interface Props { diff --git a/src/renderer/src/windows/mini/chat/components/Messages.tsx b/src/renderer/src/windows/mini/chat/components/Messages.tsx index 74e689b966..f5d858938f 100644 --- a/src/renderer/src/windows/mini/chat/components/Messages.tsx +++ b/src/renderer/src/windows/mini/chat/components/Messages.tsx @@ -1,8 +1,8 @@ import { LoadingOutlined } from '@ant-design/icons' import Scrollbar from '@renderer/components/Scrollbar' import { useTopicMessages } from '@renderer/hooks/useMessageOperations' -import { Assistant, Topic } from '@renderer/types' -import { FC } from 'react' +import type { Assistant, Topic } from '@renderer/types' +import type { FC } from 'react' import styled from 'styled-components' import MessageItem from './Message' diff --git a/src/renderer/src/windows/mini/home/HomeWindow.tsx b/src/renderer/src/windows/mini/home/HomeWindow.tsx index e2082d7b93..bf01146015 100644 --- a/src/renderer/src/windows/mini/home/HomeWindow.tsx +++ b/src/renderer/src/windows/mini/home/HomeWindow.tsx @@ -12,8 +12,10 @@ import store, { useAppSelector } from '@renderer/store' import { updateOneBlock, upsertManyBlocks, upsertOneBlock } from '@renderer/store/messageBlock' import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage' import { cancelThrottledBlockUpdate, throttledBlockUpdate } from '@renderer/store/thunk/messageThunk' -import { ThemeMode, Topic } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { Topic } from '@renderer/types' +import { ThemeMode } from '@renderer/types' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { AssistantMessageStatus, MessageBlockStatus } from '@renderer/types/newMessage' import { abortCompletion } from '@renderer/utils/abortController' import { isAbortError } from '@renderer/utils/error' @@ -25,14 +27,16 @@ import { IpcChannel } from '@shared/IpcChannel' import { Divider } from 'antd' import { cloneDeep, isEmpty } from 'lodash' import { last } from 'lodash' -import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import ChatWindow from '../chat/ChatWindow' import TranslateWindow from '../translate/TranslateWindow' import ClipboardPreview from './components/ClipboardPreview' -import FeatureMenus, { FeatureMenusRef } from './components/FeatureMenus' +import type { FeatureMenusRef } from './components/FeatureMenus' +import FeatureMenus from './components/FeatureMenus' import Footer from './components/Footer' import InputBar from './components/InputBar' diff --git a/src/renderer/src/windows/mini/home/components/ClipboardPreview.tsx b/src/renderer/src/windows/mini/home/components/ClipboardPreview.tsx index 60fe3a1851..f6456e97ca 100644 --- a/src/renderer/src/windows/mini/home/components/ClipboardPreview.tsx +++ b/src/renderer/src/windows/mini/home/components/ClipboardPreview.tsx @@ -1,7 +1,7 @@ import { CloseOutlined } from '@ant-design/icons' import CopyIcon from '@renderer/components/Icons/CopyIcon' import { Typography } from 'antd' -import { FC } from 'react' +import type { FC } from 'react' import styled from 'styled-components' interface ClipboardPreviewProps { diff --git a/src/renderer/src/windows/mini/home/components/FeatureMenus.tsx b/src/renderer/src/windows/mini/home/components/FeatureMenus.tsx index 59774e7047..ebe878644e 100644 --- a/src/renderer/src/windows/mini/home/components/FeatureMenus.tsx +++ b/src/renderer/src/windows/mini/home/components/FeatureMenus.tsx @@ -2,7 +2,8 @@ import { EnterOutlined } from '@ant-design/icons' import Scrollbar from '@renderer/components/Scrollbar' import { Col } from 'antd' import { FileText, Languages, Lightbulb, MessageSquare } from 'lucide-react' -import { Dispatch, SetStateAction, useImperativeHandle, useMemo, useState } from 'react' +import type { Dispatch, SetStateAction } from 'react' +import { useImperativeHandle, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/windows/mini/home/components/Footer.tsx b/src/renderer/src/windows/mini/home/components/Footer.tsx index abebc4ed70..04b4164404 100644 --- a/src/renderer/src/windows/mini/home/components/Footer.tsx +++ b/src/renderer/src/windows/mini/home/components/Footer.tsx @@ -1,7 +1,7 @@ import { ArrowLeftOutlined, LoadingOutlined } from '@ant-design/icons' import { Tag as AntdTag, Tooltip } from 'antd' import { CircleArrowLeft, Copy, Pin } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/windows/mini/home/components/InputBar.tsx b/src/renderer/src/windows/mini/home/components/InputBar.tsx index cfd7d29457..648b72080e 100644 --- a/src/renderer/src/windows/mini/home/components/InputBar.tsx +++ b/src/renderer/src/windows/mini/home/components/InputBar.tsx @@ -1,8 +1,8 @@ import ModelAvatar from '@renderer/components/Avatar/ModelAvatar' import { useTimer } from '@renderer/hooks/useTimer' -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' import { Input as AntdInput } from 'antd' -import { InputRef } from 'rc-input/lib/interface' +import type { InputRef } from 'rc-input/lib/interface' import React, { useRef } from 'react' import styled from 'styled-components' diff --git a/src/renderer/src/windows/mini/translate/TranslateWindow.tsx b/src/renderer/src/windows/mini/translate/TranslateWindow.tsx index 681e96de1f..b84dafc45b 100644 --- a/src/renderer/src/windows/mini/translate/TranslateWindow.tsx +++ b/src/renderer/src/windows/mini/translate/TranslateWindow.tsx @@ -7,11 +7,12 @@ import db from '@renderer/databases' import { useDefaultModel } from '@renderer/hooks/useAssistant' import useTranslate from '@renderer/hooks/useTranslate' import { translateText } from '@renderer/services/TranslateService' -import { TranslateLanguage } from '@renderer/types' +import type { TranslateLanguage } from '@renderer/types' import { runAsyncFunction } from '@renderer/utils' import { Select } from 'antd' import { isEmpty } from 'lodash' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/windows/selection/action/SelectionActionApp.tsx b/src/renderer/src/windows/selection/action/SelectionActionApp.tsx index 5112caf945..ab8e94a723 100644 --- a/src/renderer/src/windows/selection/action/SelectionActionApp.tsx +++ b/src/renderer/src/windows/selection/action/SelectionActionApp.tsx @@ -8,7 +8,8 @@ import { IpcChannel } from '@shared/IpcChannel' import { Button, Slider, Tooltip } from 'antd' import { Droplet, Minus, Pin, X } from 'lucide-react' import { DynamicIcon } from 'lucide-react/dynamic' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/windows/selection/action/components/ActionGeneral.tsx b/src/renderer/src/windows/selection/action/components/ActionGeneral.tsx index 6046da9ae1..9dd2fbc4f5 100644 --- a/src/renderer/src/windows/selection/action/components/ActionGeneral.tsx +++ b/src/renderer/src/windows/selection/action/components/ActionGeneral.tsx @@ -11,11 +11,12 @@ import { getDefaultTopic } from '@renderer/services/AssistantService' import { pauseTrace } from '@renderer/services/SpanManagerService' -import { Assistant, Topic } from '@renderer/types' +import type { Assistant, Topic } from '@renderer/types' import type { ActionItem } from '@renderer/types/selectionTypes' import { abortCompletion } from '@renderer/utils/abortController' import { ChevronDown } from 'lucide-react' -import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/windows/selection/action/components/ActionTranslate.tsx b/src/renderer/src/windows/selection/action/components/ActionTranslate.tsx index 0d29687787..5e83071add 100644 --- a/src/renderer/src/windows/selection/action/components/ActionTranslate.tsx +++ b/src/renderer/src/windows/selection/action/components/ActionTranslate.tsx @@ -9,14 +9,15 @@ import { useSettings } from '@renderer/hooks/useSettings' import useTranslate from '@renderer/hooks/useTranslate' import MessageContent from '@renderer/pages/home/Messages/MessageContent' import { getDefaultTopic, getDefaultTranslateAssistant } from '@renderer/services/AssistantService' -import { Assistant, Topic, TranslateLanguage, TranslateLanguageCode } from '@renderer/types' +import type { Assistant, Topic, TranslateLanguage, TranslateLanguageCode } from '@renderer/types' import type { ActionItem } from '@renderer/types/selectionTypes' import { runAsyncFunction } from '@renderer/utils' import { abortCompletion } from '@renderer/utils/abortController' import { detectLanguage } from '@renderer/utils/translate' import { Tooltip } from 'antd' import { ArrowRightFromLine, ArrowRightToLine, ChevronDown, CircleHelp, Globe } from 'lucide-react' -import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/windows/selection/action/components/ActionUtils.ts b/src/renderer/src/windows/selection/action/components/ActionUtils.ts index 7ef1166258..16537f0e81 100644 --- a/src/renderer/src/windows/selection/action/components/ActionUtils.ts +++ b/src/renderer/src/windows/selection/action/components/ActionUtils.ts @@ -6,8 +6,9 @@ import store from '@renderer/store' import { updateOneBlock, upsertManyBlocks, upsertOneBlock } from '@renderer/store/messageBlock' import { newMessagesActions } from '@renderer/store/newMessage' import { cancelThrottledBlockUpdate, throttledBlockUpdate } from '@renderer/store/thunk/messageThunk' -import { Assistant, Topic } from '@renderer/types' -import { Chunk, ChunkType } from '@renderer/types/chunk' +import type { Assistant, Topic } from '@renderer/types' +import type { Chunk } from '@renderer/types/chunk' +import { ChunkType } from '@renderer/types/chunk' import { AssistantMessageStatus, MessageBlockStatus } from '@renderer/types/newMessage' import { formatErrorMessage, isAbortError } from '@renderer/utils/error' import { createErrorBlock, createMainTextBlock, createThinkingBlock } from '@renderer/utils/messageUtils/create' diff --git a/src/renderer/src/windows/selection/action/components/WindowFooter.tsx b/src/renderer/src/windows/selection/action/components/WindowFooter.tsx index 5c0af02079..4048e8739d 100644 --- a/src/renderer/src/windows/selection/action/components/WindowFooter.tsx +++ b/src/renderer/src/windows/selection/action/components/WindowFooter.tsx @@ -2,7 +2,8 @@ import { LoadingOutlined } from '@ant-design/icons' import { RefreshIcon } from '@renderer/components/Icons' import { useTimer } from '@renderer/hooks/useTimer' import { CircleX, Copy, Pause } from 'lucide-react' -import { FC, useEffect, useRef, useState } from 'react' +import type { FC } from 'react' +import { useEffect, useRef, useState } from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { useTranslation } from 'react-i18next' import styled from 'styled-components' diff --git a/src/renderer/src/windows/selection/action/entryPoint.tsx b/src/renderer/src/windows/selection/action/entryPoint.tsx index 5aa8d3f745..e1ed8bac3a 100644 --- a/src/renderer/src/windows/selection/action/entryPoint.tsx +++ b/src/renderer/src/windows/selection/action/entryPoint.tsx @@ -12,7 +12,8 @@ import { HeroUIProvider } from '@renderer/context/HeroUIProvider' import { ThemeProvider } from '@renderer/context/ThemeProvider' import storeSyncService from '@renderer/services/StoreSyncService' import store, { persistor } from '@renderer/store' -import { FC, useEffect } from 'react' +import type { FC } from 'react' +import { useEffect } from 'react' import { createRoot } from 'react-dom/client' import { Provider } from 'react-redux' import { PersistGate } from 'redux-persist/integration/react' diff --git a/src/renderer/src/windows/selection/toolbar/SelectionToolbar.tsx b/src/renderer/src/windows/selection/toolbar/SelectionToolbar.tsx index 2d00b127b0..b28a0c0f98 100644 --- a/src/renderer/src/windows/selection/toolbar/SelectionToolbar.tsx +++ b/src/renderer/src/windows/selection/toolbar/SelectionToolbar.tsx @@ -12,9 +12,10 @@ import { IpcChannel } from '@shared/IpcChannel' import { Avatar } from 'antd' import { ClipboardCheck, ClipboardCopy, ClipboardX, MessageSquareHeart } from 'lucide-react' import { DynamicIcon } from 'lucide-react/dynamic' -import { FC, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FC } from 'react' +import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { TextSelectionData } from 'selection-hook' +import type { TextSelectionData } from 'selection-hook' import styled from 'styled-components' const logger = loggerService.withContext('SelectionToolbar') diff --git a/src/renderer/src/windows/selection/toolbar/entryPoint.tsx b/src/renderer/src/windows/selection/toolbar/entryPoint.tsx index 02d68607ee..e85509e590 100644 --- a/src/renderer/src/windows/selection/toolbar/entryPoint.tsx +++ b/src/renderer/src/windows/selection/toolbar/entryPoint.tsx @@ -4,7 +4,7 @@ import { loggerService } from '@logger' import { ThemeProvider } from '@renderer/context/ThemeProvider' import storeSyncService from '@renderer/services/StoreSyncService' import store, { persistor } from '@renderer/store' -import { FC } from 'react' +import type { FC } from 'react' import { createRoot } from 'react-dom/client' import { Provider } from 'react-redux' import { PersistGate } from 'redux-persist/integration/react' diff --git a/src/renderer/src/workers/shiki-stream.worker.ts b/src/renderer/src/workers/shiki-stream.worker.ts index bcc9c89646..a3803f6009 100644 --- a/src/renderer/src/workers/shiki-stream.worker.ts +++ b/src/renderer/src/workers/shiki-stream.worker.ts @@ -5,7 +5,8 @@ import { LRUCache } from 'lru-cache' import type { HighlighterCore, SpecialLanguage, ThemedToken } from 'shiki/core' // 注意保持 ShikiStreamTokenizer 依赖简单,避免打包出问题 -import { ShikiStreamTokenizer, ShikiStreamTokenizerOptions } from '../services/ShikiStreamTokenizer' +import type { ShikiStreamTokenizerOptions } from '../services/ShikiStreamTokenizer' +import { ShikiStreamTokenizer } from '../services/ShikiStreamTokenizer' const logger = loggerService.initWindowSource('Worker').withContext('ShikiStream') From 28bc89ac7ccd9acf502f9e564848ed1530a7b373 Mon Sep 17 00:00:00 2001 From: SuYao Date: Sat, 1 Nov 2025 12:13:11 +0800 Subject: [PATCH 23/83] perf: optimize QR code generation and connection info for phone LAN export (#11086) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Increase QR code margin for better scanning reliability - Change QRCodeSVG marginSize from 2 to 4 pixels - Maintains same QR code size (160px) and error correction level (Q) - Improves readability and scanning success rate on mobile devices * Optimize QR code generation and connection info for phone LAN export - Increase QR code size to 180px and reduce error correction to 'L' for better mobile scanning - Replace hardcoded logo path with AppLogo config and increase logo size to 60px - Simplify connection info by removing candidates array and using only essential IP/port data * Optimize QR code data structure for LAN connection - Compress IP addresses to numeric format to reduce QR code complexity - Use compact array format instead of verbose JSON object structure - Remove debug logging to streamline connection flow * feat: 更新 WebSocket 状态和候选者响应类型,优化连接信息处理 * Increase QR code size and error correction for better scanning - Increase QR code size from 180px to 300px for improved readability - Change error correction level from L (low) to H (high) for better reliability - Reduce logo size from 60px to 40px to accommodate larger QR data - Increase margin size from 1 to 2 for better border clearance * 调整二维码大小和图标尺寸以优化扫描体验 * fix(i18n): Auto update translations for PR #11086 * fix(i18n): Auto update translations for PR #11086 * fix(i18n): Auto update translations for PR #11086 --------- Co-authored-by: GitHub Action --- packages/shared/config/types.ts | 13 ++++++ src/main/services/WebSocketService.ts | 16 ++------ .../Popups/ExportToPhoneLanPopup.tsx | 41 ++++++++++++------- src/renderer/src/i18n/translate/de-de.json | 7 ++-- src/renderer/src/i18n/translate/el-gr.json | 7 ++-- src/renderer/src/i18n/translate/es-es.json | 7 ++-- src/renderer/src/i18n/translate/fr-fr.json | 7 ++-- src/renderer/src/i18n/translate/ja-jp.json | 7 ++-- src/renderer/src/i18n/translate/pt-pt.json | 7 ++-- src/renderer/src/i18n/translate/ru-ru.json | 9 ++-- 10 files changed, 65 insertions(+), 56 deletions(-) diff --git a/packages/shared/config/types.ts b/packages/shared/config/types.ts index 6d76173e26..5c42f1d2b2 100644 --- a/packages/shared/config/types.ts +++ b/packages/shared/config/types.ts @@ -31,3 +31,16 @@ export type WebviewKeyEvent = { shift: boolean alt: boolean } + +export interface WebSocketStatusResponse { + isRunning: boolean + port?: number + ip?: string + clientConnected: boolean +} + +export interface WebSocketCandidatesResponse { + host: string + interface: string + priority: number +} diff --git a/src/main/services/WebSocketService.ts b/src/main/services/WebSocketService.ts index f812517179..5a4b77f651 100644 --- a/src/main/services/WebSocketService.ts +++ b/src/main/services/WebSocketService.ts @@ -1,4 +1,5 @@ import { loggerService } from '@logger' +import { WebSocketCandidatesResponse, WebSocketStatusResponse } from '@shared/config/types' import * as fs from 'fs' import { networkInterfaces } from 'os' import * as path from 'path' @@ -202,12 +203,7 @@ class WebSocketService { } } - public getStatus = async (): Promise<{ - isRunning: boolean - port?: number - ip?: string - clientConnected: boolean - }> => { + public getStatus = async (): Promise => { return { isRunning: this.isStarted, port: this.isStarted ? this.port : undefined, @@ -216,13 +212,7 @@ class WebSocketService { } } - public getAllCandidates = async (): Promise< - Array<{ - host: string - interface: string - priority: number - }> - > => { + public getAllCandidates = async (): Promise => { const interfaces = networkInterfaces() // 按优先级排序的网络接口名称模式 diff --git a/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx b/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx index d826ddd01d..26caf29d86 100644 --- a/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx +++ b/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx @@ -3,7 +3,9 @@ import { Modal, ModalBody, ModalContent, ModalFooter, ModalHeader } from '@herou import { Progress } from '@heroui/progress' import { Spinner } from '@heroui/spinner' import { loggerService } from '@logger' +import { AppLogo } from '@renderer/config/env' import { SettingHelpText, SettingRow } from '@renderer/pages/settings' +import { WebSocketCandidatesResponse } from '@shared/config/types' import { QRCodeSVG } from 'qrcode.react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -38,12 +40,12 @@ const ScanQRCode: React.FC<{ qrCodeValue: string }> = ({ qrCodeValue }) => { @@ -198,17 +200,28 @@ const PopupContainer: React.FC = ({ resolve }) => { const { port, ip } = await window.api.webSocket.status() if (ip && port) { - const candidates = await window.api.webSocket.getAllCandidates() - const connectionInfo = { - type: 'cherry-studio-app', - candidates, - selectedHost: ip, - port, - timestamp: Date.now() + const candidatesData = await window.api.webSocket.getAllCandidates() + + const optimizeConnectionInfo = () => { + const ipToNumber = (ip: string) => { + return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet), 0) + } + + const compressedData = [ + 'CSA', + ipToNumber(ip), + candidatesData.map((candidate: WebSocketCandidatesResponse) => ipToNumber(candidate.host)), + port, // 端口号 + Date.now() % 86400000 + ] + + return compressedData } - setQrCodeValue(JSON.stringify(connectionInfo)) + + const compressedData = optimizeConnectionInfo() + const qrCodeValue = JSON.stringify(compressedData) + setQrCodeValue(qrCodeValue) setConnectionPhase('waiting_qr_scan') - logger.info(`QR code generated: ${ip}:${port} with ${candidates.length} IP candidates`) } else { setError(t('settings.data.export_to_phone.lan.error.no_ip')) setConnectionPhase('error') diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index 06cc53ec12..2e86111da1 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -2923,15 +2923,14 @@ }, "description": "Ein KI-Assistent für Kreative", "downloading": "Update wird heruntergeladen...", + "enterprise": { + "title": "Unternehmen" + }, "feedback": { "button": "Feedback", "title": "Feedback" }, "label": "Über uns", - "license": { - "button": "Anzeigen", - "title": "Lizenz" - }, "releases": { "button": "Anzeigen", "title": "Changelog" diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index fe7885030b..a793d9ddf0 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -2923,15 +2923,14 @@ }, "description": "Ένα AI ασιστάντα που έχει σχεδιαστεί για δημιουργούς", "downloading": "Λήψη ενημερώσεων...", + "enterprise": { + "title": "Επιχείρηση" + }, "feedback": { "button": "Σχόλια και Παρατηρήσεις", "title": "Αποστολή σχολίων" }, "label": "Περί μας", - "license": { - "button": "Προβολή", - "title": "Licenses" - }, "releases": { "button": "Προβολή", "title": "Ημερολόγιο Ενημερώσεων" diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 182da4c1a0..27b46ce3b3 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -2923,15 +2923,14 @@ }, "description": "Una asistente de IA creada para los creadores", "downloading": "Descargando actualización...", + "enterprise": { + "title": "Empresa" + }, "feedback": { "button": "Enviar feedback", "title": "Enviar comentarios" }, "label": "Acerca de nosotros", - "license": { - "button": "Ver", - "title": "Licencia" - }, "releases": { "button": "Ver", "title": "Registro de cambios" diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index 32ee893d1a..b710e40b1e 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -2923,15 +2923,14 @@ }, "description": "Un assistant IA conçu pour les créateurs", "downloading": "Téléchargement de la mise à jour en cours...", + "enterprise": { + "title": "Entreprise" + }, "feedback": { "button": "Faire un retour", "title": "Retour d'information" }, "label": "À propos de nous", - "license": { - "button": "Afficher", - "title": "Licence" - }, "releases": { "button": "Afficher", "title": "Journal des mises à jour" diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index fbbbbc9048..449e6bad29 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -2923,15 +2923,14 @@ }, "description": "クリエイターのための強力なAIアシスタント", "downloading": "ダウンロード中...", + "enterprise": { + "title": "エンタープライズ" + }, "feedback": { "button": "フィードバック", "title": "フィードバック" }, "label": "について", - "license": { - "button": "ライセンス", - "title": "ライセンス" - }, "releases": { "button": "リリース", "title": "リリースノート" diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index aa185cb07d..5ac0f082c1 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -2923,15 +2923,14 @@ }, "description": "Um assistente de IA criado para criadores", "downloading": "Baixando atualizações...", + "enterprise": { + "title": "Empresa" + }, "feedback": { "button": "Feedback", "title": "Enviar feedback" }, "label": "Sobre Nós", - "license": { - "button": "Ver", - "title": "Licença" - }, "releases": { "button": "Ver", "title": "Registro de alterações" diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index 8df5ef6630..64a6453115 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -2923,15 +2923,14 @@ }, "description": "Мощный AI-ассистент для созидания", "downloading": "Загрузка...", + "enterprise": { + "title": "Предприятие" + }, "feedback": { "button": "Обратная связь", "title": "Обратная связь" }, "label": "О программе и обратная связь", - "license": { - "button": "Лицензия", - "title": "Лицензия" - }, "releases": { "button": "Релизы", "title": "Заметки о релизах" @@ -3043,7 +3042,7 @@ "confirm": { "button": "Выберите файл резервной копии" }, - "content": "Экспорт части данных, включая чат и настройки. Пожалуйста, обратите внимание, что процесс резервного копирования может занять некоторое время. Благодарим за ваше терпение.", + "content": "Экспорт части данных, включая историю чатов и настройки. Обратите внимание, процесс резервного копирования может занять некоторое время, благодарим за ваше терпение.", "lan": { "auto_close_tip": "Автоматическое закрытие через {{seconds}} секунд...", "confirm_close_message": "Передача файла в процессе. Закрытие прервет передачу. Вы уверены, что хотите принудительно закрыть?", From e2f1d80697316b0898e763051b618ff9b7ada35d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 08:44:28 +0800 Subject: [PATCH 24/83] ci(deps): bump actions/setup-node from 4 to 6 (#11090) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4...v6) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/auto-i18n.yml | 2 +- .github/workflows/github-issue-tracker.yml | 4 ++-- .github/workflows/nightly-build.yml | 2 +- .github/workflows/pr-ci.yml | 2 +- .github/workflows/release.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/auto-i18n.yml b/.github/workflows/auto-i18n.yml index a6c1e3791a..c26f4b1adf 100644 --- a/.github/workflows/auto-i18n.yml +++ b/.github/workflows/auto-i18n.yml @@ -27,7 +27,7 @@ jobs: ref: ${{ github.event.pull_request.head.ref }} - name: 📦 Setting Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 20 package-manager-cache: false diff --git a/.github/workflows/github-issue-tracker.yml b/.github/workflows/github-issue-tracker.yml index 7cc1ad4762..f585527ea2 100644 --- a/.github/workflows/github-issue-tracker.yml +++ b/.github/workflows/github-issue-tracker.yml @@ -54,7 +54,7 @@ jobs: - name: Setup Node.js if: steps.check_time.outputs.should_delay == 'false' - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' @@ -121,7 +121,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 9e1608b13e..5e60ec1591 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -56,7 +56,7 @@ jobs: ref: main - name: Install Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 20 diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index 9108d71fc1..44fc49ee6d 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v5 - name: Install Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 20 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c54504de07..2fa8aa5d4e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: npm version "$VERSION" --no-git-tag-version --allow-same-version - name: Install Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 20 From e5967fd874e7acd2fe826c4c93a26eb06433c161 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 08:44:41 +0800 Subject: [PATCH 25/83] ci(deps): bump actions/upload-artifact from 4 to 5 (#11089) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/nightly-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 5e60ec1591..0698c3bab2 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -208,7 +208,7 @@ jobs: echo "总计: $(find renamed-artifacts -type f | wc -l) 个文件" - name: Upload artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: cherry-studio-nightly-${{ steps.date.outputs.date }}-${{ matrix.os }} path: renamed-artifacts/* From cdc12d509247f461d84fae45df8316d5d5f21266 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 08:44:53 +0800 Subject: [PATCH 26/83] ci(deps): bump actions/stale from 9 to 10 (#11088) Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v9...v10) --- updated-dependencies: - dependency-name: actions/stale dependency-version: '10' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/issue-management.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/issue-management.yml b/.github/workflows/issue-management.yml index f6041f2336..c9ff497386 100644 --- a/.github/workflows/issue-management.yml +++ b/.github/workflows/issue-management.yml @@ -21,7 +21,7 @@ jobs: contents: none steps: - name: Close needs-more-info issues - uses: actions/stale@v9 + uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} only-labels: 'needs-more-info' @@ -42,7 +42,7 @@ jobs: days-before-pr-close: -1 - name: Close inactive issues - uses: actions/stale@v9 + uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: ${{ env.daysBeforeStale }} From 5f1c14e2c03af79c1301ac43ade9e220848a959b Mon Sep 17 00:00:00 2001 From: chenxue Date: Sun, 2 Nov 2025 17:03:05 +0800 Subject: [PATCH 27/83] fix(aihubmix): fix default rules missing app code (#11100) * add imagen * Update aihubmix.ts * fix type --------- Co-authored-by: zhaochenxue --- src/main/services/WebSocketService.ts | 2 +- src/renderer/src/aiCore/provider/config/aihubmix.ts | 2 +- src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/services/WebSocketService.ts b/src/main/services/WebSocketService.ts index 5a4b77f651..e52919e96a 100644 --- a/src/main/services/WebSocketService.ts +++ b/src/main/services/WebSocketService.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { WebSocketCandidatesResponse, WebSocketStatusResponse } from '@shared/config/types' +import type { WebSocketCandidatesResponse, WebSocketStatusResponse } from '@shared/config/types' import * as fs from 'fs' import { networkInterfaces } from 'os' import * as path from 'path' diff --git a/src/renderer/src/aiCore/provider/config/aihubmix.ts b/src/renderer/src/aiCore/provider/config/aihubmix.ts index 432be5ee31..8feed89909 100644 --- a/src/renderer/src/aiCore/provider/config/aihubmix.ts +++ b/src/renderer/src/aiCore/provider/config/aihubmix.ts @@ -52,7 +52,7 @@ const AIHUBMIX_RULES: RuleSet = { } } ], - fallbackRule: (provider: Provider) => provider + fallbackRule: (provider: Provider) => extraProviderConfig(provider) } export const aihubmixProviderCreator = provider2Provider.bind(null, AIHUBMIX_RULES) diff --git a/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx b/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx index 26caf29d86..1920d0b210 100644 --- a/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx +++ b/src/renderer/src/components/Popups/ExportToPhoneLanPopup.tsx @@ -5,7 +5,7 @@ import { Spinner } from '@heroui/spinner' import { loggerService } from '@logger' import { AppLogo } from '@renderer/config/env' import { SettingHelpText, SettingRow } from '@renderer/pages/settings' -import { WebSocketCandidatesResponse } from '@shared/config/types' +import type { WebSocketCandidatesResponse } from '@shared/config/types' import { QRCodeSVG } from 'qrcode.react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' From bd94d2334316a66f50ad9e899e822b9f2f6a3374 Mon Sep 17 00:00:00 2001 From: SuYao Date: Sun, 2 Nov 2025 19:24:23 +0800 Subject: [PATCH 28/83] refactor:Unify the naming of configuration fields in thinking, change to using underscore style. (#11106) * refactor:Unify the naming of configuration fields in thinking, change to using underscore style. * fix(i18n): Auto update translations for PR #11106 * chore: lint * fix: typecheck --------- Co-authored-by: GitHub Action --- .../legacy/clients/openai/OpenAIApiClient.ts | 12 +++++------ src/renderer/src/aiCore/utils/reasoning.ts | 20 +++++++++---------- src/renderer/src/i18n/translate/de-de.json | 5 +++++ src/renderer/src/i18n/translate/el-gr.json | 5 +++++ src/renderer/src/i18n/translate/es-es.json | 5 +++++ src/renderer/src/i18n/translate/fr-fr.json | 5 +++++ src/renderer/src/i18n/translate/ja-jp.json | 5 +++++ src/renderer/src/i18n/translate/pt-pt.json | 5 +++++ src/renderer/src/i18n/translate/ru-ru.json | 5 +++++ src/renderer/src/types/sdk.ts | 6 ++++-- 10 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts index 239890c7a7..8ff25e356d 100644 --- a/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/openai/OpenAIApiClient.ts @@ -192,7 +192,7 @@ export class OpenAIAPIClient extends OpenAIBaseClient< extra_body: { google: { thinking_config: { - thinkingBudget: 0 + thinking_budget: 0 } } } @@ -327,8 +327,8 @@ export class OpenAIAPIClient extends OpenAIBaseClient< extra_body: { google: { thinking_config: { - thinkingBudget: -1, - includeThoughts: true + thinking_budget: -1, + include_thoughts: true } } } @@ -338,8 +338,8 @@ export class OpenAIAPIClient extends OpenAIBaseClient< extra_body: { google: { thinking_config: { - thinkingBudget: budgetTokens, - includeThoughts: true + thinking_budget: budgetTokens, + include_thoughts: true } } } @@ -670,7 +670,7 @@ export class OpenAIAPIClient extends OpenAIBaseClient< } else if (isClaudeReasoningModel(model) && reasoningEffort.thinking?.budget_tokens) { suffix = ` --thinking_budget ${reasoningEffort.thinking.budget_tokens}` } else if (isGeminiReasoningModel(model) && reasoningEffort.extra_body?.google?.thinking_config) { - suffix = ` --thinking_budget ${reasoningEffort.extra_body.google.thinking_config.thinkingBudget}` + suffix = ` --thinking_budget ${reasoningEffort.extra_body.google.thinking_config.thinking_budget}` } // FIXME: poe 不支持多个text part,上传文本文件的时候用的不是file part而是text part,因此会出问题 // 临时解决方案是强制poe用string content,但是其实poe部分支持array diff --git a/src/renderer/src/aiCore/utils/reasoning.ts b/src/renderer/src/aiCore/utils/reasoning.ts index 0246ac31cb..7b5a6890d7 100644 --- a/src/renderer/src/aiCore/utils/reasoning.ts +++ b/src/renderer/src/aiCore/utils/reasoning.ts @@ -98,7 +98,7 @@ export function getReasoningEffort(assistant: Assistant, model: Model): Reasonin extra_body: { google: { thinking_config: { - thinkingBudget: 0 + thinking_budget: 0 } } } @@ -259,8 +259,8 @@ export function getReasoningEffort(assistant: Assistant, model: Model): Reasonin extra_body: { google: { thinking_config: { - thinkingBudget: -1, - includeThoughts: true + thinking_budget: -1, + include_thoughts: true } } } @@ -270,8 +270,8 @@ export function getReasoningEffort(assistant: Assistant, model: Model): Reasonin extra_body: { google: { thinking_config: { - thinkingBudget: budgetTokens, - includeThoughts: true + thinking_budget: budgetTokens ?? -1, + include_thoughts: true } } } @@ -431,8 +431,8 @@ export function getGeminiReasoningParams(assistant: Assistant, model: Model): Re if (reasoningEffort === undefined) { return { thinkingConfig: { - includeThoughts: false, - ...(GEMINI_FLASH_MODEL_REGEX.test(model.id) ? { thinkingBudget: 0 } : {}) + include_thoughts: false, + ...(GEMINI_FLASH_MODEL_REGEX.test(model.id) ? { thinking_budget: 0 } : {}) } } } @@ -442,7 +442,7 @@ export function getGeminiReasoningParams(assistant: Assistant, model: Model): Re if (effortRatio > 1) { return { thinkingConfig: { - includeThoughts: true + include_thoughts: true } } } @@ -452,8 +452,8 @@ export function getGeminiReasoningParams(assistant: Assistant, model: Model): Re return { thinkingConfig: { - ...(budget > 0 ? { thinkingBudget: budget } : {}), - includeThoughts: true + ...(budget > 0 ? { thinking_budget: budget } : {}), + include_thoughts: true } } } diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index 2e86111da1..68e491ecb3 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "Bewältigen Sie komplexe Aufgaben mit verschiedenen Werkzeugen", "error": { "failed": "Agent hinzufügen fehlgeschlagen", "invalid_agent": "Ungültiger Agent" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "Tägliche Gespräche und schnelle Fragen & Antworten", "title": "Assistent hinzufügen" }, + "option": { + "title": "Typ auswählen" + }, "topic": { "title": "Neues Thema erstellen" } diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index a793d9ddf0..35d61b1a1c 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "Χειριστείτε πολύπλοκες εργασίες με διάφορα εργαλεία", "error": { "failed": "Αποτυχία προσθήκης πράκτορα", "invalid_agent": "Μη έγκυρος Agent" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "Καθημερινές συνομιλίες και γρήγορες ερωταπαντήσεις", "title": "Προσθήκη βοηθού" }, + "option": { + "title": "Επιλέξτε Τύπο" + }, "topic": { "title": "Δημιουργία νέου θέματος" } diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 27b46ce3b3..75475fef3f 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "Maneja tareas complejas con varias herramientas", "error": { "failed": "Error al añadir agente", "invalid_agent": "Agent inválido" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "Conversaciones diarias y preguntas y respuestas rápidas", "title": "Agregar asistente" }, + "option": { + "title": "Seleccionar Tipo" + }, "topic": { "title": "Crear nuevo tema" } diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index b710e40b1e..2076b9a841 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "Gérez des tâches complexes avec divers outils", "error": { "failed": "Échec de l'ajout de l'agent", "invalid_agent": "Agent invalide" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "Conversations quotidiennes et Q&R rapides", "title": "Ajouter un assistant" }, + "option": { + "title": "Sélectionner le type" + }, "topic": { "title": "Nouveau sujet" } diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index 449e6bad29..c8e6da0d04 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "さまざまなツールを使って複雑なタスクを処理する", "error": { "failed": "エージェントの追加に失敗しました", "invalid_agent": "無効なエージェント" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "日常会話と簡単なQ&A", "title": "アシスタントを追加" }, + "option": { + "title": "種類を選択" + }, "topic": { "title": "新しいトピック" } diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index 5ac0f082c1..f75a164a9d 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "Lide com tarefas complexas usando várias ferramentas", "error": { "failed": "Falha ao adicionar agente", "invalid_agent": "Agent inválido" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "Conversas diárias e perguntas e respostas rápidas", "title": "Adicionar assistente" }, + "option": { + "title": "Selecionar Tipo" + }, "topic": { "title": "Novo Tópico" } diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index 64a6453115..de63d96ff3 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -1,6 +1,7 @@ { "agent": { "add": { + "description": "Справляйтесь со сложными задачами с помощью различных инструментов", "error": { "failed": "Не удалось добавить агента", "invalid_agent": "Недействительный агент" @@ -547,8 +548,12 @@ "chat": { "add": { "assistant": { + "description": "Ежедневные разговоры и быстрые вопросы и ответы", "title": "Добавить ассистента" }, + "option": { + "title": "Выберите тип" + }, "topic": { "title": "Новый топик" } diff --git a/src/renderer/src/types/sdk.ts b/src/renderer/src/types/sdk.ts index f0ea796932..90a0101563 100644 --- a/src/renderer/src/types/sdk.ts +++ b/src/renderer/src/types/sdk.ts @@ -23,7 +23,6 @@ import type { GoogleGenAI, Model as GeminiModel, SendMessageParameters, - ThinkingConfig, Tool } from '@google/genai' @@ -92,7 +91,10 @@ export type ReasoningEffortOptionalParams = { } extra_body?: { google?: { - thinking_config: ThinkingConfig + thinking_config: { + thinking_budget: number + include_thoughts?: boolean + } } } // Add any other potential reasoning-related keys here if they exist From 9f00f0054693bf58ec4f142db47a10692cecd746 Mon Sep 17 00:00:00 2001 From: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:28:36 +0800 Subject: [PATCH 29/83] chore: update v1.7.0-beta.3 release notes (#11105) * chore: update v1.7.0-beta.3 release notes * fix(i18n): Auto update translations for PR #11105 * fix: code lint error --------- Co-authored-by: GitHub Action --- electron-builder.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/electron-builder.yml b/electron-builder.yml index ad90b39922..967d1c96a6 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -161,6 +161,9 @@ releaseInfo: - MCP Confirmation: Added confirmation modal when activating protocol-installed MCP servers - Translation: Enhanced translation script with concurrency and validation - Electron & Vite: Updated to Electron 38 and Vite 4.0.1 + - QR Code Generation: Optimized performance for phone LAN export + - Enterprise Settings: Added enterprise section in About settings + - Assistant/Agent Popup: Enhanced UI for adding assistants and agents Claude Code Tool Improvements: - GlobTool: Now counts lines instead of files in output for better clarity @@ -188,6 +191,9 @@ releaseInfo: - Fixed reranker API error response capture - Fixed right-click paste file content into inputbar - Fixed minimax-m2 support in aiCore + - Fixed Azure embedding issues + - Fixed agent edit modal loading race condition + - Fixed debounced save cancellation on file path update v1.7.0-beta.3 新特性 @@ -218,6 +224,9 @@ releaseInfo: - MCP 确认:添加激活协议安装的 MCP 服务器时的确认模态框 - 翻译:增强翻译脚本的并发和验证功能 - Electron & Vite:更新至 Electron 38 和 Vite 4.0.1 + - 二维码生成:优化手机局域网导出性能 + - 企业设置:在关于设置中添加企业部分 + - 助手/Agent 弹窗:增强添加助手和 Agent 的界面 Claude Code 工具改进: - GlobTool:现在计算行数而不是文件数,提供更清晰的输出 @@ -245,4 +254,7 @@ releaseInfo: - 修复 reranker API 错误响应捕获 - 修复右键粘贴文件内容到输入栏 - 修复 aiCore 中的 minimax-m2 支持 + - 修复 Azure embedding 问题 + - 修复 Agent 编辑模态框加载竞态条件 + - 修复文件路径更新时防抖保存取消问题 From 6eaa2b2461ca052b47f2ab9b878ee75fc486a342 Mon Sep 17 00:00:00 2001 From: beyondkmp Date: Mon, 3 Nov 2025 13:09:40 +0800 Subject: [PATCH 30/83] refactor: remove main window dependency from PythonService and utilize WindowService for window management (#11116) * refactor: remove main window dependency from PythonService and utilize WindowService for window management * format code --- src/main/ipc.ts | 3 --- src/main/services/PythonService.ts | 14 +++++--------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 0e63f11600..936a0dd008 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -115,9 +115,6 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { const appUpdater = new AppUpdater() const notificationService = new NotificationService() - // Initialize Python service with main window - pythonService.setMainWindow(mainWindow) - const checkMainWindow = () => { if (!mainWindow || mainWindow.isDestroyed()) { throw new Error('Main window does not exist or has been destroyed') diff --git a/src/main/services/PythonService.ts b/src/main/services/PythonService.ts index b4b2596831..e9f59fa3be 100644 --- a/src/main/services/PythonService.ts +++ b/src/main/services/PythonService.ts @@ -1,8 +1,9 @@ import { randomUUID } from 'node:crypto' -import type { BrowserWindow } from 'electron' import { ipcMain } from 'electron' +import { windowService } from './WindowService' + interface PythonExecutionRequest { id: string script: string @@ -21,7 +22,6 @@ interface PythonExecutionResponse { */ export class PythonService { private static instance: PythonService | null = null - private mainWindow: BrowserWindow | null = null private pendingRequests = new Map void; reject: (error: Error) => void }>() private constructor() { @@ -51,10 +51,6 @@ export class PythonService { }) } - public setMainWindow(mainWindow: BrowserWindow) { - this.mainWindow = mainWindow - } - /** * Execute Python code by sending request to renderer PyodideService */ @@ -63,8 +59,8 @@ export class PythonService { context: Record = {}, timeout: number = 60000 ): Promise { - if (!this.mainWindow) { - throw new Error('Main window not set in PythonService') + if (!windowService.getMainWindow()) { + throw new Error('Main window not found') } return new Promise((resolve, reject) => { @@ -95,7 +91,7 @@ export class PythonService { // Send request to renderer const request: PythonExecutionRequest = { id: requestId, script, context, timeout } - this.mainWindow?.webContents.send('python-execution-request', request) + windowService.getMainWindow()?.webContents.send('python-execution-request', request) }) } } From 32a84311aa5e334ae669fb06cbca825baa70cef1 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 3 Nov 2025 13:28:31 +0800 Subject: [PATCH 31/83] feat: add SophNet LLM provider --- .../src/assets/images/providers/sophnet.svg | 13 ++++++++++ src/renderer/src/config/models/default.ts | 1 + src/renderer/src/config/providers.ts | 25 ++++++++++++++++++- src/renderer/src/i18n/label.ts | 3 ++- src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/i18n/locales/zh-cn.json | 1 + src/renderer/src/i18n/locales/zh-tw.json | 1 + src/renderer/src/i18n/translate/de-de.json | 3 ++- src/renderer/src/i18n/translate/el-gr.json | 3 ++- src/renderer/src/i18n/translate/es-es.json | 3 ++- src/renderer/src/i18n/translate/fr-fr.json | 3 ++- src/renderer/src/i18n/translate/ja-jp.json | 1 + src/renderer/src/i18n/translate/pt-pt.json | 3 ++- src/renderer/src/i18n/translate/ru-ru.json | 1 + src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/migrate.ts | 10 ++++++++ src/renderer/src/types/provider.ts | 1 + 17 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 src/renderer/src/assets/images/providers/sophnet.svg diff --git a/src/renderer/src/assets/images/providers/sophnet.svg b/src/renderer/src/assets/images/providers/sophnet.svg new file mode 100644 index 0000000000..aae1e03239 --- /dev/null +++ b/src/renderer/src/assets/images/providers/sophnet.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/renderer/src/config/models/default.ts b/src/renderer/src/config/models/default.ts index 5b242f297d..a56ea7f6cb 100644 --- a/src/renderer/src/config/models/default.ts +++ b/src/renderer/src/config/models/default.ts @@ -27,6 +27,7 @@ export const SYSTEM_MODELS: Record = ], cherryin: [], vertexai: [], + sophnet: [], '302ai': [ { id: 'deepseek-chat', diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 4c25dfff99..2b9fe2b21f 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -46,6 +46,7 @@ import Ph8ProviderLogo from '@renderer/assets/images/providers/ph8.png' import PPIOProviderLogo from '@renderer/assets/images/providers/ppio.png' import QiniuProviderLogo from '@renderer/assets/images/providers/qiniu.webp' import SiliconFlowProviderLogo from '@renderer/assets/images/providers/silicon.png' +import SophnetProviderLogo from '@renderer/assets/images/providers/sophnet.svg' import StepProviderLogo from '@renderer/assets/images/providers/step.png' import TencentCloudProviderLogo from '@renderer/assets/images/providers/tencent-cloud-ti.png' import TogetherProviderLogo from '@renderer/assets/images/providers/together.png' @@ -246,6 +247,16 @@ export const SYSTEM_PROVIDERS_CONFIG: Record = isSystem: true, enabled: false }, + sophnet: { + id: 'sophnet', + name: 'SophNet', + type: 'openai', + apiKey: '', + apiHost: 'https://www.sophnet.com/api/open-apis/v1', + models: [], + isSystem: true, + enabled: false + }, ppio: { id: 'ppio', name: 'PPIO', @@ -729,7 +740,8 @@ export const PROVIDER_LOGO_MAP: AtLeast = { poe: 'poe', // use svg icon component aionly: AiOnlyProviderLogo, longcat: LongCatProviderLogo, - huggingface: HuggingfaceProviderLogo + huggingface: HuggingfaceProviderLogo, + sophnet: SophnetProviderLogo } as const export function getProviderLogo(providerId: string) { @@ -808,6 +820,17 @@ export const PROVIDER_URLS: Record = { models: 'https://ai.burncloud.com/pricing' } }, + sophnet: { + api: { + url: 'https://www.sophnet.com/api/open-apis/v1' + }, + websites: { + official: 'https://sophnet.com', + apiKey: 'https://sophnet.com/#/project/key', + docs: 'https://sophnet.com/docs/component/introduce.html', + models: 'https://sophnet.com/#/model/list' + } + }, ppio: { api: { url: 'https://api.ppinfra.com/v3/openai' diff --git a/src/renderer/src/i18n/label.ts b/src/renderer/src/i18n/label.ts index 3736437fc8..14ff45b331 100644 --- a/src/renderer/src/i18n/label.ts +++ b/src/renderer/src/i18n/label.ts @@ -85,7 +85,8 @@ const providerKeyMap = { poe: 'provider.poe', aionly: 'provider.aionly', longcat: 'provider.longcat', - huggingface: 'provider.huggingface' + huggingface: 'provider.huggingface', + sophnet: 'provider.sophnet' } as const /** diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index b3b89851d7..b84cb8bc53 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -2482,6 +2482,7 @@ "qiniu": "Qiniu AI", "qwenlm": "QwenLM", "silicon": "SiliconFlow", + "sophnet": "SophNet", "stepfun": "StepFun", "tencent-cloud-ti": "Tencent Cloud TI", "together": "Together", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 8f91651bac..a83813b017 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -2482,6 +2482,7 @@ "qiniu": "七牛云 AI 推理", "qwenlm": "QwenLM", "silicon": "硅基流动", + "sophnet": "SophNet", "stepfun": "阶跃星辰", "tencent-cloud-ti": "腾讯云 TI", "together": "Together", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index f89802ee23..76777fd644 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -2482,6 +2482,7 @@ "qiniu": "七牛雲 AI 推理", "qwenlm": "QwenLM", "silicon": "SiliconFlow", + "sophnet": "SophNet", "stepfun": "StepFun", "tencent-cloud-ti": "騰訊雲 TI", "together": "Together", diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index 68e491ecb3..9891df74ca 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -2476,12 +2476,13 @@ "openrouter": "OpenRouter", "ovms": "Intel OVMS", "perplexity": "Perplexity", - "ph8": "PH8 Großmodell-Plattform", + "ph8": "PH8", "poe": "Poe", "ppio": "PPIO Cloud", "qiniu": "Qiniu Cloud KI-Inferenz", "qwenlm": "QwenLM", "silicon": "SiliconFlow", + "sophnet": "SophNet", "stepfun": "StepFun", "tencent-cloud-ti": "Tencent Cloud TI", "together": "Together", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index 35d61b1a1c..9a51b4b1df 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -2476,12 +2476,13 @@ "openrouter": "OpenRouter", "ovms": "Intel OVMS", "perplexity": "Perplexity", - "ph8": "Πλατφόρμα Ανοιχτής Μεγάλης Μοντέλου PH8", + "ph8": "PH8", "poe": "Poe", "ppio": "PPIO Piao Yun", "qiniu": "Qiniu AI", "qwenlm": "QwenLM", "silicon": "Σιδηρική Παρουσία", + "sophnet": "SophNet", "stepfun": "Βήμα Ουράς", "tencent-cloud-ti": "Tencent Cloud TI", "together": "Together", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 75475fef3f..4382c402e1 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -2476,12 +2476,13 @@ "openrouter": "OpenRouter", "ovms": "Intel OVMS", "perplexity": "Perplejidad", - "ph8": "Plataforma Abierta de Grandes Modelos PH8", + "ph8": "PH8", "poe": "Poe", "ppio": "PPIO Cloud Piao", "qiniu": "Qiniu AI", "qwenlm": "QwenLM", "silicon": "Silicio Fluido", + "sophnet": "SophNet", "stepfun": "Función Salto", "tencent-cloud-ti": "Tencent Nube TI", "together": "Juntos", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index 2076b9a841..4b35eab2fe 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -2476,12 +2476,13 @@ "openrouter": "OpenRouter", "ovms": "Intel OVMS", "perplexity": "Perplexité", - "ph8": "Plateforme ouverte de grands modèles PH8", + "ph8": "PH8", "poe": "Poe", "ppio": "PPIO Cloud Piou", "qiniu": "Qiniu AI", "qwenlm": "QwenLM", "silicon": "Silicium Fluide", + "sophnet": "SophNet", "stepfun": "Échelon Étoile", "tencent-cloud-ti": "Tencent Cloud TI", "together": "Ensemble", diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index c8e6da0d04..be3fbf90a6 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -2482,6 +2482,7 @@ "qiniu": "七牛云 AI 推理", "qwenlm": "QwenLM", "silicon": "SiliconFlow", + "sophnet": "SophNet", "stepfun": "StepFun", "tencent-cloud-ti": "Tencent Cloud TI", "together": "Together", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index f75a164a9d..85c6400d0b 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -2476,12 +2476,13 @@ "openrouter": "OpenRouter", "ovms": "Intel OVMS", "perplexity": "Perplexidade", - "ph8": "Plataforma Aberta de Grandes Modelos PH8", + "ph8": "PH8", "poe": "Poe", "ppio": "PPIO Nuvem Piao", "qiniu": "Qiniu AI", "qwenlm": "QwenLM", "silicon": "Silício em Fluxo", + "sophnet": "SophNet", "stepfun": "Função de Passo Estelar", "tencent-cloud-ti": "Nuvem TI da Tencent", "together": "Juntos", diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index de63d96ff3..6f1797917d 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -2482,6 +2482,7 @@ "qiniu": "Qiniu AI", "qwenlm": "QwenLM", "silicon": "SiliconFlow", + "sophnet": "SophNet", "stepfun": "StepFun", "tencent-cloud-ti": "Tencent Cloud TI", "together": "Together", diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index efd5e415ff..a181e17598 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -67,7 +67,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 169, + version: 170, blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs', 'toolPermissions'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index c6e3a9576c..a96f81e2d0 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -2783,6 +2783,16 @@ const migrateConfig = { logger.error('migrate 169 error', error as Error) return state } + }, + '170': (state: RootState) => { + try { + addProvider(state, 'sophnet') + state.llm.providers = moveProvider(state.llm.providers, 'sophnet', 17) + return state + } catch (error) { + logger.error('migrate 170 error', error as Error) + return state + } } } diff --git a/src/renderer/src/types/provider.ts b/src/renderer/src/types/provider.ts index e013d3d58a..657e445707 100644 --- a/src/renderer/src/types/provider.ts +++ b/src/renderer/src/types/provider.ts @@ -123,6 +123,7 @@ export const SystemProviderIds = { cephalon: 'cephalon', lanyun: 'lanyun', ph8: 'ph8', + sophnet: 'sophnet', openrouter: 'openrouter', ollama: 'ollama', ovms: 'ovms', From 11bf50e722f1556b10326b46f1c5a02e5c04e5d7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 3 Nov 2025 14:45:21 +0800 Subject: [PATCH 32/83] fix(i18n): improve label retrieval for paintings image size options --- src/renderer/src/i18n/label.ts | 2 +- .../ProviderSettings/ModelList/ManageModelsPopup.tsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/i18n/label.ts b/src/renderer/src/i18n/label.ts index 14ff45b331..f8806359d4 100644 --- a/src/renderer/src/i18n/label.ts +++ b/src/renderer/src/i18n/label.ts @@ -239,7 +239,7 @@ const paintingsImageSizeOptionsKeyMap = { } as const export const getPaintingsImageSizeOptionsLabel = (key: string): string => { - return getLabel(paintingsImageSizeOptionsKeyMap, key) + return paintingsImageSizeOptionsKeyMap[key] ? getLabel(paintingsImageSizeOptionsKeyMap, key) : key } const paintingsQualityOptionsKeyMap = { diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx index 27f5c67eae..e2ae51394d 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx @@ -131,10 +131,11 @@ const PopupContainer: React.FC = ({ providerId, resolve }) => { (model: Model) => { if (!isEmpty(model.name)) { if (isNewApiProvider(provider)) { - if (model.supported_endpoint_types && model.supported_endpoint_types.length > 0) { + const endpointTypes = model.supported_endpoint_types + if (endpointTypes && endpointTypes.length > 0) { addModel({ ...model, - endpoint_type: model.supported_endpoint_types[0], + endpoint_type: endpointTypes.includes('image-generation') ? 'image-generation' : endpointTypes[0], supported_text_delta: !isNotSupportedTextDelta(model) }) } else { From d8f68a6056b57258eab3b011fe71a5e74fca56c7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 3 Nov 2025 15:12:58 +0800 Subject: [PATCH 33/83] feat: initialize painting model with first available option and update default provider to 'cherryin' --- .../src/pages/paintings/NewApiPage.tsx | 7 +++++++ .../pages/paintings/PaintingsRoutePage.tsx | 20 +++++++++---------- src/renderer/src/store/migrate.ts | 1 + src/renderer/src/store/settings.ts | 2 +- src/renderer/src/types/index.ts | 2 +- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/pages/paintings/NewApiPage.tsx b/src/renderer/src/pages/paintings/NewApiPage.tsx index eae48e5316..86571f446e 100644 --- a/src/renderer/src/pages/paintings/NewApiPage.tsx +++ b/src/renderer/src/pages/paintings/NewApiPage.tsx @@ -482,6 +482,13 @@ const NewApiPage: FC<{ Options: string[] }> = ({ Options }) => { } }, []) + // if painting.model is not set, set it to the first model in modelOptions + useEffect(() => { + if (!painting.model && modelOptions.length > 0) { + updatePaintingState({ model: modelOptions[0].value }) + } + }, [modelOptions, painting.model, updatePaintingState]) + return ( diff --git a/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx b/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx index 9c516560b6..aedd7a418e 100644 --- a/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx +++ b/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx @@ -3,6 +3,7 @@ import { isNewApiProvider } from '@renderer/config/providers' import { useAllProviders } from '@renderer/hooks/useProvider' import { useAppDispatch } from '@renderer/store' import { setDefaultPaintingProvider } from '@renderer/store/settings' +import { updateTab } from '@renderer/store/tabs' import type { PaintingProvider, SystemProviderId } from '@renderer/types' import type { FC } from 'react' import { useEffect, useMemo, useState } from 'react' @@ -25,11 +26,11 @@ const PaintingsRoutePage: FC = () => { const provider = params['*'] const dispatch = useAppDispatch() const providers = useAllProviders() - const Options = useMemo(() => { - return [...BASE_OPTIONS, ...providers.filter((p) => isNewApiProvider(p)).map((p) => p.id)] - }, [providers]) const [ovmsStatus, setOvmsStatus] = useState<'not-installed' | 'not-running' | 'running'>('not-running') + const Options = useMemo(() => [...BASE_OPTIONS, ...providers.filter(isNewApiProvider).map((p) => p.id)], [providers]) + const newApiProviders = useMemo(() => providers.filter(isNewApiProvider), [providers]) + useEffect(() => { const checkStatus = async () => { const status = await window.api.ovms.getStatus() @@ -44,25 +45,24 @@ const PaintingsRoutePage: FC = () => { logger.debug(`defaultPaintingProvider: ${provider}`) if (provider && validOptions.includes(provider)) { dispatch(setDefaultPaintingProvider(provider as PaintingProvider)) + dispatch(updateTab({ id: 'paintings', updates: { path: `/paintings/${provider}` } })) } }, [provider, dispatch, validOptions]) return ( - } /> + } /> } /> } /> } /> } /> } /> } /> - {/* new-api family providers are mounted dynamically below */} - {providers - .filter((p) => isNewApiProvider(p)) - .map((p) => ( - } /> - ))} } /> + {/* new-api family providers are mounted dynamically below */} + {newApiProviders.map((p) => ( + } /> + ))} ) } diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index a96f81e2d0..1a6d32106c 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -2788,6 +2788,7 @@ const migrateConfig = { try { addProvider(state, 'sophnet') state.llm.providers = moveProvider(state.llm.providers, 'sophnet', 17) + state.settings.defaultPaintingProvider = 'cherryin' return state } catch (error) { logger.error('migrate 170 error', error as Error) diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index eccaf733d8..45f521b3df 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -390,7 +390,7 @@ export const initialState: SettingsState = { localBackupSyncInterval: 0, localBackupMaxBackups: 0, localBackupSkipBackupFile: false, - defaultPaintingProvider: 'zhipu', + defaultPaintingProvider: 'cherryin', s3: { endpoint: '', region: '', diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 28e0aff882..2026a935ab 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -280,7 +280,7 @@ export type PaintingParams = { providerId?: string } -export type PaintingProvider = 'zhipu' | 'aihubmix' | 'silicon' | 'dmxapi' | 'new-api' | 'ovms' +export type PaintingProvider = 'zhipu' | 'aihubmix' | 'silicon' | 'dmxapi' | 'new-api' | 'ovms' | 'cherryin' export interface Painting extends PaintingParams { model?: string From 4186e9c990824d6d0c1f7fbb87df92479e3d0459 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 3 Nov 2025 16:37:12 +0800 Subject: [PATCH 34/83] feat: add support for TopP in model capabilities and update parameter builder to utilize it --- .../src/aiCore/prepareParams/modelCapabilities.ts | 13 +++++++++++++ .../src/aiCore/prepareParams/parameterBuilder.ts | 10 +++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/aiCore/prepareParams/modelCapabilities.ts b/src/renderer/src/aiCore/prepareParams/modelCapabilities.ts index 4a3c3f4bbf..b6e4b25843 100644 --- a/src/renderer/src/aiCore/prepareParams/modelCapabilities.ts +++ b/src/renderer/src/aiCore/prepareParams/modelCapabilities.ts @@ -85,6 +85,19 @@ export function supportsLargeFileUpload(model: Model): boolean { }) } +/** + * 检查模型是否支持TopP + */ +export function supportsTopP(model: Model): boolean { + const provider = getProviderByModel(model) + + if (provider?.type === 'anthropic' || model?.endpoint_type === 'anthropic') { + return false + } + + return true +} + /** * 获取提供商特定的文件大小限制 */ diff --git a/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts b/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts index d3fa1cb654..397c481cf3 100644 --- a/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts +++ b/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts @@ -34,6 +34,7 @@ import { setupToolsConfig } from '../utils/mcp' import { buildProviderOptions } from '../utils/options' import { getAnthropicThinkingBudget } from '../utils/reasoning' import { buildProviderBuiltinWebSearchConfig } from '../utils/websearch' +import { supportsTopP } from './modelCapabilities' import { getTemperature, getTopP } from './modelParameters' const logger = loggerService.withContext('parameterBuilder') @@ -176,20 +177,27 @@ export async function buildStreamTextParams( messages: sdkMessages, maxOutputTokens: maxTokens, temperature: getTemperature(assistant, model), - topP: getTopP(assistant, model), abortSignal: options.requestOptions?.signal, headers: options.requestOptions?.headers, providerOptions, stopWhen: stepCountIs(20), maxRetries: 0 } + + if (supportsTopP(model)) { + params.topP = getTopP(assistant, model) + } + if (tools) { params.tools = tools } + if (assistant.prompt) { params.system = await replacePromptVariables(assistant.prompt, model.name) } + logger.debug('params', params) + return { params, modelId: model.id, From 0cf81c04c8a7874acc153b46eb399a5b4b28e23a Mon Sep 17 00:00:00 2001 From: beyondkmp Date: Mon, 3 Nov 2025 17:54:29 +0800 Subject: [PATCH 35/83] chore: update electron-builder.yml to exclude additional configuration files from build (#11129) * chore: update electron-builder.yml to exclude additional configuration files from build * delete all hide files --- electron-builder.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/electron-builder.yml b/electron-builder.yml index 967d1c96a6..2815d86e5c 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -21,6 +21,8 @@ files: - "**/*" - "!**/{.vscode,.yarn,.yarn-lock,.github,.cursorrules,.prettierrc}" - "!electron.vite.config.{js,ts,mjs,cjs}}" + - "!.*" + - "!components.json" - "!**/{.eslintignore,.eslintrc.js,.eslintrc.json,.eslintcache,root.eslint.config.js,eslint.config.js,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,eslint.config.mjs,dev-app-update.yml,CHANGELOG.md,README.md,biome.jsonc}" - "!**/{.env,.env.*,.npmrc,pnpm-lock.yaml}" - "!**/{tsconfig.json,tsconfig.tsbuildinfo,tsconfig.node.json,tsconfig.web.json}" From 714a28ac29629227def4fa99d11f8bdc7008edb8 Mon Sep 17 00:00:00 2001 From: Phantom Date: Mon, 3 Nov 2025 20:34:24 +0800 Subject: [PATCH 36/83] fix(QuickPanel): Hide the options that should be hidden in the quick panel. (#10931) * feat(QuickPanel): add hidden property to list items Add support for hiding QuickPanel items by introducing a hidden property. This allows conditional visibility of items like the knowledge base button based on application state. * docs(types): clarify settings field comment in Assistant type --- src/renderer/src/components/QuickPanel/types.ts | 1 + src/renderer/src/components/QuickPanel/view.tsx | 3 ++- src/renderer/src/pages/home/Inputbar/InputbarTools.tsx | 3 ++- src/renderer/src/types/index.ts | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/components/QuickPanel/types.ts b/src/renderer/src/components/QuickPanel/types.ts index 812ec153a6..519180c5b7 100644 --- a/src/renderer/src/components/QuickPanel/types.ts +++ b/src/renderer/src/components/QuickPanel/types.ts @@ -64,6 +64,7 @@ export type QuickPanelListItem = { isSelected?: boolean isMenu?: boolean disabled?: boolean + hidden?: boolean /** * 固定显示项:不参与过滤,始终出现在列表顶部。 * 例如“清除”按钮可设置为 alwaysVisible,从而在有匹配项时始终可见; diff --git a/src/renderer/src/components/QuickPanel/view.tsx b/src/renderer/src/components/QuickPanel/view.tsx index 47a0c6299e..5c6afcbf61 100644 --- a/src/renderer/src/components/QuickPanel/view.tsx +++ b/src/renderer/src/components/QuickPanel/view.tsx @@ -143,7 +143,8 @@ export const QuickPanelView: React.FC = ({ setInputText }) => { prevSymbolRef.current = ctx.symbol // 固定项置顶 + 过滤后的普通项 - return [...pinnedItems, ...filteredNormalItems] + const pinnedFiltered = [...pinnedItems, ...filteredNormalItems] + return pinnedFiltered.filter((item) => !item.hidden) }, [ctx.isVisible, ctx.symbol, ctx.list, searchText]) const canForwardAndBackward = useMemo(() => { diff --git a/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx b/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx index a24d63e8ba..4dee55b167 100644 --- a/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx +++ b/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx @@ -245,6 +245,7 @@ const InputbarTools = ({ icon: , isMenu: true, disabled: files.length > 0, + hidden: !showKnowledgeBaseButton, action: () => { knowledgeBaseButtonRef.current?.openQuickPanel() } @@ -312,7 +313,7 @@ const InputbarTools = ({ translate() } } - ] + ] satisfies QuickPanelListItem[] } const handleDragEnd = (result: DropResult) => { diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 2026a935ab..c86e80a157 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -36,6 +36,7 @@ export type Assistant = { description?: string model?: Model defaultModel?: Model + // This field should be considered as not Partial and not optional in v2 settings?: Partial messages?: AssistantMessage[] /** enableWebSearch 代表使用模型内置网络搜索功能 */ From 49bd298d37567bdb7a1df7c6d4ed0e08affbc576 Mon Sep 17 00:00:00 2001 From: Phantom Date: Mon, 3 Nov 2025 20:36:52 +0800 Subject: [PATCH 37/83] feat(InputbarTools): add reasoning effort button to quick panel (#10959) Add new menu item with lightbulb icon that opens the reasoning effort quick panel when clicked --- src/renderer/src/pages/home/Inputbar/InputbarTools.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx b/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx index 4dee55b167..a3d62e85bf 100644 --- a/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx +++ b/src/renderer/src/pages/home/Inputbar/InputbarTools.tsx @@ -2,6 +2,7 @@ import type { DropResult } from '@hello-pangea/dnd' import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import { loggerService } from '@logger' import { ActionIconButton } from '@renderer/components/Buttons' +import { MdiLightbulbOn } from '@renderer/components/Icons' import type { QuickPanelListItem } from '@renderer/components/QuickPanel' import { isAnthropicModel, @@ -230,6 +231,15 @@ const InputbarTools = ({ quickPhrasesButtonRef.current?.openQuickPanel() } }, + { + label: t('assistants.settings.reasoning_effort.label'), + description: '', + icon: , + isMenu: true, + action: () => { + thinkingButtonRef.current?.openQuickPanel() + } + }, { label: t('assistants.presets.edit.model.select.title'), description: '', From abd5d3b96ff549aa571938f1b5187a48cb6747ed Mon Sep 17 00:00:00 2001 From: Zephyr Date: Mon, 3 Nov 2025 21:05:10 +0800 Subject: [PATCH 38/83] feat: amazon bedrock request use bedrock api key (#10727) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: amazon bedrock request use bedrock api key * feat: ai-core/provider support bedrock api key * refactor: extract AWS Bedrock auth type and remove redundant state * feat: add bedrock reasoning support Add AWS Bedrock-specific reasoning parameter handling to support Extended Thinking feature for Claude models via Bedrock API. Changes: - Add `buildBedrockProviderOptions` function in options.ts to handle Bedrock-specific provider options - Add `getBedrockReasoningParams` function in reasoning.ts to generate reasoning config with budget tokens - Register 'bedrock' case in provider options switch to route to Bedrock-specific builder - Reuse `getAnthropicThinkingBudget` helper for consistent token budget calculation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * feat: add migration for Bedrock auth type and API key fields * refactor: replace any type with BedrockRuntimeClientConfig in AWS Bedrock client * fix: bug fix * fix: lint error * fix: bedrock reasoning * chore: bump persisted reducer version to 171 * Update src/renderer/src/store/migrate.ts --------- Co-authored-by: Claude Co-authored-by: icarus --- package.json | 6 +- .../legacy/clients/aws/AwsBedrockAPIClient.ts | 59 +- .../src/aiCore/provider/providerConfig.ts | 12 +- src/renderer/src/aiCore/utils/options.ts | 30 + src/renderer/src/aiCore/utils/reasoning.ts | 28 + src/renderer/src/hooks/useAwsBedrock.ts | 19 +- src/renderer/src/i18n/locales/en-us.json | 6 + src/renderer/src/i18n/locales/zh-cn.json | 6 + src/renderer/src/i18n/locales/zh-tw.json | 6 + .../ProviderSettings/AwsBedrockSettings.tsx | 109 +- .../src/services/__tests__/ApiService.test.ts | 2 + src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/llm.ts | 14 +- src/renderer/src/store/migrate.ts | 11 + src/renderer/src/types/provider.ts | 11 + yarn.lock | 2821 +++++------------ 16 files changed, 1120 insertions(+), 2022 deletions(-) diff --git a/package.json b/package.json index 0187f2fef1..f0c0050d2a 100644 --- a/package.json +++ b/package.json @@ -113,9 +113,9 @@ "@ant-design/v5-patch-for-react-19": "^1.0.3", "@anthropic-ai/sdk": "^0.41.0", "@anthropic-ai/vertex-sdk": "patch:@anthropic-ai/vertex-sdk@npm%3A0.11.4#~/.yarn/patches/@anthropic-ai-vertex-sdk-npm-0.11.4-c19cb41edb.patch", - "@aws-sdk/client-bedrock": "^3.840.0", - "@aws-sdk/client-bedrock-runtime": "^3.840.0", - "@aws-sdk/client-s3": "^3.840.0", + "@aws-sdk/client-bedrock": "^3.910.0", + "@aws-sdk/client-bedrock-runtime": "^3.910.0", + "@aws-sdk/client-s3": "^3.910.0", "@biomejs/biome": "2.2.4", "@cherrystudio/ai-core": "workspace:^1.0.0-alpha.18", "@cherrystudio/embedjs": "^0.1.31", diff --git a/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts b/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts index 94f74eecff..c4b0140579 100644 --- a/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/aws/AwsBedrockAPIClient.ts @@ -1,6 +1,7 @@ import { BedrockClient, ListFoundationModelsCommand, ListInferenceProfilesCommand } from '@aws-sdk/client-bedrock' import { BedrockRuntimeClient, + type BedrockRuntimeClientConfig, ConverseCommand, InvokeModelCommand, InvokeModelWithResponseStreamCommand @@ -11,6 +12,8 @@ import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant' import { findTokenLimit, isReasoningModel } from '@renderer/config/models' import { getAwsBedrockAccessKeyId, + getAwsBedrockApiKey, + getAwsBedrockAuthType, getAwsBedrockRegion, getAwsBedrockSecretAccessKey } from '@renderer/hooks/useAwsBedrock' @@ -75,32 +78,48 @@ export class AwsBedrockAPIClient extends BaseApiClient< } const region = getAwsBedrockRegion() - const accessKeyId = getAwsBedrockAccessKeyId() - const secretAccessKey = getAwsBedrockSecretAccessKey() + const authType = getAwsBedrockAuthType() if (!region) { - throw new Error('AWS region is required. Please configure AWS-Region in extra headers.') + throw new Error('AWS region is required. Please configure AWS region in settings.') } - if (!accessKeyId || !secretAccessKey) { - throw new Error('AWS credentials are required. Please configure AWS-Access-Key-ID and AWS-Secret-Access-Key.') + // Build client configuration based on auth type + let clientConfig: BedrockRuntimeClientConfig + + if (authType === 'iam') { + // IAM credentials authentication + const accessKeyId = getAwsBedrockAccessKeyId() + const secretAccessKey = getAwsBedrockSecretAccessKey() + + if (!accessKeyId || !secretAccessKey) { + throw new Error('AWS credentials are required. Please configure Access Key ID and Secret Access Key.') + } + + clientConfig = { + region, + credentials: { + accessKeyId, + secretAccessKey + } + } + } else { + // API Key authentication + const awsBedrockApiKey = getAwsBedrockApiKey() + + if (!awsBedrockApiKey) { + throw new Error('AWS Bedrock API Key is required. Please configure API Key in settings.') + } + + clientConfig = { + region, + token: { token: awsBedrockApiKey }, + authSchemePreference: ['httpBearerAuth'] + } } - const client = new BedrockRuntimeClient({ - region, - credentials: { - accessKeyId, - secretAccessKey - } - }) - - const bedrockClient = new BedrockClient({ - region, - credentials: { - accessKeyId, - secretAccessKey - } - }) + const client = new BedrockRuntimeClient(clientConfig) + const bedrockClient = new BedrockClient(clientConfig) this.sdkInstance = { client, bedrockClient, region } return this.sdkInstance diff --git a/src/renderer/src/aiCore/provider/providerConfig.ts b/src/renderer/src/aiCore/provider/providerConfig.ts index 15323751c2..c8447671d1 100644 --- a/src/renderer/src/aiCore/provider/providerConfig.ts +++ b/src/renderer/src/aiCore/provider/providerConfig.ts @@ -14,6 +14,8 @@ import { } from '@renderer/config/providers' import { getAwsBedrockAccessKeyId, + getAwsBedrockApiKey, + getAwsBedrockAuthType, getAwsBedrockRegion, getAwsBedrockSecretAccessKey } from '@renderer/hooks/useAwsBedrock' @@ -192,9 +194,15 @@ export function providerToAiSdkConfig( // bedrock if (aiSdkProviderId === 'bedrock') { + const authType = getAwsBedrockAuthType() extraOptions.region = getAwsBedrockRegion() - extraOptions.accessKeyId = getAwsBedrockAccessKeyId() - extraOptions.secretAccessKey = getAwsBedrockSecretAccessKey() + + if (authType === 'apiKey') { + extraOptions.apiKey = getAwsBedrockApiKey() + } else { + extraOptions.accessKeyId = getAwsBedrockAccessKeyId() + extraOptions.secretAccessKey = getAwsBedrockSecretAccessKey() + } } // google-vertex if (aiSdkProviderId === 'google-vertex' || aiSdkProviderId === 'google-vertex-anthropic') { diff --git a/src/renderer/src/aiCore/utils/options.ts b/src/renderer/src/aiCore/utils/options.ts index eaf4764c70..60d9b1e098 100644 --- a/src/renderer/src/aiCore/utils/options.ts +++ b/src/renderer/src/aiCore/utils/options.ts @@ -17,6 +17,7 @@ import { getAiSdkProviderId } from '../provider/factory' import { buildGeminiGenerateImageParams } from './image' import { getAnthropicReasoningParams, + getBedrockReasoningParams, getCustomParameters, getGeminiReasoningParams, getOpenAIReasoningParams, @@ -127,6 +128,9 @@ export function buildProviderOptions( case 'google-vertex-anthropic': providerSpecificOptions = buildAnthropicProviderOptions(assistant, model, capabilities) break + case 'bedrock': + providerSpecificOptions = buildBedrockProviderOptions(assistant, model, capabilities) + break default: // 对于其他 provider,使用通用的构建逻辑 providerSpecificOptions = { @@ -266,6 +270,32 @@ function buildXAIProviderOptions( return providerOptions } +/** + * Build Bedrock providerOptions + */ +function buildBedrockProviderOptions( + assistant: Assistant, + model: Model, + capabilities: { + enableReasoning: boolean + enableWebSearch: boolean + enableGenerateImage: boolean + } +): Record { + const { enableReasoning } = capabilities + let providerOptions: Record = {} + + if (enableReasoning) { + const reasoningParams = getBedrockReasoningParams(assistant, model) + providerOptions = { + ...providerOptions, + ...reasoningParams + } + } + + return providerOptions +} + /** * 构建通用的 providerOptions(用于其他 provider) */ diff --git a/src/renderer/src/aiCore/utils/reasoning.ts b/src/renderer/src/aiCore/utils/reasoning.ts index 7b5a6890d7..3a36fb658a 100644 --- a/src/renderer/src/aiCore/utils/reasoning.ts +++ b/src/renderer/src/aiCore/utils/reasoning.ts @@ -485,6 +485,34 @@ export function getXAIReasoningParams(assistant: Assistant, model: Model): Recor } } +/** + * Get Bedrock reasoning parameters + */ +export function getBedrockReasoningParams(assistant: Assistant, model: Model): Record { + if (!isReasoningModel(model)) { + return {} + } + + const reasoningEffort = assistant?.settings?.reasoning_effort + + if (reasoningEffort === undefined) { + return {} + } + + // Only apply thinking budget for Claude reasoning models + if (!isSupportedThinkingTokenClaudeModel(model)) { + return {} + } + + const budgetTokens = getAnthropicThinkingBudget(assistant, model) + return { + reasoningConfig: { + type: 'enabled', + budgetTokens: budgetTokens + } + } +} + /** * 获取自定义参数 * 从 assistant 设置中提取自定义参数 diff --git a/src/renderer/src/hooks/useAwsBedrock.ts b/src/renderer/src/hooks/useAwsBedrock.ts index e84608a3bb..619eedd4ea 100644 --- a/src/renderer/src/hooks/useAwsBedrock.ts +++ b/src/renderer/src/hooks/useAwsBedrock.ts @@ -1,5 +1,12 @@ import store, { useAppSelector } from '@renderer/store' -import { setAwsBedrockAccessKeyId, setAwsBedrockRegion, setAwsBedrockSecretAccessKey } from '@renderer/store/llm' +import { + setAwsBedrockAccessKeyId, + setAwsBedrockApiKey, + setAwsBedrockAuthType, + setAwsBedrockRegion, + setAwsBedrockSecretAccessKey +} from '@renderer/store/llm' +import type { AwsBedrockAuthType } from '@renderer/types' import { useDispatch } from 'react-redux' export function useAwsBedrockSettings() { @@ -8,8 +15,10 @@ export function useAwsBedrockSettings() { return { ...settings, + setAuthType: (authType: AwsBedrockAuthType) => dispatch(setAwsBedrockAuthType(authType)), setAccessKeyId: (accessKeyId: string) => dispatch(setAwsBedrockAccessKeyId(accessKeyId)), setSecretAccessKey: (secretAccessKey: string) => dispatch(setAwsBedrockSecretAccessKey(secretAccessKey)), + setApiKey: (apiKey: string) => dispatch(setAwsBedrockApiKey(apiKey)), setRegion: (region: string) => dispatch(setAwsBedrockRegion(region)) } } @@ -18,6 +27,10 @@ export function getAwsBedrockSettings() { return store.getState().llm.settings.awsBedrock } +export function getAwsBedrockAuthType() { + return store.getState().llm.settings.awsBedrock.authType +} + export function getAwsBedrockAccessKeyId() { return store.getState().llm.settings.awsBedrock.accessKeyId } @@ -26,6 +39,10 @@ export function getAwsBedrockSecretAccessKey() { return store.getState().llm.settings.awsBedrock.secretAccessKey } +export function getAwsBedrockApiKey() { + return store.getState().llm.settings.awsBedrock.apiKey +} + export function getAwsBedrockRegion() { return store.getState().llm.settings.awsBedrock.region } diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index b84cb8bc53..36ce60edb6 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "AWS Access Key ID", "access_key_id_help": "Your AWS Access Key ID for accessing AWS Bedrock services", + "api_key": "Bedrock API Key", + "api_key_help": "Your AWS Bedrock API Key for authentication", + "auth_type": "Authentication Type", + "auth_type_api_key": "Bedrock API Key", + "auth_type_help": "Choose between IAM credentials or Bedrock API Key authentication", + "auth_type_iam": "IAM Credentials", "description": "AWS Bedrock is Amazon's fully managed foundation model service that supports various advanced large language models", "region": "AWS Region", "region_help": "Your AWS service region, e.g., us-east-1", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index a83813b017..0acb816a1c 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "AWS 访问密钥 ID", "access_key_id_help": "您的 AWS 访问密钥 ID,用于访问 AWS Bedrock 服务", + "api_key": "Bedrock API 密钥", + "api_key_help": "您的 AWS Bedrock API 密钥,用于身份验证", + "auth_type": "认证方式", + "auth_type_api_key": "Bedrock API 密钥", + "auth_type_help": "选择使用 IAM 凭证或 Bedrock API 密钥进行身份验证", + "auth_type_iam": "IAM 凭证", "description": "AWS Bedrock 是亚马逊提供的全托管基础模型服务,支持多种先进的大语言模型", "region": "AWS 区域", "region_help": "您的 AWS 服务区域,例如 us-east-1", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 76777fd644..913a4de5ad 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "AWS 存取密鑰 ID", "access_key_id_help": "您的 AWS 存取密鑰 ID,用於存取 AWS Bedrock 服務", + "api_key": "Bedrock API 金鑰", + "api_key_help": "您的 AWS Bedrock API 金鑰,用於身份驗證", + "auth_type": "認證方式", + "auth_type_api_key": "Bedrock API 金鑰", + "auth_type_help": "選擇使用 IAM 憑證或 Bedrock API 金鑰進行身份驗證", + "auth_type_iam": "IAM 憑證", "description": "AWS Bedrock 是亞馬遜提供的全托管基础模型服務,支持多種先進的大語言模型", "region": "AWS 區域", "region_help": "您的 AWS 服務區域,例如 us-east-1", diff --git a/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx index 198765da9b..75278c917f 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/AwsBedrockSettings.tsx @@ -1,7 +1,7 @@ import { HStack } from '@renderer/components/Layout' import { PROVIDER_URLS } from '@renderer/config/providers' import { useAwsBedrockSettings } from '@renderer/hooks/useAwsBedrock' -import { Alert, Input } from 'antd' +import { Alert, Input, Radio } from 'antd' import type { FC } from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' @@ -10,14 +10,25 @@ import { SettingHelpLink, SettingHelpText, SettingHelpTextRow, SettingSubtitle } const AwsBedrockSettings: FC = () => { const { t } = useTranslation() - const { accessKeyId, secretAccessKey, region, setAccessKeyId, setSecretAccessKey, setRegion } = - useAwsBedrockSettings() + const { + authType, + accessKeyId, + secretAccessKey, + apiKey, + region, + setAuthType, + setAccessKeyId, + setSecretAccessKey, + setApiKey, + setRegion + } = useAwsBedrockSettings() const providerConfig = PROVIDER_URLS['aws-bedrock'] const apiKeyWebsite = providerConfig?.websites?.apiKey const [localAccessKeyId, setLocalAccessKeyId] = useState(accessKeyId) const [localSecretAccessKey, setLocalSecretAccessKey] = useState(secretAccessKey) + const [localApiKey, setLocalApiKey] = useState(apiKey) const [localRegion, setLocalRegion] = useState(region) return ( @@ -25,39 +36,75 @@ const AwsBedrockSettings: FC = () => { {t('settings.provider.aws-bedrock.title')} - {t('settings.provider.aws-bedrock.access_key_id')} - setLocalAccessKeyId(e.target.value)} - onBlur={() => setAccessKeyId(localAccessKeyId)} - style={{ marginTop: 5 }} - /> + {/* Authentication Type Selector */} + {t('settings.provider.aws-bedrock.auth_type')} + setAuthType(e.target.value)} style={{ marginTop: 5 }}> + {t('settings.provider.aws-bedrock.auth_type_iam')} + {t('settings.provider.aws-bedrock.auth_type_api_key')} + - {t('settings.provider.aws-bedrock.access_key_id_help')} + {t('settings.provider.aws-bedrock.auth_type_help')} - {t('settings.provider.aws-bedrock.secret_access_key')} - setLocalSecretAccessKey(e.target.value)} - onBlur={() => setSecretAccessKey(localSecretAccessKey)} - style={{ marginTop: 5 }} - spellCheck={false} - /> - {apiKeyWebsite && ( - - - - {t('settings.provider.get_api_key')} - - - {t('settings.provider.aws-bedrock.secret_access_key_help')} - + {/* IAM Credentials Fields */} + {authType === 'iam' && ( + <> + + {t('settings.provider.aws-bedrock.access_key_id')} + + setLocalAccessKeyId(e.target.value)} + onBlur={() => setAccessKeyId(localAccessKeyId)} + style={{ marginTop: 5 }} + /> + + {t('settings.provider.aws-bedrock.access_key_id_help')} + + + + {t('settings.provider.aws-bedrock.secret_access_key')} + + setLocalSecretAccessKey(e.target.value)} + onBlur={() => setSecretAccessKey(localSecretAccessKey)} + style={{ marginTop: 5 }} + spellCheck={false} + /> + {apiKeyWebsite && ( + + + + {t('settings.provider.get_api_key')} + + + {t('settings.provider.aws-bedrock.secret_access_key_help')} + + )} + )} - {t('settings.provider.aws-bedrock.region')} + {authType === 'apiKey' && ( + <> + {t('settings.provider.aws-bedrock.api_key')} + setLocalApiKey(e.target.value)} + onBlur={() => setApiKey(localApiKey)} + style={{ marginTop: 5 }} + spellCheck={false} + /> + + {t('settings.provider.aws-bedrock.api_key_help')} + + + )} + + {t('settings.provider.aws-bedrock.region')} { location: '' }, awsBedrock: { + authType: 'iam', accessKeyId: '', secretAccessKey: '', + apiKey: '', region: '' } } diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index a181e17598..e68ada058f 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -67,7 +67,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 170, + version: 171, blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs', 'toolPermissions'], migrate }, diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 737de4440b..15f256382e 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -3,7 +3,7 @@ import { createSlice } from '@reduxjs/toolkit' import { isLocalAi } from '@renderer/config/env' import { SYSTEM_MODELS } from '@renderer/config/models' import { SYSTEM_PROVIDERS } from '@renderer/config/providers' -import type { Model, Provider } from '@renderer/types' +import type { AwsBedrockAuthType, Model, Provider } from '@renderer/types' import { uniqBy } from 'lodash' type LlmSettings = { @@ -25,8 +25,10 @@ type LlmSettings = { location: string } awsBedrock: { + authType: AwsBedrockAuthType accessKeyId: string secretAccessKey: string + apiKey: string region: string } } @@ -68,8 +70,10 @@ export const initialState: LlmState = { location: '' }, awsBedrock: { + authType: 'iam', accessKeyId: '', secretAccessKey: '', + apiKey: '', region: '' } } @@ -197,12 +201,18 @@ const llmSlice = createSlice({ setVertexAIServiceAccountClientEmail: (state, action: PayloadAction) => { state.settings.vertexai.serviceAccount.clientEmail = action.payload }, + setAwsBedrockAuthType: (state, action: PayloadAction) => { + state.settings.awsBedrock.authType = action.payload + }, setAwsBedrockAccessKeyId: (state, action: PayloadAction) => { state.settings.awsBedrock.accessKeyId = action.payload }, setAwsBedrockSecretAccessKey: (state, action: PayloadAction) => { state.settings.awsBedrock.secretAccessKey = action.payload }, + setAwsBedrockApiKey: (state, action: PayloadAction) => { + state.settings.awsBedrock.apiKey = action.payload + }, setAwsBedrockRegion: (state, action: PayloadAction) => { state.settings.awsBedrock.region = action.payload }, @@ -242,8 +252,10 @@ export const { setVertexAILocation, setVertexAIServiceAccountPrivateKey, setVertexAIServiceAccountClientEmail, + setAwsBedrockAuthType, setAwsBedrockAccessKeyId, setAwsBedrockSecretAccessKey, + setAwsBedrockApiKey, setAwsBedrockRegion, updateModel } = llmSlice.actions diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 1a6d32106c..d4bebf6023 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -2794,6 +2794,17 @@ const migrateConfig = { logger.error('migrate 170 error', error as Error) return state } + }, + '171': (state: RootState) => { + try { + addProvider(state, 'sophnet') + state.llm.providers = moveProvider(state.llm.providers, 'sophnet', 17) + state.settings.defaultPaintingProvider = 'cherryin' + return state + } catch (error) { + logger.error('migrate 171 error', error as Error) + return state + } } } diff --git a/src/renderer/src/types/provider.ts b/src/renderer/src/types/provider.ts index 657e445707..b7d669e1f2 100644 --- a/src/renderer/src/types/provider.ts +++ b/src/renderer/src/types/provider.ts @@ -73,6 +73,17 @@ export function isServiceTier(tier: string): tier is ServiceTier { return isGroqServiceTier(tier) || isOpenAIServiceTier(tier) } +export const AwsBedrockAuthTypes = { + iam: 'iam', + apiKey: 'apiKey' +} as const + +export type AwsBedrockAuthType = keyof typeof AwsBedrockAuthTypes + +export function isAwsBedrockAuthType(type: string): type is AwsBedrockAuthType { + return Object.hasOwn(AwsBedrockAuthTypes, type) +} + export type Provider = { id: string type: ProviderType diff --git a/yarn.lock b/yarn.lock index 1d4550b9b4..73436f5108 100644 --- a/yarn.lock +++ b/yarn.lock @@ -721,1209 +721,645 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-bedrock-runtime@npm:^3.840.0": - version: 3.848.0 - resolution: "@aws-sdk/client-bedrock-runtime@npm:3.848.0" +"@aws-sdk/client-bedrock-runtime@npm:^3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/client-bedrock-runtime@npm:3.910.0" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/credential-provider-node": "npm:3.848.0" - "@aws-sdk/eventstream-handler-node": "npm:3.840.0" - "@aws-sdk/middleware-eventstream": "npm:3.840.0" - "@aws-sdk/middleware-host-header": "npm:3.840.0" - "@aws-sdk/middleware-logger": "npm:3.840.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.840.0" - "@aws-sdk/middleware-user-agent": "npm:3.848.0" - "@aws-sdk/middleware-websocket": "npm:3.844.0" - "@aws-sdk/region-config-resolver": "npm:3.840.0" - "@aws-sdk/token-providers": "npm:3.848.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.848.0" - "@aws-sdk/util-user-agent-browser": "npm:3.840.0" - "@aws-sdk/util-user-agent-node": "npm:3.848.0" - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/core": "npm:^3.7.0" - "@smithy/eventstream-serde-browser": "npm:^4.0.4" - "@smithy/eventstream-serde-config-resolver": "npm:^4.1.2" - "@smithy/eventstream-serde-node": "npm:^4.0.4" - "@smithy/fetch-http-handler": "npm:^5.1.0" - "@smithy/hash-node": "npm:^4.0.4" - "@smithy/invalid-dependency": "npm:^4.0.4" - "@smithy/middleware-content-length": "npm:^4.0.4" - "@smithy/middleware-endpoint": "npm:^4.1.15" - "@smithy/middleware-retry": "npm:^4.1.16" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/node-http-handler": "npm:^4.1.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.7" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.23" - "@smithy/util-defaults-mode-node": "npm:^4.0.23" - "@smithy/util-endpoints": "npm:^3.0.6" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" - "@smithy/util-stream": "npm:^4.2.3" - "@smithy/util-utf8": "npm:^4.0.0" - "@types/uuid": "npm:^9.0.1" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/credential-provider-node": "npm:3.910.0" + "@aws-sdk/eventstream-handler-node": "npm:3.910.0" + "@aws-sdk/middleware-eventstream": "npm:3.910.0" + "@aws-sdk/middleware-host-header": "npm:3.910.0" + "@aws-sdk/middleware-logger": "npm:3.910.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" + "@aws-sdk/middleware-user-agent": "npm:3.910.0" + "@aws-sdk/middleware-websocket": "npm:3.910.0" + "@aws-sdk/region-config-resolver": "npm:3.910.0" + "@aws-sdk/token-providers": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-endpoints": "npm:3.910.0" + "@aws-sdk/util-user-agent-browser": "npm:3.910.0" + "@aws-sdk/util-user-agent-node": "npm:3.910.0" + "@smithy/config-resolver": "npm:^4.3.2" + "@smithy/core": "npm:^3.16.1" + "@smithy/eventstream-serde-browser": "npm:^4.2.2" + "@smithy/eventstream-serde-config-resolver": "npm:^4.3.2" + "@smithy/eventstream-serde-node": "npm:^4.2.2" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/hash-node": "npm:^4.2.2" + "@smithy/invalid-dependency": "npm:^4.2.2" + "@smithy/middleware-content-length": "npm:^4.2.2" + "@smithy/middleware-endpoint": "npm:^4.3.3" + "@smithy/middleware-retry": "npm:^4.4.3" + "@smithy/middleware-serde": "npm:^4.2.2" + "@smithy/middleware-stack": "npm:^4.2.2" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/node-http-handler": "npm:^4.4.1" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-body-length-browser": "npm:^4.2.0" + "@smithy/util-body-length-node": "npm:^4.2.1" + "@smithy/util-defaults-mode-browser": "npm:^4.3.2" + "@smithy/util-defaults-mode-node": "npm:^4.2.3" + "@smithy/util-endpoints": "npm:^3.2.2" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-stream": "npm:^4.5.2" + "@smithy/util-utf8": "npm:^4.2.0" + "@smithy/uuid": "npm:^1.1.0" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10c0/6aae8b8a8970f55605c89aa15d7efc189120cb54b64a9f57348ac4085b422d4d839fa5ed8b0d2d8ca4efc4a5326bf6988f61ded8f2b1cde79455c3bd4705ece6 + checksum: 10c0/b13ddcbf3453603612531df9ff056510755adde400ec1ed3357e8da129696cb36d80834e4ddd8abd34c076182389b24abbc3705bf9342fe9b341db785c37a63e languageName: node linkType: hard -"@aws-sdk/client-bedrock@npm:^3.840.0": - version: 3.864.0 - resolution: "@aws-sdk/client-bedrock@npm:3.864.0" +"@aws-sdk/client-bedrock@npm:^3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/client-bedrock@npm:3.910.0" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/credential-provider-node": "npm:3.864.0" - "@aws-sdk/middleware-host-header": "npm:3.862.0" - "@aws-sdk/middleware-logger": "npm:3.862.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.862.0" - "@aws-sdk/middleware-user-agent": "npm:3.864.0" - "@aws-sdk/region-config-resolver": "npm:3.862.0" - "@aws-sdk/token-providers": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@aws-sdk/util-endpoints": "npm:3.862.0" - "@aws-sdk/util-user-agent-browser": "npm:3.862.0" - "@aws-sdk/util-user-agent-node": "npm:3.864.0" - "@smithy/config-resolver": "npm:^4.1.5" - "@smithy/core": "npm:^3.8.0" - "@smithy/fetch-http-handler": "npm:^5.1.1" - "@smithy/hash-node": "npm:^4.0.5" - "@smithy/invalid-dependency": "npm:^4.0.5" - "@smithy/middleware-content-length": "npm:^4.0.5" - "@smithy/middleware-endpoint": "npm:^4.1.18" - "@smithy/middleware-retry": "npm:^4.1.19" - "@smithy/middleware-serde": "npm:^4.0.9" - "@smithy/middleware-stack": "npm:^4.0.5" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/node-http-handler": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - "@smithy/url-parser": "npm:^4.0.5" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.26" - "@smithy/util-defaults-mode-node": "npm:^4.0.26" - "@smithy/util-endpoints": "npm:^3.0.7" - "@smithy/util-middleware": "npm:^4.0.5" - "@smithy/util-retry": "npm:^4.0.7" - "@smithy/util-utf8": "npm:^4.0.0" - "@types/uuid": "npm:^9.0.1" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/credential-provider-node": "npm:3.910.0" + "@aws-sdk/middleware-host-header": "npm:3.910.0" + "@aws-sdk/middleware-logger": "npm:3.910.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" + "@aws-sdk/middleware-user-agent": "npm:3.910.0" + "@aws-sdk/region-config-resolver": "npm:3.910.0" + "@aws-sdk/token-providers": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-endpoints": "npm:3.910.0" + "@aws-sdk/util-user-agent-browser": "npm:3.910.0" + "@aws-sdk/util-user-agent-node": "npm:3.910.0" + "@smithy/config-resolver": "npm:^4.3.2" + "@smithy/core": "npm:^3.16.1" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/hash-node": "npm:^4.2.2" + "@smithy/invalid-dependency": "npm:^4.2.2" + "@smithy/middleware-content-length": "npm:^4.2.2" + "@smithy/middleware-endpoint": "npm:^4.3.3" + "@smithy/middleware-retry": "npm:^4.4.3" + "@smithy/middleware-serde": "npm:^4.2.2" + "@smithy/middleware-stack": "npm:^4.2.2" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/node-http-handler": "npm:^4.4.1" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-body-length-browser": "npm:^4.2.0" + "@smithy/util-body-length-node": "npm:^4.2.1" + "@smithy/util-defaults-mode-browser": "npm:^4.3.2" + "@smithy/util-defaults-mode-node": "npm:^4.2.3" + "@smithy/util-endpoints": "npm:^3.2.2" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-utf8": "npm:^4.2.0" + "@smithy/uuid": "npm:^1.1.0" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10c0/ab2d473f3b7d7d95baa03f25117eb70314c2904554b10163a0b63d1f1abba858c2791aa7565832289104a277d51196e1c1cfea6b9ce2628c20fffd607d09bb79 + checksum: 10c0/f70fd04f589a7e9d14c9862d3a1444023e0fb8c72a21aa162eb2077def9fb26c68650b117429be1db74e63908316ae28d8040a1165360c513c66a3876d446606 languageName: node linkType: hard -"@aws-sdk/client-s3@npm:^3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/client-s3@npm:3.840.0" +"@aws-sdk/client-s3@npm:^3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/client-s3@npm:3.910.0" dependencies: "@aws-crypto/sha1-browser": "npm:5.2.0" "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/credential-provider-node": "npm:3.840.0" - "@aws-sdk/middleware-bucket-endpoint": "npm:3.840.0" - "@aws-sdk/middleware-expect-continue": "npm:3.840.0" - "@aws-sdk/middleware-flexible-checksums": "npm:3.840.0" - "@aws-sdk/middleware-host-header": "npm:3.840.0" - "@aws-sdk/middleware-location-constraint": "npm:3.840.0" - "@aws-sdk/middleware-logger": "npm:3.840.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.840.0" - "@aws-sdk/middleware-sdk-s3": "npm:3.840.0" - "@aws-sdk/middleware-ssec": "npm:3.840.0" - "@aws-sdk/middleware-user-agent": "npm:3.840.0" - "@aws-sdk/region-config-resolver": "npm:3.840.0" - "@aws-sdk/signature-v4-multi-region": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.840.0" - "@aws-sdk/util-user-agent-browser": "npm:3.840.0" - "@aws-sdk/util-user-agent-node": "npm:3.840.0" - "@aws-sdk/xml-builder": "npm:3.821.0" - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/core": "npm:^3.6.0" - "@smithy/eventstream-serde-browser": "npm:^4.0.4" - "@smithy/eventstream-serde-config-resolver": "npm:^4.1.2" - "@smithy/eventstream-serde-node": "npm:^4.0.4" - "@smithy/fetch-http-handler": "npm:^5.0.4" - "@smithy/hash-blob-browser": "npm:^4.0.4" - "@smithy/hash-node": "npm:^4.0.4" - "@smithy/hash-stream-node": "npm:^4.0.4" - "@smithy/invalid-dependency": "npm:^4.0.4" - "@smithy/md5-js": "npm:^4.0.4" - "@smithy/middleware-content-length": "npm:^4.0.4" - "@smithy/middleware-endpoint": "npm:^4.1.13" - "@smithy/middleware-retry": "npm:^4.1.14" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/node-http-handler": "npm:^4.0.6" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.21" - "@smithy/util-defaults-mode-node": "npm:^4.0.21" - "@smithy/util-endpoints": "npm:^3.0.6" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" - "@smithy/util-stream": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.0.0" - "@smithy/util-waiter": "npm:^4.0.6" - "@types/uuid": "npm:^9.0.1" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/credential-provider-node": "npm:3.910.0" + "@aws-sdk/middleware-bucket-endpoint": "npm:3.910.0" + "@aws-sdk/middleware-expect-continue": "npm:3.910.0" + "@aws-sdk/middleware-flexible-checksums": "npm:3.910.0" + "@aws-sdk/middleware-host-header": "npm:3.910.0" + "@aws-sdk/middleware-location-constraint": "npm:3.910.0" + "@aws-sdk/middleware-logger": "npm:3.910.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" + "@aws-sdk/middleware-sdk-s3": "npm:3.910.0" + "@aws-sdk/middleware-ssec": "npm:3.910.0" + "@aws-sdk/middleware-user-agent": "npm:3.910.0" + "@aws-sdk/region-config-resolver": "npm:3.910.0" + "@aws-sdk/signature-v4-multi-region": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-endpoints": "npm:3.910.0" + "@aws-sdk/util-user-agent-browser": "npm:3.910.0" + "@aws-sdk/util-user-agent-node": "npm:3.910.0" + "@aws-sdk/xml-builder": "npm:3.910.0" + "@smithy/config-resolver": "npm:^4.3.2" + "@smithy/core": "npm:^3.16.1" + "@smithy/eventstream-serde-browser": "npm:^4.2.2" + "@smithy/eventstream-serde-config-resolver": "npm:^4.3.2" + "@smithy/eventstream-serde-node": "npm:^4.2.2" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/hash-blob-browser": "npm:^4.2.3" + "@smithy/hash-node": "npm:^4.2.2" + "@smithy/hash-stream-node": "npm:^4.2.2" + "@smithy/invalid-dependency": "npm:^4.2.2" + "@smithy/md5-js": "npm:^4.2.2" + "@smithy/middleware-content-length": "npm:^4.2.2" + "@smithy/middleware-endpoint": "npm:^4.3.3" + "@smithy/middleware-retry": "npm:^4.4.3" + "@smithy/middleware-serde": "npm:^4.2.2" + "@smithy/middleware-stack": "npm:^4.2.2" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/node-http-handler": "npm:^4.4.1" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-body-length-browser": "npm:^4.2.0" + "@smithy/util-body-length-node": "npm:^4.2.1" + "@smithy/util-defaults-mode-browser": "npm:^4.3.2" + "@smithy/util-defaults-mode-node": "npm:^4.2.3" + "@smithy/util-endpoints": "npm:^3.2.2" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-stream": "npm:^4.5.2" + "@smithy/util-utf8": "npm:^4.2.0" + "@smithy/util-waiter": "npm:^4.2.2" + "@smithy/uuid": "npm:^1.1.0" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10c0/c923c8a0b6743f81478758641190b7c1da8306e7f6bf81d7f9df722be183f7ad506ad47e1b9de0807961fffec6b36074385d4c611c0c2fb08c8e5b1d47948a48 + checksum: 10c0/9142a2a56b6acd83d20adf4d2f9942663ba7c815158233085215d59b126234bff243b434ceb43dc59c5b3b315d44930a0b4a1993257981985b18d71756538a8a languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/client-sso@npm:3.840.0" +"@aws-sdk/client-sso@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/client-sso@npm:3.910.0" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/middleware-host-header": "npm:3.840.0" - "@aws-sdk/middleware-logger": "npm:3.840.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.840.0" - "@aws-sdk/middleware-user-agent": "npm:3.840.0" - "@aws-sdk/region-config-resolver": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.840.0" - "@aws-sdk/util-user-agent-browser": "npm:3.840.0" - "@aws-sdk/util-user-agent-node": "npm:3.840.0" - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/core": "npm:^3.6.0" - "@smithy/fetch-http-handler": "npm:^5.0.4" - "@smithy/hash-node": "npm:^4.0.4" - "@smithy/invalid-dependency": "npm:^4.0.4" - "@smithy/middleware-content-length": "npm:^4.0.4" - "@smithy/middleware-endpoint": "npm:^4.1.13" - "@smithy/middleware-retry": "npm:^4.1.14" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/node-http-handler": "npm:^4.0.6" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.21" - "@smithy/util-defaults-mode-node": "npm:^4.0.21" - "@smithy/util-endpoints": "npm:^3.0.6" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/middleware-host-header": "npm:3.910.0" + "@aws-sdk/middleware-logger": "npm:3.910.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" + "@aws-sdk/middleware-user-agent": "npm:3.910.0" + "@aws-sdk/region-config-resolver": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-endpoints": "npm:3.910.0" + "@aws-sdk/util-user-agent-browser": "npm:3.910.0" + "@aws-sdk/util-user-agent-node": "npm:3.910.0" + "@smithy/config-resolver": "npm:^4.3.2" + "@smithy/core": "npm:^3.16.1" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/hash-node": "npm:^4.2.2" + "@smithy/invalid-dependency": "npm:^4.2.2" + "@smithy/middleware-content-length": "npm:^4.2.2" + "@smithy/middleware-endpoint": "npm:^4.3.3" + "@smithy/middleware-retry": "npm:^4.4.3" + "@smithy/middleware-serde": "npm:^4.2.2" + "@smithy/middleware-stack": "npm:^4.2.2" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/node-http-handler": "npm:^4.4.1" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-body-length-browser": "npm:^4.2.0" + "@smithy/util-body-length-node": "npm:^4.2.1" + "@smithy/util-defaults-mode-browser": "npm:^4.3.2" + "@smithy/util-defaults-mode-node": "npm:^4.2.3" + "@smithy/util-endpoints": "npm:^3.2.2" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/6d83d3dfefaab731818eade68f08f563906e9bee37c0836da262f47b15be8b1885e813a67927dd2549b1a043dffb551a2ec39a963ef335b9df54e8b9faf534e5 + checksum: 10c0/d0f634c2f2c1c6234e1706470ca29f9455e97257d6263add984180e7d3c547f442673d031a1a3b6be68c78e1a4424719147cdf96b52f1bb7cc4ead70915d648b languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/client-sso@npm:3.848.0" +"@aws-sdk/core@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/core@npm:3.910.0" dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/middleware-host-header": "npm:3.840.0" - "@aws-sdk/middleware-logger": "npm:3.840.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.840.0" - "@aws-sdk/middleware-user-agent": "npm:3.848.0" - "@aws-sdk/region-config-resolver": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.848.0" - "@aws-sdk/util-user-agent-browser": "npm:3.840.0" - "@aws-sdk/util-user-agent-node": "npm:3.848.0" - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/core": "npm:^3.7.0" - "@smithy/fetch-http-handler": "npm:^5.1.0" - "@smithy/hash-node": "npm:^4.0.4" - "@smithy/invalid-dependency": "npm:^4.0.4" - "@smithy/middleware-content-length": "npm:^4.0.4" - "@smithy/middleware-endpoint": "npm:^4.1.15" - "@smithy/middleware-retry": "npm:^4.1.16" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/node-http-handler": "npm:^4.1.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.7" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.23" - "@smithy/util-defaults-mode-node": "npm:^4.0.23" - "@smithy/util-endpoints": "npm:^3.0.6" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/xml-builder": "npm:3.910.0" + "@smithy/core": "npm:^3.16.1" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/signature-v4": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/758d98cec61ee94f90e476584955409800368346ce9cafaad9d2012579655ddd7500ec31e6e4f409d4d14365ed44379b248a47b2d5a7c4dfde6658d17efea25a + checksum: 10c0/15b0215f49da8295ca9424695f2aa2f6eb578647397a57f43d56288b7f77cf4112a3a897afc7cd14bfe1f8943b2ef78bdc2788ff7eca0e57cb2029d99f71902c languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/client-sso@npm:3.864.0" +"@aws-sdk/credential-provider-env@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.910.0" dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/middleware-host-header": "npm:3.862.0" - "@aws-sdk/middleware-logger": "npm:3.862.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.862.0" - "@aws-sdk/middleware-user-agent": "npm:3.864.0" - "@aws-sdk/region-config-resolver": "npm:3.862.0" - "@aws-sdk/types": "npm:3.862.0" - "@aws-sdk/util-endpoints": "npm:3.862.0" - "@aws-sdk/util-user-agent-browser": "npm:3.862.0" - "@aws-sdk/util-user-agent-node": "npm:3.864.0" - "@smithy/config-resolver": "npm:^4.1.5" - "@smithy/core": "npm:^3.8.0" - "@smithy/fetch-http-handler": "npm:^5.1.1" - "@smithy/hash-node": "npm:^4.0.5" - "@smithy/invalid-dependency": "npm:^4.0.5" - "@smithy/middleware-content-length": "npm:^4.0.5" - "@smithy/middleware-endpoint": "npm:^4.1.18" - "@smithy/middleware-retry": "npm:^4.1.19" - "@smithy/middleware-serde": "npm:^4.0.9" - "@smithy/middleware-stack": "npm:^4.0.5" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/node-http-handler": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - "@smithy/url-parser": "npm:^4.0.5" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.26" - "@smithy/util-defaults-mode-node": "npm:^4.0.26" - "@smithy/util-endpoints": "npm:^3.0.7" - "@smithy/util-middleware": "npm:^4.0.5" - "@smithy/util-retry": "npm:^4.0.7" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/3f18d13ef59a19c636f6fa4e7c5142936f724906d9bcf5754bdb8bad9b65f215db25b565c65959fb12989c2eaf0861683babd67bb3391de391d51b75f64d269e + checksum: 10c0/31a61c3e762b1418e2c1a80a6867d4f4f8167027fd6334c1aba138e64e7a13edab6d6f386cd19c84cae3f09833445ea2d434ee0bdf715bf9782ffbd0a5e217b8 languageName: node linkType: hard -"@aws-sdk/core@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/core@npm:3.840.0" +"@aws-sdk/credential-provider-http@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/xml-builder": "npm:3.821.0" - "@smithy/core": "npm:^3.6.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/signature-v4": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-utf8": "npm:^4.0.0" - fast-xml-parser: "npm:4.4.1" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/node-http-handler": "npm:^4.4.1" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-stream": "npm:^4.5.2" tslib: "npm:^2.6.2" - checksum: 10c0/6bd10d86a85c2f52d1a6ca3fe4e45fb8b8ba43abb0f52d2cd14b8d3fb9908f2e1ec0cd9dcf7980df847cfb3dbcd329679a6fe7d029fbc57840d716d1120bc445 + checksum: 10c0/7c15829bec5ebb49542b181a17cbfef6b02b78447e1323157ca7d33103203258b409bccb3dfef19f255d88ba282c5a553552a09488c4af1a5899bb7bff65a873 languageName: node linkType: hard -"@aws-sdk/core@npm:3.846.0": - version: 3.846.0 - resolution: "@aws-sdk/core@npm:3.846.0" +"@aws-sdk/credential-provider-ini@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/xml-builder": "npm:3.821.0" - "@smithy/core": "npm:^3.7.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/signature-v4": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.7" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-utf8": "npm:^4.0.0" - fast-xml-parser: "npm:5.2.5" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/credential-provider-env": "npm:3.910.0" + "@aws-sdk/credential-provider-http": "npm:3.910.0" + "@aws-sdk/credential-provider-process": "npm:3.910.0" + "@aws-sdk/credential-provider-sso": "npm:3.910.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.910.0" + "@aws-sdk/nested-clients": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/credential-provider-imds": "npm:^4.2.2" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/b23115868854939ec4d2eefcedd0fe6a2dbaa8bca83e4b757c21e5c8a153c99b61ea4b645e763257b2031717dfcc9c92264f83aa4f9d0071c806895eea6722fa + checksum: 10c0/2dd52fa13aa4e0cf02d62e45f1c15d2ac3d891230b5a4fd95f6d69227b52887fbc3e2fc5f12665528292c2764cbf184d9a3a3bb4feb0eb97befa05e110f0fcc4 languageName: node linkType: hard -"@aws-sdk/core@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/core@npm:3.864.0" +"@aws-sdk/credential-provider-node@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.862.0" - "@aws-sdk/xml-builder": "npm:3.862.0" - "@smithy/core": "npm:^3.8.0" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/signature-v4": "npm:^5.1.3" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.5" - "@smithy/util-utf8": "npm:^4.0.0" - fast-xml-parser: "npm:5.2.5" + "@aws-sdk/credential-provider-env": "npm:3.910.0" + "@aws-sdk/credential-provider-http": "npm:3.910.0" + "@aws-sdk/credential-provider-ini": "npm:3.910.0" + "@aws-sdk/credential-provider-process": "npm:3.910.0" + "@aws-sdk/credential-provider-sso": "npm:3.910.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/credential-provider-imds": "npm:^4.2.2" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/83eae93e22408750abcd5225650945f5b9a2a4e4b9477d62e97c982b0d573d6f7b1a5ba4979a85947299d71898bf2ce68a9b87a0864c2697272eb74a817b4d97 + checksum: 10c0/cfbb7b9b19cd6971d9a766a7237eedb3b02842e90cd95edf863286bc41c9237ac54310a62dce7995333012a40db6e7c496f640a5cd5606218295bfaffcbe2daa languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.840.0" +"@aws-sdk/credential-provider-process@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/ed12ee47f67980b2a434a168de12401312d995428f33e487ea64420a670fdfec59324318eb02e630ef779336723499ca13533cec2b64f1f9d9f48fe9c7e138ef + checksum: 10c0/e4daf57799cb025020ac1df2d567a097cdbb53457be7ea30982f494b6a8ac6060de114637e7bebdb759dda874159c8ee7e6f031bf5e6d762ca359474116a0c3c languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.846.0": - version: 3.846.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.846.0" +"@aws-sdk/credential-provider-sso@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/client-sso": "npm:3.910.0" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/token-providers": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/21640b6eec50de4fa3a7e2ac1c4505c0cf27f2f7540781d2892b2aa281f28d7c4214bd385e11cdbfd5e3309cd12219c05d26adf7cad4c881c995a20b8bc4dbcd + checksum: 10c0/a3899bcc6fa8cf5cde2ef30de82a59e9f251f8c0bee7cc6a1343b8310d16923f5f06081a2f3097ca89687324a9cfc976c514c1e5e4111d62a31d6909ef955c1e languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.864.0" +"@aws-sdk/credential-provider-web-identity@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/nested-clients": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/6ffa5ba6787b976181aac62fcd510bade27a38685fb89d9824cf0ad4d34e6e8e82466438bdd35fd2d5bec1d60bbede0f7a60f836fc3ddb8d0d02a01e11e84704 + checksum: 10c0/ff16df706549cf46c93e2fa765fcdb5bbf11a42ea710d0a3efc3acbacbe9ffd7792db7b2481980243348d058955dc14d55178113f17b2e1bbef974d605bc76bf languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.840.0" +"@aws-sdk/eventstream-handler-node@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/eventstream-handler-node@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/fetch-http-handler": "npm:^5.0.4" - "@smithy/node-http-handler": "npm:^4.0.6" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-stream": "npm:^4.2.2" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/eventstream-codec": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/21892b9252b4f7692f9a3e9999a5991e476a8ef7541674c230e94d6a5a1fa7381e643e69d1f7e77dd3bbcee952fa9f4bf45793abf8e5a9c60c0ecb407f10ad4f + checksum: 10c0/2764f42bdda331963a65c22407d74cffa422c215aac450c390acc956eafb2d5d912af3fff0403387f3a1cbf7f01247530e932ba389b7d0baef6686b8e8b2a824 languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.846.0": - version: 3.846.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.846.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/fetch-http-handler": "npm:^5.1.0" - "@smithy/node-http-handler": "npm:^4.1.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.7" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-stream": "npm:^4.2.3" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-arn-parser": "npm:3.893.0" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-config-provider": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/5fbc05c5b0e622ce473dda41d5402982508e63496d36cb22ee6039caf563bb5d1c5633ced6901fe8c134090818400b865202c619288979132ba635f09aa98a97 + checksum: 10c0/32154bd1870c691d5071e5275a17ba2ea542bece2bf2da8464389c95358f1631d199af3bba25958098f04bf9dc11a569fafb2bb96d452718170abab86597300b languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.864.0" +"@aws-sdk/middleware-eventstream@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-eventstream@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/fetch-http-handler": "npm:^5.1.1" - "@smithy/node-http-handler": "npm:^4.1.1" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-stream": "npm:^4.2.4" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/430f13e13cbe35e306c312e63b9c88187134593c03cc0d68bdaee19103b8e48535c45b63fb95888d61b35348afe1dc83a32aa4db73f5a2918eed12f58ff220f3 + checksum: 10c0/a07f9ef0e4e2d25ca554806ed7e149242c1c03294744dd505c9e557d46f5f4e045ff0ed6e500084a7a16192bdd6c0ae079543cea35b27d047455e24bb53baa37 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.840.0" +"@aws-sdk/middleware-expect-continue@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/credential-provider-env": "npm:3.840.0" - "@aws-sdk/credential-provider-http": "npm:3.840.0" - "@aws-sdk/credential-provider-process": "npm:3.840.0" - "@aws-sdk/credential-provider-sso": "npm:3.840.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.840.0" - "@aws-sdk/nested-clients": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/credential-provider-imds": "npm:^4.0.6" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/963c9a675b327f70c7123c392ce0e96ee9e451e118b3af7ba1ea65921965718f96896c29992448c4d5f7739c499e66007aed03be28e094fab0728b8b2bb19731 + checksum: 10c0/1e8b9426e8b1a7f0db82faded10ac8047310f52224468bb00c7271a172fe645518b46a92be3b7cfdf757179f5ee43d53f69c81be303c5f8851ae330028b5b20a languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.848.0" - dependencies: - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/credential-provider-env": "npm:3.846.0" - "@aws-sdk/credential-provider-http": "npm:3.846.0" - "@aws-sdk/credential-provider-process": "npm:3.846.0" - "@aws-sdk/credential-provider-sso": "npm:3.848.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.848.0" - "@aws-sdk/nested-clients": "npm:3.848.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/credential-provider-imds": "npm:^4.0.6" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/af3f7aa9816618a4be600f4feeeb737cf5bd11db4f3f7e96cc30e45e93386a2e3ab4a2f9c40b2eb738b4d4e66dbe0db5086062846a8a75dfa2fd42acfb349b33 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.864.0" - dependencies: - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/credential-provider-env": "npm:3.864.0" - "@aws-sdk/credential-provider-http": "npm:3.864.0" - "@aws-sdk/credential-provider-process": "npm:3.864.0" - "@aws-sdk/credential-provider-sso": "npm:3.864.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.864.0" - "@aws-sdk/nested-clients": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/credential-provider-imds": "npm:^4.0.7" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/shared-ini-file-loader": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/e0124557eff3617b0816b498f65d8082a17a3946795f5876a00d62edec06de58aba0a1bdbf63c697e7c20af79c4f4669db44578a946ea3d7edd20873e34228ae - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-node@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.840.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.840.0" - "@aws-sdk/credential-provider-http": "npm:3.840.0" - "@aws-sdk/credential-provider-ini": "npm:3.840.0" - "@aws-sdk/credential-provider-process": "npm:3.840.0" - "@aws-sdk/credential-provider-sso": "npm:3.840.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/credential-provider-imds": "npm:^4.0.6" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/cef45e1d12aee1e05aae0498a03eafe6b0f18aa612cb7b49965dcb535bb7bc91339f33de299afb235d20e557a9a2ce16ab1ff2ddf9babec3860cc217437106b7 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-node@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.848.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.846.0" - "@aws-sdk/credential-provider-http": "npm:3.846.0" - "@aws-sdk/credential-provider-ini": "npm:3.848.0" - "@aws-sdk/credential-provider-process": "npm:3.846.0" - "@aws-sdk/credential-provider-sso": "npm:3.848.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.848.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/credential-provider-imds": "npm:^4.0.6" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/9887a7a32dfc687c4cfb9aacf9fbc9468916dc6022802a1ddfccc6d948202e6cf6f2d15c3e526806714edd365490a828c18ec67de977a66d83b37ab75d170d56 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-node@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.864.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.864.0" - "@aws-sdk/credential-provider-http": "npm:3.864.0" - "@aws-sdk/credential-provider-ini": "npm:3.864.0" - "@aws-sdk/credential-provider-process": "npm:3.864.0" - "@aws-sdk/credential-provider-sso": "npm:3.864.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/credential-provider-imds": "npm:^4.0.7" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/shared-ini-file-loader": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/4fda02b247dc54d2df2667f67b0b73bcb71a83d82ce921d94260a12717d11f76872b30074e8c435d8009a6b32d5cb92452026c4344d74ce34f7edae50aa5c714 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.840.0" - dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/c4278d64dd3a4c3072b30483fb723c6fabf811989f4f434f6573c729fed94e6851ff339275fe207e6aeab83a672d57dca70b1385c8c2dca731cae87fcec59319 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:3.846.0": - version: 3.846.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.846.0" - dependencies: - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/3be6d4547cabd1fa71aa0acacc64f7996f6154aff01e7e5aa6f1cece3d89399c4f500b74db8f0173cf0c9c89275d8803970cb815d45c769808d339bdfae186fe - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.864.0" - dependencies: - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/shared-ini-file-loader": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/74bb1906ac48187aa4639675423f6bface1447286ce4e904d0f5e5932f8bee271397f85d7dccb45c909b25d43d943531a124fe3c1fdd137df581010aa5fe3d03 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.840.0" - dependencies: - "@aws-sdk/client-sso": "npm:3.840.0" - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/token-providers": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/4b0398be1d148bcab6e228016fead4c14d0fa6c6d0a7bc59b1b3e937534070f9a99c2147a897a24e83de4601e406d47d8a1a5b19fa59a5d35beb2474b1b41087 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.848.0" - dependencies: - "@aws-sdk/client-sso": "npm:3.848.0" - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/token-providers": "npm:3.848.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/3ac50af20ff6646388175581cafab03b590eb5fccd1743ef45eeab3b3bb843a681e6c9e88d06c031a2886f77f649ab1a5df18cf7fb088dc8b34a7b225614ebaf - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.864.0" - dependencies: - "@aws-sdk/client-sso": "npm:3.864.0" - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/token-providers": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/shared-ini-file-loader": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/706532dc10c49d0988789426a32abc556feece6a2cf967f5f93a0fc9a78a67dd6b3601f086c36838323f66b270789767add61906eb42acc904eb532c06a14de3 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.840.0" - dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/nested-clients": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/a68d4b09d9c1869383372c105ed78c5b2c5442e783f8a2fa5f8ca3e9f84e4041d7eaf854a74f867b9f4bfa9f7288093b71e2789494e77ae04e8f77ef280ffdab - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.848.0" - dependencies: - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/nested-clients": "npm:3.848.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/bd1729dc05426d86c4feb4093b6c57eb2f11a8c10d6bd9a9b81d795bd4de1fa03f9c92c85ca35e6121c4814ba6a3416fa6bb7b3bf8171735de28999a1a239aa6 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.864.0" - dependencies: - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/nested-clients": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/3f1596e848ae1ecdbd731496f239e90be16a4956d2ba85bcf2603e825a9928c9aa9414952dee6efde437614ac7f189add56950d6e027dd5a30ff0ebf7db2491f - languageName: node - linkType: hard - -"@aws-sdk/eventstream-handler-node@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/eventstream-handler-node@npm:3.840.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/eventstream-codec": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/a95bc35719ed519d692d50983195ae1648edfa8c5da6750edf861e6f179daac75ab75b1235225efceae913eeebf438efb467409785aca989852adbb32637c255 - languageName: node - linkType: hard - -"@aws-sdk/middleware-bucket-endpoint@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.840.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-arn-parser": "npm:3.804.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-config-provider": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/371f6e30b16821e1a9c17efcbe6436616eb2bcbfe1757d5f70c56d5eca8452d8dddd42f26f53635b87f927b4da541dc36156e4d3529bb0eb0705969365dce8fc - languageName: node - linkType: hard - -"@aws-sdk/middleware-eventstream@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-eventstream@npm:3.840.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/887e92906c5b026f01d292d4ebc58483da5676a19a63f34c33fc7d6e4ca00b2df9c4336d0afa141a2f231fb6e01c45851facdef1f531589629e7da7bcbbee02a - languageName: node - linkType: hard - -"@aws-sdk/middleware-expect-continue@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.840.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/73099d06d044f5d82cf172398939c8776c966bf88466288270d80a4e93f451c9e620c92252b0b5c8086b22429f6a69137a21d81bbac66e573c36241859f0739b - languageName: node - linkType: hard - -"@aws-sdk/middleware-flexible-checksums@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.840.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.910.0" dependencies: "@aws-crypto/crc32": "npm:5.2.0" "@aws-crypto/crc32c": "npm:5.2.0" "@aws-crypto/util": "npm:5.2.0" - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/is-array-buffer": "npm:^4.0.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-stream": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/is-array-buffer": "npm:^4.2.0" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-stream": "npm:^4.5.2" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/55f31563a9811cc0b49c00d3c24e719416f51be31ac3d2af87425850d1c4ea2abb9a2dfc2f853ca6c3e10b837640e189c5cd37369476951dd0eab286e5abacbf + checksum: 10c0/b210f1555bd20abb848eb8696d7a9c549733ee6d50f1dcebf9379bd781de1579443a6c6474401c094444e6e639dacb1501d235ecdf11e4fd9a3b0bff78966166 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.840.0" +"@aws-sdk/middleware-host-header@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/aae5964c39118815293f3f1d42c6b5131ff44862d33af9c8d44eb98fb5b8db0e6191cceba59c487a2b89b70b2e7ad710b174a14506bc6d99d333af42fd6b3d07 + checksum: 10c0/bfd348a15b855a89a46a5c3cc18dbca94eda541847c3260b2d66b8c84440976cd527831bab7adaf3f6bc68fb9b61b885b69762dee3830cb960a2a18a8c517482 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.862.0" +"@aws-sdk/middleware-location-constraint@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.862.0" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/1a71a7fb8e678fbe7b57028e952c30ee7e6d3f9a213e99742befd008d42df772f5a6e43403c0501f86e4b3f42ff076ce068cbae040e146c1438d1f4e7643c948 + checksum: 10c0/91d06ca54012047048396ccdf1eb74477ae7d90feb28243f2e0a88df120e6c403b63c9c42b170114be4d994c089bbb1023b78db4cd6251ad978714ed8b297bed languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.840.0" +"@aws-sdk/middleware-logger@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-logger@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/4520274c5b350881df39e28b1732b482ee8023801e8cc6fe1da4b11856ea9660af5036dc6144cefce20338ed0cf5622cc03d10dddf67f95354447d3d0448d987 + checksum: 10c0/33d0ec8c067701e8fb80f792ec4208decb0eb61502fd34377976bcd0aea5ee2c554a0861b3f42547a6a11abfe7ca5324c419d87dbe88def282b9ce4da2edb068 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-logger@npm:3.840.0" +"@aws-sdk/middleware-recursion-detection@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/types": "npm:3.910.0" + "@aws/lambda-invoke-store": "npm:^0.0.1" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/5cc4eec656ec9811b64e504a96812f05f1b57e3542ea1dae6710505f81f8dfb36119709538b736a55792f02565818ab71f803e91b00bc4f0652ab198fce153fd + checksum: 10c0/bdf27349e500c8abffc67c5ed017dad8749b5a007d1e1da0fea7f12cb5e85a6255e28811e517566454a1a6a201fea6fe94cb8e90d4f8d8023cbcbf412afddcdd languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/middleware-logger@npm:3.862.0" +"@aws-sdk/middleware-sdk-s3@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.862.0" - "@smithy/types": "npm:^4.3.2" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-arn-parser": "npm:3.893.0" + "@smithy/core": "npm:^3.16.1" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/signature-v4": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-config-provider": "npm:^4.2.0" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-stream": "npm:^4.5.2" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/b1e7026ae941435b066530b37acf2291d96530bf5c1a5a47fa32f32caf3a336f1b2f6223d0ad2a61115f1846d63b632a6104fe0dd761c239067c780efa90b297 + checksum: 10c0/6e1a435849cdec5408e09d7b378f5e7d0e51660b2f360f54e6ef3745a39d5579136c9e146f23551d62df628ebb55c0139bedeeaff825e2348eec5ac71f21f2ed languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.840.0" +"@aws-sdk/middleware-ssec@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/88b1dfbf487d86b2aa26761b08e3de2fd1edd8d09abffd88f5d31b77215fd0852c74deba38802a15cc7015a716d990c2925523af88577890311958f53ef739e7 + checksum: 10c0/2156df7de3e63d426bc8fdc018298ae8dc6bcff55f9a21365de71142b0c61266f5e65657757a8815662f1b2a6d5c5a78e9b970bf4315907e6d7888059da0526a languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.862.0" +"@aws-sdk/middleware-user-agent@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.862.0" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-endpoints": "npm:3.910.0" + "@smithy/core": "npm:^3.16.1" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/ed186d07cf5733ccc899168f83767e428ca9d2e7394e315e43f4f2522ed9a9aac6e5477e47aa4710775e724730dcb25a6699784aa5e63153e102c001ea96ab7f + checksum: 10c0/70138565efae2e497cbeae877e5e07a5275ef3c59061b18aa5b4156cc2d53afbe1cced665f2c7c37f59f246bf76464cd67c68e2992f427caedf5dabba115b813 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.840.0" +"@aws-sdk/middleware-websocket@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/middleware-websocket@npm:3.910.0" dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-arn-parser": "npm:3.804.0" - "@smithy/core": "npm:^3.6.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/signature-v4": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-config-provider": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-stream": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-format-url": "npm:3.910.0" + "@smithy/eventstream-codec": "npm:^4.2.2" + "@smithy/eventstream-serde-browser": "npm:^4.2.2" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/signature-v4": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-hex-encoding": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/8ef8413028e710a5cee96af80b545d578c3c385dbcb87d2e2b61772b81813f700d7ca503305305af9819462c354e131e8aef692f58eeb08164279701ca1e67ef + checksum: 10c0/fb3e2bf805ec6eacb446cce3a79da58fde271e90295ffb8be6b2cc907c47df80dfb8162b4141bdc013496101a3524c42c46e3f7d528e11a2593aadf14a544ad2 languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.840.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/22cdded72582d15adb266e5f65b5756c129b7104535765ff5c67eedc24609bface9eebb1fa3b74ed41e7b8fade57940195810bbbe2e44b8283104849894ec658 - languageName: node - linkType: hard - -"@aws-sdk/middleware-user-agent@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.840.0" - dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.840.0" - "@smithy/core": "npm:^3.6.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/68822bc24d1311ba47a1e3b2ff194376f3923b39379aa29e6be658ee7e1b809bfea5ea07335c696ca581b42665f30899e25bbe8d9b3216003f602622b4326140 - languageName: node - linkType: hard - -"@aws-sdk/middleware-user-agent@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.848.0" - dependencies: - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.848.0" - "@smithy/core": "npm:^3.7.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/2ec977bd69711022a162e287584c04c66a6481ecc331ed8fe13b6fd334a9d2c3ebe13709933dd5b224915cf7fa6e196870077e428c853b772a4b841162e71752 - languageName: node - linkType: hard - -"@aws-sdk/middleware-user-agent@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.864.0" - dependencies: - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@aws-sdk/util-endpoints": "npm:3.862.0" - "@smithy/core": "npm:^3.8.0" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/638401786dfb365cd4e890e4b4d18ddf48e267faf8842c53feaad37f25f38615fc8fb710c721f7ca8e1de9c4b1c74f411d437b544385fe739d129b5c03958a16 - languageName: node - linkType: hard - -"@aws-sdk/middleware-websocket@npm:3.844.0": - version: 3.844.0 - resolution: "@aws-sdk/middleware-websocket@npm:3.844.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-format-url": "npm:3.840.0" - "@smithy/eventstream-codec": "npm:^4.0.4" - "@smithy/eventstream-serde-browser": "npm:^4.0.4" - "@smithy/fetch-http-handler": "npm:^5.1.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/signature-v4": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-hex-encoding": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/ff626f40f2d7369cc96ac139548bfb51b04056097ac5ad06ef20776973030e50990e7b8d218955ab1ef4caf90cc55b6a7bc34e9b01ae04a7e29dd6e6d60223be - languageName: node - linkType: hard - -"@aws-sdk/nested-clients@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/nested-clients@npm:3.840.0" +"@aws-sdk/nested-clients@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/nested-clients@npm:3.910.0" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/middleware-host-header": "npm:3.840.0" - "@aws-sdk/middleware-logger": "npm:3.840.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.840.0" - "@aws-sdk/middleware-user-agent": "npm:3.840.0" - "@aws-sdk/region-config-resolver": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.840.0" - "@aws-sdk/util-user-agent-browser": "npm:3.840.0" - "@aws-sdk/util-user-agent-node": "npm:3.840.0" - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/core": "npm:^3.6.0" - "@smithy/fetch-http-handler": "npm:^5.0.4" - "@smithy/hash-node": "npm:^4.0.4" - "@smithy/invalid-dependency": "npm:^4.0.4" - "@smithy/middleware-content-length": "npm:^4.0.4" - "@smithy/middleware-endpoint": "npm:^4.1.13" - "@smithy/middleware-retry": "npm:^4.1.14" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/node-http-handler": "npm:^4.0.6" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.21" - "@smithy/util-defaults-mode-node": "npm:^4.0.21" - "@smithy/util-endpoints": "npm:^3.0.6" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/middleware-host-header": "npm:3.910.0" + "@aws-sdk/middleware-logger": "npm:3.910.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" + "@aws-sdk/middleware-user-agent": "npm:3.910.0" + "@aws-sdk/region-config-resolver": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/util-endpoints": "npm:3.910.0" + "@aws-sdk/util-user-agent-browser": "npm:3.910.0" + "@aws-sdk/util-user-agent-node": "npm:3.910.0" + "@smithy/config-resolver": "npm:^4.3.2" + "@smithy/core": "npm:^3.16.1" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/hash-node": "npm:^4.2.2" + "@smithy/invalid-dependency": "npm:^4.2.2" + "@smithy/middleware-content-length": "npm:^4.2.2" + "@smithy/middleware-endpoint": "npm:^4.3.3" + "@smithy/middleware-retry": "npm:^4.4.3" + "@smithy/middleware-serde": "npm:^4.2.2" + "@smithy/middleware-stack": "npm:^4.2.2" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/node-http-handler": "npm:^4.4.1" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-body-length-browser": "npm:^4.2.0" + "@smithy/util-body-length-node": "npm:^4.2.1" + "@smithy/util-defaults-mode-browser": "npm:^4.3.2" + "@smithy/util-defaults-mode-node": "npm:^4.2.3" + "@smithy/util-endpoints": "npm:^3.2.2" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/1b9ee866f37f433723e472ed194629155de2b1fb7d464bf772727c5140bcb6ad5fbc5d4ae911a19b319f55614239bb1935304fa3ec5a881038a577c32a96b238 + checksum: 10c0/9d77566d1f11a4ef2b007f32b814d98837608d8f3b6207324e158c4b8ee37d183f957b8567c7f3fd8523ff8d614b6b542a195669dfc51bcb60a3866baccee7e3 languageName: node linkType: hard -"@aws-sdk/nested-clients@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/nested-clients@npm:3.848.0" +"@aws-sdk/region-config-resolver@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.910.0" dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/middleware-host-header": "npm:3.840.0" - "@aws-sdk/middleware-logger": "npm:3.840.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.840.0" - "@aws-sdk/middleware-user-agent": "npm:3.848.0" - "@aws-sdk/region-config-resolver": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@aws-sdk/util-endpoints": "npm:3.848.0" - "@aws-sdk/util-user-agent-browser": "npm:3.840.0" - "@aws-sdk/util-user-agent-node": "npm:3.848.0" - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/core": "npm:^3.7.0" - "@smithy/fetch-http-handler": "npm:^5.1.0" - "@smithy/hash-node": "npm:^4.0.4" - "@smithy/invalid-dependency": "npm:^4.0.4" - "@smithy/middleware-content-length": "npm:^4.0.4" - "@smithy/middleware-endpoint": "npm:^4.1.15" - "@smithy/middleware-retry": "npm:^4.1.16" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/node-http-handler": "npm:^4.1.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/smithy-client": "npm:^4.4.7" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.23" - "@smithy/util-defaults-mode-node": "npm:^4.0.23" - "@smithy/util-endpoints": "npm:^3.0.6" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-config-provider": "npm:^4.2.0" + "@smithy/util-middleware": "npm:^4.2.2" tslib: "npm:^2.6.2" - checksum: 10c0/77057a60ce0f86bee16e1daa5214385720aa433f1ff097350b41a85dab2da2ac0a6f196f17b94d51631448adeed9dabfd8b984976771d9cfd4bb27a449f26bc6 + checksum: 10c0/03bc2172d0c3b134cbb496e8546606a8821fc4f0272ea03aadfd653b29956ddbbfa2ad3e12b7937d3e98d7b0f92e8fedb2af6559f2389c2d1d4ffc37bb55c5b0 languageName: node linkType: hard -"@aws-sdk/nested-clients@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/nested-clients@npm:3.864.0" +"@aws-sdk/signature-v4-multi-region@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.910.0" dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/middleware-host-header": "npm:3.862.0" - "@aws-sdk/middleware-logger": "npm:3.862.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.862.0" - "@aws-sdk/middleware-user-agent": "npm:3.864.0" - "@aws-sdk/region-config-resolver": "npm:3.862.0" - "@aws-sdk/types": "npm:3.862.0" - "@aws-sdk/util-endpoints": "npm:3.862.0" - "@aws-sdk/util-user-agent-browser": "npm:3.862.0" - "@aws-sdk/util-user-agent-node": "npm:3.864.0" - "@smithy/config-resolver": "npm:^4.1.5" - "@smithy/core": "npm:^3.8.0" - "@smithy/fetch-http-handler": "npm:^5.1.1" - "@smithy/hash-node": "npm:^4.0.5" - "@smithy/invalid-dependency": "npm:^4.0.5" - "@smithy/middleware-content-length": "npm:^4.0.5" - "@smithy/middleware-endpoint": "npm:^4.1.18" - "@smithy/middleware-retry": "npm:^4.1.19" - "@smithy/middleware-serde": "npm:^4.0.9" - "@smithy/middleware-stack": "npm:^4.0.5" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/node-http-handler": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - "@smithy/url-parser": "npm:^4.0.5" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-body-length-node": "npm:^4.0.0" - "@smithy/util-defaults-mode-browser": "npm:^4.0.26" - "@smithy/util-defaults-mode-node": "npm:^4.0.26" - "@smithy/util-endpoints": "npm:^3.0.7" - "@smithy/util-middleware": "npm:^4.0.5" - "@smithy/util-retry": "npm:^4.0.7" - "@smithy/util-utf8": "npm:^4.0.0" + "@aws-sdk/middleware-sdk-s3": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/signature-v4": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/a1c6b61352bac1eb0d3348de5be92efef015256bdc18f8391df630631f0a347cdd38faea4b2ad48e99a82d5ea2e8537ad673e29ff1dab2468f13a04bd86b6038 + checksum: 10c0/c7292caec15d290d1ad8b9846da53afcebb7b8109079163b7055e3525c8ae08fe168a95f1a483c58abae810e4e99a1fc64863a962ced5fd7bfb2d6701faaeec7 languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.840.0" +"@aws-sdk/token-providers@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/token-providers@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-config-provider": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" + "@aws-sdk/core": "npm:3.910.0" + "@aws-sdk/nested-clients": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/27d72bb9657efd79637a4c4aa895004d29c66eefce083fa84050f092f68bcba8cb9bf0e4c16c11c132a5fa01f1841e878fa903bc837c4e1e6904d1b2d2c3dd37 + checksum: 10c0/8bcbc8a1f22acaaf7911bd6c7181af7da07e63470e063fb3c1a84b052af1699179a3568823e4e0c38d914340e1e2c2c9a450942f4571642113efc1e5a0410c5b languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.862.0" +"@aws-sdk/types@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/types@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.862.0" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-config-provider": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.5" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/b74d1ae2e663e6de0c4ce3a22af5693af911b0d05fb241595b69875cc6e03917c85e8d058ffc62c4bf7cf0b659d4e3aeb44d3ac2b18ecda0abd85bb04eb9579f + checksum: 10c0/b91c035d68999dfef31ffb81f0f6dea6d9a763339293d4267975dc9bc0f946d39d48fa51dbe643360d8643686e6ccce783f2ae1e3dfabd4d470bb8834c1186d3 languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.840.0" - dependencies: - "@aws-sdk/middleware-sdk-s3": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/signature-v4": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/224e17e624925ba5972f698d92e92289912f9e1ca1fd0525bbc62e6965a9e0585abb309fdb6b7e304fddeb4301e5c832d4370b324c55cbfd42922e73c1abc70c - languageName: node - linkType: hard - -"@aws-sdk/token-providers@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/token-providers@npm:3.840.0" - dependencies: - "@aws-sdk/core": "npm:3.840.0" - "@aws-sdk/nested-clients": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/a172666169fd8164ce48a3a0ea242405d8437119c8fbcf259223badf8ad04cf68a1ebba54c09c22cbee5c16775e885733788978aa99c9a27241036e967ea2fa5 - languageName: node - linkType: hard - -"@aws-sdk/token-providers@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/token-providers@npm:3.848.0" - dependencies: - "@aws-sdk/core": "npm:3.846.0" - "@aws-sdk/nested-clients": "npm:3.848.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/c37329f6f3f41c32464d4ca512baa0aa1cd8694964af4391eebb14e7a4980316041579745bc35930caf973aa5595326da95f652b26ebb8f167cea078fb893d10 - languageName: node - linkType: hard - -"@aws-sdk/token-providers@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/token-providers@npm:3.864.0" - dependencies: - "@aws-sdk/core": "npm:3.864.0" - "@aws-sdk/nested-clients": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/shared-ini-file-loader": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/c87f9a0c7becb8e016f3cb6a468c9efa26a1c708c8738155d77799547479c2ff24801bd1becd1e57244431dde94ad348c676530b9053741ffb98c8710914077b - languageName: node - linkType: hard - -"@aws-sdk/types@npm:3.840.0, @aws-sdk/types@npm:^3.222.0": +"@aws-sdk/types@npm:^3.222.0": version: 3.840.0 resolution: "@aws-sdk/types@npm:3.840.0" dependencies: @@ -1933,72 +1369,37 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/types@npm:3.862.0" +"@aws-sdk/util-arn-parser@npm:3.893.0": + version: 3.893.0 + resolution: "@aws-sdk/util-arn-parser@npm:3.893.0" dependencies: - "@smithy/types": "npm:^4.3.2" tslib: "npm:^2.6.2" - checksum: 10c0/d8e13eadde27c29e39d8effa861a3dc8ef43fba6ecb9772e3461619a76897873c8d4355be89aa5090294d1f17e1a6697834f0bbf6a7f73902a77fe00b1fbe5c2 + checksum: 10c0/c8bbc1e258674e791929f1259a3f2422433c0b8c5470808a958ef4320bb9ca7c27783b617da3b9e04d9a1cd1d0b547da2858249dbec816f1098c02731b551aac languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.804.0": - version: 3.804.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.804.0" +"@aws-sdk/util-endpoints@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/util-endpoints@npm:3.910.0" dependencies: + "@aws-sdk/types": "npm:3.910.0" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" + "@smithy/util-endpoints": "npm:^3.2.2" tslib: "npm:^2.6.2" - checksum: 10c0/b6d4c883ec2949fa40552fe8573c9c32af07c92c1bd94a27d978aa14d37b005be95392069d6b882ba977484f4dd0371792296fb2516f5d7601be5102888ee9ee + checksum: 10c0/1944c8ff7fd50ef6e018a27c378ae0eba7672900827cbc2b1604d04ce08ec2a74dea11eb3a9ba63a00e4083206be93e9a90aaa424f841e5f5c55888cf0e07073 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/util-endpoints@npm:3.840.0" +"@aws-sdk/util-format-url@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/util-format-url@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-endpoints": "npm:^3.0.6" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/querystring-builder": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/822fe59c003b433c955756daf47736a17c42c25f449b9ca96c2c2bb79964866ee0a0a657824da6289588d689e76712a7058d70e42c3fad2b78bfb23f905643d9 - languageName: node - linkType: hard - -"@aws-sdk/util-endpoints@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/util-endpoints@npm:3.848.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-endpoints": "npm:^3.0.6" - tslib: "npm:^2.6.2" - checksum: 10c0/84567b4152ea823274855cdab4acdde1ca60b4ba0be265408da13ad59b9f5ec2f16578402ca0430748b57b57f3a457466517bf434d0e9cec79abf855a0468b49 - languageName: node - linkType: hard - -"@aws-sdk/util-endpoints@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/util-endpoints@npm:3.862.0" - dependencies: - "@aws-sdk/types": "npm:3.862.0" - "@smithy/types": "npm:^4.3.2" - "@smithy/url-parser": "npm:^4.0.5" - "@smithy/util-endpoints": "npm:^3.0.7" - tslib: "npm:^2.6.2" - checksum: 10c0/e37245c5e6cfa03591895e7c11f24a356b85d57895f08f5202a2bc107030177244c66e4a952a9333c8aaf072b23edb89f781416ae9999c1dc0b2b0dec9403ca3 - languageName: node - linkType: hard - -"@aws-sdk/util-format-url@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/util-format-url@npm:3.840.0" - dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/querystring-builder": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/9f1d55e00bc10523d786e9a7c4b387ceb38170a870a1c5c8772bd3cd7d0ab1f352ca1c49a52cbf751acee65091ae9e58f079e6ee94bbe104b8989bff26f40a63 + checksum: 10c0/f65f56ac79b557a6ab98143c3cb607ea92bb5d785bc3bed0c077365e9f04119c3a34e3d05e14c0e9d99ec2064de32e30cdc03d901cee0a59d4d1da9f85e9aebd languageName: node linkType: hard @@ -2011,101 +1412,51 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.840.0" +"@aws-sdk/util-user-agent-browser@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.840.0" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/types": "npm:^4.7.1" bowser: "npm:^2.11.0" tslib: "npm:^2.6.2" - checksum: 10c0/873d5e3218958aa935127b05dad5a1d8cf26c9b7726584eb424a5958e7e205786dd99e4fa053b65f3b956261a7f8a3746e48e9b7dc47c3149792ff525da97631 + checksum: 10c0/7f331a95df724548198a076f560cb1a7491c4b87dc76b2eea623ef6acc2c4b186e50a393336a26ecf83fadb9375c9eb668e5b5bc154adcf3e17ecf7ae0f89cc0 languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.862.0" +"@aws-sdk/util-user-agent-node@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.910.0" dependencies: - "@aws-sdk/types": "npm:3.862.0" - "@smithy/types": "npm:^4.3.2" - bowser: "npm:^2.11.0" - tslib: "npm:^2.6.2" - checksum: 10c0/68d8ce204c52ed703b925f77922b8845875fb101454654c9a0483947d5edbd40d4fedb515df9f0f70f93c08277cb11cd51a376fafbf43c6745b5364679dce6cb - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-node@npm:3.840.0": - version: 3.840.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.840.0" - dependencies: - "@aws-sdk/middleware-user-agent": "npm:3.840.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/types": "npm:^4.3.1" + "@aws-sdk/middleware-user-agent": "npm:3.910.0" + "@aws-sdk/types": "npm:3.910.0" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: 10c0/862fc435d8a25f3e299e5c92c5ba51ef287a75f18cb0a529797a42a72de1481e3c92458a5569eeeab09fddfb5a75db1c59aa766d95b0e832c32c6c1bd7745644 + checksum: 10c0/619e590479b67c7870e43161e6a81eb7268a54a7b89712ce575f0e8fa14fda55356da87fa9998312c6f314e0d8187757c56874cd96f441cfbbb336a4bf297e00 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.848.0": - version: 3.848.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.848.0" +"@aws-sdk/xml-builder@npm:3.910.0": + version: 3.910.0 + resolution: "@aws-sdk/xml-builder@npm:3.910.0" dependencies: - "@aws-sdk/middleware-user-agent": "npm:3.848.0" - "@aws-sdk/types": "npm:3.840.0" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" + fast-xml-parser: "npm:5.2.5" tslib: "npm:^2.6.2" - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 10c0/165308d1323ed0f56f4366e235674a73606c9d32a47c1572541c4befc6ce5ecca2d2334981f0d77791def22dad0a722773b1540f60f2d329710f2ade361801a6 + checksum: 10c0/b0799f1a70f842e1632a4dfa9275c3669ed4d2e0551f1f238932b5d63a1582a58345b6a4e946a3bd73ab052eb702e63e0396d4b8fae35778eb30c89856287306 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.864.0": - version: 3.864.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.864.0" - dependencies: - "@aws-sdk/middleware-user-agent": "npm:3.864.0" - "@aws-sdk/types": "npm:3.862.0" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 10c0/1eba907bbeb99d1c78912e94589ead12b6ecb6f2fbfffa4fafdff94439dc81d2adfa8145302c3d6bcf355ecee7687081f18d5034269f921affc00c5b8402a9bf - languageName: node - linkType: hard - -"@aws-sdk/xml-builder@npm:3.821.0": - version: 3.821.0 - resolution: "@aws-sdk/xml-builder@npm:3.821.0" - dependencies: - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/316e0eb04bcec0bb0897f67718629deab29adb9664ce78743ad854df772472c02332ab12627d74b96ebe2205adc51b1cb7fb01fcb4251e80a7af405e56cfa135 - languageName: node - linkType: hard - -"@aws-sdk/xml-builder@npm:3.862.0": - version: 3.862.0 - resolution: "@aws-sdk/xml-builder@npm:3.862.0" - dependencies: - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/bf388c2cc23cd7d7fbe32d148b59b7476227cadc1d169d92b086befed128926d202c74a58af549888979f57f7bccff2db901b842f36aa135fb3be4b886199053 +"@aws/lambda-invoke-store@npm:^0.0.1": + version: 0.0.1 + resolution: "@aws/lambda-invoke-store@npm:0.0.1" + checksum: 10c0/0bbf3060014a462177fb743e132e9b106a6743ad9cd905df4bd26e9ca8bfe2cc90473b03a79938fa908934e45e43f366f57af56a697991abda71d9ac92f5018f languageName: node linkType: hard @@ -9905,147 +9256,76 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/abort-controller@npm:4.0.4" +"@smithy/abort-controller@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/abort-controller@npm:4.2.2" dependencies: - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/eb172b002fb92406c69b83460f949ace73247e6abd85d0d3714de2765c5db7b98070b9abfb630e2c591dd7b2ff770cc24f7737c1c207581f716c402b16bf46f9 + checksum: 10c0/eb0428d3f1cde2f7689b84f725db23d1160c493addabd00a48f1589df6dad9cf69c88050017bdaf57dc37f81ce8b390673aebdf358195598b63a8481f89056c5 languageName: node linkType: hard -"@smithy/abort-controller@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/abort-controller@npm:4.0.5" +"@smithy/chunked-blob-reader-native@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/chunked-blob-reader-native@npm:4.2.1" dependencies: - "@smithy/types": "npm:^4.3.2" + "@smithy/util-base64": "npm:^4.3.0" tslib: "npm:^2.6.2" - checksum: 10c0/0a16d5571f5aa3d6d43465ce1060263a92c6eba011cf448adaeafb940121981ecb26fabb0185745520cace9dfd9aebe6879930ff3b55c8f1b42ac6a337070f20 + checksum: 10c0/63831fe47a5b3a1ea6821846a5fb009298da57159e4818238e8110b77245805c1a07cb854df7955a39de1f5f2dfb7c8803ac942117e622665e089d715cb2041c languageName: node linkType: hard -"@smithy/chunked-blob-reader-native@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/chunked-blob-reader-native@npm:4.0.0" +"@smithy/chunked-blob-reader@npm:^5.2.0": + version: 5.2.0 + resolution: "@smithy/chunked-blob-reader@npm:5.2.0" dependencies: - "@smithy/util-base64": "npm:^4.0.0" tslib: "npm:^2.6.2" - checksum: 10c0/4387f4e8841f20c1c4e689078141de7e6f239e7883be3a02810a023aa30939b15576ee00227b991972d2c5a2f3b6152bcaeca0975c9fa8d3669354c647bd532a + checksum: 10c0/9fe95b788e022ce2b59c8cab607c8f71d73cce367329871d2a7eafdc0d77cec8d1939fe8141f446bbe4051dcfffce864a562762ac2691c368df3b6c2f6ed62b3 languageName: node linkType: hard -"@smithy/chunked-blob-reader@npm:^5.0.0": - version: 5.0.0 - resolution: "@smithy/chunked-blob-reader@npm:5.0.0" +"@smithy/config-resolver@npm:^4.3.2": + version: 4.3.2 + resolution: "@smithy/config-resolver@npm:4.3.2" dependencies: + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-config-provider": "npm:^4.2.0" + "@smithy/util-middleware": "npm:^4.2.2" tslib: "npm:^2.6.2" - checksum: 10c0/55ba0fe366ddaa3f93e1faf8a70df0b67efedbd0008922295efe215df09b68df0ba3043293e65b17e7d1be71448d074c2bfc54e5eb6bd18f59b425822c2b9e9a + checksum: 10c0/58ecefbab4b3fe802326e9a2c1d950714c44b701f6d1e36dd91d9e7f2f43d00f21c167ba1ee3a74b7f37305e7ed3a664204c16ce9691ded0603e5a8251329450 languageName: node linkType: hard -"@smithy/config-resolver@npm:^4.1.4": - version: 4.1.4 - resolution: "@smithy/config-resolver@npm:4.1.4" +"@smithy/core@npm:^3.16.1": + version: 3.16.1 + resolution: "@smithy/core@npm:3.16.1" dependencies: - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-config-provider": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" + "@smithy/middleware-serde": "npm:^4.2.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-body-length-browser": "npm:^4.2.0" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-stream": "npm:^4.5.2" + "@smithy/util-utf8": "npm:^4.2.0" + "@smithy/uuid": "npm:^1.1.0" tslib: "npm:^2.6.2" - checksum: 10c0/41832a42f8da7143732c71098b410f4ddcb096066126f7e8f45bae8d9aeb95681bd0d0d54886f46244c945c63829ca5d23373d4de31a038487aa07159722ef4e + checksum: 10c0/34892aaa74b1559c821d70d058d150fc7d7a4b09c8164c9e40ff493dddf657cd4a28e5db7dffd5b2ff76df644bb48e6b66d4213f483390fdda3f6711893517ef languageName: node linkType: hard -"@smithy/config-resolver@npm:^4.1.5": - version: 4.1.5 - resolution: "@smithy/config-resolver@npm:4.1.5" +"@smithy/credential-provider-imds@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/credential-provider-imds@npm:4.2.2" dependencies: - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-config-provider": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.5" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" tslib: "npm:^2.6.2" - checksum: 10c0/f76f2365403411810a205763a6744eb84d4edfc6bedb87ba0d41b4b310b9c693f3cb17610f963f706b06e90c12864fe54617c9ff1f435fe3b94d825f2def2bfb - languageName: node - linkType: hard - -"@smithy/core@npm:^3.6.0": - version: 3.6.0 - resolution: "@smithy/core@npm:3.6.0" - dependencies: - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-stream": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/015874e1c44815b6e50594f2983a1a88e3c4f777760d062b2e31b402e8d145ce5c64b33065eaa97fd37867ef6c95493ddc62f3775cd7102e6fd41c9808be219a - languageName: node - linkType: hard - -"@smithy/core@npm:^3.7.0, @smithy/core@npm:^3.7.1": - version: 3.7.1 - resolution: "@smithy/core@npm:3.7.1" - dependencies: - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-stream": "npm:^4.2.3" - "@smithy/util-utf8": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/3828f48b776a50ee58896fd8fdcd2ae28e2142114118b5ee78892c6e40f74c63f7dbb39199a324f9858d87ca3362e72563e47ddd81c38895da070c9503325405 - languageName: node - linkType: hard - -"@smithy/core@npm:^3.8.0": - version: 3.8.0 - resolution: "@smithy/core@npm:3.8.0" - dependencies: - "@smithy/middleware-serde": "npm:^4.0.9" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-body-length-browser": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.5" - "@smithy/util-stream": "npm:^4.2.4" - "@smithy/util-utf8": "npm:^4.0.0" - "@types/uuid": "npm:^9.0.1" - tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10c0/0fe1c19b0a2f371ed04b47e51edac896ed24d868a3f78290ea8913e255fef7d023a9c0ba252f5af2b606bfadfdca7fbc545db01dcd0d2162c228d10b2eadc303 - languageName: node - linkType: hard - -"@smithy/credential-provider-imds@npm:^4.0.6": - version: 4.0.6 - resolution: "@smithy/credential-provider-imds@npm:4.0.6" - dependencies: - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - tslib: "npm:^2.6.2" - checksum: 10c0/b1f3157d0a7b9f9155ac80aeac70d7db896d23d0322a6b38f0e848f1e53864ba1bca6d3dc5dd9af86446c371ebc5bffe01f0712ad562e7635e7d13e532622aa4 - languageName: node - linkType: hard - -"@smithy/credential-provider-imds@npm:^4.0.7": - version: 4.0.7 - resolution: "@smithy/credential-provider-imds@npm:4.0.7" - dependencies: - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - "@smithy/url-parser": "npm:^4.0.5" - tslib: "npm:^2.6.2" - checksum: 10c0/862ac40520e2756918e8ecdf2259ec82f1b1556595b3b8d19d7c68390119c416fdd9c716c78773a2ccec21c32cb81f465e0474073a8a90808e171fbdcdcfbd81 + checksum: 10c0/53e1543b195d606250fa6c4f68b81c98f9e11b4cc473f165f82bbf266ad4850d7549b05fa0424ccdf5a5b2c32bfdc809e39e124fab6e4a87f0d6a5233436647a languageName: node linkType: hard @@ -10061,164 +9341,116 @@ __metadata: languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/eventstream-codec@npm:4.0.4" +"@smithy/eventstream-codec@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/eventstream-codec@npm:4.2.2" dependencies: "@aws-crypto/crc32": "npm:5.2.0" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-hex-encoding": "npm:^4.0.0" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-hex-encoding": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/89b76826d4d3bf97317e3539ece105b9a03552144ad816a687b0b2cbca60e2b3513062c04b6cfacaffb270d616ffc8ac8bf549afc4aa676a6d7465df5a3215ba + checksum: 10c0/9bb133d1e5942c32fd1d50357f8df2d0649ef2be2761deac5754406f88e9cdb7f611680ac601e525c658a8959497b2bbebf7f830244963e5d57a6d8f31cba2bc languageName: node linkType: hard -"@smithy/eventstream-serde-browser@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/eventstream-serde-browser@npm:4.0.4" +"@smithy/eventstream-serde-browser@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/eventstream-serde-browser@npm:4.2.2" dependencies: - "@smithy/eventstream-serde-universal": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@smithy/eventstream-serde-universal": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/b2444538555c54ac96d4049b0be3a65d959914bcd5198a8059edc838c7ffac5a1db225290194f85ea8805c47c1edc95484dfeb415cb2004ec3e572880f4fc8c5 + checksum: 10c0/af58899f07476f96d30635296fffed789fa7328c4b4f32b2e4211ffc0547090e8f95609c578bddda1d79f64a3d5c3cc53d43cb160187dbc0743c4930c11a34b0 languageName: node linkType: hard -"@smithy/eventstream-serde-config-resolver@npm:^4.1.2": - version: 4.1.2 - resolution: "@smithy/eventstream-serde-config-resolver@npm:4.1.2" +"@smithy/eventstream-serde-config-resolver@npm:^4.3.2": + version: 4.3.2 + resolution: "@smithy/eventstream-serde-config-resolver@npm:4.3.2" dependencies: - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/54184a29d1e42f1b972292efc3a5cbbe3ca237cd9ab76132bad40e8426fa62d0b7f6fdac01f23e3a9cac69919107ddfd9d2f2873f83ae1f65470d3052c67cefc + checksum: 10c0/fe5c31447a9f303b1f2d530f048d233253b15236cbb9870fc809cf55f2dd66c3f1d09e21487d01a839f111de1a8316837ab9ff84f1eaa384d38d5831853702bb languageName: node linkType: hard -"@smithy/eventstream-serde-node@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/eventstream-serde-node@npm:4.0.4" +"@smithy/eventstream-serde-node@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/eventstream-serde-node@npm:4.2.2" dependencies: - "@smithy/eventstream-serde-universal": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@smithy/eventstream-serde-universal": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/e6d0765a73332c79b69531ed20c27e49475173da09ce21e4c011a64d8a61d7c5c328c9bc1cab991e145fc969b16071ffd6a33ab11291c0fa2a46e8dae28da23b + checksum: 10c0/03e3ac9b099c74f83f17bfb77c3b1389c818f88ff7ba4c0c94530b215c0c0b2545b741438d44f074044bd0cd5493f4aa235f44f4eb050bb1a227f34a89610d21 languageName: node linkType: hard -"@smithy/eventstream-serde-universal@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/eventstream-serde-universal@npm:4.0.4" +"@smithy/eventstream-serde-universal@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/eventstream-serde-universal@npm:4.2.2" dependencies: - "@smithy/eventstream-codec": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@smithy/eventstream-codec": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/f0c18efa6cafa111ed20c8c53b4a7b6a0f8e25ccb0d2cafdf83282ebc6f96e47f26daf24b5b810ea83a02e03c994c35419d94fad76871f2cc6cb01d2aed277d9 + checksum: 10c0/12102eac8161456263c008f5ab6052230fa834abc7a00142c767fc1a0094c0fc733d4e375c1133f5981513702612e4eeff3774e48f1e49711805807cd1c58c2a languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.0.4": - version: 5.0.4 - resolution: "@smithy/fetch-http-handler@npm:5.0.4" +"@smithy/fetch-http-handler@npm:^5.3.3": + version: 5.3.3 + resolution: "@smithy/fetch-http-handler@npm:5.3.3" dependencies: - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/querystring-builder": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/querystring-builder": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-base64": "npm:^4.3.0" tslib: "npm:^2.6.2" - checksum: 10c0/ce57acfcd40a6ff3965c5f14b432c5ab87f0b0766766960224d4af79af85e37d61da2db6dc5cfa16bf4b8f2d8966a2838d2ee6eef8d5cd5a837aacbc01517851 + checksum: 10c0/1f1635f3c4922f5e22e9d1a26248146e269bf847880ae57c94fe3425def0abd2938aa43678f141014bb923c03be117f9beee79e633a0dd1c4ab5eeb8e38350d9 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.1.0": - version: 5.1.0 - resolution: "@smithy/fetch-http-handler@npm:5.1.0" +"@smithy/hash-blob-browser@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/hash-blob-browser@npm:4.2.3" dependencies: - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/querystring-builder": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" + "@smithy/chunked-blob-reader": "npm:^5.2.0" + "@smithy/chunked-blob-reader-native": "npm:^4.2.1" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/9bd54f40f00f35a4eee3c359e5942fc5c6ea1c43d7c708e5dd2cd74e8291c55fc6f1ce043d66eea7c1ca687dda682899058967c5b92df75ab56e44a773bb8679 + checksum: 10c0/d0f8fcc2036f0f3dd1c02ba63d9c8c14402b339fddb962e8e030e6e6f62f75bcb73c8d623efe74de423a2a2178865ecf8920d2778d13b67054a1d538509b1837 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.1.1": - version: 5.1.1 - resolution: "@smithy/fetch-http-handler@npm:5.1.1" +"@smithy/hash-node@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/hash-node@npm:4.2.2" dependencies: - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/querystring-builder": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-base64": "npm:^4.0.0" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-buffer-from": "npm:^4.2.0" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/c07f5cad58d5da7cd0de95e2d600e8dee8cda54bba65e7327c5beb25d2aa3eb815d228944bf20860de8927068d3d80baa28f71ecee0a1a3e131307774f53813b + checksum: 10c0/dda1ab2b05e72c487c13f6dd1dfa91902143aa90516428d3fbcf8f1d12aa52d4d71c631aebb20fc661d18a25e634fb134ef8fc65057d84d92759fb27b17c41cc languageName: node linkType: hard -"@smithy/hash-blob-browser@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/hash-blob-browser@npm:4.0.4" +"@smithy/hash-stream-node@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/hash-stream-node@npm:4.2.2" dependencies: - "@smithy/chunked-blob-reader": "npm:^5.0.0" - "@smithy/chunked-blob-reader-native": "npm:^4.0.0" - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/f970058c2e04e86427e1474355199027fc84dc1d96d9a2278ed37904458d37b020472541390558bd3fb071bbd177b2850b18ceb1beb39d387fead06a2912f974 + checksum: 10c0/18bea2f7f194e31aacd75d3b4ae2c4b6a0eefd0faaddfa0d72c794b4520b19acd4530c556198e60a2980a75af89f2caaaaa7f3a207f3368a62ed575309e9c3b0 languageName: node linkType: hard -"@smithy/hash-node@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/hash-node@npm:4.0.4" +"@smithy/invalid-dependency@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/invalid-dependency@npm:4.2.2" dependencies: - "@smithy/types": "npm:^4.3.1" - "@smithy/util-buffer-from": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/07beb38643990f6c055457765d65af2aedd5944d819025df90d1f2f59596d1a1394cd8c9035ac6d343bc55e3afeb186b51b0ac91938024da8687120fc0b436dc - languageName: node - linkType: hard - -"@smithy/hash-node@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/hash-node@npm:4.0.5" - dependencies: - "@smithy/types": "npm:^4.3.2" - "@smithy/util-buffer-from": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/6c5aeba12b651d74fa05e03b7019d48193b0fac4995ad84fe313961c4e51d16cdbe46f529a3fe435a061fbe7eebee0620def92f9821add28e466152fd3270560 - languageName: node - linkType: hard - -"@smithy/hash-stream-node@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/hash-stream-node@npm:4.0.4" - dependencies: - "@smithy/types": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/4899132433f520e45972bbacb6a999da8d7ccf4c813f2fb28b1af65eaf268ba549b2c37dd54a586cd7bcd82f6e4cec914651a6446b3fb3e1f226ca1864051535 - languageName: node - linkType: hard - -"@smithy/invalid-dependency@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/invalid-dependency@npm:4.0.4" - dependencies: - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/5e5a6282c17a7310f8e866c7e34fa07479d42c650cf3c1875bdb0ec38d5280eeac82a269605a3521b8fa455b92673d8fd5e97eb997acf81a80da82d6f501d651 - languageName: node - linkType: hard - -"@smithy/invalid-dependency@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/invalid-dependency@npm:4.0.5" - dependencies: - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/8cc2a14dc47ac5513641747297e6e7e79dceb687e962e1520949db94597a5ce057f9f92657530b6660df100ef1fcff04cd5d9638847c8ada7f7b431a73f34fd2 + checksum: 10c0/76899c977d406af5afbf446af14a397ed948cda36260819d8f36c5f3f18a83e849923bf7b6435278e37c2544d52775f2bd65bb99282a4f9d2c64e52986ab8084 languageName: node linkType: hard @@ -10240,438 +9472,204 @@ __metadata: languageName: node linkType: hard -"@smithy/md5-js@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/md5-js@npm:4.0.4" +"@smithy/is-array-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/is-array-buffer@npm:4.2.0" dependencies: - "@smithy/types": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.0.0" tslib: "npm:^2.6.2" - checksum: 10c0/7c66405dca5d7df6694367dbb4a3d9f13fdfe2589abc81f85d5fb7bf876e1382578d9c477d2256d4b5bc59951c3c534e51eb65c53c2fb3251080f16d1d7ea82c + checksum: 10c0/8e3e21cff5929d627bbf4a9beded28bd54555cfd37772226290964af6950cc10d700776a2ce7553f34ddf88a2e7e3d4681de58c94e9805592d901fc0f32cb597 languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/middleware-content-length@npm:4.0.4" +"@smithy/md5-js@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/md5-js@npm:4.2.2" dependencies: - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/fde43ff13f0830c4608b83cf6e2bd3ae142aa6eb3df6f6c190c2564dd00c2c98f4f95da9146c69bc09115ad87ffc9dc24935d1a3d6d3b2383a9c8558d9177dd6 + checksum: 10c0/09c3c352d3bc00a95ffee6ccab1f2ffc4a61ea55db817f5599419e3273ca6152b43f96982675399fc20f7d448280f848123ed0b35b12650392f0645088c6e84b languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/middleware-content-length@npm:4.0.5" +"@smithy/middleware-content-length@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/middleware-content-length@npm:4.2.2" dependencies: - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/2bbe3afc2d29bf4153afb52adb2cadc063e745c2e1f3c630ff10bb97ce4fa8ae7e6872082ec1407b638d0c7cb896ebcc27ca190f9aa78635a8e41a2440fe680a + checksum: 10c0/f0671c55981785b9a141d5aaa0f5a73db7af381179b9dc1aa1f403bbfc14e6bc4dcbc45734f2a7b55f325b79f7d5eacb8c7a5f8159c470b145424dd937d1246e languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.1.13": - version: 4.1.13 - resolution: "@smithy/middleware-endpoint@npm:4.1.13" +"@smithy/middleware-endpoint@npm:^4.3.3": + version: 4.3.3 + resolution: "@smithy/middleware-endpoint@npm:4.3.3" dependencies: - "@smithy/core": "npm:^3.6.0" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-middleware": "npm:^4.0.4" + "@smithy/core": "npm:^3.16.1" + "@smithy/middleware-serde": "npm:^4.2.2" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/url-parser": "npm:^4.2.2" + "@smithy/util-middleware": "npm:^4.2.2" tslib: "npm:^2.6.2" - checksum: 10c0/a4f605ba95d59e5afbad326ed0a1417fb33cb1c6085a9c13f765520d3732e223ab501033457eab72ed223d41ce0a079d6895ebb3954935b2a6d25b223c4ef72c + checksum: 10c0/ea1adb2887178ac6421a9b59e069a1e043960f8f5422bd54183c8275b6fa8c479ac752e3d726f2d711714e9bc15664bf718495bddafaac5713a50b708216977a languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.1.15, @smithy/middleware-endpoint@npm:^4.1.16": - version: 4.1.16 - resolution: "@smithy/middleware-endpoint@npm:4.1.16" +"@smithy/middleware-retry@npm:^4.4.3": + version: 4.4.3 + resolution: "@smithy/middleware-retry@npm:4.4.3" dependencies: - "@smithy/core": "npm:^3.7.1" - "@smithy/middleware-serde": "npm:^4.0.8" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - "@smithy/url-parser": "npm:^4.0.4" - "@smithy/util-middleware": "npm:^4.0.4" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/service-error-classification": "npm:^4.2.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-retry": "npm:^4.2.2" + "@smithy/uuid": "npm:^1.1.0" tslib: "npm:^2.6.2" - checksum: 10c0/9f19d65ec1ed88e6a7a214821087286304199bbc613b157cca9dd7eab12f3ab6554fb38b9681759c75285210b21b4cc1527add1eafd46f9f5bfb8ca5679eebeb + checksum: 10c0/9ab0f4cdf0e1b9a303ea8522af1b6e070640774d09218c7a9a3c7b82a962601cb0a6e690daf815021a8717a16c58c8a36950c6c4043dbef5ec3ffb0ebe36aa2a languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.1.18": - version: 4.1.18 - resolution: "@smithy/middleware-endpoint@npm:4.1.18" +"@smithy/middleware-serde@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/middleware-serde@npm:4.2.2" dependencies: - "@smithy/core": "npm:^3.8.0" - "@smithy/middleware-serde": "npm:^4.0.9" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - "@smithy/url-parser": "npm:^4.0.5" - "@smithy/util-middleware": "npm:^4.0.5" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/22a6e05e427c9899041facefea8bdf8dad393bdb3ccd7ca795fb705e85ee8b9e48c6000e947bb6a8a1cfe48d1f1f1b9f894f0b588e87ce1ea5b187d041bcd6fe + checksum: 10c0/4d3db5dcce34b08f90af4b150c94fb25c0ceb309ea8cc07686be9dde4ccfaa5f31b6662fcaab4a7f2d4ce2630a26048abc08020e36bacccff8411772b59bb998 languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.1.14": - version: 4.1.14 - resolution: "@smithy/middleware-retry@npm:4.1.14" +"@smithy/middleware-stack@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/middleware-stack@npm:4.2.2" dependencies: - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/service-error-classification": "npm:^4.0.6" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10c0/a720f366f3c8b5ea9d35bf38718d3885492fe896288623f9e5b3c293bfea14bc530b9107da100abdac3ff45bebbe1335f6da928c005fc78dbdefab2d65f1269d + checksum: 10c0/81b265313f381ff12c223997f04b171f661e58fa3ae3d286990148d9252c784f6bdd9f2c4db747d4eb860fec96c72363d369f7d11bdd8e34fb03ae7e0aba7a09 languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.1.16": - version: 4.1.17 - resolution: "@smithy/middleware-retry@npm:4.1.17" +"@smithy/node-config-provider@npm:^4.3.2": + version: 4.3.2 + resolution: "@smithy/node-config-provider@npm:4.3.2" dependencies: - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/service-error-classification": "npm:^4.0.6" - "@smithy/smithy-client": "npm:^4.4.8" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-retry": "npm:^4.0.6" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/shared-ini-file-loader": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10c0/d8b8ce6180a1b9bef099c95a0f8bfcd232f12fc662a65f7ac2d65839009678af33665284c29b8abdb92de47f20f40ec95307a5f1d74623a3374158d800598b43 + checksum: 10c0/a1f5a329e64b738a9cf74f28cad4cd9bd844a2146bce9681d24494a69869e847dbe037bf5ef89508c7b3f234f1c7dff7796e35e747ae675b31e0aa0efd6699a8 languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.1.19": - version: 4.1.19 - resolution: "@smithy/middleware-retry@npm:4.1.19" +"@smithy/node-http-handler@npm:^4.4.1": + version: 4.4.1 + resolution: "@smithy/node-http-handler@npm:4.4.1" dependencies: - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/service-error-classification": "npm:^4.0.7" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-middleware": "npm:^4.0.5" - "@smithy/util-retry": "npm:^4.0.7" - "@types/uuid": "npm:^9.0.1" + "@smithy/abort-controller": "npm:^4.2.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/querystring-builder": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10c0/6595d27404491ee3befc69ffe8ce576f26b409385d6958597c8d889fff7aff26973a54eab605348299c24760912d9606f7efe84e3adf72ab146b114096592bec + checksum: 10c0/126ac736317cc167c5744366bff0efef9e9afffbcc6afb3a70875388be570b7eca2a52c59c6c12d6b990ebe4c90c103209a5b874b3a16c72d5923fc3c0ed3dfa languageName: node linkType: hard -"@smithy/middleware-serde@npm:^4.0.8": - version: 4.0.8 - resolution: "@smithy/middleware-serde@npm:4.0.8" +"@smithy/property-provider@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/property-provider@npm:4.2.2" dependencies: - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/11414e584780716b2b0487fe748da9927943d4d810b5b0161e73df6ab24a4d17f675773287f95868c57a71013385f7b027eb2afbab1eed3dbaafef754b482b27 + checksum: 10c0/14b49afd41b9c490b8568716aceb0e6e02449a8a3008b11634d593bd0013081296eb8768fd51ef7bf35e5d0cb248895bbfa73a8b15afa6bcf2fb8d001b38149d languageName: node linkType: hard -"@smithy/middleware-serde@npm:^4.0.9": - version: 4.0.9 - resolution: "@smithy/middleware-serde@npm:4.0.9" +"@smithy/protocol-http@npm:^5.3.2": + version: 5.3.2 + resolution: "@smithy/protocol-http@npm:5.3.2" dependencies: - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/71dc9d920d36a3f65cc883718e8c74687a7c8074a148ab1a035e395e43c6566a3514f10b4c15a13b98194ecd1d81816932c9df8dfa5955cd347c6049893defc4 + checksum: 10c0/a429e1b058d342aaff0eb9463be4d7f4da1ac12933bf30e202d906f25964e20433d503f4e19fe5ede5989f84096ba5e09cf0c10fd94992c8306dd81aa7d17a95 languageName: node linkType: hard -"@smithy/middleware-stack@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/middleware-stack@npm:4.0.4" +"@smithy/querystring-builder@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/querystring-builder@npm:4.2.2" dependencies: - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-uri-escape": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/b29b6430e31f11683f0ce0e06d21a4bfe6cb791ce1eb5686533559baa81698f617bfbfdac06f569e13f077ce177cb70e55f4db20701906b3e344d9294817f382 + checksum: 10c0/d1a288fd78a01133aca6d6778232f7cf8d8fc423af6eab1604ebd06c547ef403e2d51879a47e19dd37ac72e3cbee0f532362b2ec1528f03580ce01687d047c69 languageName: node linkType: hard -"@smithy/middleware-stack@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/middleware-stack@npm:4.0.5" +"@smithy/querystring-parser@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/querystring-parser@npm:4.2.2" dependencies: - "@smithy/types": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/2ebe346b8b868d11bf9e5028a225ad1312f7862231ae01c289059291b984127a7c18e17f1fa4d803de09f77441d839bc5e25f8ec9bed10a9a320d0393bc55930 + checksum: 10c0/af0f051265aabdefd0e8ad40b39962513ca4d6a6560f30b8129b1ddbcf5965fdc8567024062e146dc234dc952376d3a92cba7ee0660685aa7e6fc9ff851f974d languageName: node linkType: hard -"@smithy/node-config-provider@npm:^4.1.3": - version: 4.1.3 - resolution: "@smithy/node-config-provider@npm:4.1.3" +"@smithy/service-error-classification@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/service-error-classification@npm:4.2.2" dependencies: - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/shared-ini-file-loader": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@smithy/types": "npm:^4.7.1" + checksum: 10c0/10e1d9bbe7bb02e0cf20ed83964586dc97016a103d5fd656eb0a31f8d9a6df7049eef26d6b864da0ae2ecb175ddccb5e0bdf091e58282b8bda27f01ac69c08aa + languageName: node + linkType: hard + +"@smithy/shared-ini-file-loader@npm:^4.3.2": + version: 4.3.2 + resolution: "@smithy/shared-ini-file-loader@npm:4.3.2" + dependencies: + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/bea20b3f92290fbefa32d30c4ac7632f94d4e89b5432dfe5a2d0c6261bfd90e882d62dd02e0a4e65f3bc89f815b19e44d7bb103a78b6c77941cc186450ad79f1 + checksum: 10c0/3b96d782bf6ea47107799f8befc4be1182ef7db0e98168f1e253c0404e1a53c5b587ccdb09a14c601f105494aa2bf2229822242e37de7fd55263481097f75543 languageName: node linkType: hard -"@smithy/node-config-provider@npm:^4.1.4": - version: 4.1.4 - resolution: "@smithy/node-config-provider@npm:4.1.4" +"@smithy/signature-v4@npm:^5.3.2": + version: 5.3.2 + resolution: "@smithy/signature-v4@npm:5.3.2" dependencies: - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/shared-ini-file-loader": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" + "@smithy/is-array-buffer": "npm:^4.2.0" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-hex-encoding": "npm:^4.2.0" + "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-uri-escape": "npm:^4.2.0" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/950f9e234b8ffb680d2f5b35bc7ff21f73623caf0612d59daba1991da79126ec33e1afd2f6408534b7910474665ab150bd9d341aa46950bf5903665e71c7da6f + checksum: 10c0/a27ef848a6318904186a49eccf9452bf1541f7d4df70332717bb9935081effb30fdc5bc250f652277cfe2a5f983c1b0b06e981d8d6bae5dce534fb1bc4d5998f languageName: node linkType: hard -"@smithy/node-http-handler@npm:^4.0.6": - version: 4.0.6 - resolution: "@smithy/node-http-handler@npm:4.0.6" +"@smithy/smithy-client@npm:^4.8.1": + version: 4.8.1 + resolution: "@smithy/smithy-client@npm:4.8.1" dependencies: - "@smithy/abort-controller": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/querystring-builder": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@smithy/core": "npm:^3.16.1" + "@smithy/middleware-endpoint": "npm:^4.3.3" + "@smithy/middleware-stack": "npm:^4.2.2" + "@smithy/protocol-http": "npm:^5.3.2" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-stream": "npm:^4.5.2" tslib: "npm:^2.6.2" - checksum: 10c0/bde23701b6166b76958cbc194d551a139e3dcc1d05a6c7de3d5b14f54934ca5a49a28d13d8ec4b012716aae816cd0c8c4735c959d5ef697a7a1932fbcfc5d7f2 - languageName: node - linkType: hard - -"@smithy/node-http-handler@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/node-http-handler@npm:4.1.0" - dependencies: - "@smithy/abort-controller": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/querystring-builder": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/6212b86b62dc44d0d8eb3949428b2ddbb5d064e722979fc5384ec52367b8246b19619732822514e0be9d6455b8c2c41d29f46a74bf43548cc2713ea7552c07a8 - languageName: node - linkType: hard - -"@smithy/node-http-handler@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/node-http-handler@npm:4.1.1" - dependencies: - "@smithy/abort-controller": "npm:^4.0.5" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/querystring-builder": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/a61a841bc6e69c62a983031e8b3faf1ab82abaf0ccd1eb5d3e02e3d99a8be020fa8dff0b2b1f81468db43e0e7be2407785b89e9c6c04035b8b4afde08bed3a98 - languageName: node - linkType: hard - -"@smithy/property-provider@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/property-provider@npm:4.0.4" - dependencies: - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/c370efbb43ab01fb6050fbf4c231bbe2fb7d660256adeee40c0c4c14b7af1b9b75c36f6924aeacdd2885fad1aaf0655047cafe5f0d22f5e371cbd25ff2f04b27 - languageName: node - linkType: hard - -"@smithy/property-provider@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/property-provider@npm:4.0.5" - dependencies: - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/67b828f4ddfb90a90e8a919328bb3c842612115d84d949087988fd8558cd143ec8f7dc437936ef41f9427a7ea2a6ec6a726c5f92a9c12e8c7bef831c4b4f16f0 - languageName: node - linkType: hard - -"@smithy/protocol-http@npm:^5.1.2": - version: 5.1.2 - resolution: "@smithy/protocol-http@npm:5.1.2" - dependencies: - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/50fb026efa321e65a77f9747312eeb428ff2196095c15ed5937efe807a4734c47746759ccf2dbc84a45719effcbc81221662289be6d4d5ec122afb0e3cd66fd9 - languageName: node - linkType: hard - -"@smithy/protocol-http@npm:^5.1.3": - version: 5.1.3 - resolution: "@smithy/protocol-http@npm:5.1.3" - dependencies: - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/5adc1e69b9e2d7c90acfe1a9b731c4f233173e035eb9e8e3dd5fabf63d9a765aff54912a0e94f4f4bff494f4caa9ec40bd53cdc1a94028f561ab5c9649f2790f - languageName: node - linkType: hard - -"@smithy/querystring-builder@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/querystring-builder@npm:4.0.4" - dependencies: - "@smithy/types": "npm:^4.3.1" - "@smithy/util-uri-escape": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/30ec0301fbc2212101391841000a3117ab6c3ae2b6b2a1db230cc1dfcf97738f527b23f859f0a5e843f2a983793b58cdcd21a0ce11ef93fcdf5d8a1ee0d70fbc - languageName: node - linkType: hard - -"@smithy/querystring-builder@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/querystring-builder@npm:4.0.5" - dependencies: - "@smithy/types": "npm:^4.3.2" - "@smithy/util-uri-escape": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/649a046a14f25d5febba341dedd577c9fce80aa86970dc2af0b0289a2b6326731c19ddefcae172a0162a4a73306ad823533528751a0067c910efce3cabe06675 - languageName: node - linkType: hard - -"@smithy/querystring-parser@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/querystring-parser@npm:4.0.4" - dependencies: - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/36bc93732a1628be5dd53748f6f36237bad26de2da810195213541dd35b20eee0b0264160a0de734b9333ca747e0229253d6729d1a8ddc26d176c0b1cce309e0 - languageName: node - linkType: hard - -"@smithy/querystring-parser@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/querystring-parser@npm:4.0.5" - dependencies: - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/e12a2e19137bc95487c51652dd20f6cd0199854986019e5461f14f797fda3cda3ec4786ff45af853aa64ab75a2a91d18f3f8320276f7e407016f80e33604564d - languageName: node - linkType: hard - -"@smithy/service-error-classification@npm:^4.0.6": - version: 4.0.6 - resolution: "@smithy/service-error-classification@npm:4.0.6" - dependencies: - "@smithy/types": "npm:^4.3.1" - checksum: 10c0/b67f5ef633fa803f6b9f81f53dcc361253f33e01ffefbcb1beaf29c578834b1381e5f979e25b38985d351142e1ab4ee638cf132a2ba9f6f7a0a806a35da76d86 - languageName: node - linkType: hard - -"@smithy/service-error-classification@npm:^4.0.7": - version: 4.0.7 - resolution: "@smithy/service-error-classification@npm:4.0.7" - dependencies: - "@smithy/types": "npm:^4.3.2" - checksum: 10c0/fe44ce36c8759c74a63adc52c47b638ee0a34ea32752d9c5923c370f0497a412ced51d8b83e444303d8d9d544d30d3d16fecb39c9f5cda8622b293704ce999a2 - languageName: node - linkType: hard - -"@smithy/shared-ini-file-loader@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/shared-ini-file-loader@npm:4.0.4" - dependencies: - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/a3ecabadda13ff6fca99585e7e0086a04c4d2350b8c783b3a23493c2ae0a599f397d3cb80a7e171b7123889340995cada866d320726fa6a03f3063d60d5d0207 - languageName: node - linkType: hard - -"@smithy/shared-ini-file-loader@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/shared-ini-file-loader@npm:4.0.5" - dependencies: - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/9fafb7d4cf10398cf07a2ad7b619b05f136a2a774b1d104eb43b1862f1297d1f88f7e6d72198df43bef35cdf5938b8b5bcf0e896a8bb406474920d0f653a0a4b - languageName: node - linkType: hard - -"@smithy/signature-v4@npm:^5.1.2": - version: 5.1.2 - resolution: "@smithy/signature-v4@npm:5.1.2" - dependencies: - "@smithy/is-array-buffer": "npm:^4.0.0" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-hex-encoding": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.4" - "@smithy/util-uri-escape": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/83d3870668a6c080c1d0cbecf2e7d1a86c0298cc3a3df9fba21bd942e2a9bcae81eb50960c66bba00c6f9820ef9e5ab3e5ddba67b2d7914a09a82c7887621c0c - languageName: node - linkType: hard - -"@smithy/signature-v4@npm:^5.1.3": - version: 5.1.3 - resolution: "@smithy/signature-v4@npm:5.1.3" - dependencies: - "@smithy/is-array-buffer": "npm:^4.0.0" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-hex-encoding": "npm:^4.0.0" - "@smithy/util-middleware": "npm:^4.0.5" - "@smithy/util-uri-escape": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/122a918ee070215e5cea8040605d905143a724b5bb0e5c904085f7a7a4b3d87701e5674b39cc8c9e13639b077994739edcdf33c3884172f363bcf68071c2abc7 - languageName: node - linkType: hard - -"@smithy/smithy-client@npm:^4.4.10": - version: 4.4.10 - resolution: "@smithy/smithy-client@npm:4.4.10" - dependencies: - "@smithy/core": "npm:^3.8.0" - "@smithy/middleware-endpoint": "npm:^4.1.18" - "@smithy/middleware-stack": "npm:^4.0.5" - "@smithy/protocol-http": "npm:^5.1.3" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-stream": "npm:^4.2.4" - tslib: "npm:^2.6.2" - checksum: 10c0/994743c7a04e3e1b5136c3be98c3882ab9169d39143530c11553062934887b6b9b7d32de035a15f7ff0f7e6b5db6106ab3e71dc62beb473da9313ff6b8b24a37 - languageName: node - linkType: hard - -"@smithy/smithy-client@npm:^4.4.5": - version: 4.4.5 - resolution: "@smithy/smithy-client@npm:4.4.5" - dependencies: - "@smithy/core": "npm:^3.6.0" - "@smithy/middleware-endpoint": "npm:^4.1.13" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-stream": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/180115cf186a0984db9110b3763db2f84451b65c353ae8e908cc6b6941ad4ad13de690192e7ee50281c83694ab09a7f282bcf4c81a2d839497f515c951d86b38 - languageName: node - linkType: hard - -"@smithy/smithy-client@npm:^4.4.7, @smithy/smithy-client@npm:^4.4.8": - version: 4.4.8 - resolution: "@smithy/smithy-client@npm:4.4.8" - dependencies: - "@smithy/core": "npm:^3.7.1" - "@smithy/middleware-endpoint": "npm:^4.1.16" - "@smithy/middleware-stack": "npm:^4.0.4" - "@smithy/protocol-http": "npm:^5.1.2" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-stream": "npm:^4.2.3" - tslib: "npm:^2.6.2" - checksum: 10c0/2e7a0138dcf8afed63e998254f75d90fdb8da34f96cd09f84c7736eb5118f2b539b1ccb1dce697fdd7df7653d9c34b663731b22bfd1e0cb5dbdd8f797a01dfd9 + checksum: 10c0/3c01450c7d3b43e56781333450e50a8f30afb530acf0a8e8e37b03cf9e534082427e48b9bd4fb31a94791fc9177e12b37fda63eafb0e3ee79c3e7272281add1f languageName: node linkType: hard @@ -10693,54 +9691,52 @@ __metadata: languageName: node linkType: hard -"@smithy/url-parser@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/url-parser@npm:4.0.4" +"@smithy/types@npm:^4.7.1": + version: 4.7.1 + resolution: "@smithy/types@npm:4.7.1" dependencies: - "@smithy/querystring-parser": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" tslib: "npm:^2.6.2" - checksum: 10c0/5f4649d9ff618c683e339fa826b1d722419bf8e20d72726fc5fe3cd479ec8c161d4b09b6e24e49b0143a6fb4f9a950d35410db1834e143c28e377b9c529a3657 + checksum: 10c0/5e5703d99bf814d78b636a7652229c644759424523b1877d16a61007de250ced27bb119ab37bb0fb31d973ba590717dac03ff1827d2a45a075b0bb037066c90b languageName: node linkType: hard -"@smithy/url-parser@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/url-parser@npm:4.0.5" +"@smithy/url-parser@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/url-parser@npm:4.2.2" dependencies: - "@smithy/querystring-parser": "npm:^4.0.5" - "@smithy/types": "npm:^4.3.2" + "@smithy/querystring-parser": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/19cb3c8a80a7a42936d47011e5991cee6d548f233cde2bf36ccb6c547d075bbc30e3be67e92f60aaf17c4f3875766be319a3da8399af40767a77b04aea3d9ee5 + checksum: 10c0/da5bfb3ad9670437cd917c9be7a9f7563a7d59a67d0dd639b306e439cdf1fed651e4d1f8e3ee9f66fafb938668419284e2c3d29fee29b3e8b708c826ddecac2d languageName: node linkType: hard -"@smithy/util-base64@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-base64@npm:4.0.0" +"@smithy/util-base64@npm:^4.3.0": + version: 4.3.0 + resolution: "@smithy/util-base64@npm:4.3.0" dependencies: - "@smithy/util-buffer-from": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" + "@smithy/util-buffer-from": "npm:^4.2.0" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/ad18ec66cc357c189eef358d96876b114faf7086b13e47e009b265d0ff80cec046052500489c183957b3a036768409acdd1a373e01074cc002ca6983f780cffc + checksum: 10c0/02dd536b9257914cc9a595a865faac64fc96db10468d52d0cba475df78764fc25ba255707ccd061ee197fca189d7859d70af8cf89b0b0c3e27c1c693676eb6e4 languageName: node linkType: hard -"@smithy/util-body-length-browser@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-body-length-browser@npm:4.0.0" +"@smithy/util-body-length-browser@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/util-body-length-browser@npm:4.2.0" dependencies: tslib: "npm:^2.6.2" - checksum: 10c0/574a10934024a86556e9dcde1a9776170284326c3dfcc034afa128cc5a33c1c8179fca9cfb622ef8be5f2004316cc3f427badccceb943e829105536ec26306d9 + checksum: 10c0/15553c249088d59406c6917c19ed19810c7dbcc0967c44e5f3fbb2cc870c004b35f388c082b77f370a2c440a69ec7e8336c7a066af904812a66944dd5cb4c8cc languageName: node linkType: hard -"@smithy/util-body-length-node@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-body-length-node@npm:4.0.0" +"@smithy/util-body-length-node@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-body-length-node@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10c0/e91fd3816767606c5f786166ada26440457fceb60f96653b3d624dcf762a8c650e513c275ff3f647cb081c63c283cc178853a7ed9aa224abc8ece4eeeef7a1dd + checksum: 10c0/3c32306735af5b62f75375e976a531ab45f171dfb0dc23ee035478d2132eaf21f244c31b0f3e861c514ff97d8112055e74c98ed44595ad24bd31434d5fdaf4bf languageName: node linkType: hard @@ -10764,118 +9760,60 @@ __metadata: languageName: node linkType: hard -"@smithy/util-config-provider@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-config-provider@npm:4.0.0" +"@smithy/util-buffer-from@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/util-buffer-from@npm:4.2.0" dependencies: + "@smithy/is-array-buffer": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/cd9498d5f77a73aadd575084bcb22d2bb5945bac4605d605d36f2efe3f165f2b60f4dc88b7a62c2ed082ffa4b2c2f19621d0859f18399edbc2b5988d92e4649f + checksum: 10c0/4842d5607240c11400db30762ef6cb4def8d13e3474c5a901a4e2a1783198f5b163ab6011cf24a7f0acbba9a4d7cc79db1d811dc8aa9da446448e52773223997 languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.0.21": - version: 4.0.21 - resolution: "@smithy/util-defaults-mode-browser@npm:4.0.21" +"@smithy/util-config-provider@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/util-config-provider@npm:4.2.0" dependencies: - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" - bowser: "npm:^2.11.0" tslib: "npm:^2.6.2" - checksum: 10c0/401d5f83aa0c054755e18742a6f35de50268174d93ad05bd95123fe176870153da3bfc2344ebad23a2a159bd0668f2c0c758a94e3d5696dd59990d5e881c4c1b + checksum: 10c0/0699b9980ef94eac8f491c2ac557dc47e01c6ae71dabcb4464cc064f8dbf0855797461dbec8ba1925d45f076e968b0df02f0691c636cd1043e560f67541a1d27 languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.0.23": - version: 4.0.24 - resolution: "@smithy/util-defaults-mode-browser@npm:4.0.24" +"@smithy/util-defaults-mode-browser@npm:^4.3.2": + version: 4.3.2 + resolution: "@smithy/util-defaults-mode-browser@npm:4.3.2" dependencies: - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/smithy-client": "npm:^4.4.8" - "@smithy/types": "npm:^4.3.1" - bowser: "npm:^2.11.0" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/f0738ae262dd79c17cfa060a26cfd84de6b51d7a238f3d48bc960f2e9888e68af719b825243c99ec65828edda52883bd70361cedd7224f290981d71963edbc07 + checksum: 10c0/143041912a4819909c317e7c7a23270e49bdfdc19b36e3e296247ca2ce1e47db1e46523910b21bb5e8b07fb5b57daf653e5226dad0670f7328d44914592147ef languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.0.26": - version: 4.0.26 - resolution: "@smithy/util-defaults-mode-browser@npm:4.0.26" +"@smithy/util-defaults-mode-node@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/util-defaults-mode-node@npm:4.2.3" dependencies: - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - bowser: "npm:^2.11.0" + "@smithy/config-resolver": "npm:^4.3.2" + "@smithy/credential-provider-imds": "npm:^4.2.2" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/property-provider": "npm:^4.2.2" + "@smithy/smithy-client": "npm:^4.8.1" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/ba10af21bd302f4705a808673eb3811e36a78c396f7ee93e2dfea5ded7d78470c789d3bc7a23e3d6232b43b7b91f57fbfbd383d11042e6993dc9c49030cbd0ef + checksum: 10c0/e572c8ce3b73bd8dd12e0987bbe0a4c97e2f42d03d58f61ad2ba9dbd261e491b8367d08f7322b1679407df53c6a4d0988cb1a8766271ff9914cb5232dc25670c languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^4.0.21": - version: 4.0.21 - resolution: "@smithy/util-defaults-mode-node@npm:4.0.21" +"@smithy/util-endpoints@npm:^3.2.2": + version: 3.2.2 + resolution: "@smithy/util-endpoints@npm:3.2.2" dependencies: - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/credential-provider-imds": "npm:^4.0.6" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/smithy-client": "npm:^4.4.5" - "@smithy/types": "npm:^4.3.1" + "@smithy/node-config-provider": "npm:^4.3.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/936399758fdecf68b14f7adfcb6a9dbc50b62edeabc6c146affe5f7dc40ccfc42df0c6af882748a8ccc32a54834bcf1d22fd42ec8589242dcabe5b983b67e40c - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-node@npm:^4.0.23": - version: 4.0.24 - resolution: "@smithy/util-defaults-mode-node@npm:4.0.24" - dependencies: - "@smithy/config-resolver": "npm:^4.1.4" - "@smithy/credential-provider-imds": "npm:^4.0.6" - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/property-provider": "npm:^4.0.4" - "@smithy/smithy-client": "npm:^4.4.8" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/4ca648d7d660bf62c096d2a4b7639e0178898def45aa5e9d0b5ddd4cd6f49478155465145a44c1634e8e3149b7e6f79a19f91f93e584d765118504bac81225c0 - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-node@npm:^4.0.26": - version: 4.0.26 - resolution: "@smithy/util-defaults-mode-node@npm:4.0.26" - dependencies: - "@smithy/config-resolver": "npm:^4.1.5" - "@smithy/credential-provider-imds": "npm:^4.0.7" - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/property-provider": "npm:^4.0.5" - "@smithy/smithy-client": "npm:^4.4.10" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/0a682393db1617681fc132c39d9f01accd5c3c250be457ebb514001d83d34252d404fe6315ee0cc5176e0efc7fdeec64e848299bdefe6113d3c70f81717b665b - languageName: node - linkType: hard - -"@smithy/util-endpoints@npm:^3.0.6": - version: 3.0.6 - resolution: "@smithy/util-endpoints@npm:3.0.6" - dependencies: - "@smithy/node-config-provider": "npm:^4.1.3" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/d7d583c73a0c1ce38188569616cd4d7c95c36c0393516117043962b932f8c743e8cd672d2edd23ea8a9da0e30b84ee0f0ced0709cc8024b70ea8e5f17f505811 - languageName: node - linkType: hard - -"@smithy/util-endpoints@npm:^3.0.7": - version: 3.0.7 - resolution: "@smithy/util-endpoints@npm:3.0.7" - dependencies: - "@smithy/node-config-provider": "npm:^4.1.4" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/7024005a8a4f77ebae52d1dce538d76db3567c6fb22b06ba601dba4d4d8668cb4dbadd229015d02bb6bdb1a5aaa6b2d1c826cfcf412257ceb9dfe52c7ab95fca + checksum: 10c0/1423e1432cb7983324f58fc570ff7e0824f2064f54d599a87c6fbe59fbba7c0a72c1748a74b4e1a4c3b15c308313986591548a14878c1ff08804dde2fe57a5a1 languageName: node linkType: hard @@ -10888,102 +9826,58 @@ __metadata: languageName: node linkType: hard -"@smithy/util-middleware@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/util-middleware@npm:4.0.4" +"@smithy/util-hex-encoding@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/util-hex-encoding@npm:4.2.0" dependencies: - "@smithy/types": "npm:^4.3.1" tslib: "npm:^2.6.2" - checksum: 10c0/39530add63ec13dac555846c30e98128316136f7f57bfd8fe876a8c15a7677cb64d0a33fd1f08b671096d769ab3f025d4d8c785a9d7a7cdf42fd0188236b0f32 + checksum: 10c0/aaa94a69f03d14d3f28125cc915ca421065735e2d05d7305f0958a50021b2fce4fc68a248328e6b5b612dbaa49e471d481ff513bf89554f659f0a49573e97312 languageName: node linkType: hard -"@smithy/util-middleware@npm:^4.0.5": - version: 4.0.5 - resolution: "@smithy/util-middleware@npm:4.0.5" - dependencies: - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/74d9bdbcea4c4aa5304197417c370346b230b7a89893ba0dee0d9771b6ead2628a53fb8a64a3822bf1a30a176ebba2c16ece7003c21880a7ff54be0955356606 - languageName: node - linkType: hard - -"@smithy/util-retry@npm:^4.0.6": - version: 4.0.6 - resolution: "@smithy/util-retry@npm:4.0.6" - dependencies: - "@smithy/service-error-classification": "npm:^4.0.6" - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/b1d3a5875769300bb74d63243868eba8a8f3567a9b22776cfb11700cfdd10bf10b2ed96bffdc9527d9130daf1be2482ea9217e1865a94efed01fe66e688768f4 - languageName: node - linkType: hard - -"@smithy/util-retry@npm:^4.0.7": - version: 4.0.7 - resolution: "@smithy/util-retry@npm:4.0.7" - dependencies: - "@smithy/service-error-classification": "npm:^4.0.7" - "@smithy/types": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/09c633f59ac51203d917548ceb4caf7678e24c87eea024e97e8d62a918be4a76a1c517622b7e9841cf0e9f50778d6787f62efe6c25ae514ed7068e2323303c72 - languageName: node - linkType: hard - -"@smithy/util-stream@npm:^4.2.2": +"@smithy/util-middleware@npm:^4.2.2": version: 4.2.2 - resolution: "@smithy/util-stream@npm:4.2.2" + resolution: "@smithy/util-middleware@npm:4.2.2" dependencies: - "@smithy/fetch-http-handler": "npm:^5.0.4" - "@smithy/node-http-handler": "npm:^4.0.6" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-buffer-from": "npm:^4.0.0" - "@smithy/util-hex-encoding": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/5e4ef783e41185d291a72e8503d02fd5a5f7bd23f3d30198f3d738c0f27dd6d7ea131fe6fbe36a6ac69b8bd4207f7dfc75a15329764e6aa52f62c45bc5442619 + checksum: 10c0/efada57900ece7f000740899a0f38a38844be3968e40379105c1c2a19d88bbda9095e87d50c8837f6d35b4f984ee73617c39db516b3716270b763e3a3b3ed406 languageName: node linkType: hard -"@smithy/util-stream@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/util-stream@npm:4.2.3" +"@smithy/util-retry@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/util-retry@npm:4.2.2" dependencies: - "@smithy/fetch-http-handler": "npm:^5.1.0" - "@smithy/node-http-handler": "npm:^4.1.0" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-buffer-from": "npm:^4.0.0" - "@smithy/util-hex-encoding": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" + "@smithy/service-error-classification": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" tslib: "npm:^2.6.2" - checksum: 10c0/3321f944a36c7a9a8ef17f5c58b29ef06107c9bc682d7932f2ea9e1b6f839174d07d053e81285bad8b29c11848e799795e6c016648a6e3a8636d8acfe24183ef + checksum: 10c0/7df12a5d81a3047fdd3d1a03b391e2132bc94127eccfbe3c3d74409c0e6d6a4f924845d6f5c78708a49ba28213b177d97e2db9fe397d2851f89995b98d47edf7 languageName: node linkType: hard -"@smithy/util-stream@npm:^4.2.4": - version: 4.2.4 - resolution: "@smithy/util-stream@npm:4.2.4" +"@smithy/util-stream@npm:^4.5.2": + version: 4.5.2 + resolution: "@smithy/util-stream@npm:4.5.2" dependencies: - "@smithy/fetch-http-handler": "npm:^5.1.1" - "@smithy/node-http-handler": "npm:^4.1.1" - "@smithy/types": "npm:^4.3.2" - "@smithy/util-base64": "npm:^4.0.0" - "@smithy/util-buffer-from": "npm:^4.0.0" - "@smithy/util-hex-encoding": "npm:^4.0.0" - "@smithy/util-utf8": "npm:^4.0.0" + "@smithy/fetch-http-handler": "npm:^5.3.3" + "@smithy/node-http-handler": "npm:^4.4.1" + "@smithy/types": "npm:^4.7.1" + "@smithy/util-base64": "npm:^4.3.0" + "@smithy/util-buffer-from": "npm:^4.2.0" + "@smithy/util-hex-encoding": "npm:^4.2.0" + "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/45d2945656a68822272eb5e37e447bd161861722d841712d087cc0aaf93ad0da8162eef2164d1a35f55a7124cb8815b357b766c21442b23ea972b1d5345f0526 + checksum: 10c0/aade6b07adfb6cc9e85fbdd3ce70959e95550d849d7f89d87c61148d1189258ee9f2a589c4c7cbd264776db945bef5b6dee76277439c0a9e4ecf9651b07fe383 languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-uri-escape@npm:4.0.0" +"@smithy/util-uri-escape@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/util-uri-escape@npm:4.2.0" dependencies: tslib: "npm:^2.6.2" - checksum: 10c0/23984624060756adba8aa4ab1693fe6b387ee5064d8ec4dfd39bb5908c4ee8b9c3f2dc755da9b07505d8e3ce1338c1867abfa74158931e4728bf3cfcf2c05c3d + checksum: 10c0/1933e8d939dc52e1ee5e7d2397f4c208a9eac0283397a19ee72078d04db997ebe3ad39709b56aac586ffce10d1cf5ab17dfc068ea6ab030098fc06fe3532e085 languageName: node linkType: hard @@ -11007,14 +9901,33 @@ __metadata: languageName: node linkType: hard -"@smithy/util-waiter@npm:^4.0.6": - version: 4.0.6 - resolution: "@smithy/util-waiter@npm:4.0.6" +"@smithy/util-utf8@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/util-utf8@npm:4.2.0" dependencies: - "@smithy/abort-controller": "npm:^4.0.4" - "@smithy/types": "npm:^4.3.1" + "@smithy/util-buffer-from": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10c0/4027aed03515dfb627c09e0d490f001b912def1142865d0ec8de1fc0422e7c71e96df3efc7b92c7fdfff9030105b2b4213120506d064ad346cc79124708c1b17 + checksum: 10c0/689a1f2295d52bec0dde7215a075d79ef32ad8b146cb610a529b2cab747d96978401fd31469c225e31f3042830c54403e64d39b28033df013c8de27a84b405a2 + languageName: node + linkType: hard + +"@smithy/util-waiter@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/util-waiter@npm:4.2.2" + dependencies: + "@smithy/abort-controller": "npm:^4.2.2" + "@smithy/types": "npm:^4.7.1" + tslib: "npm:^2.6.2" + checksum: 10c0/285efdb47f3e0f70aea7c9261df5fcfbe498515d52f3a63c94402183ab3b05eb9c972dd0a0d6dba6736890d5cc7cf8abe382abd833b3fe58fcdc978b32f3aeb1 + languageName: node + linkType: hard + +"@smithy/uuid@npm:^1.1.0": + version: 1.1.0 + resolution: "@smithy/uuid@npm:1.1.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/f8a8bfcc0e241457636884e778e261d45d8a3aaad533775111170cac36ac666275b59ec6d86d3d5b8d470ff4b864202d2a1a188b3c0e0ed0c86a0b693acf1ecf languageName: node linkType: hard @@ -12854,13 +11767,6 @@ __metadata: languageName: node linkType: hard -"@types/uuid@npm:^9.0.1": - version: 9.0.8 - resolution: "@types/uuid@npm:9.0.8" - checksum: 10c0/b411b93054cb1d4361919579ef3508a1f12bf15b5fdd97337d3d351bece6c921b52b6daeef89b62340fd73fd60da407878432a1af777f40648cbe53a01723489 - languageName: node - linkType: hard - "@types/verror@npm:^1.10.3": version: 1.10.11 resolution: "@types/verror@npm:1.10.11" @@ -13857,9 +12763,9 @@ __metadata: "@anthropic-ai/claude-agent-sdk": "patch:@anthropic-ai/claude-agent-sdk@npm%3A0.1.25#~/.yarn/patches/@anthropic-ai-claude-agent-sdk-npm-0.1.25-08bbabb5d3.patch" "@anthropic-ai/sdk": "npm:^0.41.0" "@anthropic-ai/vertex-sdk": "patch:@anthropic-ai/vertex-sdk@npm%3A0.11.4#~/.yarn/patches/@anthropic-ai-vertex-sdk-npm-0.11.4-c19cb41edb.patch" - "@aws-sdk/client-bedrock": "npm:^3.840.0" - "@aws-sdk/client-bedrock-runtime": "npm:^3.840.0" - "@aws-sdk/client-s3": "npm:^3.840.0" + "@aws-sdk/client-bedrock": "npm:^3.910.0" + "@aws-sdk/client-bedrock-runtime": "npm:^3.910.0" + "@aws-sdk/client-s3": "npm:^3.910.0" "@biomejs/biome": "npm:2.2.4" "@cherrystudio/ai-core": "workspace:^1.0.0-alpha.18" "@cherrystudio/embedjs": "npm:^0.1.31" @@ -18738,17 +17644,6 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:4.4.1": - version: 4.4.1 - resolution: "fast-xml-parser@npm:4.4.1" - dependencies: - strnum: "npm:^1.0.5" - bin: - fxparser: src/cli/cli.js - checksum: 10c0/7f334841fe41bfb0bf5d920904ccad09cefc4b5e61eaf4c225bf1e1bb69ee77ef2147d8942f783ee8249e154d1ca8a858e10bda78a5d78b8bed3f48dcee9bf33 - languageName: node - linkType: hard - "fast-xml-parser@npm:5.2.5": version: 5.2.5 resolution: "fast-xml-parser@npm:5.2.5" @@ -27907,7 +26802,7 @@ __metadata: languageName: node linkType: hard -"strnum@npm:^1.0.5, strnum@npm:^1.1.1": +"strnum@npm:^1.1.1": version: 1.1.2 resolution: "strnum@npm:1.1.2" checksum: 10c0/a0fce2498fa3c64ce64a40dada41beb91cabe3caefa910e467dc0518ef2ebd7e4d10f8c2202a6104f1410254cae245066c0e94e2521fb4061a5cb41831952392 From 346af4d338fbd3719a3d0af9f2c3380273fb3e47 Mon Sep 17 00:00:00 2001 From: beyondkmp Date: Tue, 4 Nov 2025 12:59:14 +0800 Subject: [PATCH 39/83] fix: add CherryAI provider support and update API host formatting (#11135) * fix: add CherryAI provider support and update API host formatting * format code * add ut * format code --- .../provider/__tests__/providerConfig.test.ts | 116 +++++++++++++++++- .../src/aiCore/provider/providerConfig.ts | 3 + src/renderer/src/config/providers.ts | 4 + 3 files changed, 119 insertions(+), 4 deletions(-) diff --git a/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts b/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts index eb6e73c8ae..cc5f20c63e 100644 --- a/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts +++ b/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts @@ -21,10 +21,44 @@ vi.mock('@renderer/store', () => ({ } })) +vi.mock('@renderer/utils/api', () => ({ + formatApiHost: vi.fn((host, isSupportedAPIVersion = true) => { + if (isSupportedAPIVersion === false) { + return host // Return host as-is when isSupportedAPIVersion is false + } + return `${host}/v1` // Default behavior when isSupportedAPIVersion is true + }), + routeToEndpoint: vi.fn((host) => ({ + baseURL: host, + endpoint: '/chat/completions' + })) +})) + +vi.mock('@renderer/config/providers', async (importOriginal) => { + const actual = (await importOriginal()) as any + return { + ...actual, + isCherryAIProvider: vi.fn(), + isAnthropicProvider: vi.fn(() => false), + isAzureOpenAIProvider: vi.fn(() => false), + isGeminiProvider: vi.fn(() => false), + isNewApiProvider: vi.fn(() => false) + } +}) + +vi.mock('@renderer/hooks/useVertexAI', () => ({ + isVertexProvider: vi.fn(() => false), + isVertexAIConfigured: vi.fn(() => false), + createVertexProvider: vi.fn() +})) + +import { isCherryAIProvider } from '@renderer/config/providers' +import { getProviderByModel } from '@renderer/services/AssistantService' import type { Model, Provider } from '@renderer/types' +import { formatApiHost } from '@renderer/utils/api' import { COPILOT_DEFAULT_HEADERS, COPILOT_EDITOR_VERSION, isCopilotResponsesModel } from '../constants' -import { providerToAiSdkConfig } from '../providerConfig' +import { getActualProvider, providerToAiSdkConfig } from '../providerConfig' const createWindowKeyv = () => { const store = new Map() @@ -46,11 +80,21 @@ const createCopilotProvider = (): Provider => ({ isSystem: true }) -const createModel = (id: string, name = id): Model => ({ +const createModel = (id: string, name = id, provider = 'copilot'): Model => ({ id, name, - provider: 'copilot', - group: 'copilot' + provider, + group: provider +}) + +const createCherryAIProvider = (): Provider => ({ + id: 'cherryai', + type: 'openai', + name: 'CherryAI', + apiKey: 'test-key', + apiHost: 'https://api.cherryai.com', + models: [], + isSystem: false }) describe('Copilot responses routing', () => { @@ -87,3 +131,67 @@ describe('Copilot responses routing', () => { expect(config.options.headers?.['Copilot-Integration-Id']).toBe(COPILOT_DEFAULT_HEADERS['Copilot-Integration-Id']) }) }) + +describe('CherryAI provider configuration', () => { + beforeEach(() => { + ;(globalThis as any).window = { + ...(globalThis as any).window, + keyv: createWindowKeyv() + } + vi.clearAllMocks() + }) + + it('formats CherryAI provider apiHost with false parameter', () => { + const provider = createCherryAIProvider() + const model = createModel('gpt-4', 'GPT-4', 'cherryai') + + // Mock the functions to simulate CherryAI provider detection + vi.mocked(isCherryAIProvider).mockReturnValue(true) + vi.mocked(getProviderByModel).mockReturnValue(provider) + + // Call getActualProvider which should trigger formatProviderApiHost + const actualProvider = getActualProvider(model) + + // Verify that formatApiHost was called with false as the second parameter + expect(formatApiHost).toHaveBeenCalledWith('https://api.cherryai.com', false) + expect(actualProvider.apiHost).toBe('https://api.cherryai.com') + }) + + it('does not format non-CherryAI provider with false parameter', () => { + const provider = { + id: 'openai', + type: 'openai', + name: 'OpenAI', + apiKey: 'test-key', + apiHost: 'https://api.openai.com', + models: [], + isSystem: false + } as Provider + const model = createModel('gpt-4', 'GPT-4', 'openai') + + // Mock the functions to simulate non-CherryAI provider + vi.mocked(isCherryAIProvider).mockReturnValue(false) + vi.mocked(getProviderByModel).mockReturnValue(provider) + + // Call getActualProvider + const actualProvider = getActualProvider(model) + + // Verify that formatApiHost was called with default parameters (true) + expect(formatApiHost).toHaveBeenCalledWith('https://api.openai.com') + expect(actualProvider.apiHost).toBe('https://api.openai.com/v1') + }) + + it('handles CherryAI provider with empty apiHost', () => { + const provider = createCherryAIProvider() + provider.apiHost = '' + const model = createModel('gpt-4', 'GPT-4', 'cherryai') + + vi.mocked(isCherryAIProvider).mockReturnValue(true) + vi.mocked(getProviderByModel).mockReturnValue(provider) + + const actualProvider = getActualProvider(model) + + expect(formatApiHost).toHaveBeenCalledWith('', false) + expect(actualProvider.apiHost).toBe('') + }) +}) diff --git a/src/renderer/src/aiCore/provider/providerConfig.ts b/src/renderer/src/aiCore/provider/providerConfig.ts index c8447671d1..4669d4c851 100644 --- a/src/renderer/src/aiCore/provider/providerConfig.ts +++ b/src/renderer/src/aiCore/provider/providerConfig.ts @@ -9,6 +9,7 @@ import { isOpenAIChatCompletionOnlyModel } from '@renderer/config/models' import { isAnthropicProvider, isAzureOpenAIProvider, + isCherryAIProvider, isGeminiProvider, isNewApiProvider } from '@renderer/config/providers' @@ -100,6 +101,8 @@ function formatProviderApiHost(provider: Provider): Provider { formatted.apiHost = formatAzureOpenAIApiHost(formatted.apiHost) } else if (isVertexProvider(formatted)) { formatted.apiHost = formatVertexApiHost(formatted) + } else if (isCherryAIProvider(formatted)) { + formatted.apiHost = formatApiHost(formatted.apiHost, false) } else { formatted.apiHost = formatApiHost(formatted.apiHost) } diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 2b9fe2b21f..5fbae73dbf 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -1486,6 +1486,10 @@ export const isNewApiProvider = (provider: Provider) => { return ['new-api', 'cherryin'].includes(provider.id) || provider.type === 'new-api' } +export function isCherryAIProvider(provider: Provider): boolean { + return provider.id === 'cherryai' +} + /** * 判断是否为 OpenAI 兼容的提供商 * @param {Provider} provider 提供商对象 From 7dce1d776bace312d5280589ccb1e2700857251a Mon Sep 17 00:00:00 2001 From: fullex <106392080+0xfullex@users.noreply.github.com> Date: Tue, 4 Nov 2025 14:13:07 +0800 Subject: [PATCH 40/83] feat: app's version history log (#11097) * feat: integrate version tracking in app initialization - Added versionService to record the current version during app startup. - This change prepares for upcoming data refactoring in version 2. * fix: lint from other PRs & format * feat: enhance version tracking with meaningful change detection - Updated VersionService to check for changes in version, OS, environment, packaged status, and install mode before recording a new entry. - Improved logging to reflect whether version information has changed or remained the same. --- src/main/index.ts | 5 + src/main/services/VersionService.ts | 285 ++++++++++++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 src/main/services/VersionService.ts diff --git a/src/main/index.ts b/src/main/index.ts index d9554e1652..bcec606f4b 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -30,6 +30,7 @@ import { import selectionService, { initSelectionService } from './services/SelectionService' import { registerShortcuts } from './services/ShortcutService' import { TrayService } from './services/TrayService' +import { versionService } from './services/VersionService' import { windowService } from './services/WindowService' import { initWebviewHotkeys } from './services/WebviewService' @@ -110,6 +111,10 @@ if (!app.requestSingleInstanceLock()) { // Some APIs can only be used after this event occurs. app.whenReady().then(async () => { + // Record current version for tracking + // A preparation for v2 data refactoring + versionService.recordCurrentVersion() + initWebviewHotkeys() // Set app user model id for windows electronApp.setAppUserModelId(import.meta.env.VITE_MAIN_BUNDLE_ID || 'com.kangfenmao.CherryStudio') diff --git a/src/main/services/VersionService.ts b/src/main/services/VersionService.ts new file mode 100644 index 0000000000..a853b99074 --- /dev/null +++ b/src/main/services/VersionService.ts @@ -0,0 +1,285 @@ +import { loggerService } from '@logger' +import { app } from 'electron' +import fs from 'fs' +import path from 'path' + +const logger = loggerService.withContext('VersionService') + +type OS = 'win' | 'mac' | 'linux' | 'unknown' +type Environment = 'prod' | 'dev' +type Packaged = 'packaged' | 'unpackaged' +type Mode = 'install' | 'portable' + +/** + * Version record stored in version.log + */ +interface VersionRecord { + version: string + os: OS + environment: Environment + packaged: Packaged + mode: Mode + timestamp: string +} + +/** + * Service for tracking application version history + * Stores version information in userData/version.log for data migration and diagnostics + */ +class VersionService { + private readonly VERSION_LOG_FILE = 'version.log' + private versionLogPath: string | null = null + + constructor() { + // Lazy initialization of path since app.getPath may not be available during construction + } + + /** + * Gets the full path to version.log file + * @returns {string} Full path to version log file + */ + private getVersionLogPath(): string { + if (!this.versionLogPath) { + this.versionLogPath = path.join(app.getPath('userData'), this.VERSION_LOG_FILE) + } + return this.versionLogPath + } + + /** + * Gets current operating system identifier + * @returns {OS} OS identifier + */ + private getCurrentOS(): OS { + switch (process.platform) { + case 'win32': + return 'win' + case 'darwin': + return 'mac' + case 'linux': + return 'linux' + default: + return 'unknown' + } + } + + /** + * Gets current environment (production or development) + * @returns {Environment} Environment identifier + */ + private getCurrentEnvironment(): Environment { + return import.meta.env.MODE === 'production' ? 'prod' : 'dev' + } + + /** + * Gets packaging status + * @returns {Packaged} Packaging status + */ + private getPackagedStatus(): Packaged { + return app.isPackaged ? 'packaged' : 'unpackaged' + } + + /** + * Gets installation mode (install or portable) + * @returns {Mode} Installation mode + */ + private getInstallMode(): Mode { + return process.env.PORTABLE_EXECUTABLE_DIR !== undefined ? 'portable' : 'install' + } + + /** + * Generates version log line for current application state + * @returns {string} Pipe-separated version record line + */ + private generateCurrentVersionLine(): string { + const version = app.getVersion() + const os = this.getCurrentOS() + const environment = this.getCurrentEnvironment() + const packaged = this.getPackagedStatus() + const mode = this.getInstallMode() + const timestamp = new Date().toISOString() + + return `${version}|${os}|${environment}|${packaged}|${mode}|${timestamp}` + } + + /** + * Parses a version log line into a VersionRecord object + * @param {string} line - Pipe-separated version record line + * @returns {VersionRecord | null} Parsed version record or null if invalid + */ + private parseVersionLine(line: string): VersionRecord | null { + try { + const parts = line.trim().split('|') + if (parts.length !== 6) { + return null + } + + const [version, os, environment, packaged, mode, timestamp] = parts + + // Validate data + if ( + !version || + !['win', 'mac', 'linux', 'unknown'].includes(os) || + !['prod', 'dev'].includes(environment) || + !['packaged', 'unpackaged'].includes(packaged) || + !['install', 'portable'].includes(mode) || + !timestamp + ) { + return null + } + + return { + version, + os: os as OS, + environment: environment as Environment, + packaged: packaged as Packaged, + mode: mode as Mode, + timestamp + } + } catch (error) { + logger.warn(`Failed to parse version line: ${line}`, error as Error) + return null + } + } + + /** + * Reads the last 1KB from version.log and returns all lines + * Uses reverse reading from file end to avoid reading the entire file + * @returns {string[]} Array of version lines from the last 1KB + */ + private readLastVersionLines(): string[] { + const logPath = this.getVersionLogPath() + + try { + if (!fs.existsSync(logPath)) { + return [] + } + + const stats = fs.statSync(logPath) + const fileSize = stats.size + + if (fileSize === 0) { + return [] + } + + // Read from the end of the file, 1KB is enough to find previous version + // Typical line: "1.7.0-beta.3|win|prod|packaged|install|2025-01-15T08:30:00.000Z\n" (~70 bytes) + // 1KB can store ~14 lines, which is more than enough + const bufferSize = Math.min(1024, fileSize) + const buffer = Buffer.alloc(bufferSize) + + const fd = fs.openSync(logPath, 'r') + try { + const startPosition = Math.max(0, fileSize - bufferSize) + fs.readSync(fd, buffer, 0, bufferSize, startPosition) + + const content = buffer.toString('utf-8') + const lines = content + .trim() + .split('\n') + .filter((line) => line.trim()) + + return lines + } finally { + fs.closeSync(fd) + } + } catch (error) { + logger.error('Failed to read version log:', error as Error) + return [] + } + } + + /** + * Appends a version record line to version.log + * @param {string} line - Version record line to append + */ + private appendVersionLine(line: string): void { + const logPath = this.getVersionLogPath() + + try { + fs.appendFileSync(logPath, line + '\n', 'utf-8') + logger.debug(`Version recorded: ${line}`) + } catch (error) { + logger.error('Failed to append version log:', error as Error) + } + } + + /** + * Records the current version on application startup + * Only adds a new record if the version has changed since the last run + */ + recordCurrentVersion(): void { + try { + const currentLine = this.generateCurrentVersionLine() + const lines = this.readLastVersionLines() + + // Add new record if this is the first run or version has changed + if (lines.length === 0) { + logger.info('First run detected, creating version log') + this.appendVersionLine(currentLine) + return + } + + const lastLine = lines[lines.length - 1] + const lastRecord = this.parseVersionLine(lastLine) + const currentVersion = app.getVersion() + + // Check if any meaningful field has changed (version, os, environment, packaged, mode) + const currentOS = this.getCurrentOS() + const currentEnvironment = this.getCurrentEnvironment() + const currentPackaged = this.getPackagedStatus() + const currentMode = this.getInstallMode() + + const hasMeaningfulChange = + !lastRecord || + lastRecord.version !== currentVersion || + lastRecord.os !== currentOS || + lastRecord.environment !== currentEnvironment || + lastRecord.packaged !== currentPackaged || + lastRecord.mode !== currentMode + + if (hasMeaningfulChange) { + logger.info(`Version information changed, recording new entry`) + this.appendVersionLine(currentLine) + } else { + logger.debug(`Version information not changed, skip recording`) + } + } catch (error) { + logger.error('Failed to record current version:', error as Error) + } + } + + /** + * Gets the previous version record (last record with different version than current) + * Reads from the last 1KB of version.log to find the most recent different version + * Useful for detecting version upgrades and running migrations + * @returns {VersionRecord | null} Previous version record or null if not available + */ + getPreviousVersion(): VersionRecord | null { + try { + const lines = this.readLastVersionLines() + if (lines.length === 0) { + return null + } + + const currentVersion = app.getVersion() + + // Read from the end backwards to find the first different version + for (let i = lines.length - 1; i >= 0; i--) { + const record = this.parseVersionLine(lines[i]) + if (record && record.version !== currentVersion) { + return record + } + } + + return null + } catch (error) { + logger.error('Failed to get previous version:', error as Error) + return null + } + } +} + +/** + * Singleton instance of VersionService + */ +export const versionService = new VersionService() From 5fea202a7d5cb33e9e1b8da41fb48003afafb737 Mon Sep 17 00:00:00 2001 From: beyondkmp Date: Tue, 4 Nov 2025 18:56:09 +0800 Subject: [PATCH 41/83] fix: add PowerMonitorService for system shutdown handling (#11115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add PowerMonitorService for system shutdown handling - Add PowerMonitorService to monitor system shutdown events - Use @paymoapp/electron-shutdown-handler for Windows platform - Use Electron's powerMonitor for macOS and Linux platforms - Support registering multiple shutdown handlers via dependency injection - Register shutdown handlers in ipc.ts to disable auto-update and save data 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * format code --------- Co-authored-by: Claude --- package.json | 1 + src/main/index.ts | 2 + src/main/ipc.ts | 13 +++ src/main/services/PowerMonitorService.ts | 112 +++++++++++++++++++++++ yarn.lock | 68 ++++++++++++++ 5 files changed, 196 insertions(+) create mode 100644 src/main/services/PowerMonitorService.ts diff --git a/package.json b/package.json index f0c0050d2a..c7a3a66ba4 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "@libsql/client": "0.14.0", "@libsql/win32-x64-msvc": "^0.4.7", "@napi-rs/system-ocr": "patch:@napi-rs/system-ocr@npm%3A1.0.2#~/.yarn/patches/@napi-rs-system-ocr-npm-1.0.2-59e7a78e8b.patch", + "@paymoapp/electron-shutdown-handler": "^1.1.2", "@strongtz/win32-arm64-msvc": "^0.4.7", "express": "^5.1.0", "font-list": "^2.0.0", diff --git a/src/main/index.ts b/src/main/index.ts index bcec606f4b..025268b651 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -21,6 +21,7 @@ import { appMenuService } from './services/AppMenuService' import { configManager } from './services/ConfigManager' import mcpService from './services/MCPService' import { nodeTraceService } from './services/NodeTraceService' +import powerMonitorService from './services/PowerMonitorService' import { CHERRY_STUDIO_PROTOCOL, handleProtocolUrl, @@ -132,6 +133,7 @@ if (!app.requestSingleInstanceLock()) { appMenuService?.setupApplicationMenu() nodeTraceService.init() + powerMonitorService.init() app.on('activate', function () { const mainWindow = windowService.getMainWindow() diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 936a0dd008..5bf5c73051 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -50,6 +50,7 @@ import * as NutstoreService from './services/NutstoreService' import ObsidianVaultService from './services/ObsidianVaultService' import { ocrService } from './services/ocr/OcrService' import OvmsManager from './services/OvmsManager' +import powerMonitorService from './services/PowerMonitorService' import { proxyManager } from './services/ProxyManager' import { pythonService } from './services/PythonService' import { FileServiceManager } from './services/remotefile/FileServiceManager' @@ -115,6 +116,18 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { const appUpdater = new AppUpdater() const notificationService = new NotificationService() + // Register shutdown handlers + powerMonitorService.registerShutdownHandler(() => { + appUpdater.setAutoUpdate(false) + }) + + powerMonitorService.registerShutdownHandler(() => { + const mw = windowService.getMainWindow() + if (mw && !mw.isDestroyed()) { + mw.webContents.send(IpcChannel.App_SaveData) + } + }) + const checkMainWindow = () => { if (!mainWindow || mainWindow.isDestroyed()) { throw new Error('Main window does not exist or has been destroyed') diff --git a/src/main/services/PowerMonitorService.ts b/src/main/services/PowerMonitorService.ts new file mode 100644 index 0000000000..aab3906c9e --- /dev/null +++ b/src/main/services/PowerMonitorService.ts @@ -0,0 +1,112 @@ +import { loggerService } from '@logger' +import { isLinux, isMac, isWin } from '@main/constant' +import ElectronShutdownHandler from '@paymoapp/electron-shutdown-handler' +import { BrowserWindow } from 'electron' +import { powerMonitor } from 'electron' + +const logger = loggerService.withContext('PowerMonitorService') + +type ShutdownHandler = () => void | Promise + +export class PowerMonitorService { + private static instance: PowerMonitorService + private initialized = false + private shutdownHandlers: ShutdownHandler[] = [] + + private constructor() { + // Private constructor to prevent direct instantiation + } + + public static getInstance(): PowerMonitorService { + if (!PowerMonitorService.instance) { + PowerMonitorService.instance = new PowerMonitorService() + } + return PowerMonitorService.instance + } + + /** + * Register a shutdown handler to be called when system shutdown is detected + * @param handler - The handler function to be called on shutdown + */ + public registerShutdownHandler(handler: ShutdownHandler): void { + this.shutdownHandlers.push(handler) + logger.info('Shutdown handler registered', { totalHandlers: this.shutdownHandlers.length }) + } + + /** + * Initialize power monitor to listen for shutdown events + */ + public init(): void { + if (this.initialized) { + logger.warn('PowerMonitorService already initialized') + return + } + + if (isWin) { + this.initWindowsShutdownHandler() + } else if (isMac || isLinux) { + this.initElectronPowerMonitor() + } + + this.initialized = true + logger.info('PowerMonitorService initialized', { platform: process.platform }) + } + + /** + * Execute all registered shutdown handlers + */ + private async executeShutdownHandlers(): Promise { + logger.info('Executing shutdown handlers', { count: this.shutdownHandlers.length }) + for (const handler of this.shutdownHandlers) { + try { + await handler() + } catch (error) { + logger.error('Error executing shutdown handler', error as Error) + } + } + } + + /** + * Initialize shutdown handler for Windows using @paymoapp/electron-shutdown-handler + */ + private initWindowsShutdownHandler(): void { + try { + const zeroMemoryWindow = new BrowserWindow({ show: false }) + // Set the window handle for the shutdown handler + ElectronShutdownHandler.setWindowHandle(zeroMemoryWindow.getNativeWindowHandle()) + + // Listen for shutdown event + ElectronShutdownHandler.on('shutdown', async () => { + logger.info('System shutdown event detected (Windows)') + // Execute all registered shutdown handlers + await this.executeShutdownHandlers() + // Release the shutdown block to allow the system to shut down + ElectronShutdownHandler.releaseShutdown() + }) + + logger.info('Windows shutdown handler registered') + } catch (error) { + logger.error('Failed to initialize Windows shutdown handler', error as Error) + } + } + + /** + * Initialize power monitor for macOS and Linux using Electron's powerMonitor + */ + private initElectronPowerMonitor(): void { + try { + powerMonitor.on('shutdown', async () => { + logger.info('System shutdown event detected', { platform: process.platform }) + // Execute all registered shutdown handlers + await this.executeShutdownHandlers() + }) + + logger.info('Electron powerMonitor shutdown listener registered') + } catch (error) { + logger.error('Failed to initialize Electron powerMonitor', error as Error) + } + } +} + +// Default export as singleton instance +export default PowerMonitorService.getInstance() diff --git a/yarn.lock b/yarn.lock index 73436f5108..9415540a0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6787,6 +6787,17 @@ __metadata: languageName: node linkType: hard +"@paymoapp/electron-shutdown-handler@npm:^1.1.2": + version: 1.1.2 + resolution: "@paymoapp/electron-shutdown-handler@npm:1.1.2" + dependencies: + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.2" + checksum: 10c0/c774ded900870cd0eae79f2281e971561328b9d2f555b8763a75773f12d953edfa3923067f257bbda5001f9c934343d55344f7a7aac5eff8739762c91e9f37a7 + languageName: node + linkType: hard + "@pdf-lib/standard-fonts@npm:^1.0.0": version: 1.0.0 resolution: "@pdf-lib/standard-fonts@npm:1.0.0" @@ -12816,6 +12827,7 @@ __metadata: "@opentelemetry/sdk-trace-node": "npm:^2.0.0" "@opentelemetry/sdk-trace-web": "npm:^2.0.0" "@opeoginni/github-copilot-openai-compatible": "npm:0.1.19" + "@paymoapp/electron-shutdown-handler": "npm:^1.1.2" "@playwright/test": "npm:^1.52.0" "@radix-ui/react-context-menu": "npm:^2.2.16" "@reduxjs/toolkit": "npm:^2.2.5" @@ -16036,6 +16048,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.0": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + "detect-libc@npm:^2.0.1": version: 2.0.3 resolution: "detect-libc@npm:2.0.3" @@ -22425,6 +22444,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "napi-build-utils@npm:2.0.0" + checksum: 10c0/5833aaeb5cc5c173da47a102efa4680a95842c13e0d9cc70428bd3ee8d96bb2172f8860d2811799b5daa5cbeda779933601492a2028a6a5351c6d0fcf6de83db + languageName: node + linkType: hard + "native-promise-only@npm:0.8.1": version: 0.8.1 resolution: "native-promise-only@npm:0.8.1" @@ -22508,6 +22534,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d + languageName: node + linkType: hard + "node-addon-api@npm:^8.4.0": version: 8.4.0 resolution: "node-addon-api@npm:8.4.0" @@ -23722,6 +23757,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.2": + version: 7.1.3 + resolution: "prebuild-install@npm:7.1.3" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^2.0.0" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10c0/25919a42b52734606a4036ab492d37cfe8b601273d8dfb1fa3c84e141a0a475e7bad3ab848c741d2f810cef892fcf6059b8c7fe5b29f98d30e0c29ad009bedff + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -26301,6 +26358,17 @@ __metadata: languageName: node linkType: hard +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + "simple-swizzle@npm:^0.2.2": version: 0.2.2 resolution: "simple-swizzle@npm:0.2.2" From 2546dfbe5d37c5b7bfdf148594e16ab61a76cacb Mon Sep 17 00:00:00 2001 From: fullex <0xfullex@gmail.com> Date: Wed, 5 Nov 2025 12:54:30 +0800 Subject: [PATCH 42/83] chore: update Node.js version to 22 and Yarn version to 4.9.1 across workflows and documentation --- .github/workflows/auto-i18n.yml | 2 +- .github/workflows/github-issue-tracker.yml | 6 +++--- .github/workflows/nightly-build.yml | 6 +++--- .github/workflows/pr-ci.yml | 4 ++-- .github/workflows/release.yml | 10 +++++----- docs/dev.md | 4 ++-- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/auto-i18n.yml b/.github/workflows/auto-i18n.yml index c26f4b1adf..1a85b16757 100644 --- a/.github/workflows/auto-i18n.yml +++ b/.github/workflows/auto-i18n.yml @@ -29,7 +29,7 @@ jobs: - name: 📦 Setting Node.js uses: actions/setup-node@v6 with: - node-version: 20 + node-version: 22 package-manager-cache: false - name: 📦 Install dependencies in isolated directory diff --git a/.github/workflows/github-issue-tracker.yml b/.github/workflows/github-issue-tracker.yml index f585527ea2..32bd393145 100644 --- a/.github/workflows/github-issue-tracker.yml +++ b/.github/workflows/github-issue-tracker.yml @@ -5,7 +5,7 @@ on: types: [opened] schedule: # Run every day at 8:30 Beijing Time (00:30 UTC) - - cron: '30 0 * * *' + - cron: "30 0 * * *" workflow_dispatch: jobs: @@ -56,7 +56,7 @@ jobs: if: steps.check_time.outputs.should_delay == 'false' uses: actions/setup-node@v6 with: - node-version: '20' + node-version: 22 - name: Process issue with Claude if: steps.check_time.outputs.should_delay == 'false' @@ -123,7 +123,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: 22 - name: Process pending issues with Claude uses: anthropics/claude-code-action@main diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 0698c3bab2..523a670064 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -3,7 +3,7 @@ name: Nightly Build on: workflow_dispatch: schedule: - - cron: '0 17 * * *' # 1:00 BJ Time + - cron: "0 17 * * *" # 1:00 BJ Time permissions: contents: write @@ -58,7 +58,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v6 with: - node-version: 20 + node-version: 22 - name: macos-latest dependencies fix if: matrix.os == 'macos-latest' @@ -66,7 +66,7 @@ jobs: brew install python-setuptools - name: Install corepack - run: corepack enable && corepack prepare yarn@4.6.0 --activate + run: corepack enable && corepack prepare yarn@4.9.1 --activate - name: Get yarn cache directory path id: yarn-cache-dir-path diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index 44fc49ee6d..aa273cc56e 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -26,10 +26,10 @@ jobs: - name: Install Node.js uses: actions/setup-node@v6 with: - node-version: 20 + node-version: 22 - name: Install corepack - run: corepack enable && corepack prepare yarn@4.6.0 --activate + run: corepack enable && corepack prepare yarn@4.9.1 --activate - name: Get yarn cache directory path id: yarn-cache-dir-path diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2fa8aa5d4e..8bbb46ee67 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,9 +4,9 @@ on: workflow_dispatch: inputs: tag: - description: 'Release tag (e.g. v1.0.0)' + description: "Release tag (e.g. v1.0.0)" required: true - default: 'v1.0.0' + default: "v1.0.0" push: tags: - v*.*.* @@ -49,7 +49,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v6 with: - node-version: 20 + node-version: 22 - name: macos-latest dependencies fix if: matrix.os == 'macos-latest' @@ -57,7 +57,7 @@ jobs: brew install python-setuptools - name: Install corepack - run: corepack enable && corepack prepare yarn@4.6.0 --activate + run: corepack enable && corepack prepare yarn@4.9.1 --activate - name: Get yarn cache directory path id: yarn-cache-dir-path @@ -127,5 +127,5 @@ jobs: allowUpdates: true makeLatest: false tag: ${{ steps.get-tag.outputs.tag }} - artifacts: 'dist/*.exe,dist/*.zip,dist/*.dmg,dist/*.AppImage,dist/*.snap,dist/*.deb,dist/*.rpm,dist/*.tar.gz,dist/latest*.yml,dist/rc*.yml,dist/beta*.yml,dist/*.blockmap' + artifacts: "dist/*.exe,dist/*.zip,dist/*.dmg,dist/*.AppImage,dist/*.snap,dist/*.deb,dist/*.rpm,dist/*.tar.gz,dist/latest*.yml,dist/rc*.yml,dist/beta*.yml,dist/*.blockmap" token: ${{ secrets.GITHUB_TOKEN }} diff --git a/docs/dev.md b/docs/dev.md index 0fdff640ec..fe67742768 100644 --- a/docs/dev.md +++ b/docs/dev.md @@ -18,13 +18,13 @@ yarn ### Setup Node.js -Download and install [Node.js v20.x.x](https://nodejs.org/en/download) +Download and install [Node.js v22.x.x](https://nodejs.org/en/download) ### Setup Yarn ```bash corepack enable -corepack prepare yarn@4.6.0 --activate +corepack prepare yarn@4.9.1 --activate ``` ### Install Dependencies From caa59c4c50ed65ae360d508dd0fd6e0156db47b6 Mon Sep 17 00:00:00 2001 From: Phantom Date: Wed, 5 Nov 2025 14:14:40 +0800 Subject: [PATCH 43/83] refactor(Topics & Sessions): Style and code structure adjustments (#10868) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(Tabs): extract shared styled components into separate file Move common styled components (ListItem, ListItemNameContainer, ListItemName, ListItemEditInput) from SessionItem.tsx and Topics.tsx into shared.tsx to improve code reuse and maintainability * refactor(components): extract ListContainer component for shared tab layouts Create reusable ListContainer component to standardize layout styling across tabs Replace manual div containers in Sessions and Topics components with new ListContainer * refactor(ListItem): convert styled component to Tailwind CSS function component - Convert ListItem from styled-components to Tailwind CSS function component - Maintain all original styling and hover/active states - Use HTMLDivElement props interface for proper TypeScript typing - Preserve CSS custom properties for theme variables 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * refactor(ListItemNameContainer): convert styled component to Tailwind CSS function component - Convert ListItemNameContainer from styled-components to Tailwind CSS function component - Simplify layout styles using Tailwind's utility classes - Use HTMLDivElement props interface for proper TypeScript typing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * refactor(ListItemName): convert styled component to Tailwind CSS function component - Convert ListItemName from styled-components to Tailwind CSS function component - Use inline styles for webkit-specific line clamping properties - Remove complex animations from component definition (can be added via CSS classes) - Use HTMLDivElement props interface for proper TypeScript typing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * refactor(ListItemEditInput): convert styled component to Tailwind CSS function component - Convert ListItemEditInput from styled-components to Tailwind CSS function component - Use proper InputHTMLAttributes type for input elements - Remove styled-components import as no longer needed - Maintain all original styling using Tailwind utility classes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * refactor(components): improve type safety and class ordering in shared components - Replace HTMLAttributes with more specific ComponentProps types - Reorder class names for better readability and consistency * refactor(components): update styling and class handling in list items - Replace deprecated classNames utility with cn from @heroui/react - Consolidate style properties into className using cn - Improve CSS selector syntax for better specificity - Standardize padding and border radius values * Revert "refactor(ListItemName): convert styled component to Tailwind CSS function component" This reverts commit 196136068db9fc27294ffebe8124dd0eeab64cf1. * style(shared): increase font size and remove redundant padding The font size was increased from 13px to 14px for better readability. Redundant padding in ListItemEditInput was removed to maintain consistent styling. * refactor(AddButton): simplify component by removing FC type and inline props Remove unnecessary FC type declaration and inline the Props interface with ButtonProps. Also clean up prop spreading by moving it to the end of the component. * style(Topics): remove redundant className and add overflow styles * refactor(components): extract MenuButton to shared components Move MenuButton implementation from individual components to shared module to reduce code duplication and improve maintainability * refactor(PendingIndicator): convert styled component to Tailwind CSS function component - Convert PendingIndicator from styled-components to Tailwind CSS function component - Use ComponentPropsWithoutRef<'div'> for consistent TypeScript typing - Replace styled-components attrs with Tailwind animate-pulse class - Use CSS custom properties for pulse-size variable - Remove styled-components import as no longer needed 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * refactor(components): replace styled indicators with shared StatusIndicator Consolidate PendingIndicator and FulfilledIndicator into a single StatusIndicator component with variant support * style(shared.tsx): adjust border styles for singlealone active state * refactor: use type-only imports for react props --------- Co-authored-by: Claude --- .../pages/home/Tabs/components/AddButton.tsx | 12 +- .../home/Tabs/components/SessionItem.tsx | 154 +------- .../pages/home/Tabs/components/Sessions.tsx | 5 +- .../src/pages/home/Tabs/components/Topics.tsx | 353 +++++------------- .../src/pages/home/Tabs/components/shared.tsx | 131 +++++++ 5 files changed, 258 insertions(+), 397 deletions(-) create mode 100644 src/renderer/src/pages/home/Tabs/components/shared.tsx diff --git a/src/renderer/src/pages/home/Tabs/components/AddButton.tsx b/src/renderer/src/pages/home/Tabs/components/AddButton.tsx index 62feecd226..2a5a93357c 100644 --- a/src/renderer/src/pages/home/Tabs/components/AddButton.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AddButton.tsx @@ -1,22 +1,16 @@ import type { ButtonProps } from '@heroui/react' import { Button, cn } from '@heroui/react' import { PlusIcon } from 'lucide-react' -import type { FC } from 'react' -interface Props extends ButtonProps { - children: React.ReactNode -} - -const AddButton: FC = ({ children, className, ...props }) => { +const AddButton = ({ children, className, ...props }: ButtonProps) => { return ( ) diff --git a/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx b/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx index d4dcc4cb95..dd2ba50099 100644 --- a/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx +++ b/src/renderer/src/pages/home/Tabs/components/SessionItem.tsx @@ -1,3 +1,4 @@ +import { cn } from '@heroui/react' import { DeleteIcon, EditIcon } from '@renderer/components/Icons' import { isMac } from '@renderer/config/constant' import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession' @@ -19,14 +20,14 @@ import { ContextMenuSubTrigger, ContextMenuTrigger } from '@renderer/ui/context-menu' -import { classNames } from '@renderer/utils' import { buildAgentSessionTopicId } from '@renderer/utils/agentSession' import { Tooltip } from 'antd' import { MenuIcon, XIcon } from 'lucide-react' import type { FC } from 'react' import React, { memo, startTransition, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import styled from 'styled-components' + +import { ListItem, ListItemEditInput, ListItemName, ListItemNameContainer, MenuButton, StatusIndicator } from './shared' // const logger = loggerService.withContext('AgentItem') @@ -67,7 +68,6 @@ const SessionItem: FC = ({ session, agentId, onDelete, onPress
}> { e.stopPropagation() if (isConfirmingDeletion || e.ctrlKey || e.metaKey) { @@ -115,20 +115,21 @@ const SessionItem: FC = ({ session, agentId, onDelete, onPress <> - startEdit(session.name ?? '')} - title={session.name ?? session.id} - style={{ - borderRadius: 'var(--list-item-border-radius)', - cursor: isEditing ? 'default' : 'pointer' - }}> - {isPending && !isActive && } - {isFulfilled && !isActive && } - + title={session.name ?? session.id}> + {isPending && !isActive && } + {isFulfilled && !isActive && } + {isEditing ? ( - ) => handleValueChange(e.target.value)} @@ -138,14 +139,14 @@ const SessionItem: FC = ({ session, agentId, onDelete, onPress /> ) : ( <> - + - + )} - - + + = ({ session, agentId, onDelete, onPress ) } -const SessionListItem = styled.div` - padding: 7px 12px; - border-radius: var(--list-item-border-radius); - font-size: 13px; - display: flex; - flex-direction: column; - justify-content: space-between; - cursor: pointer; - width: calc(var(--assistants-width) - 20px); - margin-bottom: 8px; - - .menu { - opacity: 0; - color: var(--color-text-3); - } - - &:hover { - background-color: var(--color-list-item-hover); - transition: background-color 0.1s; - - .menu { - opacity: 1; - } - } - - &.active { - background-color: var(--color-list-item); - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); - .menu { - opacity: 1; - - &:hover { - color: var(--color-text-2); - } - } - } - - &.singlealone { - border-radius: 0 !important; - &:hover { - background-color: var(--color-background-soft); - } - &.active { - border-left: 2px solid var(--color-primary); - box-shadow: none; - } - } -` - -const SessionNameContainer = styled.div` - display: flex; - flex-direction: row; - align-items: center; - gap: 4px; - height: 20px; - justify-content: space-between; -` - -const SessionName = styled.div` - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - font-size: 13px; - position: relative; -` - -const SessionEditInput = styled.input` - background: var(--color-background); - border: none; - color: var(--color-text-1); - font-size: 13px; - font-family: inherit; - padding: 2px 6px; - width: 100%; - outline: none; - padding: 0; -` - -const MenuButton = styled.div` - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - min-width: 20px; - min-height: 20px; - .anticon { - font-size: 12px; - } -` - -const PendingIndicator = styled.div.attrs({ - className: 'animation-pulse' -})` - --pulse-size: 5px; - width: 5px; - height: 5px; - position: absolute; - left: 3px; - top: 15px; - border-radius: 50%; - background-color: var(--color-status-warning); -` - -const FulfilledIndicator = styled.div.attrs({ - className: 'animation-pulse' -})` - --pulse-size: 5px; - width: 5px; - height: 5px; - position: absolute; - left: 3px; - top: 15px; - border-radius: 50%; - background-color: var(--color-status-success); -` - export default memo(SessionItem) diff --git a/src/renderer/src/pages/home/Tabs/components/Sessions.tsx b/src/renderer/src/pages/home/Tabs/components/Sessions.tsx index 5a36ce5d22..b56ef9f9c2 100644 --- a/src/renderer/src/pages/home/Tabs/components/Sessions.tsx +++ b/src/renderer/src/pages/home/Tabs/components/Sessions.tsx @@ -17,6 +17,7 @@ import { useTranslation } from 'react-i18next' import AddButton from './AddButton' import SessionItem from './SessionItem' +import { ListContainer } from './shared' // const logger = loggerService.withContext('SessionsTab') @@ -95,7 +96,7 @@ const Sessions: React.FC = ({ agentId }) => { if (error) return return ( -
+ {t('agent.session.add.title')} @@ -118,7 +119,7 @@ const Sessions: React.FC = ({ agentId }) => { /> )} -
+ ) } diff --git a/src/renderer/src/pages/home/Tabs/components/Topics.tsx b/src/renderer/src/pages/home/Tabs/components/Topics.tsx index 04e8bead7a..65bfdd8b3f 100644 --- a/src/renderer/src/pages/home/Tabs/components/Topics.tsx +++ b/src/renderer/src/pages/home/Tabs/components/Topics.tsx @@ -1,3 +1,4 @@ +import { cn } from '@heroui/react' import { DraggableVirtualList } from '@renderer/components/DraggableList' import { CopyIcon, DeleteIcon, EditIcon } from '@renderer/components/Icons' import ObsidianExportPopup from '@renderer/components/Popups/ObsidianExportPopup' @@ -17,7 +18,7 @@ import store from '@renderer/store' import { newMessagesActions } from '@renderer/store/newMessage' import { setGenerating } from '@renderer/store/runtime' import type { Assistant, Topic } from '@renderer/types' -import { classNames, removeSpecialCharactersForFileName } from '@renderer/utils' +import { removeSpecialCharactersForFileName } from '@renderer/utils' import { copyTopicAsMarkdown, copyTopicAsPlainText } from '@renderer/utils/copy' import { exportMarkdownToJoplin, @@ -53,6 +54,15 @@ import { useDispatch, useSelector } from 'react-redux' import styled from 'styled-components' import AddButton from './AddButton' +import { + ListContainer, + ListItem, + ListItemEditInput, + ListItemName, + ListItemNameContainer, + MenuButton, + StatusIndicator +} from './shared' interface Props { assistant: Assistant @@ -73,8 +83,6 @@ export const Topics: React.FC = ({ assistant: _assistant, activeTopic, se const topicFulfilledQuery = useSelector((state: RootState) => state.messages.fulfilledByTopic) const newlyRenamedTopics = useSelector((state: RootState) => state.runtime.chat.newlyRenamedTopics) - const borderRadius = showTopicTime ? 12 : 'var(--list-item-border-radius)' - const [deletingTopicId, setDeletingTopicId] = useState(null) const deleteTimerRef = useRef(null) const [editingTopicId, setEditingTopicId] = useState(null) @@ -489,252 +497,107 @@ export const Topics: React.FC = ({ assistant: _assistant, activeTopic, se const singlealone = topicPosition === 'right' && position === 'right' return ( - EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)} className="mb-2"> - {t('chat.add.topic.title')} - - }> - {(topic) => { - const isActive = topic.id === activeTopic?.id - const topicName = topic.name.replace('`', '') - const topicPrompt = topic.prompt - const fullTopicPrompt = t('common.prompt') + ': ' + topicPrompt + + EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)} className="mb-2"> + {t('chat.add.topic.title')} + + + {(topic) => { + const isActive = topic.id === activeTopic?.id + const topicName = topic.name.replace('`', '') + const topicPrompt = topic.prompt + const fullTopicPrompt = t('common.prompt') + ': ' + topicPrompt - const getTopicNameClassName = () => { - if (isRenaming(topic.id)) return 'shimmer' - if (isNewlyRenamed(topic.id)) return 'typing' - return '' - } + const getTopicNameClassName = () => { + if (isRenaming(topic.id)) return 'shimmer' + if (isNewlyRenamed(topic.id)) return 'typing' + return '' + } - return ( - - setTargetTopic(topic)} - className={classNames(isActive ? 'active' : '', singlealone ? 'singlealone' : '')} - onClick={editingTopicId === topic.id && topicEdit.isEditing ? undefined : () => onSwitchTopic(topic)} - style={{ - borderRadius, - cursor: editingTopicId === topic.id && topicEdit.isEditing ? 'default' : 'pointer' - }}> - {isPending(topic.id) && !isActive && } - {isFulfilled(topic.id) && !isActive && } - - {editingTopicId === topic.id && topicEdit.isEditing ? ( - e.stopPropagation()} - /> - ) : ( - { - setEditingTopicId(topic.id) - topicEdit.startEdit(topic.name) - }}> - {topicName} - + return ( + + setTargetTopic(topic)} + className={cn( + isActive ? 'active' : undefined, + singlealone ? 'singlealone' : undefined, + editingTopicId === topic.id && topicEdit.isEditing ? 'cursor-default' : 'cursor-pointer', + showTopicTime ? 'rounded-2xl' : 'rounded-[var(--list-item-border-radius)]' )} - {!topic.pinned && ( - - {t('chat.topics.delete.shortcut', { key: isMac ? '⌘' : 'Ctrl' })} -
- }> - { - if (e.ctrlKey || e.metaKey) { - handleConfirmDelete(topic, e) - } else if (deletingTopicId === topic.id) { - handleConfirmDelete(topic, e) - } else { - handleDeleteClick(topic.id, e) - } + onClick={editingTopicId === topic.id && topicEdit.isEditing ? undefined : () => onSwitchTopic(topic)}> + {isPending(topic.id) && !isActive && } + {isFulfilled(topic.id) && !isActive && } + + {editingTopicId === topic.id && topicEdit.isEditing ? ( + e.stopPropagation()} + /> + ) : ( + { + setEditingTopicId(topic.id) + topicEdit.startEdit(topic.name) }}> - {deletingTopicId === topic.id ? ( - - ) : ( - - )} + {topicName} + + )} + {!topic.pinned && ( + + {t('chat.topics.delete.shortcut', { key: isMac ? '⌘' : 'Ctrl' })} +
+ }> + { + if (e.ctrlKey || e.metaKey) { + handleConfirmDelete(topic, e) + } else if (deletingTopicId === topic.id) { + handleConfirmDelete(topic, e) + } else { + handleDeleteClick(topic.id, e) + } + }}> + {deletingTopicId === topic.id ? ( + + ) : ( + + )} + + + )} + {topic.pinned && ( + + - + )} + + {topicPrompt && ( + + {fullTopicPrompt} + )} - {topic.pinned && ( - - - + {showTopicTime && ( + {dayjs(topic.createdAt).format('MM/DD HH:mm')} )} - - {topicPrompt && ( - - {fullTopicPrompt} - - )} - {showTopicTime && {dayjs(topic.createdAt).format('MM/DD HH:mm')}} - - - ) - }} - + + + ) + }} + + ) } -const TopicListItem = styled.div` - padding: 7px 12px; - border-radius: var(--list-item-border-radius); - font-size: 13px; - display: flex; - flex-direction: column; - justify-content: space-between; - cursor: pointer; - width: calc(var(--assistants-width) - 20px); - - .menu { - opacity: 0; - color: var(--color-text-3); - } - - &:hover { - background-color: var(--color-list-item-hover); - transition: background-color 0.1s; - - .menu { - opacity: 1; - } - } - - &.active { - background-color: var(--color-list-item); - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); - .menu { - opacity: 1; - - &:hover { - color: var(--color-text-2); - } - } - } - &.singlealone { - border-radius: 0 !important; - &:hover { - background-color: var(--color-background-soft); - } - &.active { - border-left: 2px solid var(--color-primary); - box-shadow: none; - } - } -` - -const TopicNameContainer = styled.div` - display: flex; - flex-direction: row; - align-items: center; - gap: 4px; - height: 20px; - justify-content: space-between; -` - -const TopicName = styled.div` - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - font-size: 13px; - position: relative; - will-change: background-position, width; - - --color-shimmer-mid: var(--color-text-1); - --color-shimmer-end: color-mix(in srgb, var(--color-text-1) 25%, transparent); - - &.shimmer { - background: linear-gradient(to left, var(--color-shimmer-end), var(--color-shimmer-mid), var(--color-shimmer-end)); - background-size: 200% 100%; - background-clip: text; - color: transparent; - animation: shimmer 3s linear infinite; - } - - &.typing { - display: block; - -webkit-line-clamp: unset; - -webkit-box-orient: unset; - white-space: nowrap; - overflow: hidden; - animation: typewriter 0.5s steps(40, end); - } - - @keyframes shimmer { - 0% { - background-position: 200% 0; - } - 100% { - background-position: -200% 0; - } - } - - @keyframes typewriter { - from { - width: 0; - } - to { - width: 100%; - } - } -` - -const TopicEditInput = styled.input` - background: var(--color-background); - border: none; - color: var(--color-text-1); - font-size: 13px; - font-family: inherit; - padding: 2px 6px; - width: 100%; - outline: none; - padding: 0; -` - -const PendingIndicator = styled.div.attrs({ - className: 'animation-pulse' -})` - --pulse-size: 5px; - width: 5px; - height: 5px; - position: absolute; - left: 3px; - top: 15px; - border-radius: 50%; - background-color: var(--color-status-warning); -` - -const FulfilledIndicator = styled.div.attrs({ - className: 'animation-pulse' -})` - --pulse-size: 5px; - width: 5px; - height: 5px; - position: absolute; - left: 3px; - top: 15px; - border-radius: 50%; - background-color: var(--color-status-success); -` - const TopicPromptText = styled.div` color: var(--color-text-2); font-size: 12px; @@ -751,15 +614,3 @@ const TopicTime = styled.div` color: var(--color-text-3); font-size: 11px; ` - -const MenuButton = styled.div` - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - min-width: 20px; - min-height: 20px; - .anticon { - font-size: 12px; - } -` diff --git a/src/renderer/src/pages/home/Tabs/components/shared.tsx b/src/renderer/src/pages/home/Tabs/components/shared.tsx new file mode 100644 index 0000000000..2ef0278984 --- /dev/null +++ b/src/renderer/src/pages/home/Tabs/components/shared.tsx @@ -0,0 +1,131 @@ +import { cn } from '@heroui/react' +import type { ComponentPropsWithoutRef, ComponentPropsWithRef } from 'react' +import { useMemo } from 'react' +import styled from 'styled-components' + +export const ListItem = ({ children, className, ...props }: ComponentPropsWithoutRef<'div'>) => { + return ( +
+ {children} +
+ ) +} +export const ListItemNameContainer = ({ children, className, ...props }: ComponentPropsWithoutRef<'div'>) => { + return ( +
+ {children} +
+ ) +} + +// This component involves complex animations and will not be migrated for now. +export const ListItemName = styled.div` + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + font-size: 14px; + position: relative; + will-change: background-position, width; + + --color-shimmer-mid: var(--color-text-1); + --color-shimmer-end: color-mix(in srgb, var(--color-text-1) 25%, transparent); + + &.shimmer { + background: linear-gradient(to left, var(--color-shimmer-end), var(--color-shimmer-mid), var(--color-shimmer-end)); + background-size: 200% 100%; + background-clip: text; + color: transparent; + animation: shimmer 3s linear infinite; + } + + &.typing { + display: block; + -webkit-line-clamp: unset; + -webkit-box-orient: unset; + white-space: nowrap; + overflow: hidden; + animation: typewriter 0.5s steps(40, end); + } + + @keyframes shimmer { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } + } + + @keyframes typewriter { + from { + width: 0; + } + to { + width: 100%; + } + } +` + +export const ListItemEditInput = ({ className, ...props }: ComponentPropsWithRef<'input'>) => { + return ( + + ) +} + +export const ListContainer = ({ children, className, ...props }: ComponentPropsWithoutRef<'div'>) => { + return ( +
+ {children} +
+ ) +} + +export const MenuButton = ({ children, className, ...props }: ComponentPropsWithoutRef<'div'>) => { + return ( +
+ {children} +
+ ) +} + +export const StatusIndicator = ({ variant }: { variant: 'pending' | 'fulfilled' }) => { + const colors = useMemo(() => { + switch (variant) { + case 'pending': + return { + wave: 'bg-warning-400', + back: 'bg-warning-500' + } + case 'fulfilled': + return { + wave: 'bg-success-400', + back: 'bg-success-500' + } + } + }, [variant]) + return ( +
+ + +
+ ) +} From 56c7a7f06631fd10a9c590e1520037a016cf29c1 Mon Sep 17 00:00:00 2001 From: beyondkmp Date: Wed, 5 Nov 2025 14:19:14 +0800 Subject: [PATCH 44/83] =?UTF-8?q?=F0=9F=90=9B=20fix:=20resolve=20TypeScrip?= =?UTF-8?q?t=20type=20conflicts=20and=20React=20hooks=20warnings=20(#11148?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐛 fix: resolve TypeScript type conflicts and React hooks warnings - Add @smithy/types@4.7.1 to resolutions to unify AWS SDK dependencies - Wrap updatePaintingState in useCallback to fix exhaustive-deps warning - Fix AWS Bedrock client type incompatibility issues 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * fix(i18n): Auto update translations for PR #11148 --------- Co-authored-by: Claude Co-authored-by: GitHub Action --- package.json | 1 + src/renderer/src/i18n/translate/de-de.json | 6 ++++++ src/renderer/src/i18n/translate/el-gr.json | 6 ++++++ src/renderer/src/i18n/translate/es-es.json | 6 ++++++ src/renderer/src/i18n/translate/fr-fr.json | 6 ++++++ src/renderer/src/i18n/translate/ja-jp.json | 6 ++++++ src/renderer/src/i18n/translate/pt-pt.json | 6 ++++++ src/renderer/src/i18n/translate/ru-ru.json | 6 ++++++ .../src/pages/paintings/NewApiPage.tsx | 13 +++++++----- yarn.lock | 20 +------------------ 10 files changed, 52 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index c7a3a66ba4..c4259a85a1 100644 --- a/package.json +++ b/package.json @@ -374,6 +374,7 @@ "zod": "^4.1.5" }, "resolutions": { + "@smithy/types": "4.7.1", "@codemirror/language": "6.11.3", "@codemirror/lint": "6.8.5", "@codemirror/view": "6.38.1", diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index 9891df74ca..b90addff79 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "AWS-Zugriffsschlüssel-ID", "access_key_id_help": "Ihre AWS-Zugriffsschlüssel-ID, um auf AWS Bedrock-Dienste zuzugreifen", + "api_key": "Bedrock-API-Schlüssel", + "api_key_help": "Ihr AWS Bedrock-API-Schlüssel für die Authentifizierung", + "auth_type": "Authentifizierungstyp", + "auth_type_api_key": "Bedrock-API-Schlüssel", + "auth_type_help": "Wählen Sie zwischen IAM-Anmeldeinformationen oder Bedrock-API-Schlüssel-Authentifizierung", + "auth_type_iam": "IAM-Anmeldeinformationen", "description": "AWS Bedrock ist ein vollständig verwalteter Basismodell-Dienst von Amazon, der eine Vielzahl moderner großer Sprachmodelle unterstützt", "region": "AWS-Region", "region_help": "Ihre AWS-Serviceregion, z.B. us-east-1", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index 9a51b4b1df..4c6a0b4b20 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "Αναγνωριστικό κλειδιού πρόσβασης AWS", "access_key_id_help": "Το ID του κλειδιού πρόσβασης AWS που χρησιμοποιείται για την πρόσβαση στην υπηρεσία AWS Bedrock", + "api_key": "Κλειδί API Bedrock", + "api_key_help": "Το κλειδί API του AWS Bedrock για έλεγχο ταυτότητας", + "auth_type": "Τύπος Πιστοποίησης", + "auth_type_api_key": "Κλειδί API Bedrock", + "auth_type_help": "Επιλέξτε μεταξύ πιστοποιητικών IAM ή πιστοποίησης με κλειδί API Bedrock", + "auth_type_iam": "Διαπιστευτήρια IAM", "description": "Η AWS Bedrock είναι μια πλήρως διαχειριζόμενη υπηρεσία βασικών μοντέλων που παρέχεται από την Amazon και υποστηρίζει διάφορα προηγμένα μεγάλα γλωσσικά μοντέλα.", "region": "Περιοχές AWS", "region_help": "Η περιοχή υπηρεσίας AWS σας, για παράδειγμα us-east-1", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 4382c402e1..cf1b029db3 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "ID de clave de acceso de AWS", "access_key_id_help": "Su ID de clave de acceso de AWS, utilizado para acceder al servicio AWS Bedrock", + "api_key": "Clave de API de Bedrock", + "api_key_help": "Tu clave de API de AWS Bedrock para autenticación", + "auth_type": "Tipo de autenticación", + "auth_type_api_key": "Clave de API de Bedrock", + "auth_type_help": "Elige entre credenciales IAM o autenticación con clave API de Bedrock", + "auth_type_iam": "Credenciales de IAM", "description": "AWS Bedrock es un servicio de modelos fundamentales completamente gestionado proporcionado por Amazon, que admite diversos modelos avanzados de lenguaje de gran tamaño.", "region": "Región de AWS", "region_help": "Su región de servicio AWS, por ejemplo us-east-1", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index 4b35eab2fe..c1c699afaf 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "Identifiant de clé d'accès AWS", "access_key_id_help": "Votre identifiant de clé d'accès AWS, utilisé pour accéder au service AWS Bedrock", + "api_key": "Clé API Bedrock", + "api_key_help": "Votre clé API AWS Bedrock pour l'authentification", + "auth_type": "Type d'authentification", + "auth_type_api_key": "Clé API Bedrock", + "auth_type_help": "Choisissez entre l'authentification par identifiants IAM ou par clé API Bedrock", + "auth_type_iam": "Identifiants IAM", "description": "AWS Bedrock est un service de modèles de base entièrement géré proposé par Amazon, prenant en charge divers grands modèles linguistiques avancés.", "region": "Région AWS", "region_help": "Votre région de service AWS, par exemple us-east-1", diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index be3fbf90a6..b12587ecf4 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "AWS アクセスキー ID", "access_key_id_help": "あなたの AWS アクセスキー ID は、AWS Bedrock サービスへのアクセスに使用されます", + "api_key": "Bedrock APIキー", + "api_key_help": "認証用のAWS Bedrock APIキー", + "auth_type": "認証タイプ", + "auth_type_api_key": "Bedrock APIキー", + "auth_type_help": "IAM認証情報とBedrock APIキー認証のどちらかを選択してください", + "auth_type_iam": "IAM認証情報", "description": "AWS Bedrock は、Amazon が提供する完全に管理されたベースモデルサービスで、さまざまな最先端の大言語モデルをサポートしています", "region": "AWS リージョン", "region_help": "あなたの AWS サービスリージョン、例:us-east-1", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index 85c6400d0b..7ad1184b15 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "ID da chave de acesso da AWS", "access_key_id_help": "O seu ID da chave de acesso AWS, utilizado para aceder ao serviço AWS Bedrock", + "api_key": "Chave de API do Bedrock", + "api_key_help": "Sua Chave de API AWS Bedrock para autenticação", + "auth_type": "Tipo de Autenticação", + "auth_type_api_key": "Chave de API do Bedrock", + "auth_type_help": "Escolha entre credenciais IAM ou autenticação por chave de API do Bedrock", + "auth_type_iam": "Credenciais IAM", "description": "A AWS Bedrock é um serviço de modelos fundamentais totalmente gerido fornecido pela Amazon, que suporta diversos modelos avançados de linguagem.", "region": "Região da AWS", "region_help": "A sua região de serviço da AWS, por exemplo, us-east-1", diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index 6f1797917d..ecdc0ecef0 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -4260,6 +4260,12 @@ "aws-bedrock": { "access_key_id": "AWS Ключ доступа ID", "access_key_id_help": "Ваш AWS Ключ доступа ID для доступа к AWS Bedrock", + "api_key": "Ключ API Bedrock", + "api_key_help": "Ваш ключ API AWS Bedrock для аутентификации", + "auth_type": "Тип аутентификации", + "auth_type_api_key": "Ключ API Bedrock", + "auth_type_help": "Выберите между аутентификацией с помощью учетных данных IAM или ключа API Bedrock", + "auth_type_iam": "Учетные данные IAM", "description": "AWS Bedrock — это полное управляемое сервисное предложение для моделей, поддерживающее различные современные модели языка", "region": "AWS регион", "region_help": "Ваш регион AWS, например us-east-1", diff --git a/src/renderer/src/pages/paintings/NewApiPage.tsx b/src/renderer/src/pages/paintings/NewApiPage.tsx index 86571f446e..a038a655f6 100644 --- a/src/renderer/src/pages/paintings/NewApiPage.tsx +++ b/src/renderer/src/pages/paintings/NewApiPage.tsx @@ -96,11 +96,14 @@ const NewApiPage: FC<{ Options: string[] }> = ({ Options }) => { return editImageFiles }, [editImageFiles]) - const updatePaintingState = (updates: Partial) => { - const updatedPainting = { ...painting, providerId: newApiProvider.id, ...updates } - setPainting(updatedPainting) - updatePainting(mode, updatedPainting) - } + const updatePaintingState = useCallback( + (updates: Partial) => { + const updatedPainting = { ...painting, providerId: newApiProvider.id, ...updates } + setPainting(updatedPainting) + updatePainting(mode, updatedPainting) + }, + [painting, newApiProvider.id, mode, updatePainting] + ) // ---------------- Model Related Configurations ---------------- // const modelOptions = MODELS.map((m) => ({ label: m.name, value: m.name })) diff --git a/yarn.lock b/yarn.lock index 9415540a0c..c1173958bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9684,25 +9684,7 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^4.3.1": - version: 4.3.1 - resolution: "@smithy/types@npm:4.3.1" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/8b350562b9ed4ff97465025b4ae77a34bb07b9d47fb6f9781755aac9401b0355a63c2fef307393e2dae3fa0277149dd7d83f5bc2a63d4ad3519ea32fd56b5cda - languageName: node - linkType: hard - -"@smithy/types@npm:^4.3.2": - version: 4.3.2 - resolution: "@smithy/types@npm:4.3.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/120c5d38f6362c86e6493cce3b9ca9902cd986dab773b39664ff6a95b787c45481f1b1d230f45a6f5ad0c045fb690dc96b51b9ca7b5e9487714a652ed98231f6 - languageName: node - linkType: hard - -"@smithy/types@npm:^4.7.1": +"@smithy/types@npm:4.7.1": version: 4.7.1 resolution: "@smithy/types@npm:4.7.1" dependencies: From 1103449a4f1d9b8b7ae242736336bc1998307552 Mon Sep 17 00:00:00 2001 From: Phantom Date: Wed, 5 Nov 2025 14:33:07 +0800 Subject: [PATCH 45/83] fix: wrong migration in #10727 (#11151) --- src/renderer/src/store/migrate.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index d4bebf6023..ba9bf21f45 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -2797,9 +2797,21 @@ const migrateConfig = { }, '171': (state: RootState) => { try { - addProvider(state, 'sophnet') - state.llm.providers = moveProvider(state.llm.providers, 'sophnet', 17) - state.settings.defaultPaintingProvider = 'cherryin' + // Ensure aws-bedrock provider exists + addProvider(state, 'aws-bedrock') + + // Ensure awsBedrock settings exist and have all required fields + if (!state.llm.settings.awsBedrock) { + state.llm.settings.awsBedrock = llmInitialState.settings.awsBedrock + } else { + // For users who have awsBedrock but missing new fields (authType and apiKey) + if (!state.llm.settings.awsBedrock.authType) { + state.llm.settings.awsBedrock.authType = 'iam' + } + if (state.llm.settings.awsBedrock.apiKey === undefined) { + state.llm.settings.awsBedrock.apiKey = '' + } + } return state } catch (error) { logger.error('migrate 171 error', error as Error) From 83e4d4363fc069e7477ee06feafa0099dfa87630 Mon Sep 17 00:00:00 2001 From: beyondkmp Date: Thu, 6 Nov 2025 10:43:33 +0800 Subject: [PATCH 46/83] fix: add Perplexity provider support and update API host formatting (#11162) * feat: add Perplexity provider support and update API host formatting - Introduced `isPerplexityProvider` function to identify Perplexity providers. - Updated `formatProviderApiHost` to handle Perplexity provider API host formatting. - Added unit tests for Perplexity provider configuration to ensure correct API host formatting behavior. * fix: add 'perplexity' to unsupported API version providers list --- .../provider/__tests__/providerConfig.test.ts | 80 ++++++++++++++++++- .../src/aiCore/provider/providerConfig.ts | 5 +- src/renderer/src/config/providers.ts | 6 +- 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts b/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts index cc5f20c63e..39786231e6 100644 --- a/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts +++ b/src/renderer/src/aiCore/provider/__tests__/providerConfig.test.ts @@ -39,6 +39,7 @@ vi.mock('@renderer/config/providers', async (importOriginal) => { return { ...actual, isCherryAIProvider: vi.fn(), + isPerplexityProvider: vi.fn(), isAnthropicProvider: vi.fn(() => false), isAzureOpenAIProvider: vi.fn(() => false), isGeminiProvider: vi.fn(() => false), @@ -52,7 +53,7 @@ vi.mock('@renderer/hooks/useVertexAI', () => ({ createVertexProvider: vi.fn() })) -import { isCherryAIProvider } from '@renderer/config/providers' +import { isCherryAIProvider, isPerplexityProvider } from '@renderer/config/providers' import { getProviderByModel } from '@renderer/services/AssistantService' import type { Model, Provider } from '@renderer/types' import { formatApiHost } from '@renderer/utils/api' @@ -97,6 +98,16 @@ const createCherryAIProvider = (): Provider => ({ isSystem: false }) +const createPerplexityProvider = (): Provider => ({ + id: 'perplexity', + type: 'openai', + name: 'Perplexity', + apiKey: 'test-key', + apiHost: 'https://api.perplexity.ai', + models: [], + isSystem: false +}) + describe('Copilot responses routing', () => { beforeEach(() => { ;(globalThis as any).window = { @@ -195,3 +206,70 @@ describe('CherryAI provider configuration', () => { expect(actualProvider.apiHost).toBe('') }) }) + +describe('Perplexity provider configuration', () => { + beforeEach(() => { + ;(globalThis as any).window = { + ...(globalThis as any).window, + keyv: createWindowKeyv() + } + vi.clearAllMocks() + }) + + it('formats Perplexity provider apiHost with false parameter', () => { + const provider = createPerplexityProvider() + const model = createModel('sonar', 'Sonar', 'perplexity') + + // Mock the functions to simulate Perplexity provider detection + vi.mocked(isCherryAIProvider).mockReturnValue(false) + vi.mocked(isPerplexityProvider).mockReturnValue(true) + vi.mocked(getProviderByModel).mockReturnValue(provider) + + // Call getActualProvider which should trigger formatProviderApiHost + const actualProvider = getActualProvider(model) + + // Verify that formatApiHost was called with false as the second parameter + expect(formatApiHost).toHaveBeenCalledWith('https://api.perplexity.ai', false) + expect(actualProvider.apiHost).toBe('https://api.perplexity.ai') + }) + + it('does not format non-Perplexity provider with false parameter', () => { + const provider = { + id: 'openai', + type: 'openai', + name: 'OpenAI', + apiKey: 'test-key', + apiHost: 'https://api.openai.com', + models: [], + isSystem: false + } as Provider + const model = createModel('gpt-4', 'GPT-4', 'openai') + + // Mock the functions to simulate non-Perplexity provider + vi.mocked(isCherryAIProvider).mockReturnValue(false) + vi.mocked(isPerplexityProvider).mockReturnValue(false) + vi.mocked(getProviderByModel).mockReturnValue(provider) + + // Call getActualProvider + const actualProvider = getActualProvider(model) + + // Verify that formatApiHost was called with default parameters (true) + expect(formatApiHost).toHaveBeenCalledWith('https://api.openai.com') + expect(actualProvider.apiHost).toBe('https://api.openai.com/v1') + }) + + it('handles Perplexity provider with empty apiHost', () => { + const provider = createPerplexityProvider() + provider.apiHost = '' + const model = createModel('sonar', 'Sonar', 'perplexity') + + vi.mocked(isCherryAIProvider).mockReturnValue(false) + vi.mocked(isPerplexityProvider).mockReturnValue(true) + vi.mocked(getProviderByModel).mockReturnValue(provider) + + const actualProvider = getActualProvider(model) + + expect(formatApiHost).toHaveBeenCalledWith('', false) + expect(actualProvider.apiHost).toBe('') + }) +}) diff --git a/src/renderer/src/aiCore/provider/providerConfig.ts b/src/renderer/src/aiCore/provider/providerConfig.ts index 4669d4c851..7f279a3898 100644 --- a/src/renderer/src/aiCore/provider/providerConfig.ts +++ b/src/renderer/src/aiCore/provider/providerConfig.ts @@ -11,7 +11,8 @@ import { isAzureOpenAIProvider, isCherryAIProvider, isGeminiProvider, - isNewApiProvider + isNewApiProvider, + isPerplexityProvider } from '@renderer/config/providers' import { getAwsBedrockAccessKeyId, @@ -103,6 +104,8 @@ function formatProviderApiHost(provider: Provider): Provider { formatted.apiHost = formatVertexApiHost(formatted) } else if (isCherryAIProvider(formatted)) { formatted.apiHost = formatApiHost(formatted.apiHost, false) + } else if (isPerplexityProvider(formatted)) { + formatted.apiHost = formatApiHost(formatted.apiHost, false) } else { formatted.apiHost = formatApiHost(formatted.apiHost) } diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 5fbae73dbf..50b0dbaece 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -1490,6 +1490,10 @@ export function isCherryAIProvider(provider: Provider): boolean { return provider.id === 'cherryai' } +export function isPerplexityProvider(provider: Provider): boolean { + return provider.id === 'perplexity' +} + /** * 判断是否为 OpenAI 兼容的提供商 * @param {Provider} provider 提供商对象 @@ -1515,7 +1519,7 @@ export function isGeminiProvider(provider: Provider): boolean { return provider.type === 'gemini' } -const NOT_SUPPORT_API_VERSION_PROVIDERS = ['github', 'copilot'] as const satisfies SystemProviderId[] +const NOT_SUPPORT_API_VERSION_PROVIDERS = ['github', 'copilot', 'perplexity'] as const satisfies SystemProviderId[] export const isSupportAPIVersionProvider = (provider: Provider) => { if (isSystemProvider(provider)) { From 816a92c6094d1ec221c3c2d10fc90e81bd70c84a Mon Sep 17 00:00:00 2001 From: Jake Jia <87770044+Phoen1xCode@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:46:42 +0800 Subject: [PATCH 47/83] feat(app-menu): add full i18n support and sync lanuage with app language settings (#11131) Previously, the macOS menu bar was always displayed in English regardless of system language or in-app language settings. This change enables the menu bar to dynamically follow the application's language preference. Key changes: - Add language change listener to automatically update menu when user switches language - Refactor AppMenuService with proper subscription management and cleanup - Add appMenu translations for en-us, zh-cn, and zh-tw locales - Implement destroy method to prevent memory leaks from config subscriptions - Convert all menu items (File, Edit, View, Window, Help) to use localized labels The menu bar now respects the in-app language setting and updates in real-time when users change their preferences, providing a consistent multilingual experience. --- src/main/services/AppMenuService.ts | 77 +++++++++++++++++++----- src/renderer/src/i18n/locales/en-us.json | 35 +++++++++++ src/renderer/src/i18n/locales/zh-cn.json | 35 +++++++++++ src/renderer/src/i18n/locales/zh-tw.json | 35 +++++++++++ 4 files changed, 166 insertions(+), 16 deletions(-) diff --git a/src/main/services/AppMenuService.ts b/src/main/services/AppMenuService.ts index abb494f707..b3a9de01d0 100644 --- a/src/main/services/AppMenuService.ts +++ b/src/main/services/AppMenuService.ts @@ -7,16 +7,33 @@ import { app, Menu, shell } from 'electron' import { configManager } from './ConfigManager' export class AppMenuService { + private languageChangeCallback?: (newLanguage: string) => void + + constructor() { + // Subscribe to language change events + this.languageChangeCallback = () => { + this.setupApplicationMenu() + } + configManager.subscribe('language', this.languageChangeCallback) + } + + public destroy(): void { + // Clean up subscription to prevent memory leaks + if (this.languageChangeCallback) { + configManager.unsubscribe('language', this.languageChangeCallback) + } + } + public setupApplicationMenu(): void { const locale = locales[configManager.getLanguage()] - const { common } = locale.translation + const { appMenu } = locale.translation const template: MenuItemConstructorOptions[] = [ { label: app.name, submenu: [ { - label: common.about + ' ' + app.name, + label: appMenu.about + ' ' + app.name, click: () => { // Emit event to navigate to About page const mainWindow = windowService.getMainWindow() @@ -27,50 +44,78 @@ export class AppMenuService { } }, { type: 'separator' }, - { role: 'services' }, + { role: 'services', label: appMenu.services }, { type: 'separator' }, - { role: 'hide' }, - { role: 'hideOthers' }, - { role: 'unhide' }, + { role: 'hide', label: `${appMenu.hide} ${app.name}` }, + { role: 'hideOthers', label: appMenu.hideOthers }, + { role: 'unhide', label: appMenu.unhide }, { type: 'separator' }, - { role: 'quit' } + { role: 'quit', label: `${appMenu.quit} ${app.name}` } ] }, { - role: 'fileMenu' + label: appMenu.file, + submenu: [{ role: 'close', label: appMenu.close }] }, { - role: 'editMenu' + label: appMenu.edit, + submenu: [ + { role: 'undo', label: appMenu.undo }, + { role: 'redo', label: appMenu.redo }, + { type: 'separator' }, + { role: 'cut', label: appMenu.cut }, + { role: 'copy', label: appMenu.copy }, + { role: 'paste', label: appMenu.paste }, + { role: 'delete', label: appMenu.delete }, + { role: 'selectAll', label: appMenu.selectAll } + ] }, { - role: 'viewMenu' + label: appMenu.view, + submenu: [ + { role: 'reload', label: appMenu.reload }, + { role: 'forceReload', label: appMenu.forceReload }, + { role: 'toggleDevTools', label: appMenu.toggleDevTools }, + { type: 'separator' }, + { role: 'resetZoom', label: appMenu.resetZoom }, + { role: 'zoomIn', label: appMenu.zoomIn }, + { role: 'zoomOut', label: appMenu.zoomOut }, + { type: 'separator' }, + { role: 'togglefullscreen', label: appMenu.toggleFullscreen } + ] }, { - role: 'windowMenu' + label: appMenu.window, + submenu: [ + { role: 'minimize', label: appMenu.minimize }, + { role: 'zoom', label: appMenu.zoom }, + { type: 'separator' }, + { role: 'front', label: appMenu.front } + ] }, { - role: 'help', + label: appMenu.help, submenu: [ { - label: 'Website', + label: appMenu.website, click: () => { shell.openExternal('https://cherry-ai.com') } }, { - label: 'Documentation', + label: appMenu.documentation, click: () => { shell.openExternal('https://cherry-ai.com/docs') } }, { - label: 'Feedback', + label: appMenu.feedback, click: () => { shell.openExternal('https://github.com/CherryHQ/cherry-studio/issues/new/choose') } }, { - label: 'Releases', + label: appMenu.releases, click: () => { shell.openExternal('https://github.com/CherryHQ/cherry-studio/releases') } diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 36ce60edb6..e851242559 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -339,6 +339,41 @@ }, "title": "API Server" }, + "appMenu": { + "about": "About", + "close": "Close Window", + "copy": "Copy", + "cut": "Cut", + "delete": "Delete", + "documentation": "Documentation", + "edit": "Edit", + "feedback": "Feedback", + "file": "File", + "forceReload": "Force Reload", + "front": "Bring All to Front", + "help": "Help", + "hide": "Hide", + "hideOthers": "Hide Others", + "minimize": "Minimize", + "paste": "Paste", + "quit": "Quit", + "redo": "Redo", + "releases": "Releases", + "reload": "Reload", + "resetZoom": "Actual Size", + "selectAll": "Select All", + "services": "Services", + "toggleDevTools": "Toggle Developer Tools", + "toggleFullscreen": "Toggle Fullscreen", + "undo": "Undo", + "unhide": "Show All", + "view": "View", + "website": "Website", + "window": "Window", + "zoom": "Zoom", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out" + }, "assistants": { "abbr": "Assistants", "clear": { diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 0acb816a1c..9174938a8e 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -339,6 +339,41 @@ }, "title": "API 服务器" }, + "appMenu": { + "about": "关于", + "close": "关闭窗口", + "copy": "复制", + "cut": "剪切", + "delete": "删除", + "documentation": "文档", + "edit": "编辑", + "feedback": "反馈", + "file": "文件", + "forceReload": "强制重新加载", + "front": "全部置于顶层", + "help": "帮助", + "hide": "隐藏", + "hideOthers": "隐藏其他", + "minimize": "最小化", + "paste": "粘贴", + "quit": "退出", + "redo": "重做", + "releases": "版本发布", + "reload": "重新加载", + "resetZoom": "实际大小", + "selectAll": "全选", + "services": "服务", + "toggleDevTools": "切换开发者工具", + "toggleFullscreen": "切换全屏", + "undo": "撤销", + "unhide": "全部显示", + "view": "视图", + "website": "网站", + "window": "窗口", + "zoom": "缩放", + "zoomIn": "放大", + "zoomOut": "缩小" + }, "assistants": { "abbr": "助手", "clear": { diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 913a4de5ad..01fc28df0d 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -339,6 +339,41 @@ }, "title": "API 伺服器" }, + "appMenu": { + "about": "關於", + "close": "關閉視窗", + "copy": "複製", + "cut": "剪下", + "delete": "刪除", + "documentation": "文件", + "edit": "編輯", + "feedback": "回饋", + "file": "檔案", + "forceReload": "強制重新載入", + "front": "全部置於頂層", + "help": "幫助", + "hide": "隱藏", + "hideOthers": "隱藏其他", + "minimize": "最小化", + "paste": "貼上", + "quit": "結束", + "redo": "重做", + "releases": "版本發布", + "reload": "重新載入", + "resetZoom": "實際大小", + "selectAll": "全選", + "services": "服務", + "toggleDevTools": "切換開發者工具", + "toggleFullscreen": "切換全螢幕", + "undo": "復原", + "unhide": "全部顯示", + "view": "檢視", + "website": "網站", + "window": "視窗", + "zoom": "縮放", + "zoomIn": "放大", + "zoomOut": "縮小" + }, "assistants": { "abbr": "助手", "clear": { From 76483d828e4aebcc592b2d3ccf2d58726768378c Mon Sep 17 00:00:00 2001 From: Phantom Date: Thu, 6 Nov 2025 18:25:04 +0800 Subject: [PATCH 48/83] ci(i18n): change auto i18n workflow to run weekly (#11152) * ci(i18n): change auto i18n workflow to run weekly Update the workflow to run on a weekly schedule instead of on pull request events. Also simplify the workflow by using yarn for dependency management and create a PR for changes instead of committing directly to the branch. * ci(github-actions): improve workflow step names with emojis Use emojis in step names to enhance readability and visual scanning of workflow logs * ci(workflow): prevent committing package.json and yarn.lock changes in i18n workflow --- .github/workflows/auto-i18n.yml | 85 +++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 30 deletions(-) diff --git a/.github/workflows/auto-i18n.yml b/.github/workflows/auto-i18n.yml index 1a85b16757..1584ab48db 100644 --- a/.github/workflows/auto-i18n.yml +++ b/.github/workflows/auto-i18n.yml @@ -1,4 +1,4 @@ -name: Auto I18N +name: Auto I18N Weekly env: TRANSLATION_API_KEY: ${{ secrets.TRANSLATE_API_KEY }} @@ -7,14 +7,15 @@ env: TRANSLATION_BASE_LOCALE: ${{ vars.AUTO_I18N_BASE_LOCALE || 'en-us'}} on: - pull_request: - types: [opened, synchronize, reopened] + schedule: + # Runs at 00:00 UTC every Sunday. + # This corresponds to 08:00 AM UTC+8 (Beijing time) every Sunday. + - cron: "0 0 * * 0" workflow_dispatch: jobs: auto-i18n: runs-on: ubuntu-latest - if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.full_name == 'CherryHQ/cherry-studio' name: Auto I18N permissions: contents: write @@ -24,45 +25,69 @@ jobs: - name: 🐈‍⬛ Checkout uses: actions/checkout@v5 with: - ref: ${{ github.event.pull_request.head.ref }} + fetch-depth: 0 - name: 📦 Setting Node.js uses: actions/setup-node@v6 with: node-version: 22 - package-manager-cache: false - - name: 📦 Install dependencies in isolated directory + - name: 📦 Install corepack + run: corepack enable && corepack prepare yarn@4.9.1 --activate + + - name: 📂 Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT + + - name: 💾 Cache yarn dependencies + uses: actions/cache@v4 + with: + path: | + ${{ steps.yarn-cache-dir-path.outputs.dir }} + node_modules + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: 📦 Install dependencies run: | - # 在临时目录安装依赖 - mkdir -p /tmp/translation-deps - cd /tmp/translation-deps - echo '{"dependencies": {"@cherrystudio/openai": "^6.5.0", "cli-progress": "^3.12.0", "tsx": "^4.20.3", "@biomejs/biome": "2.2.4"}}' > package.json - npm install --no-package-lock - - # 设置 NODE_PATH 让项目能找到这些依赖 - echo "NODE_PATH=/tmp/translation-deps/node_modules" >> $GITHUB_ENV + yarn install - name: 🏃‍♀️ Translate - run: npx tsx scripts/sync-i18n.ts && npx tsx scripts/auto-translate-i18n.ts + run: yarn sync:i18n && yarn auto:i18n - name: 🔍 Format - run: cd /tmp/translation-deps && npx biome format --config-path /home/runner/work/cherry-studio/cherry-studio/biome.jsonc --write /home/runner/work/cherry-studio/cherry-studio/src/renderer/src/i18n/ + run: yarn format - - name: 🔄 Commit changes + - name: 🔍 Check for changes + id: git_status run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git add . + # Check if there are any uncommitted changes git reset -- package.json yarn.lock # 不提交 package.json 和 yarn.lock 的更改 - if git diff --cached --quiet; then - echo "No changes to commit" - else - git commit -m "fix(i18n): Auto update translations for PR #${{ github.event.pull_request.number }}" - fi + git diff --exit-code --quiet || echo "::set-output name=has_changes::true" + git status --porcelain - - name: 🚀 Push changes - uses: ad-m/github-push-action@master + - name: 📅 Set current date for PR title + id: set_date + run: echo "CURRENT_DATE=$(date +'%b %d, %Y')" >> $GITHUB_ENV # e.g., "Jun 06, 2024" + + - name: 🚀 Create Pull Request if changes exist + if: steps.git_status.outputs.has_changes == 'true' + uses: peter-evans/create-pull-request@v6 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: ${{ github.event.pull_request.head.ref }} + token: ${{ secrets.GITHUB_TOKEN }} # Use the built-in GITHUB_TOKEN for bot actions + commit-message: "feat(bot): Weekly automated script run" + title: "🤖 Weekly Automated Update: ${{ env.CURRENT_DATE }}" + body: | + This PR includes changes generated by the weekly auto i18n. + Review the changes before merging. + + --- + _Generated by the automated weekly workflow_ + branch: "auto-i18n-weekly-${{ github.run_id }}" # Unique branch name + base: "main" # Or 'develop', set your base branch + delete-branch: true # Delete the branch after merging or closing the PR + + - name: 📢 Notify if no changes + if: steps.git_status.outputs.has_changes != 'true' + run: echo "Bot script ran, but no changes were detected. No PR created." From 78278ce96d72eaa2bdb62ec115cc872ee25227e4 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 6 Nov 2025 18:04:26 +0800 Subject: [PATCH 49/83] refactor: remove heroui commit 7c8bf8b591aaff90655b1453e3fac6e51b8b3426 Author: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Thu Nov 6 17:59:38 2025 +0800 fix: add token usage to agent session message commit ff8e5ddd27c94eea87fc8cb50b31033f94e81b68 Author: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Thu Nov 6 17:25:54 2025 +0800 fix: close prompt stream when finish or error chunk received commit 530e6516fd029494b04e2ebfac041b4074e02a74 Author: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Thu Nov 6 17:19:53 2025 +0800 chore: code cleanup commit ab21c0d56c4d3bc78037d2f2cb419c173679650c Author: kangfenmao Date: Thu Nov 6 16:13:36 2025 +0800 feat(SessionItem): implement auto-rename feature for sessions and improve context menu handling - Added a new context menu option to automatically rename sessions based on topics. - Introduced useDeferredValue for managing target session state. - Updated imports to include necessary thunk actions and components. - Enhanced API service to handle optional assistant model in message summary fetching. - Exported renameAgentSessionIfNeeded function for better accessibility in the store. commit 21ea8ccf372f3c08de6402298d54e3b996259653 Merge: ab7b207d2 816a92c60 Author: kangfenmao Date: Thu Nov 6 15:29:09 2025 +0800 Merge branch 'main' of github.com:CherryHQ/cherry-studio into refactor/heroui-antd # Conflicts: # src/renderer/src/pages/home/Tabs/components/AddButton.tsx # src/renderer/src/pages/home/Tabs/components/SessionItem.tsx # src/renderer/src/pages/home/Tabs/components/Sessions.tsx # src/renderer/src/pages/home/Tabs/components/Topics.tsx # src/renderer/src/pages/paintings/NewApiPage.tsx commit ab7b207d295dbfed5971b3976bad54578ceeeae1 Author: kangfenmao Date: Thu Nov 6 14:50:05 2025 +0800 refactor: streamline event listener management in useAppInit and update ToolPermissionRequestCard styling commit 3834c5d4021afad2c5b755e180f260863255dc7f Author: kangfenmao Date: Thu Nov 6 14:21:25 2025 +0800 refactor: enhance API server state management and remove unused initialization in useAppInit commit a64b94a41f15bcfe93e7641fc28dcf703ca08ffd Author: kangfenmao Date: Thu Nov 6 13:21:58 2025 +0800 refactor: update OpenAPI documentation paths to include subdirectories for better route coverage commit 2e0ff28505c4372e14aff8ba33eae4f5310939f3 Author: kangfenmao Date: Thu Nov 6 12:26:09 2025 +0800 refactor: center align columns in InstalledPluginsList and set AntTable size to small commit 84bf94e2ff3c3783ac08ff5e70d2b7b243073c6c Author: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Thu Nov 6 12:06:09 2025 +0800 refactor: align create agent model selection with edit agent commit 84f22815063dddc76bd6efa6b9fba05322fffe5c Author: kangfenmao Date: Thu Nov 6 11:29:32 2025 +0800 refactor: integrate API server functionality into various components and enhance user notifications commit 4e01210df4b6bff43b05da9636c7e396664e9c72 Author: kangfenmao Date: Thu Nov 6 10:56:38 2025 +0800 refactor: replace ContextMenu with Dropdown in AgentItem and SessionItem components for improved context menu handling commit 9df38c7e8376f83087aebcf0a0dc842729afe11f Author: kangfenmao Date: Thu Nov 6 10:27:30 2025 +0800 refactor: update AddButton styling to use CSS variable for border radius and remove unused settings hook commit 251c269ab3cb053682d7219385e90093138cd643 Author: kangfenmao Date: Thu Nov 6 10:11:21 2025 +0800 refactor: remove unused error handling alerts from AssistantsTab component commit 9b9640d8d150b559ec57e211b0f9140d63a89c76 Author: kangfenmao Date: Thu Nov 6 10:07:26 2025 +0800 refactor: adjust margin styling for UnifiedAddButton component commit edd6b11aa7955459f78a11f8b539528cbdff8b19 Author: kangfenmao Date: Thu Nov 6 10:04:01 2025 +0800 refactor: update AddButton styling based on topic position and clean up CSS for root element commit 1c0de625d8018c7073f91483592795a89674422f Author: kangfenmao Date: Thu Nov 6 09:56:42 2025 +0800 fix: update assistant addition messages for multiple languages commit 0ea4dd4e3a51adae81b6d7fd46b3fea29e5bd58a Author: dev Date: Wed Nov 5 21:01:24 2025 +0800 fix: init message api err commit f3bbd4ed449ad91dca618b118dd44532904579ac Author: dev Date: Wed Nov 5 20:42:49 2025 +0800 refactor: remove heroui commit d01609fc367cc58c5c95fd9eda598112ff87c747 Author: dev Date: Wed Nov 5 19:08:41 2025 +0800 refactor: migrate heroui/toast to antd message commit f4b14dfc105a1e86b38eb4c6eb141b98d33b8453 Author: kangfenmao Date: Wed Nov 5 18:51:29 2025 +0800 refactor: enhance Sessions component layout with styled Scrollbar and adjust UnifiedAddButton margins commit 6ae5f6916389a3b0d8c79da9e0eb70233c97df54 Author: kangfenmao Date: Wed Nov 5 18:44:13 2025 +0800 refactor: update PluginSettings and ToolingSettings for improved layout and functionality commit fcb002078734961a43e11ebe3d1d72e7d1844840 Author: kangfenmao Date: Wed Nov 5 18:29:52 2025 +0800 wip commit 02265f369e1b7b22307a4cd8422564a783bf9f12 Author: dev Date: Wed Nov 5 17:26:39 2025 +0800 fix: error block related commit 5e22d9d36fa6eaae0b5700353a25c5b30059570e Author: dev Date: Wed Nov 5 17:14:25 2025 +0800 fix: note head nav related commit 3f52b7766a3157d010dc8d06d742bf7de86e4e76 Author: dev Date: Wed Nov 5 16:45:49 2025 +0800 chore: remove dead code commit 484622f12bd0687c7d5a482c2c934ed1a06a7cf0 Author: dev Date: Wed Nov 5 16:43:12 2025 +0800 chore: remove dead code commit 2bceb302e08378e03720b8915649787f22494590 Author: dev Date: Wed Nov 5 15:33:25 2025 +0800 fix: tool setting related commit 5c455f25eb1eaceb72951d0b74137b3e9b77b4a1 Author: dev Date: Wed Nov 5 13:59:33 2025 +0800 chore: remove dead code commit d1d1dbc046fd0d1e2e4a5a576be282d935ef37e8 Author: dev Date: Wed Nov 5 13:51:41 2025 +0800 fix: tool permission card related commit bf4ec23ef79aec2e4a3648eb745ad3def92a00e9 Author: dev Date: Wed Nov 5 12:22:53 2025 +0800 fix: remove button and modal renaming commit 47db5baeb1a232946a419620d0e1374f848029c6 Author: dev Date: Wed Nov 5 12:20:36 2025 +0800 fix: plugin setting related commit 81fecce552d79e1f5650e3851136588ed169c53c Author: kangfenmao Date: Wed Nov 5 12:16:42 2025 +0800 refactor: enhance ChatNavbarContent structure by replacing Breadcrumbs with custom layout and adding separators commit fc64b6c6115d1ed51ceefea301d3ded573ae43cb Author: kangfenmao Date: Wed Nov 5 12:10:48 2025 +0800 refactor: simplify MessageAgentTools component structure by removing unnecessary wrapper div commit e0f383a050e2157a399a27f103d42f63f707efd2 Author: kangfenmao Date: Wed Nov 5 12:08:32 2025 +0800 fix: update button classes in AddAssistantOrAgentPopup for improved cursor behavior commit 720284262ffb35fe187284306e5d0d5f68095e6e Author: kangfenmao Date: Wed Nov 5 12:06:58 2025 +0800 refactor: update AgentModal to use TopView for improved modal management and enhance form structure commit b334a2c5be4f7caa61d6885a7782e2f317b64f56 Author: kangfenmao Date: Wed Nov 5 11:40:47 2025 +0800 refactor: replace UpdateDialog with UpdateDialogPopup for better modal handling commit 468aebd632739a37e5c91c0957fb0ec44264a915 Author: dev Date: Wed Nov 5 10:56:40 2025 +0800 fix: plugins related wip commit bd4a979f6208f980b180fed0b8acab53af28b6e7 Author: dev Date: Tue Nov 4 17:46:14 2025 +0800 fix: add button related commit b3316a4dc831be038699777d433cd76c24f91377 Author: dev Date: Tue Nov 4 17:18:31 2025 +0800 fix: agent tool result related components commit 6ca7597a988d3c61a137da77e8d3625b47a06ac0 Author: dev Date: Tue Nov 4 11:12:01 2025 +0800 fix: lint commit 7d0f0b38a66ac92f7a9c8e1c7431efd665b55df0 Author: kangfenmao Date: Tue Nov 4 09:56:32 2025 +0800 wip commit 96a607a41042bf8edfb89d9bdcc0305e2f648b0c Author: kangfenmao Date: Mon Nov 3 20:23:25 2025 +0800 wip commit 235ad16252b4a3e25c6e708001a8d55555855be0 Author: kangfenmao Date: Mon Nov 3 20:08:45 2025 +0800 wip commit f23fe1b9e91cc8c347e15d9e32dafde34690d15c Author: kangfenmao Date: Mon Nov 3 19:15:01 2025 +0800 wip commit 28fac543fca703e065cd75e6db7f85454c61a1dd Author: kangfenmao Date: Mon Nov 3 18:39:39 2025 +0800 wip commit 3cc7ee01e296d86f00f66feba7eb34057779ad9a Author: kangfenmao Date: Mon Nov 3 17:33:13 2025 +0800 wip commit 37bdf9e508e72b5ce194e693af55164507ac9e34 Author: kangfenmao Date: Sat Nov 1 19:16:58 2025 +0800 wip commit 1bf5104f97b1e59006a06cd7cca255b3463d6962 Author: kangfenmao Date: Sat Nov 1 12:12:01 2025 +0800 wip --- CLAUDE.md | 2 - package.json | 2 +- src/main/apiServer/middleware/openapi.ts | 2 +- .../agents/services/claudecode/index.ts | 10 + src/renderer/src/App.tsx | 35 +- src/renderer/src/assets/styles/index.css | 4 +- src/renderer/src/assets/styles/tailwind.css | 9 - src/renderer/src/components/ApiModelLabel.tsx | 31 - .../Avatar/EmojiAvatarWithPicker.tsx | 13 +- .../components/Buttons/ActionIconButton.tsx | 2 +- src/renderer/src/components/ConfirmDialog.tsx | 26 +- src/renderer/src/components/ErrorBoundary.tsx | 6 +- .../HorizontalScrollContainer/index.tsx | 2 +- .../Popups/AddAssistantOrAgentPopup.tsx | 6 +- .../Popups/ExportToPhoneLanPopup.tsx | 179 +- .../components/Popups/UpdateDialogPopup.tsx | 205 ++ .../components/Popups/agent/AgentModal.tsx | 596 ++-- .../components/Popups/agent/SessionModal.tsx | 320 -- .../src/components/Popups/agent/shared.tsx | 45 - src/renderer/src/components/ToastPortal.tsx | 32 - src/renderer/src/components/TopView/index.tsx | 9 +- src/renderer/src/components/TopView/toast.ts | 72 - src/renderer/src/components/TopView/toast.tsx | 231 ++ src/renderer/src/components/UpdateDialog.tsx | 101 - .../components/agent/AllowedToolsSelect.tsx | 55 - src/renderer/src/components/agent/index.tsx | 1 - src/renderer/src/context/HeroUIProvider.tsx | 13 - src/renderer/src/env.d.ts | 14 +- src/renderer/src/hero.ts | 2 - src/renderer/src/hooks/agents/useAgents.ts | 1 + src/renderer/src/hooks/useApiServer.ts | 17 +- src/renderer/src/hooks/useAppInit.ts | 11 +- src/renderer/src/hooks/useUserTheme.ts | 12 - src/renderer/src/i18n/locales/zh-cn.json | 2 +- src/renderer/src/i18n/locales/zh-tw.json | 2 +- src/renderer/src/i18n/translate/de-de.json | 2 +- src/renderer/src/i18n/translate/el-gr.json | 2 +- src/renderer/src/i18n/translate/ja-jp.json | 2 +- src/renderer/src/pages/home/Chat.tsx | 21 +- .../home/Inputbar/AgentSessionInputbar.tsx | 13 +- .../pages/home/Messages/Blocks/ErrorBlock.tsx | 14 +- .../home/Messages/Blocks/PlaceholderBlock.tsx | 4 +- .../src/pages/home/Messages/Message.tsx | 3 +- .../MessageAgentTools/BashOutputTool.tsx | 158 +- .../Tools/MessageAgentTools/BashTool.tsx | 36 +- .../Tools/MessageAgentTools/EditTool.tsx | 39 +- .../MessageAgentTools/ExitPlanModeTool.tsx | 35 +- .../Tools/MessageAgentTools/GlobTool.tsx | 37 +- .../Tools/MessageAgentTools/GrepTool.tsx | 47 +- .../Tools/MessageAgentTools/MultiEditTool.tsx | 36 +- .../MessageAgentTools/NotebookEditTool.tsx | 32 +- .../Tools/MessageAgentTools/ReadTool.tsx | 37 +- .../Tools/MessageAgentTools/SearchTool.tsx | 37 +- .../Tools/MessageAgentTools/SkillTool.tsx | 23 +- .../Tools/MessageAgentTools/TaskTool.tsx | 35 +- .../Tools/MessageAgentTools/TodoWriteTool.tsx | 77 +- .../MessageAgentTools/UnknownToolRenderer.tsx | 33 +- .../Tools/MessageAgentTools/WebFetchTool.tsx | 24 +- .../Tools/MessageAgentTools/WebSearchTool.tsx | 37 +- .../Tools/MessageAgentTools/WriteTool.tsx | 22 +- .../Tools/MessageAgentTools/index.tsx | 43 +- .../Tools/ToolPermissionRequestCard.tsx | 50 +- .../src/pages/home/Tabs/AssistantsTab.tsx | 38 +- .../pages/home/Tabs/SessionSettingsTab.tsx | 8 +- .../src/pages/home/Tabs/SessionsTab.tsx | 15 +- .../pages/home/Tabs/components/AddButton.tsx | 38 +- .../pages/home/Tabs/components/AgentItem.tsx | 92 +- .../home/Tabs/components/AssistantItem.tsx | 3 +- .../home/Tabs/components/SessionItem.tsx | 311 +- .../pages/home/Tabs/components/Sessions.tsx | 24 +- .../home/Tabs/components/SessionsSection.tsx | 0 .../pages/home/Tabs/components/TagGroup.tsx | 2 +- .../src/pages/home/Tabs/components/Topics.tsx | 356 +- .../home/Tabs/components/UnifiedAddButton.tsx | 40 +- .../src/pages/home/Tabs/components/shared.tsx | 131 - src/renderer/src/pages/home/Tabs/index.tsx | 9 +- .../home/components/ChatNavbarContent.tsx | 64 +- .../components/SelectAgentBaseModelButton.tsx | 72 +- .../pages/home/components/UpdateAppButton.tsx | 12 +- .../minapps/components/WebviewSearch.tsx | 69 +- src/renderer/src/pages/notes/HeaderNavbar.tsx | 79 +- .../paintings/components/ProviderSelect.tsx | 60 +- .../src/pages/settings/AboutSettings.tsx | 12 +- .../AgentSettings/AccessibleDirsSetting.tsx | 18 +- .../AgentSettings/AdvancedSettings.tsx | 37 +- .../AgentSettings/AgentSettingsPopup.tsx | 22 +- .../AgentSettings/DescriptionSetting.tsx | 9 +- .../AgentSettings/EssentialSettings.tsx | 4 +- .../settings/AgentSettings/NameSetting.tsx | 7 +- .../settings/AgentSettings/PluginSettings.tsx | 142 +- .../AgentSettings/SessionSettingsPopup.tsx | 21 +- .../AgentSettings/ToolingSettings.tsx | 285 +- .../components/InstalledPluginsList.tsx | 116 +- .../components/PluginBrowser.tsx | 153 +- .../AgentSettings/components/PluginCard.tsx | 72 +- .../components/PluginDetailModal.tsx | 367 +- .../pages/settings/AgentSettings/shared.tsx | 2 +- .../settings/DataSettings/DataSettings.tsx | 47 +- .../DocProcessSettings/OcrImageSettings.tsx | 49 +- .../ApiServerSettings/ApiServerSettings.tsx | 7 +- .../src/pages/translate/TranslateSettings.tsx | 31 +- src/renderer/src/services/ApiService.ts | 2 +- src/renderer/src/store/runtime.ts | 8 +- src/renderer/src/store/thunk/messageThunk.ts | 2 +- src/renderer/src/ui/context-menu.tsx | 2 +- src/renderer/src/utils/dataLimit.ts | 6 +- src/renderer/src/utils/style.ts | 6 + .../src/windows/mini/MiniWindowApp.tsx | 27 +- .../windows/selection/action/entryPoint.tsx | 23 +- yarn.lock | 2976 +---------------- 110 files changed, 3053 insertions(+), 5792 deletions(-) delete mode 100644 src/renderer/src/components/ApiModelLabel.tsx create mode 100644 src/renderer/src/components/Popups/UpdateDialogPopup.tsx delete mode 100644 src/renderer/src/components/Popups/agent/SessionModal.tsx delete mode 100644 src/renderer/src/components/ToastPortal.tsx delete mode 100644 src/renderer/src/components/TopView/toast.ts create mode 100644 src/renderer/src/components/TopView/toast.tsx delete mode 100644 src/renderer/src/components/UpdateDialog.tsx delete mode 100644 src/renderer/src/components/agent/AllowedToolsSelect.tsx delete mode 100644 src/renderer/src/components/agent/index.tsx delete mode 100644 src/renderer/src/context/HeroUIProvider.tsx delete mode 100644 src/renderer/src/hero.ts delete mode 100644 src/renderer/src/pages/home/Tabs/components/SessionsSection.tsx delete mode 100644 src/renderer/src/pages/home/Tabs/components/shared.tsx diff --git a/CLAUDE.md b/CLAUDE.md index 2716815ba2..0728605824 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,7 +7,6 @@ This file provides guidance to AI coding assistants when working with code in th - **Keep it clear**: Write code that is easy to read, maintain, and explain. - **Match the house style**: Reuse existing patterns, naming, and conventions. - **Search smart**: Prefer `ast-grep` for semantic queries; fall back to `rg`/`grep` when needed. -- **Build with HeroUI**: Use HeroUI for every new UI component; never add `antd` or `styled-components`. - **Log centrally**: Route all logging through `loggerService` with the right context—no `console.log`. - **Research via subagent**: Lean on `subagent` for external docs, APIs, news, and references. - **Always propose before executing**: Before making any changes, clearly explain your planned approach and wait for explicit user approval to ensure alignment and prevent unwanted modifications. @@ -41,7 +40,6 @@ This file provides guidance to AI coding assistants when working with code in th - **Services** (`src/main/services/`): MCPService, KnowledgeService, WindowService, etc. - **Build System**: Electron-Vite with experimental rolldown-vite, yarn workspaces. - **State Management**: Redux Toolkit (`src/renderer/src/store/`) for predictable state. -- **UI Components**: HeroUI (`@heroui/*`) for all new UI elements. ### Logging ```typescript diff --git a/package.json b/package.json index c4259a85a1..5c41f0df65 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,6 @@ "@eslint/js": "^9.22.0", "@google/genai": "patch:@google/genai@npm%3A1.0.1#~/.yarn/patches/@google-genai-npm-1.0.1-e26f0f9af7.patch", "@hello-pangea/dnd": "^18.0.1", - "@heroui/react": "^2.8.3", "@kangfenmao/keyv-storage": "^0.1.0", "@langchain/community": "^1.0.0", "@langchain/core": "patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch", @@ -349,6 +348,7 @@ "striptags": "^3.2.0", "styled-components": "^6.1.11", "swr": "^2.3.6", + "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.13", "tar": "^7.4.3", "tiny-pinyin": "^1.3.2", diff --git a/src/main/apiServer/middleware/openapi.ts b/src/main/apiServer/middleware/openapi.ts index c136fecdde..ff01005bd9 100644 --- a/src/main/apiServer/middleware/openapi.ts +++ b/src/main/apiServer/middleware/openapi.ts @@ -171,7 +171,7 @@ const swaggerOptions: swaggerJSDoc.Options = { } ] }, - apis: ['./src/main/apiServer/routes/*.ts', './src/main/apiServer/app.ts'] + apis: ['./src/main/apiServer/routes/**/*.ts', './src/main/apiServer/app.ts'] } export function setupOpenAPIDocumentation(app: Express) { diff --git a/src/main/services/agents/services/claudecode/index.ts b/src/main/services/agents/services/claudecode/index.ts index c9a8c677cd..4e20520017 100644 --- a/src/main/services/agents/services/claudecode/index.ts +++ b/src/main/services/agents/services/claudecode/index.ts @@ -365,6 +365,16 @@ class ClaudeCodeService implements AgentServiceInterface { type: 'chunk', chunk }) + + // Close prompt stream when SDK signals completion or error + if (chunk.type === 'finish' || chunk.type === 'error') { + logger.info('Closing prompt stream as SDK signaled completion', { + chunkType: chunk.type, + reason: chunk.type === 'finish' ? 'finished' : 'error_occurred' + }) + closePromptStream() + logger.info('Prompt stream closed successfully') + } } } diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 78396c49e7..703015e30e 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -6,11 +6,9 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { Provider } from 'react-redux' import { PersistGate } from 'redux-persist/integration/react' -import { ToastPortal } from './components/ToastPortal' import TopViewContainer from './components/TopView' import AntdProvider from './context/AntdProvider' import { CodeStyleProvider } from './context/CodeStyleProvider' -import { HeroUIProvider } from './context/HeroUIProvider' import { NotificationProvider } from './context/NotificationProvider' import StyleSheetManager from './context/StyleSheetManager' import { ThemeProvider } from './context/ThemeProvider' @@ -34,24 +32,21 @@ function App(): React.ReactElement { return ( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + ) diff --git a/src/renderer/src/assets/styles/index.css b/src/renderer/src/assets/styles/index.css index eaa984270f..ed1eb555a3 100644 --- a/src/renderer/src/assets/styles/index.css +++ b/src/renderer/src/assets/styles/index.css @@ -41,11 +41,11 @@ body, margin: 0; } -/* #root { +#root { display: flex; flex-direction: row; flex: 1; -} */ +} body { display: flex; diff --git a/src/renderer/src/assets/styles/tailwind.css b/src/renderer/src/assets/styles/tailwind.css index f05b01b65c..5cd4046689 100644 --- a/src/renderer/src/assets/styles/tailwind.css +++ b/src/renderer/src/assets/styles/tailwind.css @@ -1,10 +1,6 @@ @import 'tailwindcss' source('../../../../renderer'); @import 'tw-animate-css'; -/* heroui */ -@plugin '../../hero.ts'; -@source '../../../../../node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}'; - @custom-variant dark (&:is(.dark *)); /* 如需自定义: @@ -156,11 +152,6 @@ body { @apply bg-background text-foreground; } - - /* To disable drag title bar on toast. tailwind css doesn't provide such class name. */ - .hero-toast { - -webkit-app-region: no-drag; - } } :root { diff --git a/src/renderer/src/components/ApiModelLabel.tsx b/src/renderer/src/components/ApiModelLabel.tsx deleted file mode 100644 index 3e36083a69..0000000000 --- a/src/renderer/src/components/ApiModelLabel.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Avatar, cn } from '@heroui/react' -import { getModelLogoById } from '@renderer/config/models' -import type { ApiModel } from '@renderer/types' -import React from 'react' - -import Ellipsis from './Ellipsis' - -export interface ModelLabelProps extends Omit, 'children'> { - model?: ApiModel - classNames?: { - container?: string - avatar?: string - modelName?: string - divider?: string - providerName?: string - } -} - -export const ApiModelLabel: React.FC = ({ model, className, classNames, ...props }) => { - return ( -
- - {model?.name} - | - {model?.provider_name} -
- ) -} diff --git a/src/renderer/src/components/Avatar/EmojiAvatarWithPicker.tsx b/src/renderer/src/components/Avatar/EmojiAvatarWithPicker.tsx index 6735d86a4e..649f619cba 100644 --- a/src/renderer/src/components/Avatar/EmojiAvatarWithPicker.tsx +++ b/src/renderer/src/components/Avatar/EmojiAvatarWithPicker.tsx @@ -1,4 +1,4 @@ -import { Button, Popover, PopoverContent, PopoverTrigger } from '@heroui/react' +import { Button, Popover } from 'antd' import React from 'react' import EmojiPicker from '../EmojiPicker' @@ -10,13 +10,10 @@ type Props = { export const EmojiAvatarWithPicker: React.FC = ({ emoji, onPick }) => { return ( - - - ) } diff --git a/src/renderer/src/components/Buttons/ActionIconButton.tsx b/src/renderer/src/components/Buttons/ActionIconButton.tsx index 9f5c98abf0..bf3a6d288d 100644 --- a/src/renderer/src/components/Buttons/ActionIconButton.tsx +++ b/src/renderer/src/components/Buttons/ActionIconButton.tsx @@ -1,4 +1,4 @@ -import { cn } from '@heroui/react' +import { cn } from '@renderer/utils' import type { ButtonProps } from 'antd' import { Button } from 'antd' import React, { memo } from 'react' diff --git a/src/renderer/src/components/ConfirmDialog.tsx b/src/renderer/src/components/ConfirmDialog.tsx index 5ac0ae1273..a3ffa5e270 100644 --- a/src/renderer/src/components/ConfirmDialog.tsx +++ b/src/renderer/src/components/ConfirmDialog.tsx @@ -1,5 +1,5 @@ -import { Button } from '@heroui/react' -import { CheckIcon, XIcon } from 'lucide-react' +import { CheckOutlined, CloseOutlined } from '@ant-design/icons' +import { Button } from 'antd' import type { FC } from 'react' import { createPortal } from 'react-dom' @@ -28,12 +28,22 @@ const ConfirmDialog: FC = ({ x, y, message, onConfirm, onCancel }) => {
{message}
- - +
diff --git a/src/renderer/src/components/ErrorBoundary.tsx b/src/renderer/src/components/ErrorBoundary.tsx index 12e9ab5935..838c6f136b 100644 --- a/src/renderer/src/components/ErrorBoundary.tsx +++ b/src/renderer/src/components/ErrorBoundary.tsx @@ -1,5 +1,5 @@ -import { Button } from '@heroui/button' import { formatErrorMessage } from '@renderer/utils/error' +import { Button } from 'antd' import { Alert, Space } from 'antd' import type { ComponentType, ReactNode } from 'react' import type { FallbackProps } from 'react-error-boundary' @@ -24,10 +24,10 @@ const DefaultFallback: ComponentType = (props: FallbackProps): Re type="error" action={ - - diff --git a/src/renderer/src/components/HorizontalScrollContainer/index.tsx b/src/renderer/src/components/HorizontalScrollContainer/index.tsx index fdc890d2e2..ec9f7a1043 100644 --- a/src/renderer/src/components/HorizontalScrollContainer/index.tsx +++ b/src/renderer/src/components/HorizontalScrollContainer/index.tsx @@ -1,5 +1,5 @@ -import { cn } from '@heroui/react' import Scrollbar from '@renderer/components/Scrollbar' +import { cn } from '@renderer/utils' import { ChevronRight } from 'lucide-react' import { useEffect, useRef, useState } from 'react' import styled from 'styled-components' diff --git a/src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx b/src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx index 4094b3f3d1..4b3f969a26 100644 --- a/src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx +++ b/src/renderer/src/components/Popups/AddAssistantOrAgentPopup.tsx @@ -1,5 +1,5 @@ -import { cn } from '@heroui/react' import { TopView } from '@renderer/components/TopView' +import { cn } from '@renderer/utils' import { Modal } from 'antd' import { Bot, MessageSquare } from 'lucide-react' import { useState } from 'react' @@ -51,7 +51,7 @@ const PopupContainer: React.FC = ({ onSelect, resolve }) => { - -
- + +
+ + +
+
- - {selectedFolderPath || t('settings.data.export_to_phone.lan.noZipSelected')} - + + {selectedFolderPath || t('settings.data.export_to_phone.lan.noZipSelected')} + - - - - - - {showCloseConfirm && ( - -
-
- ⚠️ - - {t('settings.data.export_to_phone.lan.confirm_close_title')} - -
- - {t('settings.data.export_to_phone.lan.confirm_close_message')} - -
- - -
-
-
- )} - - )} - + + + ) } diff --git a/src/renderer/src/components/Popups/UpdateDialogPopup.tsx b/src/renderer/src/components/Popups/UpdateDialogPopup.tsx new file mode 100644 index 0000000000..29afcc0d24 --- /dev/null +++ b/src/renderer/src/components/Popups/UpdateDialogPopup.tsx @@ -0,0 +1,205 @@ +import { loggerService } from '@logger' +import { TopView } from '@renderer/components/TopView' +import { handleSaveData } from '@renderer/store' +import { Button, Modal } from 'antd' +import type { ReleaseNoteInfo, UpdateInfo } from 'builder-util-runtime' +import { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import Markdown from 'react-markdown' +import styled from 'styled-components' + +const logger = loggerService.withContext('UpdateDialog') + +interface ShowParams { + releaseInfo: UpdateInfo | null +} + +interface Props extends ShowParams { + resolve: (data: any) => void +} + +const PopupContainer: React.FC = ({ releaseInfo, resolve }) => { + const { t } = useTranslation() + const [open, setOpen] = useState(true) + const [isInstalling, setIsInstalling] = useState(false) + + useEffect(() => { + if (releaseInfo) { + logger.info('Update dialog opened', { version: releaseInfo.version }) + } + }, [releaseInfo]) + + const handleInstall = async () => { + setIsInstalling(true) + try { + await handleSaveData() + await window.api.quitAndInstall() + setOpen(false) + } catch (error) { + logger.error('Failed to save data before update', error as Error) + setIsInstalling(false) + window.toast.error(t('update.saveDataError')) + } + } + + const onCancel = () => { + setOpen(false) + } + + const onClose = () => { + resolve({}) + } + + UpdateDialogPopup.hide = onCancel + + const releaseNotes = releaseInfo?.releaseNotes + + return ( + +

{t('update.title')}

+

{t('update.message').replace('{{version}}', releaseInfo?.version || '')}

+ + } + open={open} + onCancel={onCancel} + afterClose={onClose} + transitionName="animation-move-down" + centered + width={720} + footer={[ + , + + ]}> + + + + {typeof releaseNotes === 'string' + ? releaseNotes + : Array.isArray(releaseNotes) + ? releaseNotes + .map((note: ReleaseNoteInfo) => note.note) + .filter(Boolean) + .join('\n\n') + : t('update.noReleaseNotes')} + + + +
+ ) +} + +const TopViewKey = 'UpdateDialogPopup' + +export default class UpdateDialogPopup { + static topviewId = 0 + static hide() { + TopView.hide(TopViewKey) + } + static show(props: ShowParams) { + return new Promise((resolve) => { + TopView.show( + { + resolve(v) + TopView.hide(TopViewKey) + }} + />, + TopViewKey + ) + }) + } +} + +const ModalHeaderWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 4px; + + h3 { + margin: 0; + font-size: 16px; + font-weight: 600; + color: var(--color-text-1); + } + + p { + margin: 0; + font-size: 14px; + color: var(--color-text-2); + } +` + +const ModalBodyWrapper = styled.div` + max-height: 450px; + overflow-y: auto; + padding: 12px 0; +` + +const ReleaseNotesWrapper = styled.div` + background-color: var(--color-bg-2); + border-radius: 8px; + + p { + margin: 0 0 12px 0; + color: var(--color-text-2); + font-size: 14px; + line-height: 1.6; + + &:last-child { + margin-bottom: 0; + } + } + + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 16px 0 8px 0; + color: var(--color-text-1); + font-weight: 600; + + &:first-child { + margin-top: 0; + } + } + + ul, + ol { + margin: 8px 0; + padding-left: 24px; + color: var(--color-text-2); + } + + li { + margin: 4px 0; + } + + code { + padding: 2px 6px; + background-color: var(--color-bg-3); + border-radius: 4px; + font-family: 'Consolas', 'Monaco', monospace; + font-size: 13px; + } + + pre { + padding: 12px; + background-color: var(--color-bg-3); + border-radius: 6px; + overflow-x: auto; + + code { + padding: 0; + background-color: transparent; + } + } +` diff --git a/src/renderer/src/components/Popups/agent/AgentModal.tsx b/src/renderer/src/components/Popups/agent/AgentModal.tsx index cb53879fcc..d504699399 100644 --- a/src/renderer/src/components/Popups/agent/AgentModal.tsx +++ b/src/renderer/src/components/Popups/agent/AgentModal.tsx @@ -1,44 +1,32 @@ -import type { SelectedItemProps } from '@heroui/react' -import { - Button, - Form, - Input, - Modal, - ModalBody, - ModalContent, - ModalFooter, - ModalHeader, - Select, - SelectItem, - Textarea, - useDisclosure -} from '@heroui/react' import { loggerService } from '@logger' -import type { Selection } from '@react-types/shared' import ClaudeIcon from '@renderer/assets/images/models/claude.png' +import { ErrorBoundary } from '@renderer/components/ErrorBoundary' +import { TopView } from '@renderer/components/TopView' import { permissionModeCards } from '@renderer/config/agent' -import { agentModelFilter, getModelLogoById } from '@renderer/config/models' import { useAgents } from '@renderer/hooks/agents/useAgents' -import { useApiModels } from '@renderer/hooks/agents/useModels' import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' +import SelectAgentBaseModelButton from '@renderer/pages/home/components/SelectAgentBaseModelButton' import type { AddAgentForm, AgentEntity, AgentType, + ApiModel, BaseAgentForm, PermissionMode, Tool, UpdateAgentForm } from '@renderer/types' import { AgentConfigurationSchema, isAgentType } from '@renderer/types' +import { Avatar, Button, Input, Modal, Select } from 'antd' import { AlertTriangleIcon } from 'lucide-react' import type { ChangeEvent, FormEvent } from 'react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' +import styled from 'styled-components' -import { ErrorBoundary } from '../../ErrorBoundary' -import type { BaseOption, ModelOption } from './shared' -import { Option, renderOption } from './shared' +import type { BaseOption } from './shared' + +const { TextArea } = Input const logger = loggerService.withContext('AddAgentPopup') @@ -48,8 +36,6 @@ interface AgentTypeOption extends BaseOption { name: AgentEntity['name'] } -type Option = AgentTypeOption | ModelOption - type AgentWithTools = AgentEntity & { tools?: Tool[] } const buildAgentForm = (existing?: AgentWithTools): BaseAgentForm => ({ @@ -64,58 +50,37 @@ const buildAgentForm = (existing?: AgentWithTools): BaseAgentForm => ({ configuration: AgentConfigurationSchema.parse(existing?.configuration ?? {}) }) -type Props = { +interface ShowParams { agent?: AgentWithTools - isOpen: boolean - onClose: () => void afterSubmit?: (a: AgentEntity) => void } -/** - * Modal component for creating or editing an agent. - * - * Either trigger or isOpen and onClose is given. - * @param agent - Optional agent entity for editing mode. - * @param isOpen - Optional controlled modal open state. From useDisclosure. - * @param onClose - Optional callback when modal closes. From useDisclosure. - * @returns Modal component for agent creation/editing - */ -export const AgentModal: React.FC = ({ agent, isOpen: _isOpen, onClose: _onClose, afterSubmit }) => { - const { isOpen, onClose } = useDisclosure({ isOpen: _isOpen, onClose: _onClose }) +interface Props extends ShowParams { + resolve: (data: any) => void +} + +const PopupContainer: React.FC = ({ agent, afterSubmit, resolve }) => { const { t } = useTranslation() + const [open, setOpen] = useState(true) const loadingRef = useRef(false) - // const { setTimeoutTimer } = useTimer() const { addAgent } = useAgents() const { updateAgent } = useUpdateAgent() - // hard-coded. We only support anthropic for now. - const { models } = useApiModels({ providerType: 'anthropic' }) const isEditing = (agent?: AgentWithTools) => agent !== undefined const [form, setForm] = useState(() => buildAgentForm(agent)) useEffect(() => { - if (isOpen) { + if (open) { setForm(buildAgentForm(agent)) } - }, [agent, isOpen]) + }, [agent, open]) const selectedPermissionMode = form.configuration?.permission_mode ?? 'default' - const onPermissionModeChange = useCallback((keys: Selection) => { - if (keys === 'all') { - return - } - - const [first] = Array.from(keys) - if (!first) { - return - } - + const onPermissionModeChange = useCallback((value: PermissionMode) => { setForm((prev) => { const parsedConfiguration = AgentConfigurationSchema.parse(prev.configuration ?? {}) - const nextMode = first as PermissionMode - - if (parsedConfiguration.permission_mode === nextMode) { + if (parsedConfiguration.permission_mode === value) { if (!prev.configuration) { return { ...prev, @@ -129,7 +94,7 @@ export const AgentModal: React.FC = ({ agent, isOpen: _isOpen, onClose: _ ...prev, configuration: { ...parsedConfiguration, - permission_mode: nextMode + permission_mode: value } } }) @@ -150,55 +115,57 @@ export const AgentModal: React.FC = ({ agent, isOpen: _isOpen, onClose: _ [] ) - const agentOptions: AgentTypeOption[] = useMemo( + const agentOptions = useMemo( () => - agentConfig.map( - (option) => - ({ - ...option, - rendered: