diff --git a/src/contributes/codecomplete/codecomplete.ts b/src/contributes/codecomplete/codecomplete.ts index 4772725..3b90d64 100644 --- a/src/contributes/codecomplete/codecomplete.ts +++ b/src/contributes/codecomplete/codecomplete.ts @@ -11,6 +11,7 @@ import { outputAst } from './astTest'; import { getEndOfLine } from './ast/language'; import { RecentEditsManager } from './recentEdits'; import { GitDiffWatcher } from './gitDiffWatcher'; +import { MessageHandler } from '../../handler/messageHandler'; export function registerCodeCompleteCallbackCommand(context: vscode.ExtensionContext) { let disposable = vscode.commands.registerCommand( @@ -44,6 +45,7 @@ function isSubsequence(sub: string, source: string): boolean { interface LogEventRequest { completion_id: string; + is_manual_trigger: boolean; type: string; // "view", "select" lines: number; length: number; // length of code completed @@ -77,26 +79,11 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv } async logEventToServer(event: LogEventRequest) { - const devchatToken = this.devchatConfig.get("providers.devchat.api_key"); - const devchatEndpoint = this.devchatConfig.get("providers.devchat.api_base"); - const apiUrl = `${devchatEndpoint}/complete_events`; - const requestOptions: RequestInit = { - method: 'POST', - headers: { - "Content-Type": "application/json", - "Authorization": `Bearer ${devchatToken}`, - }, - body: JSON.stringify(event), - }; + MessageHandler.sendMessage2({command: "logEvent", id: event.completion_id, language: event.language, name: event.type, value: {...event}}); + } - try { - const response = await fetch(apiUrl, requestOptions); - if (!response.ok) { - logger.channel()?.info("log event to server failed:", response.status); - } - } catch (error) { - console.error('Error posting event to the server:', error); - } + async logMessageToServer(id: string, language: string, model: string, result: string) { + MessageHandler.sendMessage2({command: "logMessage", id: id, language, commandName: "code_completion", content: result, model}); } // check whether need to send code complete event @@ -219,6 +206,7 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv if (!this.isManualTrigger && this.devchatConfig.get("complete_enable") !== true) { return []; } + const isManualTrigger = this.isManualTrigger; // const filepath = document.uri.fsPath; // const fileContent = document.getText(); @@ -269,12 +257,20 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv } } + this.logMessageToServer( + response.result.id, + path.extname(document.uri.fsPath).toLowerCase().slice(1), + DevChatConfig.getInstance().get("complete_model") ?? "unknow", + response.result.code + ); + // TODO // 代码补全建议是否已经被用户看到,这个需要更加准确的方式来识别。 logger.channel()?.trace("code complete show."); this.logEventToServer( { completion_id: response.result.id, + is_manual_trigger: isManualTrigger, type: "view", lines: response.result.code.split('\n').length, length: response.result.code.length, @@ -302,6 +298,7 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv this.logEventToServer( { completion_id: response!.result.id, + is_manual_trigger: isManualTrigger, type: "select", lines: response!.result.code.split('\n').length, length: response!.result.code.length, diff --git a/src/contributes/commands.ts b/src/contributes/commands.ts index d0559fe..ce58cca 100644 --- a/src/contributes/commands.ts +++ b/src/contributes/commands.ts @@ -29,6 +29,10 @@ async function copyDirectory(src: string, dest: string): Promise { const srcPath = path.join(src, entry.name); const destPath = path.join(dest, entry.name); + if (entry.name === ".git") { + continue; + } + if (entry.isDirectory()) { await copyDirectory(srcPath, destPath); } else { @@ -185,6 +189,12 @@ export function regApplyDiffResultCommand(context: vscode.ExtensionContext) { ); } +function getExtensionVersion(): string { + const packageJsonPath = path.join(__dirname, '..', 'package.json'); + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + return packageJson.version; +} + export function registerInstallCommandsCommand( context: vscode.ExtensionContext ) { @@ -195,17 +205,22 @@ export function registerInstallCommandsCommand( const homePath = process.env.HOME || process.env.USERPROFILE || ""; const sysDirPath = path.join(homePath, ".chat", "scripts"); const sysMericoDirPath = path.join(homePath, ".chat", "scripts", "merico"); + const devchatConfig = DevChatConfig.getInstance(); const pluginDirPath = path.join( UiUtilWrapper.extensionPath(), "workflowsCommands" ); // Adjust this path as needed const dcClient = new DevChatClient(); + const updatePublicWorkflow = devchatConfig.get("update_public_workflow", true); + const currentVersion = UiUtilWrapper.extensionPath(); + const previousVersion = devchatConfig.get("last_devchat_version", ""); - if (!fs.existsSync(sysMericoDirPath)) { + if (!fs.existsSync(sysMericoDirPath) || (updatePublicWorkflow === false && currentVersion !== previousVersion)) { logger.channel()?.debug("Creating directory: " + sysMericoDirPath); await copyDirectory(pluginDirPath, sysDirPath); } + devchatConfig.set("last_devchat_version", currentVersion); // Check if ~/.chat/scripts directory exists if (!fs.existsSync(sysMericoDirPath)) { diff --git a/src/handler/messageHandler.ts b/src/handler/messageHandler.ts index 1e01fe7..52e1f25 100644 --- a/src/handler/messageHandler.ts +++ b/src/handler/messageHandler.ts @@ -3,6 +3,7 @@ import * as vscode from 'vscode'; import { logger } from '../util/logger'; +import { ExtensionContextHolder } from '../util/extensionContext'; export class MessageHandler { @@ -60,6 +61,19 @@ export class MessageHandler { panel.webview.postMessage(message); } + + public static sendMessage2(message : any, log: boolean = true): void { + if (log) { + logger.channel()?.trace(`Message to GUI: "${JSON.stringify(message)}"`); + } + + const panel = ExtensionContextHolder.provider?.view()!; + if (!panel) { + logger.channel()?.warn(`No panel found to send message: "${JSON.stringify(message)}"`); + return; + } + panel.webview.postMessage(message); + } } export const messageHandler = new MessageHandler();