fix(desktop): 替换 require() 为 ES import — 修复生产构建崩溃
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
- connectionStore: 2 处 require() → loadConversationStore() 异步预加载 + 闭包引用 - saasStore: 1 处 require() → await import()(logout 是 async) - llm-service: 1 处 require() → 顶层 import(无循环依赖) - streamStore: 移除重复动态导入,统一使用顶层 useConnectionStore - tsc --noEmit 0 errors
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
import { DEFAULT_MODEL_ID, DEFAULT_OPENAI_BASE_URL } from '../constants/models';
|
import { DEFAULT_MODEL_ID, DEFAULT_OPENAI_BASE_URL } from '../constants/models';
|
||||||
import { createLogger } from './logger';
|
import { createLogger } from './logger';
|
||||||
|
import { recordLLMUsage } from './telemetry-collector';
|
||||||
|
|
||||||
const log = createLogger('LLMService');
|
const log = createLogger('LLMService');
|
||||||
|
|
||||||
@@ -819,7 +820,6 @@ function trackLLMCall(
|
|||||||
error?: unknown,
|
error?: unknown,
|
||||||
): void {
|
): void {
|
||||||
try {
|
try {
|
||||||
const { recordLLMUsage } = require('./telemetry-collector');
|
|
||||||
recordLLMUsage(
|
recordLLMUsage(
|
||||||
response.model || adapter.getProvider(),
|
response.model || adapter.getProvider(),
|
||||||
response.tokensUsed?.input ?? 0,
|
response.tokensUsed?.input ?? 0,
|
||||||
@@ -832,7 +832,7 @@ function trackLLMCall(
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.debug('Telemetry recording failed (SSR or unavailable)', { error: e });
|
log.debug('Telemetry recording failed', { error: e });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ async function tryRecoverFromAuthError(error: string): Promise<string | null> {
|
|||||||
const newToken = await saasClient.refreshMutex();
|
const newToken = await saasClient.refreshMutex();
|
||||||
if (newToken) {
|
if (newToken) {
|
||||||
// Update kernel config with refreshed token → triggers kernel re-init via changed api_key detection
|
// 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 { getKernelClient } = await import('../../lib/kernel-client');
|
||||||
const kernelClient = getKernelClient();
|
const kernelClient = getKernelClient();
|
||||||
const currentConfig = kernelClient.getConfig();
|
const currentConfig = kernelClient.getConfig();
|
||||||
|
|||||||
@@ -30,6 +30,16 @@ import { useConfigStore } from './configStore';
|
|||||||
import { createLogger } from '../lib/logger';
|
import { createLogger } from '../lib/logger';
|
||||||
import { secureStorage } from '../lib/secure-storage';
|
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');
|
const log = createLogger('ConnectionStore');
|
||||||
|
|
||||||
// === Mode Selection ===
|
// === Mode Selection ===
|
||||||
@@ -492,8 +502,8 @@ export const useConnectionStore = create<ConnectionStore>((set, get) => {
|
|||||||
// 优先使用 conversationStore 的 currentModel,如果设置了的话
|
// 优先使用 conversationStore 的 currentModel,如果设置了的话
|
||||||
let preferredModel: string | undefined;
|
let preferredModel: string | undefined;
|
||||||
try {
|
try {
|
||||||
const { useConversationStore } = require('./chat/conversationStore');
|
const cs = await loadConversationStore();
|
||||||
preferredModel = useConversationStore.getState().currentModel;
|
preferredModel = cs?.useConversationStore.getState().currentModel;
|
||||||
} catch {
|
} catch {
|
||||||
// conversationStore 可能尚未初始化
|
// conversationStore 可能尚未初始化
|
||||||
}
|
}
|
||||||
@@ -553,13 +563,9 @@ export const useConnectionStore = create<ConnectionStore>((set, get) => {
|
|||||||
);
|
);
|
||||||
const relayClient = createSaaSRelayGatewayClient(session.saasUrl, () => {
|
const relayClient = createSaaSRelayGatewayClient(session.saasUrl, () => {
|
||||||
// 每次调用时读取 conversationStore 的 currentModel,fallback 到第一个可用模型
|
// 每次调用时读取 conversationStore 的 currentModel,fallback 到第一个可用模型
|
||||||
try {
|
// 注意:这里不能用 await(同步回调),但 conversationStore 已在上方 loadConversationStore() 中加载
|
||||||
const { useConversationStore } = require('./chat/conversationStore');
|
const current = _conversationStore?.useConversationStore.getState().currentModel;
|
||||||
const current = useConversationStore.getState().currentModel;
|
return (current && validBrowserModelIds.has(current)) ? current : fallbackModelId;
|
||||||
return (current && validBrowserModelIds.has(current)) ? current : fallbackModelId;
|
|
||||||
} catch {
|
|
||||||
return fallbackModelId;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
set({
|
set({
|
||||||
|
|||||||
@@ -434,7 +434,7 @@ export const useSaaSStore = create<SaaSStore>((set, get) => {
|
|||||||
|
|
||||||
// Clear currentModel so next connection uses fresh model resolution
|
// Clear currentModel so next connection uses fresh model resolution
|
||||||
try {
|
try {
|
||||||
const { useConversationStore } = require('./chat/conversationStore');
|
const { useConversationStore } = await import('./chat/conversationStore');
|
||||||
useConversationStore.getState().setCurrentModel('');
|
useConversationStore.getState().setCurrentModel('');
|
||||||
} catch { /* non-critical */ }
|
} catch { /* non-critical */ }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user