feat: 实现上下文使用量监控和会话压缩功能

- sseHandler: 新增 onContextUsage 回调处理上下文使用量事件
- dialogService: 集成上下文使用量回调,追踪 AI 消息用于后端重启恢复
- apiClient: 新增 compactDialog API 支持手动压缩对话历史
- messageHandler: 新增 lastTaskId 管理机制,支持会话恢复后的压缩操作,转发上下文使用量到 WebView
This commit is contained in:
XiaoFeng
2025-12-31 18:50:20 +08:00
parent 259310a29d
commit b794d1ceb0
4 changed files with 64 additions and 2 deletions

View File

@ -27,6 +27,9 @@ let useBackendService = true;
/** 当前对话会话 */
let currentSession: DialogSession | null = null;
/** 最后一个活跃的 taskId用于压缩等操作 */
let lastTaskId: string | null = null;
/** 待执行的计划Plan 模式确认后自动执行) */
let pendingPlanExecution: {
panel: vscode.WebviewPanel;
@ -128,6 +131,8 @@ async function handleUserMessageWithBackend(
// 创建或复用会话
if (!currentSession || !currentSession.active) {
currentSession = dialogManager.createSession(extensionPath, reuseTaskId);
// 保存 taskId 用于后续操作(如压缩)
lastTaskId = currentSession.getTaskId();
if (reuseTaskId) {
console.log('[MessageHandler] 复用 taskId 创建会话:', reuseTaskId);
}
@ -253,6 +258,16 @@ async function handleUserMessageWithBackend(
onNotification: (message) => {
vscode.window.showInformationMessage(message);
},
onContextUsage: (data) => {
// 发送上下文使用量到 WebView
panel.webview.postMessage({
command: 'contextUsage',
currentTokens: data.currentTokens,
maxTokens: data.maxTokens,
percentage: data.percentage
});
},
}, mode);
});
}
@ -310,7 +325,15 @@ export async function abortCurrentDialog(): Promise<void> {
* 获取当前会话的 taskId
*/
export function getCurrentTaskId(): string | null {
return currentSession?.getTaskId() || null;
return currentSession?.getTaskId() || lastTaskId;
}
/**
* 设置最后的 taskId加载历史会话时调用
*/
export function setLastTaskId(taskId: string): void {
lastTaskId = taskId;
console.log('[MessageHandler] 设置 lastTaskId:', taskId);
}
/**