summaryrefslogtreecommitdiff
path: root/extension/src/activation/environmentSetup.ts
diff options
context:
space:
mode:
authorNate Sesti <33237525+sestinj@users.noreply.github.com>2023-10-09 18:37:27 -0700
committerGitHub <noreply@github.com>2023-10-09 18:37:27 -0700
commitf09150617ed2454f3074bcf93f53aae5ae637d40 (patch)
tree5cfe614a64d921dfe58b049f426d67a8b832c71f /extension/src/activation/environmentSetup.ts
parent985304a213f620cdff3f8f65f74ed7e3b79be29d (diff)
downloadsncontinue-f09150617ed2454f3074bcf93f53aae5ae637d40.tar.gz
sncontinue-f09150617ed2454f3074bcf93f53aae5ae637d40.tar.bz2
sncontinue-f09150617ed2454f3074bcf93f53aae5ae637d40.zip
Preview (#541)
* Strong typing (#533) * refactor: :recycle: get rid of continuedev.src.continuedev structure * refactor: :recycle: switching back to server folder * feat: :sparkles: make config.py imports shorter * feat: :bookmark: publish as pre-release vscode extension * refactor: :recycle: refactor and add more completion params to ui * build: :building_construction: download from preview S3 * fix: :bug: fix paths * fix: :green_heart: package:pre-release * ci: :green_heart: more time for tests * fix: :green_heart: fix build scripts * fix: :bug: fix import in run.py * fix: :bookmark: update version to try again * ci: 💚 Update package.json version [skip ci] * refactor: :fire: don't check for old extensions version * fix: :bug: small bug fixes * fix: :bug: fix config.py import paths * ci: 💚 Update package.json version [skip ci] * ci: :green_heart: platform-specific builds test #1 * feat: :green_heart: ship with binary * fix: :green_heart: fix copy statement to include.exe for windows * fix: :green_heart: cd extension before packaging * chore: :loud_sound: count tokens generated * fix: :green_heart: remove npm_config_arch * fix: :green_heart: publish as pre-release! * chore: :bookmark: update version * perf: :green_heart: hardcode distro paths * fix: :bug: fix yaml syntax error * chore: :bookmark: update version * fix: :green_heart: update permissions and version * feat: :bug: kill old server if needed * feat: :lipstick: update marketplace icon for pre-release * ci: 💚 Update package.json version [skip ci] * feat: :sparkles: auto-reload for config.py * feat: :wrench: update default config.py imports * feat: :sparkles: codelens in config.py * feat: :sparkles: select model param count from UI * ci: 💚 Update package.json version [skip ci] * feat: :sparkles: more model options, ollama error handling * perf: :zap: don't show server loading immediately * fix: :bug: fixing small UI details * ci: 💚 Update package.json version [skip ci] * feat: :rocket: headers param on LLM class * fix: :bug: fix headers for openai.;y * feat: :sparkles: highlight code on cmd+shift+L * ci: 💚 Update package.json version [skip ci] * feat: :lipstick: sticky top bar in gui.tsx * fix: :loud_sound: websocket logging and horizontal scrollbar * ci: 💚 Update package.json version [skip ci] * feat: :sparkles: allow AzureOpenAI Service through GGML * ci: 💚 Update package.json version [skip ci] * fix: :bug: fix automigration * ci: 💚 Update package.json version [skip ci] * ci: :green_heart: upload binaries in ci, download apple silicon * chore: :fire: remove notes * fix: :green_heart: use curl to download binary * fix: :green_heart: set permissions on apple silicon binary * fix: :green_heart: testing * fix: :green_heart: cleanup file * fix: :green_heart: fix preview.yaml * fix: :green_heart: only upload once per binary * fix: :green_heart: install rosetta * ci: :green_heart: download binary after tests * ci: 💚 Update package.json version [skip ci] * ci: :green_heart: prepare ci for merge to main --------- Co-authored-by: GitHub Action <action@github.com>
Diffstat (limited to 'extension/src/activation/environmentSetup.ts')
-rw-r--r--extension/src/activation/environmentSetup.ts218
1 files changed, 136 insertions, 82 deletions
diff --git a/extension/src/activation/environmentSetup.ts b/extension/src/activation/environmentSetup.ts
index 3f82631f..4c47fba6 100644
--- a/extension/src/activation/environmentSetup.ts
+++ b/extension/src/activation/environmentSetup.ts
@@ -89,7 +89,10 @@ export function getExtensionVersion() {
}
// Returns whether a server of the current version is already running
-async function checkOrKillRunningServer(serverUrl: string): Promise<boolean> {
+async function checkOrKillRunningServer(
+ serverUrl: string,
+ deleteBinary: boolean
+): Promise<boolean> {
const serverRunning = await checkServerRunning(serverUrl);
let shouldKillAndReplace = true;
@@ -127,10 +130,13 @@ async function checkOrKillRunningServer(serverUrl: string): Promise<boolean> {
if (fs.existsSync(serverVersionPath())) {
fs.unlinkSync(serverVersionPath());
}
- // Also delete the server binary
- const serverBinary = serverBinaryPath();
- if (fs.existsSync(serverBinary)) {
- fs.unlinkSync(serverBinary);
+
+ if (deleteBinary) {
+ // Optionally, delete the server binary
+ const serverBinary = serverBinaryPath();
+ if (fs.existsSync(serverBinary)) {
+ fs.unlinkSync(serverBinary);
+ }
}
}
@@ -146,6 +152,17 @@ function ensureDirectoryExistence(filePath: string) {
fs.mkdirSync(dirname);
}
+function isPreviewExtension() {
+ // If the extension minor version is odd, it is a preview version
+ const extensionVersion = getExtensionVersion();
+ if (!extensionVersion || extensionVersion === "") {
+ return false;
+ }
+ const extensionVersionSplit = extensionVersion.split(".");
+ const extensionMinorVersion = extensionVersionSplit[1];
+ return parseInt(extensionMinorVersion) % 2 === 1;
+}
+
export async function downloadFromS3(
bucket: string,
fileName: string,
@@ -187,24 +204,84 @@ export async function downloadFromS3(
});
}
-export async function startContinuePythonServer(redownload: boolean = true) {
- // Check vscode settings
- const manuallyRunningServer =
- vscode.workspace
- .getConfiguration("continue")
- .get<boolean>("manuallyRunningServer") || false;
- const serverUrl = getContinueServerUrl();
- if (
- (serverUrl !== "http://localhost:65432" &&
- serverUrl !== "http://127.0.0.1:65432") ||
- manuallyRunningServer
- ) {
- console.log("Continue server is being run manually, skipping start");
- return;
- }
+function includedBinaryPath(): string {
+ const extensionPath = getExtensionUri().fsPath;
+ return path.join(
+ extensionPath,
+ "exe",
+ `run${os.platform() === "win32" ? ".exe" : ""}`
+ );
+}
+
+function runExecutable(path: string) {
+ console.log("---- Starting Continue server ----");
+ let attempts = 0;
+ let maxAttempts = 5;
+ let delay = 1000; // Delay between each attempt in milliseconds
+
+ const spawnChild = () => {
+ const retry = (e: any) => {
+ attempts++;
+ console.log(`Error caught: ${e}.\n\nRetrying attempt ${attempts}...`);
+ setTimeout(spawnChild, delay);
+ };
+ try {
+ // NodeJS bug requires not using detached on Windows, otherwise windowsHide is ineffective
+ // Otherwise, detach is preferable
+ const windowsSettings = {
+ windowsHide: true,
+ };
+ const macLinuxSettings = {
+ detached: true,
+ stdio: "ignore",
+ };
+ const settings: any =
+ os.platform() === "win32" ? windowsSettings : macLinuxSettings;
+ // Spawn the server
+ const child = spawn(path, settings);
+
+ // Either unref to avoid zombie process, or listen to events because you can
+ if (os.platform() === "win32") {
+ child.stdout.on("data", (data: any) => {
+ console.log(`stdout: ${data}`);
+ });
+ child.stderr.on("data", (data: any) => {
+ console.log(`stderr: ${data}`);
+ });
+ child.on("error", (err: any) => {
+ if (attempts < maxAttempts) {
+ retry(err);
+ } else {
+ console.error("Failed to start subprocess.", err);
+ }
+ });
+ child.on("exit", (code: any, signal: any) => {
+ console.log("Subprocess exited with code", code, signal);
+ });
+ child.on("close", (code: any, signal: any) => {
+ console.log("Subprocess closed with code", code, signal);
+ });
+ } else {
+ child.unref();
+ }
+ } catch (e: any) {
+ if (attempts < maxAttempts) {
+ retry(e);
+ } else {
+ throw e;
+ }
+ }
+ };
+
+ spawnChild();
+
+ // Write the current version of vscode extension to a file called server_version.txt
+ fs.writeFileSync(serverVersionPath(), getExtensionVersion());
+}
+async function setupWithS3Download(redownload: boolean, serverUrl: string) {
// Check if server is already running
- if (redownload && (await checkOrKillRunningServer(serverUrl))) {
+ if (redownload && (await checkOrKillRunningServer(serverUrl, true))) {
console.log("Continue server already running");
return;
}
@@ -263,7 +340,7 @@ export async function startContinuePythonServer(redownload: boolean = true) {
try {
await downloadFromS3(
bucket,
- fileName,
+ `${isPreviewExtension() ? "preview/" : ""}${fileName}`,
destination,
"us-west-1",
false
@@ -285,7 +362,7 @@ export async function startContinuePythonServer(redownload: boolean = true) {
try {
await downloadFromS3(
bucket,
- fileName,
+ `${isPreviewExtension() ? "preview/" : ""}${fileName}`,
destination,
"us-west-1",
true
@@ -342,67 +419,44 @@ export async function startContinuePythonServer(redownload: boolean = true) {
}
// Run the executable
- console.log("---- Starting Continue server ----");
- let attempts = 0;
- let maxAttempts = 5;
- let delay = 1000; // Delay between each attempt in milliseconds
+ runExecutable(destination);
+}
- const spawnChild = () => {
- const retry = (e: any) => {
- attempts++;
- console.log(`Error caught: ${e}.\n\nRetrying attempt ${attempts}...`);
- setTimeout(spawnChild, delay);
- };
- try {
- // NodeJS bug requires not using detached on Windows, otherwise windowsHide is ineffective
- // Otherwise, detach is preferable
- const windowsSettings = {
- windowsHide: true,
- };
- const macLinuxSettings = {
- detached: true,
- stdio: "ignore",
- };
- const settings: any =
- os.platform() === "win32" ? windowsSettings : macLinuxSettings;
- // Spawn the server
- const child = spawn(destination, settings);
+export async function startContinuePythonServer(redownload: boolean = true) {
+ // Check vscode settings for whether server is being run manually
+ const manuallyRunningServer =
+ vscode.workspace
+ .getConfiguration("continue")
+ .get<boolean>("manuallyRunningServer") || false;
+ const serverUrl = getContinueServerUrl();
+ if (
+ (serverUrl !== "http://localhost:65432" &&
+ serverUrl !== "http://127.0.0.1:65432") ||
+ manuallyRunningServer
+ ) {
+ console.log("Continue server is being run manually, skipping start");
+ return;
+ }
- // Either unref to avoid zombie process, or listen to events because you can
- if (os.platform() === "win32") {
- child.stdout.on("data", (data: any) => {
- console.log(`stdout: ${data}`);
- });
- child.stderr.on("data", (data: any) => {
- console.log(`stderr: ${data}`);
- });
- child.on("error", (err: any) => {
- if (attempts < maxAttempts) {
- retry(err);
- } else {
- console.error("Failed to start subprocess.", err);
- }
- });
- child.on("exit", (code: any, signal: any) => {
- console.log("Subprocess exited with code", code, signal);
- });
- child.on("close", (code: any, signal: any) => {
- console.log("Subprocess closed with code", code, signal);
- });
- } else {
- child.unref();
- }
- } catch (e: any) {
- if (attempts < maxAttempts) {
- retry(e);
- } else {
- throw e;
- }
- }
- };
+ // If on Apple Silicon, download binary from S3
+ // const isAppleSilicon = os.platform() === "darwin" && os.arch() === "arm64";
+ // if (isAppleSilicon) {
+ // await setupWithS3Download(redownload, serverUrl);
+ // return;
+ // }
- spawnChild();
+ // Check if current server version is already running
+ if (redownload && (await checkOrKillRunningServer(serverUrl, false))) {
+ console.log("Continue server already running");
+ return;
+ }
- // Write the current version of vscode extension to a file called server_version.txt
- fs.writeFileSync(serverVersionPath(), getExtensionVersion());
+ // Otherwise, use the binary installed with the extension
+ if (!fs.existsSync(includedBinaryPath())) {
+ throw new Error(
+ `Continue server binary not found at ${includedBinaryPath()}`
+ );
+ }
+
+ runExecutable(includedBinaryPath());
}