feat(icon): 更新面板和视图中的图标路径为统一的 icon.png

This commit is contained in:
Roe-xin
2025-12-29 16:32:18 +08:00
parent d4d86df7de
commit 4288607ee2
2 changed files with 83 additions and 39 deletions

View File

@ -34,19 +34,21 @@ export async function showICHelperPanel(
); );
// 为面板生成唯一ID // 为面板生成唯一ID
const panelId = `panel_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; const panelId = `panel_${Date.now()}_${Math.random()
.toString(36)
.substr(2, 9)}`;
(panel as any).__uniqueId = panelId; (panel as any).__uniqueId = panelId;
// 设置标签页图标 // 设置标签页图标
panel.iconPath = vscode.Uri.joinPath( panel.iconPath = vscode.Uri.joinPath(
context.extensionUri, context.extensionUri,
"media", "media",
"图案(方底).png" "icon.png"
); );
// 获取页面内图标URI // 获取页面内图标URI
const iconUri = panel.webview.asWebviewUri( const iconUri = panel.webview.asWebviewUri(
vscode.Uri.joinPath(context.extensionUri, "media", "图案(方底).png") vscode.Uri.joinPath(context.extensionUri, "media", "icon.png")
); );
// 设置HTML内容 // 设置HTML内容
@ -63,11 +65,19 @@ export async function showICHelperPanel(
// 仅在用户发送消息时,确保面板有任务上下文 // 仅在用户发送消息时,确保面板有任务上下文
// 如果没有,则创建新任务(仅在首次发送消息时) // 如果没有,则创建新任务(仅在首次发送消息时)
if (!historyManager.getPanelTask(panelId)) { if (!historyManager.getPanelTask(panelId)) {
const workspacePath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; const workspacePath =
vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
if (workspacePath) { if (workspacePath) {
try { try {
const taskMeta = await historyManager.createTask(workspacePath, "新对话"); const taskMeta = await historyManager.createTask(
historyManager.setPanelTask(panelId, taskMeta.taskId, workspacePath); workspacePath,
"新对话"
);
historyManager.setPanelTask(
panelId,
taskMeta.taskId,
workspacePath
);
} catch (error) { } catch (error) {
console.error("创建任务失败:", error); console.error("创建任务失败:", error);
} }
@ -123,12 +133,20 @@ export async function showICHelperPanel(
break; break;
case "loadConversationHistory": case "loadConversationHistory":
// 加载会话历史(支持分页) // 加载会话历史(支持分页)
loadConversationHistory(panel, message.offset || 0, message.limit || 10); loadConversationHistory(
panel,
message.offset || 0,
message.limit || 10
);
break; break;
case "selectConversation": case "selectConversation":
// 选择会话 // 选择会话
if (message.conversationId) { if (message.conversationId) {
selectConversation(panel, message.conversationId, context.extensionPath); selectConversation(
panel,
message.conversationId,
context.extensionPath
);
} }
break; break;
// 新增:处理用户回答 // 新增:处理用户回答
@ -407,10 +425,15 @@ async function selectConversation(
} }
// 加载任务会话 // 加载任务会话
const taskSession = await historyManager.loadTaskSession(workspacePath, taskId); const taskSession = await historyManager.loadTaskSession(
workspacePath,
taskId
);
if (!taskSession) { if (!taskSession) {
vscode.window.showErrorMessage(`加载任务 ${taskId} 失败: 任务不存在或数据损坏`); vscode.window.showErrorMessage(
`加载任务 ${taskId} 失败: 任务不存在或数据损坏`
);
return; return;
} }
@ -427,7 +450,7 @@ async function selectConversation(
// 清空当前聊天界面 // 清空当前聊天界面
panel.webview.postMessage({ panel.webview.postMessage({
command: "clearChat" command: "clearChat",
}); });
// 将会话历史消息转换为 segments 格式并发送到前端显示 // 将会话历史消息转换为 segments 格式并发送到前端显示
@ -442,17 +465,17 @@ async function selectConversation(
if (segments.length > 0) { if (segments.length > 0) {
panel.webview.postMessage({ panel.webview.postMessage({
command: "receiveSegments", command: "receiveSegments",
segments: [...segments] segments: [...segments],
}); });
segments.length = 0; segments.length = 0;
} }
// 发送用户消息 // 发送用户消息
const textContent = message.contents?.find(c => c.type === 'TEXT'); const textContent = message.contents?.find((c) => c.type === "TEXT");
if (textContent && 'text' in textContent) { if (textContent && "text" in textContent) {
panel.webview.postMessage({ panel.webview.postMessage({
command: "addUserMessage", command: "addUserMessage",
text: textContent.text text: textContent.text,
}); });
} }
i++; i++;
@ -461,7 +484,7 @@ async function selectConversation(
if (message.segments && message.segments.length > 0) { if (message.segments && message.segments.length > 0) {
panel.webview.postMessage({ panel.webview.postMessage({
command: "receiveSegments", command: "receiveSegments",
segments: message.segments segments: message.segments,
}); });
i++; i++;
} else { } else {
@ -469,30 +492,35 @@ async function selectConversation(
// 收集连续的 AI 消息、工具调用和工具结果 // 收集连续的 AI 消息、工具调用和工具结果
if (message.text) { if (message.text) {
segments.push({ segments.push({
type: 'text', type: "text",
content: message.text content: message.text,
}); });
} }
// 检查是否有工具调用 // 检查是否有工具调用
if (message.toolExecutionRequests && message.toolExecutionRequests.length > 0) { if (
message.toolExecutionRequests &&
message.toolExecutionRequests.length > 0
) {
for (const toolReq of message.toolExecutionRequests) { for (const toolReq of message.toolExecutionRequests) {
// 查找对应的工具执行结果 // 查找对应的工具执行结果
let toolResult = ''; let toolResult = "";
if (i + 1 < taskSession.messages.length) { if (i + 1 < taskSession.messages.length) {
const nextMsg = taskSession.messages[i + 1]; const nextMsg = taskSession.messages[i + 1];
if (nextMsg.type === MessageType.TOOL_EXECUTION_RESULT && if (
nextMsg.id === toolReq.id) { nextMsg.type === MessageType.TOOL_EXECUTION_RESULT &&
nextMsg.id === toolReq.id
) {
toolResult = nextMsg.text; toolResult = nextMsg.text;
i++; // 跳过工具结果消息 i++; // 跳过工具结果消息
} }
} }
segments.push({ segments.push({
type: 'tool', type: "tool",
toolName: toolReq.name, toolName: toolReq.name,
askId: toolReq.id, askId: toolReq.id,
toolResult: toolResult toolResult: toolResult,
}); });
} }
} }
@ -511,26 +539,31 @@ async function selectConversation(
} }
if (nextMsg.text) { if (nextMsg.text) {
segments.push({ segments.push({
type: 'text', type: "text",
content: nextMsg.text content: nextMsg.text,
}); });
} }
if (nextMsg.toolExecutionRequests && nextMsg.toolExecutionRequests.length > 0) { if (
nextMsg.toolExecutionRequests &&
nextMsg.toolExecutionRequests.length > 0
) {
for (const toolReq of nextMsg.toolExecutionRequests) { for (const toolReq of nextMsg.toolExecutionRequests) {
let toolResult = ''; let toolResult = "";
if (i + 1 < taskSession.messages.length) { if (i + 1 < taskSession.messages.length) {
const resultMsg = taskSession.messages[i + 1]; const resultMsg = taskSession.messages[i + 1];
if (resultMsg.type === MessageType.TOOL_EXECUTION_RESULT && if (
resultMsg.id === toolReq.id) { resultMsg.type === MessageType.TOOL_EXECUTION_RESULT &&
resultMsg.id === toolReq.id
) {
toolResult = resultMsg.text; toolResult = resultMsg.text;
i++; // 跳过工具结果消息 i++; // 跳过工具结果消息
} }
} }
segments.push({ segments.push({
type: 'tool', type: "tool",
toolName: toolReq.name, toolName: toolReq.name,
askId: toolReq.id, askId: toolReq.id,
toolResult: toolResult toolResult: toolResult,
}); });
} }
} }
@ -552,11 +585,13 @@ async function selectConversation(
if (segments.length > 0) { if (segments.length > 0) {
panel.webview.postMessage({ panel.webview.postMessage({
command: "receiveSegments", command: "receiveSegments",
segments: segments segments: segments,
}); });
} }
vscode.window.showInformationMessage(`已加载会话: ${taskSession.meta.taskName}`); vscode.window.showInformationMessage(
`已加载会话: ${taskSession.meta.taskName}`
);
} catch (error) { } catch (error) {
console.error("选择会话失败:", error); console.error("选择会话失败:", error);
vscode.window.showErrorMessage(`加载会话失败: ${error}`); vscode.window.showErrorMessage(`加载会话失败: ${error}`);

View File

@ -32,12 +32,12 @@ export function showICHelperPanel(context: vscode.ExtensionContext) {
panel.iconPath = vscode.Uri.joinPath( panel.iconPath = vscode.Uri.joinPath(
context.extensionUri, context.extensionUri,
"media", "media",
"图案(方底).png" "icon.png"
); );
// 获取页面内图标URI // 获取页面内图标URI
const iconUri = panel.webview.asWebviewUri( const iconUri = panel.webview.asWebviewUri(
vscode.Uri.joinPath(context.extensionUri, "media", "图案(方底).png") vscode.Uri.joinPath(context.extensionUri, "media", "icon.png")
); );
// 设置HTML内容 // 设置HTML内容
panel.webview.html = getWebviewContent(iconUri.toString()); panel.webview.html = getWebviewContent(iconUri.toString());
@ -59,7 +59,12 @@ export function showICHelperPanel(context: vscode.ExtensionContext) {
handleRenameFile(panel, message.oldPath, message.newPath); handleRenameFile(panel, message.oldPath, message.newPath);
break; break;
case "replaceInFile": case "replaceInFile":
handleReplaceInFile(panel, message.filePath, message.searchText, message.replaceText); handleReplaceInFile(
panel,
message.filePath,
message.searchText,
message.replaceText
);
break; break;
case "insertCode": case "insertCode":
insertCodeToEditor(message.code); insertCodeToEditor(message.code);
@ -77,7 +82,11 @@ export function showICHelperPanel(context: vscode.ExtensionContext) {
break; break;
// 新增:处理用户回答 // 新增:处理用户回答
case "submitAnswer": case "submitAnswer":
handleUserAnswer(message.askId, message.selected, message.customInput); handleUserAnswer(
message.askId,
message.selected,
message.customInput
);
break; break;
// 新增:中止对话 // 新增:中止对话
case "abortDialog": case "abortDialog":
@ -114,7 +123,7 @@ export class ICViewProvider implements vscode.WebviewViewProvider {
private getWebviewContent(webview: vscode.Webview): string { private getWebviewContent(webview: vscode.Webview): string {
const logoUri = webview.asWebviewUri( const logoUri = webview.asWebviewUri(
vscode.Uri.joinPath(this.extensionUri, "media", "ICCoder主页标志.png") vscode.Uri.joinPath(this.extensionUri, "media", "icon.png")
); );
return ` return `