diff --git a/src/extension.ts b/src/extension.ts index 183d353..bea0771 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -161,18 +161,29 @@ export async function activate(context: vscode.ExtensionContext) { "ic-coder.login", async () => { try { - // 先清除 session 偏好,避免 VSCode 弹出"账户不一致"确认框 - try { - await vscode.authentication.getSession("iccoder", [], { - clearSessionPreference: true, - createIfNone: false - }); - } catch { - // 忽略错误 + const session = await vscode.authentication.getSession("iccoder", [], { + createIfNone: false, + }); + const expired = session?.accessToken + ? isTokenExpired(session.accessToken) + : null; + + // 会话仍有效时,直接打开聊天面板 + if (session && expired !== true) { + vscode.commands.executeCommand("ic-coder.openChat"); + return; } - // 创建新 session - await vscode.authentication.getSession("iccoder", [], { createIfNone: true }); + // 1) 清空当前登录状态信息 + await authProvider.clearSessionsForRelogin(); + await context.globalState.update("icCoderSessions", []); + await context.globalState.update("icCoderUserInfo", undefined); + + // 2) 重新登录(强制新会话) + await vscode.authentication.getSession("iccoder", [], { + clearSessionPreference: true, + forceNewSession: true, + }); } catch (error) { vscode.window.showErrorMessage(`登录失败: ${error}`); } diff --git a/src/services/icCoderAuthProvider.ts b/src/services/icCoderAuthProvider.ts index 153317b..244a01b 100644 --- a/src/services/icCoderAuthProvider.ts +++ b/src/services/icCoderAuthProvider.ts @@ -176,6 +176,28 @@ export class ICCoderAuthenticationProvider } } + /** + * Clear local authentication state without window reload. + * Used by re-login flow when session is expired. + */ + async clearSessionsForRelogin(): Promise { + if (this._sessions.length === 0) { + await clearUserInfo(); + return; + } + + const removed = [...this._sessions]; + this._sessions = []; + await this.saveSessions(); + await clearUserInfo(); + + this._onDidChangeSessions.fire({ + added: [], + removed, + changed: [], + }); + } + /** * 生成会话 ID */ diff --git a/src/views/ICViewProvider.ts b/src/views/ICViewProvider.ts index f4a55fb..f45cabf 100644 --- a/src/views/ICViewProvider.ts +++ b/src/views/ICViewProvider.ts @@ -256,7 +256,7 @@ export class ICViewProvider implements vscode.WebviewViewProvider { vscode.commands.executeCommand("ic-coder.login"); } else if (message.command === "logout") { // 退出登录(前端已有确认对话框) - vscode.commands.executeCommand('iccoder.logout'); + vscode.commands.executeCommand("ic-coder.logout"); } else if (message.command === "openICCoder") { // 打开 IC Coder 官网 vscode.env.openExternal(vscode.Uri.parse('https://www.iccoder.com'));