diff --git a/src/config/settings.ts b/src/config/settings.ts index 170ddf7..06225dc 100644 --- a/src/config/settings.ts +++ b/src/config/settings.ts @@ -29,6 +29,9 @@ export interface IccoderConfig { serviceTier: ServiceTier; } +/** 自定义配置缓存 */ +let customConfig: Partial | null = null; + /** 环境配置 */ const ENV_CONFIG: Record = { /** 本地开发环境 - 通过 Gateway 路由 */ @@ -38,7 +41,7 @@ const ENV_CONFIG: Record = { loginUrl: "http://localhost/login", timeout: 300000, userId: "default-user", - serviceTier: "max", // 默认使用 max + serviceTier: "max", }, /** 测试服务器环境 - 通过 Gateway 路由 */ test: { @@ -60,6 +63,13 @@ const ENV_CONFIG: Record = { }, }; +/** + * 设置自定义配置 + */ +export function setCustomConfig(config: Partial) { + customConfig = config; +} + /** * 获取当前环境 */ @@ -71,7 +81,14 @@ export function getCurrentEnv(): Environment { * 获取配置项 */ export function getConfig(): IccoderConfig { - return { ...ENV_CONFIG[CURRENT_ENV] }; + const baseConfig = { ...ENV_CONFIG[CURRENT_ENV] }; + + // 合并自定义配置(空字符串表示使用默认) + if (customConfig?.backendUrl && customConfig.backendUrl !== '') { + baseConfig.backendUrl = customConfig.backendUrl; + } + + return baseConfig; } /** diff --git a/src/extension.ts b/src/extension.ts index 9cb3007..21ce5cd 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -9,10 +9,19 @@ import { isTokenExpired } from "./utils/jwtUtils"; import { NotificationService } from "./services/notificationService"; import { InvitationService } from "./services/invitationService"; import { ICCoderCodeActionProvider } from "./providers/codeActionProvider"; +import { setCustomConfig } from "./config/settings"; export async function activate(context: vscode.ExtensionContext) { console.log("🎉 IC Coder 插件已激活!"); + // 加载保存的配置 + const savedSettings = context.globalState.get('generalSettings') as any; + if (savedSettings?.backendUrl) { + setCustomConfig({ + backendUrl: savedSettings.backendUrl, + }); + } + // 创建装饰类型(代码旁边的提示) const decorationType = vscode.window.createTextEditorDecorationType({ after: { @@ -83,7 +92,7 @@ export async function activate(context: vscode.ExtensionContext) { }); // 【已禁用】Authentication Provider 注册 - 无需登录 - // const authProvider = new ICCoderAuthenticationProvider(context); + const authProvider = new ICCoderAuthenticationProvider(context); // context.subscriptions.push( // vscode.authentication.registerAuthenticationProvider( // "iccoder", diff --git a/src/panels/ICHelperPanel.ts b/src/panels/ICHelperPanel.ts index d86c193..a8c0666 100644 --- a/src/panels/ICHelperPanel.ts +++ b/src/panels/ICHelperPanel.ts @@ -18,6 +18,7 @@ import { startChangeSession, handleOpenFileDiff, } from "../utils/messageHandler"; +import { setCustomConfig } from "../config/settings"; import { compactDialog } from "../services/apiClient"; import { VCDViewerPanel } from "./VCDViewerPanel"; import { ChatHistoryManager } from "../utils/chatHistoryManager"; @@ -684,6 +685,21 @@ export async function showICHelperPanel( // 退出登录(前端已有确认对话框) vscode.commands.executeCommand("ic-coder.logout"); break; + case "saveGeneralSettings": + // 保存通用设置 + context.globalState.update('generalSettings', message.settings); + // 更新运行时配置(包括清空) + setCustomConfig({ backendUrl: message.settings.backendUrl || '' }); + vscode.window.showInformationMessage('设置已保存'); + break; + case "loadGeneralSettings": + // 加载通用设置 + const settings = context.globalState.get('generalSettings'); + panel.webview.postMessage({ + command: 'loadedGeneralSettings', + settings: settings + }); + break; } }, undefined, diff --git a/src/services/sseHandler.ts b/src/services/sseHandler.ts index e5828eb..9426523 100644 --- a/src/services/sseHandler.ts +++ b/src/services/sseHandler.ts @@ -161,7 +161,16 @@ export async function startStreamDialog( const body = JSON.stringify(request); - console.log(`[SSE] 开始流式对话: taskId=${request.taskId}, mode=${request.mode}, url=${urlString}`); + console.log('[SSE] 请求详情:', { + url: urlString, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'text/event-stream', + hasToken: !!request.token, + }, + body: request + }); return new Promise((resolve, reject) => { const options: http.RequestOptions = { diff --git a/src/views/ICViewProvider.ts b/src/views/ICViewProvider.ts index e751b90..682f373 100644 --- a/src/views/ICViewProvider.ts +++ b/src/views/ICViewProvider.ts @@ -13,6 +13,7 @@ import { abortCurrentDialog, handleOptimizePrompt, } from "../utils/messageHandler"; +import { setCustomConfig } from "../config/settings"; /** * 创建并显示IC 侧边栏视图 @@ -141,6 +142,21 @@ export function showICHelperPanel(context: vscode.ExtensionContext) { case "optimizePrompt": handleOptimizePrompt(panel, message.prompt); break; + // 保存通用设置 + case "saveGeneralSettings": + context.globalState.update('generalSettings', message.settings); + // 更新运行时配置(包括清空) + setCustomConfig({ backendUrl: message.settings.backendUrl || '' }); + vscode.window.showInformationMessage('设置已保存'); + break; + // 加载通用设置 + case "loadGeneralSettings": + const settings = context.globalState.get('generalSettings'); + panel.webview.postMessage({ + command: 'loadedGeneralSettings', + settings: settings + }); + break; } }, undefined, @@ -213,6 +229,20 @@ export class ICViewProvider implements vscode.WebviewViewProvider { if (message.url) { vscode.env.openExternal(vscode.Uri.parse(message.url)); } + } else if (message.command === "saveGeneralSettings") { + // 保存通用设置 + this.context.globalState.update('generalSettings', message.settings); + if (message.settings.backendUrl) { + setCustomConfig({ backendUrl: message.settings.backendUrl }); + } + vscode.window.showInformationMessage('设置已保存'); + } else if (message.command === "loadGeneralSettings") { + // 加载通用设置 + const settings = this.context.globalState.get('generalSettings'); + webviewView.webview.postMessage({ + command: 'loadedGeneralSettings', + settings: settings + }); } }, undefined, diff --git a/src/views/generalSettingsComponent.ts b/src/views/generalSettingsComponent.ts index caba8cf..923b142 100644 --- a/src/views/generalSettingsComponent.ts +++ b/src/views/generalSettingsComponent.ts @@ -4,75 +4,15 @@ export function getGeneralSettingsComponentContent(): string { return `
-

通用设置

+

后端服务配置

- - 选择界面主题 + + 自定义后端 API 地址
- -
- -
-
- - 选择界面语言 -
- -
- -
-
- - 自动保存会话历史 -
- -
- -
-
- - 在消息中显示时间戳 -
- -
-
- -
-

编辑器设置

- -
-
- - 设置编辑器字体大小 -
- -
- -
-
- - 启用代码语法高亮 -
- +
@@ -176,6 +116,21 @@ export function getGeneralSettingsComponentStyles(): string { border-color: var(--vscode-focusBorder); } + .settings-input-text { + width: 300px; + padding: 6px 12px; + background: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + font-size: 13px; + outline: none; + } + + .settings-input-text:focus { + border-color: var(--vscode-focusBorder); + } + .settings-switch { position: relative; display: inline-block; @@ -270,57 +225,37 @@ export function getGeneralSettingsComponentScript(): string { // 保存通用设置 function saveGeneralSettings() { const settings = { - theme: document.getElementById('themeSelect').value, - language: document.getElementById('languageSelect').value, - autoSave: document.getElementById('autoSaveCheckbox').checked, - showTimestamp: document.getElementById('showTimestampCheckbox').checked, - fontSize: document.getElementById('fontSizeInput').value, - syntaxHighlight: document.getElementById('syntaxHighlightCheckbox').checked, + backendUrl: document.getElementById('backendUrlInput').value, }; - // 发送消息到扩展 vscode.postMessage({ command: 'saveGeneralSettings', settings: settings }); - // 显示保存成功提示 console.log('通用设置已保存', settings); + closeSettingsModal(); } // 重置通用设置 function resetGeneralSettings() { - document.getElementById('themeSelect').value = 'auto'; - document.getElementById('languageSelect').value = 'zh-CN'; - document.getElementById('autoSaveCheckbox').checked = true; - document.getElementById('showTimestampCheckbox').checked = false; - document.getElementById('fontSizeInput').value = '14'; - document.getElementById('syntaxHighlightCheckbox').checked = true; + document.getElementById('backendUrlInput').value = ''; + + // 清空保存的配置 + vscode.postMessage({ + command: 'saveGeneralSettings', + settings: { backendUrl: '' } + }); console.log('通用设置已重置为默认值'); + closeSettingsModal(); } // 加载通用设置 function loadGeneralSettings(settings) { if (!settings) return; - - if (settings.theme) { - document.getElementById('themeSelect').value = settings.theme; - } - if (settings.language) { - document.getElementById('languageSelect').value = settings.language; - } - if (settings.autoSave !== undefined) { - document.getElementById('autoSaveCheckbox').checked = settings.autoSave; - } - if (settings.showTimestamp !== undefined) { - document.getElementById('showTimestampCheckbox').checked = settings.showTimestamp; - } - if (settings.fontSize) { - document.getElementById('fontSizeInput').value = settings.fontSize; - } - if (settings.syntaxHighlight !== undefined) { - document.getElementById('syntaxHighlightCheckbox').checked = settings.syntaxHighlight; + if (settings.backendUrl) { + document.getElementById('backendUrlInput').value = settings.backendUrl; } } `; diff --git a/src/views/settingsComponent.ts b/src/views/settingsComponent.ts index db24906..9efb218 100644 --- a/src/views/settingsComponent.ts +++ b/src/views/settingsComponent.ts @@ -203,6 +203,8 @@ export function getSettingsComponentScript(): string { const modal = document.getElementById('settingsModal'); if (modal) { modal.classList.add('active'); + // 请求加载设置 + vscode.postMessage({ command: 'loadGeneralSettings' }); } } diff --git a/src/views/webviewContent.ts b/src/views/webviewContent.ts index 2a36bb5..5e212bc 100644 --- a/src/views/webviewContent.ts +++ b/src/views/webviewContent.ts @@ -903,6 +903,13 @@ export function getWebviewContent( } break; + case 'loadedGeneralSettings': + // 加载通用设置 + if (typeof loadGeneralSettings === 'function') { + loadGeneralSettings(message.settings); + } + break; + default: console.log('[WebView] 未处理的消息类型:', message.command); }