chore: Optimize code completion and logging

- Refactor code completion event logging
- Add manual trigger flag to log events
- Implement message logging for code completion
- Update public workflow installation process
This commit is contained in:
bobo.yang 2024-11-26 09:42:35 +08:00
parent ee55a20459
commit 5aefba5941
3 changed files with 46 additions and 20 deletions

View File

@ -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,

View File

@ -29,6 +29,10 @@ async function copyDirectory(src: string, dest: string): Promise<void> {
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)) {

View File

@ -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();