From 31b073aca099d6bc2b01a3cbf8fb5099e61e19b9 Mon Sep 17 00:00:00 2001 From: nang-dev Date: Mon, 25 Nov 2024 14:31:38 -0800 Subject: [PATCH 1/3] Fixed build --- core/core.ts | 11 +++++++++-- core/llm/llms/AiderLLM.ts | 17 +++++++---------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/core/core.ts b/core/core.ts index 20af07df0c..14b7d9dd4a 100644 --- a/core/core.ts +++ b/core/core.ts @@ -1,6 +1,6 @@ import * as fs from "node:fs"; import { v4 as uuidv4 } from "uuid"; -import type { ContextItemId, IDE, IndexingProgressUpdate } from "."; +import type { ChatMessage, ContextItemId, IDE, IndexingProgressUpdate } from "."; import { CompletionProvider } from "./autocomplete/completionProvider"; import { ConfigHandler } from "./config/ConfigHandler"; import { @@ -383,7 +383,14 @@ export class Core { }); break; } - yield { content: next.value.content, citations: next.value?.citations }; + // Assert that next.value is a ChatMessage + const chatMessage = next.value as ChatMessage; + + yield { + content: chatMessage.content, + citations: chatMessage.citations + }; + next = await gen.next(); } diff --git a/core/llm/llms/AiderLLM.ts b/core/llm/llms/AiderLLM.ts index 13ed04843e..720c489a16 100644 --- a/core/llm/llms/AiderLLM.ts +++ b/core/llm/llms/AiderLLM.ts @@ -198,23 +198,20 @@ class Aider extends BaseLLM { content: escapeDollarSigns(newOutput), }; - // Safety check - // if (Aider.aiderProcess?.killed) { - // if (potentialCompletionTimeout) { - // clearTimeout(potentialCompletionTimeout); - // } - // this.setAiderState("stopped"); - // break; - // } + if (Aider.aiderProcess?.state.state === "stopped" || Aider.aiderProcess?.state.state === "crashed") { + if (potentialCompletionTimeout) { + clearTimeout(potentialCompletionTimeout); + } + this.setAiderState({ state: "stopped" }); + break; + } } } - // Clean up any remaining timeout if (potentialCompletionTimeout) { clearTimeout(potentialCompletionTimeout); } - // Reset the output after capturing a complete response if (Aider.aiderProcess) { Aider.aiderProcess.aiderOutput = ""; } From 3b0cbc9471e023de77f98e35632c57cc32fa4b04 Mon Sep 17 00:00:00 2001 From: nang-dev Date: Mon, 25 Nov 2024 15:02:31 -0800 Subject: [PATCH 2/3] Added working --- core/core.ts | 11 +++----- extensions/vscode/package-lock.json | 4 +-- extensions/vscode/package.json | 2 +- .../src/integrations/aider/aiderProcess.ts | 25 +++++++++++++------ .../src/integrations/aider/aiderUtil.ts | 14 ++++------- .../integrations/aider/types/aiderTypes.ts | 2 +- gui/src/integrations/aider/aidergui.tsx | 2 +- 7 files changed, 31 insertions(+), 29 deletions(-) diff --git a/core/core.ts b/core/core.ts index 14b7d9dd4a..20dbe56e23 100644 --- a/core/core.ts +++ b/core/core.ts @@ -451,7 +451,7 @@ export class Core { const { accessToken, refreshToken } = msg.data || {}; const config = await this.configHandler.loadConfig(); const pearAIModels = config.models.filter(model => model instanceof PearAIServer) as PearAIServer[]; - const aiderModels = config.models.filter(model => model instanceof Aider) as Aider[]; + const aiderModel = config.models.find(model => model instanceof Aider) as Aider; try { if (pearAIModels.length > 0) { @@ -464,13 +464,10 @@ export class Core { console.warn(`Error resetting PearAI credentials: ${e}`); return undefined; } - // TODO @nang - handle this better try { - if (aiderModels.length > 0) { - aiderModels.forEach(model => { - model.setPearAIAccessToken(accessToken); - model.setPearAIRefreshToken(refreshToken); - }); + if (aiderModel) { + aiderModel.setPearAIAccessToken(accessToken); + aiderModel.setPearAIRefreshToken(refreshToken); } } catch (e) { console.warn(`Error resetting PearAI credentials for aider: ${e}`); diff --git a/extensions/vscode/package-lock.json b/extensions/vscode/package-lock.json index da7723cd3d..e1035d180d 100644 --- a/extensions/vscode/package-lock.json +++ b/extensions/vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "pearai", - "version": "1.5.2", + "version": "1.5.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pearai", - "version": "1.5.2", + "version": "1.5.3", "license": "Apache-2.0", "dependencies": { "@electron/rebuild": "^3.2.10", diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index bc554d19b7..9bb940b382 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -3,7 +3,7 @@ "name": "pearai", "publisher": "pearai", "icon": "media/icon.png", - "version": "1.5.2", + "version": "1.5.3", "repository": { "type": "git", "url": "https://github.com/trypear/pearai-submodule" diff --git a/extensions/vscode/src/integrations/aider/aiderProcess.ts b/extensions/vscode/src/integrations/aider/aiderProcess.ts index 8f933e42a8..676ef11f7f 100644 --- a/extensions/vscode/src/integrations/aider/aiderProcess.ts +++ b/extensions/vscode/src/integrations/aider/aiderProcess.ts @@ -208,16 +208,19 @@ export class AiderProcessManager { public updateState(newState: Omit) { + console.log(`Aider state changing from ${this._state.state} to ${newState.state}`); + + // TODO: probably handle this better. Crashed happens because we send a SIGINT to the process needed to reset. @nang + if (this._state.state === "restarting" && newState.state === "crashed") { + console.log("Blocking state change from 'restarting' to 'crashed'"); + + return; + } this._state = { ...newState, timeStamp: Date.now() }; vscode.commands.executeCommand("pearai.setAiderProcessState", this._state); - this.notifyStateChange(); - } - - private notifyStateChange() { - console.log(`Aider state changed to: ${this._state.state}`); } private captureAiderOutput(data: Buffer): void { @@ -232,8 +235,10 @@ export class AiderProcessManager { this.aiderOutput += cleanOutput; } - async startAiderChat(model: string, apiKey: string | undefined): Promise { +async startAiderChat(model: string, apiKey: string | undefined, isRestarting: boolean = false): Promise { + if (!isRestarting) { this.updateState({ state: "starting" }); + } try { // Check if current workspace is a git repo @@ -405,10 +410,14 @@ export class AiderProcessManager { async resetSession(model: string, apiKey: string | undefined): Promise { console.log("Resetting Aider process..."); - this.killAiderProcess(); + if (this.aiderProcess) { + killAiderProcess(this.aiderProcess); + this.aiderProcess = null; + this.updateState({ state: "restarting" }); + } try { - await this.startAiderChat(model, apiKey); + await this.startAiderChat(model, apiKey, true); console.log("Aider process reset successfully."); } catch (error) { console.error("Error resetting Aider process:", error); diff --git a/extensions/vscode/src/integrations/aider/aiderUtil.ts b/extensions/vscode/src/integrations/aider/aiderUtil.ts index 1176feac4c..e4e670900d 100644 --- a/extensions/vscode/src/integrations/aider/aiderUtil.ts +++ b/extensions/vscode/src/integrations/aider/aiderUtil.ts @@ -113,17 +113,13 @@ export async function aiderCtrlC(core: Core) { export async function aiderResetSession(core: Core) { const config = await core.configHandler.loadConfig(); - const aiderModels = config.models.filter( - (model) => model instanceof Aider, - ) as Aider[]; + const aiderModel = config.models.find( + (model) => model instanceof Aider + ) as Aider | undefined; try { - if (aiderModels.length > 0) { - aiderModels.forEach((model) => { - if (Aider.aiderProcess) { - model.aiderResetSession(model.model, model.apiKey); - } - }); + if (aiderModel && Aider.aiderProcess) { + aiderModel.aiderResetSession(aiderModel.model, aiderModel.apiKey); } } catch (e) { console.warn(`Error resetting Aider session: ${e}`); diff --git a/extensions/vscode/src/integrations/aider/types/aiderTypes.ts b/extensions/vscode/src/integrations/aider/types/aiderTypes.ts index 0f82961d54..2cf6e0f830 100644 --- a/extensions/vscode/src/integrations/aider/types/aiderTypes.ts +++ b/extensions/vscode/src/integrations/aider/types/aiderTypes.ts @@ -1,4 +1,4 @@ export interface AiderState { - state: "undefined" | "starting" | "uninstalled" | "ready" | "stopped" |"crashed" | "signedOut" | "notgitrepo"; + state: "undefined" | "starting" | "uninstalled" | "ready" | "stopped" |"crashed" | "signedOut" | "notgitrepo" | "restarting"; timeStamp?: number; } \ No newline at end of file diff --git a/gui/src/integrations/aider/aidergui.tsx b/gui/src/integrations/aider/aidergui.tsx index 5a4e6836fa..bb5e1de41d 100644 --- a/gui/src/integrations/aider/aidergui.tsx +++ b/gui/src/integrations/aider/aidergui.tsx @@ -271,7 +271,7 @@ useEffect(() => { if (aiderProcessState.state === "uninstalled" || aiderProcessState.state === "stopped" || aiderProcessState.state === "crashed") { return ; } - if (aiderProcessState.state === "starting") { + if (aiderProcessState.state === "starting" || aiderProcessState.state === "restarting") { msg = ( <> Spinning up PearAI Creator (Powered By aider), please give it a second... From 296f019ed706dcbf381b2b0d0e9a2a278f42bc19 Mon Sep 17 00:00:00 2001 From: nang-dev Date: Mon, 25 Nov 2024 20:50:33 -0800 Subject: [PATCH 3/3] Added --no-detect-urls --- .../src/integrations/aider/aiderProcess.ts | 38 +++++++++++++++++-- .../src/integrations/aider/aiderUtil.ts | 1 + 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/extensions/vscode/src/integrations/aider/aiderProcess.ts b/extensions/vscode/src/integrations/aider/aiderProcess.ts index 676ef11f7f..112d2b38eb 100644 --- a/extensions/vscode/src/integrations/aider/aiderProcess.ts +++ b/extensions/vscode/src/integrations/aider/aiderProcess.ts @@ -1,7 +1,7 @@ import * as cp from "child_process"; import * as vscode from "vscode"; import * as os from "os"; -import { execSync } from "child_process"; +import { execSync, exec } from "child_process"; import { AiderState } from "./types/aiderTypes"; import { PearAICredentials } from "core/pearaiServer/PearAICredentials"; import { @@ -28,20 +28,52 @@ export const AIDER_QUESTION_MARKER = "[Yes]\\:"; export const AIDER_END_MARKER = "─────────────────────────────────────"; export const COMPLETION_DELAY = 1500; // 1.5 seconds wait time +function getAiderVersion(): string { + try { + const versionOutput = execSync('aider --version').toString().trim(); + // Extract version number from output (e.g., "aider v0.64.2" -> "0.64.2") + const match = versionOutput.match(/v?(\d+\.\d+\.\d+)/); + return match ? match[1] : "0.0.0"; + } catch (error) { + console.error("Error getting aider version:", error); + return "0.0.0"; + } +} + +function compareVersions(v1: string, v2: string): number { + const parts1 = v1.split('.').map(Number); + const parts2 = v2.split('.').map(Number); + + for (let i = 0; i < 3; i++) { + if (parts1[i] > parts2[i]) return 1; + if (parts1[i] < parts2[i]) return -1; + } + return 0; +} + export function buildAiderCommand(model: string, accessToken: string | undefined, apiKey: string | undefined): string[] { const aiderCommand = ["aider"]; + const currentVersion = getAiderVersion(); + console.dir("CURRENT VERSION") + console.dir(currentVersion) + const minVersionForNoDetectUrls = "0.64.2"; + let aiderFlags = [ "--no-pretty", "--yes-always", "--no-auto-commits", "--no-suggest-shell-commands", - "--no-check-update", "--no-auto-lint", "--map-tokens", "2048", - "--subtree-only" + "--subtree-only", ]; + // Add --no-detect-urls flag if version is >= 0.64.2 + if (compareVersions(currentVersion, minVersionForNoDetectUrls) >= 0) { + aiderFlags.push("--no-detect-urls"); + } + aiderCommand.push(...aiderFlags); if (model === "pearai_model") { diff --git a/extensions/vscode/src/integrations/aider/aiderUtil.ts b/extensions/vscode/src/integrations/aider/aiderUtil.ts index e4e670900d..d013ca515c 100644 --- a/extensions/vscode/src/integrations/aider/aiderUtil.ts +++ b/extensions/vscode/src/integrations/aider/aiderUtil.ts @@ -50,6 +50,7 @@ export async function startAiderProcess(core: Core) { await aiderModel.setAiderState({state: "uninstalled"}); return; } + try { await aiderModel.startAiderChat(aiderModel.model, aiderModel.apiKey);