From 02a4ba5e75a001fa3da40903f13f436f15674ebf Mon Sep 17 00:00:00 2001 From: iven Date: Wed, 15 Apr 2026 00:47:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(desktop):=20=E6=9B=BF=E6=8D=A2=20require()?= =?UTF-8?q?=20=E4=B8=BA=20ES=20import=20=E2=80=94=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E6=9E=84=E5=BB=BA=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - connectionStore: 2 处 require() → loadConversationStore() 异步预加载 + 闭包引用 - saasStore: 1 处 require() → await import()(logout 是 async) - llm-service: 1 处 require() → 顶层 import(无循环依赖) - streamStore: 移除重复动态导入,统一使用顶层 useConnectionStore - tsc --noEmit 0 errors --- desktop/src/lib/llm-service.ts | 4 ++-- desktop/src/store/chat/streamStore.ts | 1 - desktop/src/store/connectionStore.ts | 24 +++++++++++++++--------- desktop/src/store/saasStore.ts | 2 +- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/desktop/src/lib/llm-service.ts b/desktop/src/lib/llm-service.ts index fc02c80..4c60ce5 100644 --- a/desktop/src/lib/llm-service.ts +++ b/desktop/src/lib/llm-service.ts @@ -16,6 +16,7 @@ import { DEFAULT_MODEL_ID, DEFAULT_OPENAI_BASE_URL } from '../constants/models'; import { createLogger } from './logger'; +import { recordLLMUsage } from './telemetry-collector'; const log = createLogger('LLMService'); @@ -819,7 +820,6 @@ function trackLLMCall( error?: unknown, ): void { try { - const { recordLLMUsage } = require('./telemetry-collector'); recordLLMUsage( response.model || adapter.getProvider(), response.tokensUsed?.input ?? 0, @@ -832,7 +832,7 @@ function trackLLMCall( }, ); } catch (e) { - log.debug('Telemetry recording failed (SSR or unavailable)', { error: e }); + log.debug('Telemetry recording failed', { error: e }); } } diff --git a/desktop/src/store/chat/streamStore.ts b/desktop/src/store/chat/streamStore.ts index c881531..05fd157 100644 --- a/desktop/src/store/chat/streamStore.ts +++ b/desktop/src/store/chat/streamStore.ts @@ -57,7 +57,6 @@ async function tryRecoverFromAuthError(error: string): Promise { const newToken = await saasClient.refreshMutex(); if (newToken) { // Update kernel config with refreshed token → triggers kernel re-init via changed api_key detection - const { useConnectionStore } = await import('../connectionStore'); const { getKernelClient } = await import('../../lib/kernel-client'); const kernelClient = getKernelClient(); const currentConfig = kernelClient.getConfig(); diff --git a/desktop/src/store/connectionStore.ts b/desktop/src/store/connectionStore.ts index 6b4f929..e9fa984 100644 --- a/desktop/src/store/connectionStore.ts +++ b/desktop/src/store/connectionStore.ts @@ -30,6 +30,16 @@ import { useConfigStore } from './configStore'; import { createLogger } from '../lib/logger'; import { secureStorage } from '../lib/secure-storage'; +// 延迟加载 conversationStore 避免循环依赖 +// connect() 是 async 函数,在其中 await import() 是安全的 +let _conversationStore: typeof import('./chat/conversationStore') | null = null; +async function loadConversationStore() { + if (!_conversationStore) { + try { _conversationStore = await import('./chat/conversationStore'); } catch { /* not loaded yet */ } + } + return _conversationStore; +} + const log = createLogger('ConnectionStore'); // === Mode Selection === @@ -492,8 +502,8 @@ export const useConnectionStore = create((set, get) => { // 优先使用 conversationStore 的 currentModel,如果设置了的话 let preferredModel: string | undefined; try { - const { useConversationStore } = require('./chat/conversationStore'); - preferredModel = useConversationStore.getState().currentModel; + const cs = await loadConversationStore(); + preferredModel = cs?.useConversationStore.getState().currentModel; } catch { // conversationStore 可能尚未初始化 } @@ -553,13 +563,9 @@ export const useConnectionStore = create((set, get) => { ); const relayClient = createSaaSRelayGatewayClient(session.saasUrl, () => { // 每次调用时读取 conversationStore 的 currentModel,fallback 到第一个可用模型 - try { - const { useConversationStore } = require('./chat/conversationStore'); - const current = useConversationStore.getState().currentModel; - return (current && validBrowserModelIds.has(current)) ? current : fallbackModelId; - } catch { - return fallbackModelId; - } + // 注意:这里不能用 await(同步回调),但 conversationStore 已在上方 loadConversationStore() 中加载 + const current = _conversationStore?.useConversationStore.getState().currentModel; + return (current && validBrowserModelIds.has(current)) ? current : fallbackModelId; }); set({ diff --git a/desktop/src/store/saasStore.ts b/desktop/src/store/saasStore.ts index 31040ea..1929ea7 100644 --- a/desktop/src/store/saasStore.ts +++ b/desktop/src/store/saasStore.ts @@ -434,7 +434,7 @@ export const useSaaSStore = create((set, get) => { // Clear currentModel so next connection uses fresh model resolution try { - const { useConversationStore } = require('./chat/conversationStore'); + const { useConversationStore } = await import('./chat/conversationStore'); useConversationStore.getState().setCurrentModel(''); } catch { /* non-critical */ }