Add stopDevChat function and move spawnAsync to DevChat class
- Import stopDevChat in loadHandlers.ts and register it as a handler - Move spawnAsync function from devchat.ts to DevChat class as a method - Add stop method to DevChat class to kill the child process - Update sendMessage.ts to use a single instance of DevChat
This commit is contained in:
parent
da9883f7f2
commit
95bb1161f1
@ -6,7 +6,7 @@ import { doCommit } from './doCommit';
|
||||
import { historyMessages } from './historyMessages';
|
||||
import { regCommandList } from './regCommandList';
|
||||
import { regContextList } from './regContextList';
|
||||
import { sendMessage } from './sendMessage';
|
||||
import { sendMessage, stopDevChat } from './sendMessage';
|
||||
import { blockApply } from './showDiff';
|
||||
import { showDiff } from './showDiff';
|
||||
import { addConext } from './addContext';
|
||||
@ -22,6 +22,7 @@ messageHandler.registerHandler('historyMessages', historyMessages);
|
||||
messageHandler.registerHandler('regCommandList', regCommandList);
|
||||
messageHandler.registerHandler('regContextList', regContextList);
|
||||
messageHandler.registerHandler('sendMessage', sendMessage);
|
||||
messageHandler.registerHandler('stopDevChat', stopDevChat);
|
||||
messageHandler.registerHandler('block_apply', blockApply);
|
||||
messageHandler.registerHandler('show_diff', showDiff);
|
||||
messageHandler.registerHandler('addRefCommandContext', addRefCommandContext);
|
||||
|
@ -69,15 +69,13 @@ function getInstructionFiles(): string[] {
|
||||
return instructionFiles;
|
||||
}
|
||||
|
||||
|
||||
const devChat = new DevChat();
|
||||
|
||||
// message: { command: 'sendMessage', text: 'xxx', parent_hash: 'xxx'}
|
||||
// return message:
|
||||
// { command: 'receiveMessage', text: 'xxxx', hash: 'xxx', user: 'xxx', date: 'xxx'}
|
||||
// { command: 'receiveMessagePartial', text: 'xxxx', user: 'xxx', date: 'xxx'}
|
||||
export async function sendMessage(message: any, panel: vscode.WebviewPanel): Promise<void> {
|
||||
const devChat = new DevChat();
|
||||
|
||||
const newText2 = await CommandManager.getInstance().processText(message.text);
|
||||
const parsedMessage = parseMessage(newText2);
|
||||
const chatOptions: any = {};
|
||||
@ -110,5 +108,10 @@ export async function sendMessage(message: any, panel: vscode.WebviewPanel): Pro
|
||||
return;
|
||||
}
|
||||
|
||||
export async function stopDevChat(message: any, panel: vscode.WebviewPanel): Promise<void> {
|
||||
logger.channel()?.info(`Stopping devchat`);
|
||||
devChat.stop();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -9,31 +9,6 @@ import * as fs from 'fs';
|
||||
|
||||
import { logger } from '../util/logger';
|
||||
|
||||
const spawnAsync = async (command: string, args: string[], options: any, onData: (data: string) => void): Promise<{ code: number, stdout: string; stderr: string }> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = spawn(command, args, options);
|
||||
let stdout = '';
|
||||
let stderr = '';
|
||||
|
||||
child.stdout.on('data', (data) => {
|
||||
const dataStr = data.toString();
|
||||
onData(dataStr);
|
||||
stdout += dataStr;
|
||||
});
|
||||
|
||||
child.stderr.on('data', (data) => {
|
||||
stderr += data;
|
||||
});
|
||||
|
||||
child.on('close', (code) => {
|
||||
if (code === 0) {
|
||||
resolve({ code, stdout, stderr });
|
||||
} else {
|
||||
reject({ code, stdout, stderr });
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const envPath = path.join(__dirname, '..', '.env');
|
||||
dotenv.config({ path: envPath });
|
||||
@ -69,6 +44,42 @@ export interface ChatResponse {
|
||||
|
||||
|
||||
class DevChat {
|
||||
private childProcess: any;
|
||||
|
||||
async spawnAsync(command: string, args: string[], options: any, onData: (data: string) => void): Promise<{ code: number, stdout: string; stderr: string }> {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.childProcess = spawn(command, args, options);
|
||||
|
||||
let stdout = '';
|
||||
let stderr = '';
|
||||
|
||||
this.childProcess.stdout.on('data', (data: { toString: () => any; }) => {
|
||||
const dataStr = data.toString();
|
||||
onData(dataStr);
|
||||
stdout += dataStr;
|
||||
});
|
||||
|
||||
this.childProcess.stderr.on('data', (data: string) => {
|
||||
stderr += data;
|
||||
});
|
||||
|
||||
this.childProcess.on('close', (code: number) => {
|
||||
if (code === 0) {
|
||||
resolve({ code, stdout, stderr });
|
||||
} else {
|
||||
reject({ code, stdout, stderr });
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
public stop() {
|
||||
if (this.childProcess) {
|
||||
this.childProcess.kill();
|
||||
this.childProcess = null;
|
||||
}
|
||||
}
|
||||
|
||||
async chat(content: string, options: ChatOptions = {}, onData: (data: ChatResponse) => void): Promise<ChatResponse> {
|
||||
let args = ["prompt"];
|
||||
|
||||
@ -182,7 +193,7 @@ class DevChat {
|
||||
};
|
||||
|
||||
logger.channel()?.info(`Running devchat with args: ${args.join(" ")}`);
|
||||
const { code, stdout, stderr } = await spawnAsync('devchat', args, {
|
||||
const { code, stdout, stderr } = await this.spawnAsync('devchat', args, {
|
||||
maxBuffer: 10 * 1024 * 1024, // Set maxBuffer to 10 MB
|
||||
cwd: workspaceDir,
|
||||
env: {
|
||||
@ -230,7 +241,7 @@ class DevChat {
|
||||
|
||||
try {
|
||||
logger.channel()?.info(`Running devchat with args: ${args.join(" ")}`);
|
||||
const { code, stdout, stderr } = await spawnAsync('devchat', args, {
|
||||
const { code, stdout, stderr } = await this.spawnAsync('devchat', args, {
|
||||
maxBuffer: 10 * 1024 * 1024, // Set maxBuffer to 10 MB
|
||||
cwd: workspaceDir,
|
||||
env: {
|
||||
|
Loading…
x
Reference in New Issue
Block a user