Merge remote-tracking branch 'origin/feat/front-end' into feat/back-to-front

# Conflicts:
#	src/services/dialogService.ts
This commit is contained in:
XiaoFeng
2026-01-13 14:34:08 +08:00
15 changed files with 401 additions and 66 deletions

View File

@ -18,7 +18,10 @@ import { ChatHistoryManager } from "./chatHistoryManager";
import { dialogManager, DialogSession } from "../services/dialogService";
import { userInteractionManager } from "../services/userInteraction";
import { healthCheck } from "../services/apiClient";
import { checkBalanceBeforeSend } from "../services/creditsService";
import {
checkBalanceBeforeSend,
fetchBalance,
} from "../services/creditsService";
import type { RunMode, ServiceTier } from "../types/api";
@ -39,7 +42,7 @@ export async function handleUserMessage(
text: string,
extensionPath?: string,
mode?: RunMode,
serviceTier?: ServiceTier // 新增:服务等级参数
serviceTier?: ServiceTier // 新增:服务等级参数
) {
console.log("收到用户消息:", text);
@ -78,7 +81,9 @@ export async function handleUserMessage(
"去充值"
);
if (selection === "去充值") {
vscode.env.openExternal(vscode.Uri.parse("https://iccoder.com/recharge"));
vscode.env.openExternal(
vscode.Uri.parse("https://iccoder.com/memberCenter")
);
}
// 恢复输入状态
panel.webview.postMessage({
@ -92,7 +97,14 @@ export async function handleUserMessage(
// 尝试使用后端服务
if (useBackendService && extensionPath) {
try {
await handleUserMessageWithBackend(panel, text, extensionPath, mode, undefined, serviceTier);
await handleUserMessageWithBackend(
panel,
text,
extensionPath,
mode,
undefined,
serviceTier
);
return;
} catch (error) {
console.error("后端服务不可用:", error);
@ -128,7 +140,7 @@ async function handleUserMessageWithBackend(
extensionPath: string,
mode?: RunMode,
reuseTaskId?: string, // 可选,复用现有 taskId用于 Plan 模式确认后继续执行)
serviceTier?: ServiceTier // 新增:服务等级参数
serviceTier?: ServiceTier // 新增:服务等级参数
): Promise<void> {
const historyManager = ChatHistoryManager.getInstance();
@ -137,10 +149,18 @@ async function handleUserMessageWithBackend(
const taskIdToUse = reuseTaskId || historyManager.getCurrentTaskId();
// 创建会话dialogManager 会自动处理旧会话的中止)
currentSession = dialogManager.createSession(extensionPath, taskIdToUse || undefined);
currentSession = dialogManager.createSession(
extensionPath,
taskIdToUse || undefined
);
// 保存 taskId 用于后续操作(如压缩)
lastTaskId = currentSession.getTaskId();
console.log("[MessageHandler] 创建会话: taskId=", lastTaskId, "来源=", taskIdToUse ? "historyManager" : "新生成");
console.log(
"[MessageHandler] 创建会话: taskId=",
lastTaskId,
"来源=",
taskIdToUse ? "historyManager" : "新生成"
);
// 显示状态栏
panel.webview.postMessage({
@ -200,6 +220,17 @@ async function handleUserMessageWithBackend(
// 最后一次发送完整的段落
console.log("[MessageHandler] 对话完成, 段落数:", segments.length);
// 对话完成后重新获取余额(因为已经消耗了 Credits
try {
console.log("[MessageHandler] 对话完成,重新获取余额...");
const newBalance = await fetchBalance();
if (newBalance !== null) {
console.log("[MessageHandler] 余额已更新:", newBalance);
}
} catch (error) {
console.error("[MessageHandler] 获取余额失败:", error);
}
const result = await panel.webview.postMessage({
command: "updateSegments",
segments: segments,
@ -286,7 +317,7 @@ async function handleUserMessageWithBackend(
},
},
mode,
serviceTier // 传递服务等级
serviceTier // 传递服务等级
);
});
}
@ -369,7 +400,14 @@ export async function handlePlanAction(
extensionPath: string,
serviceTier?: ServiceTier
): Promise<void> {
console.log("[handlePlanAction] action:", action, "planTitle:", planTitle, "serviceTier:", serviceTier);
console.log(
"[handlePlanAction] action:",
action,
"planTitle:",
planTitle,
"serviceTier:",
serviceTier
);
switch (action) {
case "confirm":