diff --git a/src/config/settings.ts b/src/config/settings.ts index 170ddf7..5b700e3 100644 --- a/src/config/settings.ts +++ b/src/config/settings.ts @@ -8,7 +8,7 @@ import * as vscode from "vscode"; type Environment = "dev" | "test" | "prod"; /** 当前环境 - 修改这里切换环境 */ -const CURRENT_ENV: Environment = "prod"; +const CURRENT_ENV: Environment = "test"; /** 服务等级类型 */ export type ServiceTier = "lite" | "syntaxic" | "max" | "auto"; @@ -42,9 +42,9 @@ const ENV_CONFIG: Record = { }, /** 测试服务器环境 - 通过 Gateway 路由 */ test: { - backendUrl: "http://192.168.1.108:2029/iccoder", - backendUrlStrongeLoop: "http://192.168.1.108:2029", - loginUrl: "http://192.168.1.108:2005/login", + backendUrl: "http://192.168.1.134:2233", + backendUrlStrongeLoop: "http://192.168.1.134:2233", + loginUrl: "http://192.168.1.134/login", timeout: 60000, userId: "default-user", serviceTier: "max", diff --git a/src/panels/helpers/contextHelper.ts b/src/panels/helpers/contextHelper.ts index 710a22e..858eec8 100644 --- a/src/panels/helpers/contextHelper.ts +++ b/src/panels/helpers/contextHelper.ts @@ -7,6 +7,20 @@ import * as vscode from "vscode"; let globalContext: vscode.ExtensionContext; +const DOCUMENT_SETS_KEY = "iccoder.documentSets"; + +export interface DocumentFile { + name: string; + absolutePath: string; + size: number; +} + +export interface DocumentSet { + id: string; + name: string; + files: DocumentFile[]; + updatedAt: number; +} export function initializeContextHelper(context: vscode.ExtensionContext) { globalContext = context; @@ -138,26 +152,26 @@ export async function handleGetDocumentSetList(panel: vscode.WebviewPanel) { }); } -let documentSet: Array<{ path: string; relativePath: string }> = []; +let documentSet: DocumentFile[] = []; export function getDocumentSet() { return documentSet; } -export function addToDocumentSet(docs: Array<{ path: string; relativePath: string }>) { +export function addToDocumentSet(docs: DocumentFile[]) { documentSet = [...documentSet, ...docs]; } export function saveDocumentSet( - docs: Array<{ path: string; relativePath: string }>, + docs: DocumentFile[], name: string, panel: vscode.WebviewPanel ) { - const newDocSet = { + const newDocSet: DocumentSet = { id: Date.now().toString(), name, - documents: docs, - updatedAt: new Date().toISOString(), + files: docs, + updatedAt: Date.now(), }; documentSets.push(newDocSet); persistDocumentSets(); @@ -167,22 +181,44 @@ export function saveDocumentSet( }); } -let documentSets: Array<{ - id: string; - name: string; - documents: Array<{ path: string; relativePath: string }>; - updatedAt: string; -}> = []; +let documentSets: DocumentSet[] = []; function loadDocumentSets() { - const saved = globalContext.globalState.get("documentSets"); + const saved = + globalContext.globalState.get>(DOCUMENT_SETS_KEY) || + globalContext.globalState.get>("documentSets", []); if (saved) { - documentSets = saved; + documentSets = saved.map((item: any) => ({ + id: String(item.id), + name: String(item.name || ""), + files: Array.isArray(item.files) + ? item.files.map((file: any) => ({ + name: String(file.name || ""), + absolutePath: String(file.absolutePath || file.path || ""), + size: Number(file.size || 0), + })) + : Array.isArray(item.documents) + ? item.documents.map((file: any) => ({ + name: String( + file.name || + file.relativePath?.split(/[\\/]/).pop() || + file.path?.split(/[\\/]/).pop() || + "", + ), + absolutePath: String(file.absolutePath || file.path || ""), + size: Number(file.size || 0), + })) + : [], + updatedAt: + typeof item.updatedAt === "number" + ? item.updatedAt + : new Date(item.updatedAt || Date.now()).getTime(), + })); } } function persistDocumentSets() { - globalContext.globalState.update("documentSets", documentSets); + globalContext.globalState.update(DOCUMENT_SETS_KEY, documentSets); } export function getDocumentSets() { @@ -202,7 +238,7 @@ export function changeDocumentSetName(id: string, newName: string, panel: vscode const docSet = documentSets.find(ds => ds.id === id); if (docSet) { docSet.name = newName; - docSet.updatedAt = new Date().toISOString(); + docSet.updatedAt = Date.now(); persistDocumentSets(); panel.webview.postMessage({ command: "documentSetSaved", diff --git a/src/panels/helpers/messageRouter.ts b/src/panels/helpers/messageRouter.ts index a81fbce..d5f646c 100644 --- a/src/panels/helpers/messageRouter.ts +++ b/src/panels/helpers/messageRouter.ts @@ -408,7 +408,11 @@ export async function handleWebviewMessage( if (uris && uris.length > 0) { const fs = require("fs"); const path = require("path"); - const selectedFiles: Array<{ path: string; relativePath: string; size: number }> = []; + const selectedFiles: Array<{ + name: string; + absolutePath: string; + size: number; + }> = []; const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB const MAX_TOTAL_SIZE = 50 * 1024 * 1024; // 50 MB const MAX_FILES = 1000; @@ -440,8 +444,8 @@ export async function handleWebviewMessage( } selectedFiles.push({ - path: filePath, - relativePath: vscode.workspace.asRelativePath(filePath), + name: path.basename(filePath), + absolutePath: filePath, size: stat.size, }); totalSize += stat.size; diff --git a/src/services/sseHandler.ts b/src/services/sseHandler.ts index e5828eb..58a9f35 100644 --- a/src/services/sseHandler.ts +++ b/src/services/sseHandler.ts @@ -162,6 +162,8 @@ export async function startStreamDialog( const body = JSON.stringify(request); console.log(`[SSE] 开始流式对话: taskId=${request.taskId}, mode=${request.mode}, url=${urlString}`); + console.log("[SSE] 完整请求体:", request); + console.log("[SSE] 请求体 JSON:", body); return new Promise((resolve, reject) => { const options: http.RequestOptions = { diff --git a/src/utils/messageHandler.ts b/src/utils/messageHandler.ts index fb0cff1..eedb50c 100644 --- a/src/utils/messageHandler.ts +++ b/src/utils/messageHandler.ts @@ -268,8 +268,19 @@ async function handleUserMessageWithBackend( let enhancedText = text; if (contextItems && contextItems.length > 0) { console.log("[MessageHandler] 处理上下文项:", contextItems.length); - const paths = contextItems.map((item) => item.path).join("\n"); - enhancedText = `${paths}\n\n${text}`; + const docTypes = new Set(["file", "document", "docset"]); + const regularPaths = contextItems + .filter((item) => !docTypes.has(item.type)) + .map((item) => item.path); + const docTags = contextItems + .filter((item) => docTypes.has(item.type)) + .map((item) => `${item.path}`); + if (regularPaths.length > 0) { + enhancedText = `${regularPaths.join("\n")}\n\n${enhancedText}`; + } + if (docTags.length > 0) { + enhancedText = `${enhancedText}\n\n${docTags.join("\n")}`; + } } // 获取 historyManager 中的 taskId(由 ICHelperPanel 创建) diff --git a/src/views/contextButton.ts b/src/views/contextButton.ts index 86eb799..ed41deb 100644 --- a/src/views/contextButton.ts +++ b/src/views/contextButton.ts @@ -554,8 +554,8 @@ export function getContextButtonScript(): string { if (currentListType === 'documentSetItem') { const selected = currentListData.filter(item => selectedItems.has(item.id)); selected.forEach(docSet => { - docSet.documents.forEach(doc => { - addContextItem('file', doc.path, doc.relativePath || doc.path); + (docSet.files || []).forEach(doc => { + addContextItem('docset', doc.absolutePath, doc.name || doc.absolutePath); }); }); } else { @@ -609,9 +609,13 @@ export function getContextButtonScript(): string { searchInput.addEventListener('input', function(e) { const keyword = (e.target.value || '').toLowerCase().trim(); const filtered = currentListData.filter(item => - (item.relativePath || item.path || '').toLowerCase().includes(keyword) + (item.name || item.relativePath || item.path || '').toLowerCase().includes(keyword) ); - renderList(filtered); + if (currentListType === 'documentSetItem') { + renderDocumentSetList(filtered); + } else { + renderList(filtered); + } }); } diff --git a/src/views/contextDisplay.ts b/src/views/contextDisplay.ts index 32f9422..8bd45a4 100644 --- a/src/views/contextDisplay.ts +++ b/src/views/contextDisplay.ts @@ -181,6 +181,7 @@ export function getContextDisplayScript(): string { case 'folder': icon = getFolderIcon(); break; case 'image': icon = getImageIcon(); break; case 'document': icon = getDocumentIcon(); break; + case 'docset': icon = getDocumentIcon(); break; case 'code': icon = getCodeIcon(); break; } diff --git a/src/views/docsetDialog.ts b/src/views/docsetDialog.ts index 2d36df8..b23843c 100644 --- a/src/views/docsetDialog.ts +++ b/src/views/docsetDialog.ts @@ -409,7 +409,7 @@ export function getDocsetDialogScript(): string { listEl.innerHTML = docsetFiles.map((file, index) => \`
- \${file.relativePath || file.path} + \${file.name || file.absolutePath}