diff options
Diffstat (limited to 'extension')
-rw-r--r-- | extension/package-lock.json | 165 | ||||
-rw-r--r-- | extension/package.json | 7 | ||||
-rw-r--r-- | extension/react-app/src/components/TextDialog.tsx | 3 | ||||
-rw-r--r-- | extension/react-app/src/tabs/gui.tsx | 22 | ||||
-rw-r--r-- | extension/server_version.txt | 1 | ||||
-rw-r--r-- | extension/src/activation/environmentSetup.ts | 87 | ||||
-rw-r--r-- | extension/src/continueIdeClient.ts | 4 | ||||
-rw-r--r-- | extension/src/suggestions.ts | 23 | ||||
-rw-r--r-- | extension/src/telemetry.ts | 4 |
9 files changed, 243 insertions, 73 deletions
diff --git a/extension/package-lock.json b/extension/package-lock.json index a3b528ac..0a1ba1b6 100644 --- a/extension/package-lock.json +++ b/extension/package-lock.json @@ -1,17 +1,18 @@ { "name": "continue", - "version": "0.0.99", + "version": "0.0.104", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "continue", - "version": "0.0.99", + "version": "0.0.104", "license": "Apache-2.0", "dependencies": { "@electron/rebuild": "^3.2.10", "@reduxjs/toolkit": "^1.9.3", "@segment/analytics-node": "^0.0.1-beta.16", + "@sentry/node": "^7.57.0", "@styled-icons/heroicons-outline": "^10.47.0", "@vitejs/plugin-react-swc": "^3.3.2", "axios": "^1.2.5", @@ -35,7 +36,7 @@ "@types/node-fetch": "^2.6.2", "@types/react-dom": "^18.2.4", "@types/styled-components": "^5.1.26", - "@types/vscode": "^1.74.0", + "@types/vscode": "1.60", "@types/ws": "^8.5.4", "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.45.0", @@ -49,7 +50,7 @@ "vsce": "^2.15.0" }, "engines": { - "vscode": "^1.74.0" + "vscode": "^1.60.0" } }, "node_modules/@alloc/quick-lru": { @@ -1331,6 +1332,71 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "node_modules/@sentry-internal/tracing": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.57.0.tgz", + "integrity": "sha512-tpViyDd8AhQGYYhI94xi2aaDopXOPfL2Apwrtb3qirWkomIQ2K86W1mPmkce+B0cFOnW2Dxv/ZTFKz6ghjK75A==", + "dependencies": { + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/core": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.57.0.tgz", + "integrity": "sha512-l014NudPH0vQlzybtXajPxYFfs9w762NoarjObC3gu76D1jzBBFzhdRelkGpDbSLNTIsKhEDDRpgAjBWJ9icfw==", + "dependencies": { + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.57.0.tgz", + "integrity": "sha512-63mjyUVM6sfJFVQ5TGVRVGUsoEfESl5ABzIW1W0s9gUiQPaG8SOdaQJglb2VNrkMYxnRHgD8Q9LUh/qcmUyPGw==", + "dependencies": { + "@sentry-internal/tracing": "7.57.0", + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.57.0.tgz", + "integrity": "sha512-D7ifoUfxuVCUyktIr5Gc+jXUbtcUMmfHdTtTbf1XCZHua5mJceK9wtl3YCg3eq/HK2Ppd52BKnTzEcS5ZKQM+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.57.0.tgz", + "integrity": "sha512-YXrkMCiNklqkXctn4mKYkrzNCf/dfVcRUQrkXjeBC+PHXbcpPyaJgInNvztR7Skl8lE3JPGPN4v5XhLxK1bUUg==", + "dependencies": { + "@sentry/types": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -1774,9 +1840,9 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@types/vscode": { - "version": "1.74.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", - "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.60.0.tgz", + "integrity": "sha512-wZt3VTmzYrgZ0l/3QmEbCq4KAJ71K3/hmMQ/nfpv84oH8e81KKwPEoQ5v8dNCxfHFVJ1JabHKmCvqdYOoVm1Ow==", "dev": true }, "node_modules/@types/ws": { @@ -2940,6 +3006,14 @@ "node": "> 0.10" } }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -5183,6 +5257,11 @@ "node": ">=8" } }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -8183,8 +8262,7 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -9808,6 +9886,56 @@ } } }, + "@sentry-internal/tracing": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.57.0.tgz", + "integrity": "sha512-tpViyDd8AhQGYYhI94xi2aaDopXOPfL2Apwrtb3qirWkomIQ2K86W1mPmkce+B0cFOnW2Dxv/ZTFKz6ghjK75A==", + "requires": { + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" + } + }, + "@sentry/core": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.57.0.tgz", + "integrity": "sha512-l014NudPH0vQlzybtXajPxYFfs9w762NoarjObC3gu76D1jzBBFzhdRelkGpDbSLNTIsKhEDDRpgAjBWJ9icfw==", + "requires": { + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" + } + }, + "@sentry/node": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.57.0.tgz", + "integrity": "sha512-63mjyUVM6sfJFVQ5TGVRVGUsoEfESl5ABzIW1W0s9gUiQPaG8SOdaQJglb2VNrkMYxnRHgD8Q9LUh/qcmUyPGw==", + "requires": { + "@sentry-internal/tracing": "7.57.0", + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^2.4.1 || ^1.9.3" + } + }, + "@sentry/types": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.57.0.tgz", + "integrity": "sha512-D7ifoUfxuVCUyktIr5Gc+jXUbtcUMmfHdTtTbf1XCZHua5mJceK9wtl3YCg3eq/HK2Ppd52BKnTzEcS5ZKQM+w==" + }, + "@sentry/utils": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.57.0.tgz", + "integrity": "sha512-YXrkMCiNklqkXctn4mKYkrzNCf/dfVcRUQrkXjeBC+PHXbcpPyaJgInNvztR7Skl8lE3JPGPN4v5XhLxK1bUUg==", + "requires": { + "@sentry/types": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" + } + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -10116,9 +10244,9 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "@types/vscode": { - "version": "1.74.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", - "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.60.0.tgz", + "integrity": "sha512-wZt3VTmzYrgZ0l/3QmEbCq4KAJ71K3/hmMQ/nfpv84oH8e81KKwPEoQ5v8dNCxfHFVJ1JabHKmCvqdYOoVm1Ow==", "dev": true }, "@types/ws": { @@ -10937,6 +11065,11 @@ "easy-table": "1.1.0" } }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -12603,6 +12736,11 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -14662,8 +14800,7 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { "version": "3.21.0", diff --git a/extension/package.json b/extension/package.json index 93649e3a..2a375138 100644 --- a/extension/package.json +++ b/extension/package.json @@ -14,10 +14,10 @@ "displayName": "Continue", "pricing": "Free", "description": "The open-source coding autopilot", - "version": "0.0.99", + "version": "0.0.104", "publisher": "Continue", "engines": { - "vscode": "^1.74.0" + "vscode": "^1.60.0" }, "categories": [ "Other", @@ -223,7 +223,7 @@ "@types/node-fetch": "^2.6.2", "@types/react-dom": "^18.2.4", "@types/styled-components": "^5.1.26", - "@types/vscode": "^1.74.0", + "@types/vscode": "1.60", "@types/ws": "^8.5.4", "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.45.0", @@ -240,6 +240,7 @@ "@electron/rebuild": "^3.2.10", "@reduxjs/toolkit": "^1.9.3", "@segment/analytics-node": "^0.0.1-beta.16", + "@sentry/node": "^7.57.0", "@styled-icons/heroicons-outline": "^10.47.0", "@vitejs/plugin-react-swc": "^3.3.2", "axios": "^1.2.5", diff --git a/extension/react-app/src/components/TextDialog.tsx b/extension/react-app/src/components/TextDialog.tsx index 2632e572..a564f884 100644 --- a/extension/react-app/src/components/TextDialog.tsx +++ b/extension/react-app/src/components/TextDialog.tsx @@ -52,6 +52,7 @@ const TextDialog = (props: { showDialog: boolean; onEnter: (text: string) => void; onClose: () => void; + message?: string; }) => { const [text, setText] = useState(""); const textAreaRef = React.createRef<HTMLTextAreaElement>(); @@ -75,7 +76,7 @@ const TextDialog = (props: { }} > <Dialog> - <P>Thanks for your feedback. We'll get back to you soon!</P> + <P>{props.message || ""}</P> <TextArea rows={10} ref={textAreaRef} diff --git a/extension/react-app/src/tabs/gui.tsx b/extension/react-app/src/tabs/gui.tsx index 658aa503..e0b32a24 100644 --- a/extension/react-app/src/tabs/gui.tsx +++ b/extension/react-app/src/tabs/gui.tsx @@ -103,6 +103,7 @@ function GUI(props: GUIProps) { } as any); const [showFeedbackDialog, setShowFeedbackDialog] = useState(false); + const [feedbackDialogMessage, setFeedbackDialogMessage] = useState(""); const topGuiDivRef = useRef<HTMLDivElement>(null); const client = useContinueGUIProtocol(); @@ -259,6 +260,7 @@ function GUI(props: GUIProps) { onClose={() => { setShowFeedbackDialog(false); }} + message={feedbackDialogMessage} ></TextDialog> <TopGUIDiv @@ -396,17 +398,24 @@ function GUI(props: GUIProps) { </div> <HeaderButtonWithText onClick={() => { - client?.changeDefaultModel( - usingFastModel ? "gpt-4" : "gpt-3.5-turbo" - ); + // client?.changeDefaultModel( + // usingFastModel ? "gpt-4" : "gpt-3.5-turbo" + // ); + if (!usingFastModel) { + // Show the dialog + setFeedbackDialogMessage( + "We don't yet support local models, but we're working on it! If privacy is a concern of yours, please use the feedback button in the bottom right to let us know." + ); + setShowFeedbackDialog(true); + } setUsingFastModel((prev) => !prev); }} - text={usingFastModel ? "gpt-3.5-turbo" : "gpt-4"} + text={usingFastModel ? "local" : "gpt-4"} > <div style={{ fontSize: "18px", marginLeft: "2px", marginRight: "2px" }} > - {usingFastModel ? "⚡" : "🧠"} + {usingFastModel ? "🔒" : "🧠"} </div> </HeaderButtonWithText> <HeaderButtonWithText @@ -428,6 +437,9 @@ function GUI(props: GUIProps) { <HeaderButtonWithText onClick={() => { // Set dialog open + setFeedbackDialogMessage( + "Having trouble using Continue? Want a new feature? Let us know! This box is anonymous, but we will promptly address your feedback." + ); setShowFeedbackDialog(true); }} text="Feedback" diff --git a/extension/server_version.txt b/extension/server_version.txt new file mode 100644 index 00000000..da5ce208 --- /dev/null +++ b/extension/server_version.txt @@ -0,0 +1 @@ +0.0.101
\ No newline at end of file diff --git a/extension/src/activation/environmentSetup.ts b/extension/src/activation/environmentSetup.ts index d4c81d2e..4e6be9b3 100644 --- a/extension/src/activation/environmentSetup.ts +++ b/extension/src/activation/environmentSetup.ts @@ -9,6 +9,7 @@ import { getContinueServerUrl } from "../bridge"; import fetch from "node-fetch"; import * as vscode from "vscode"; import fkill from "fkill"; +import { sendTelemetryEvent, TelemetryEvent } from "../telemetry"; const MAX_RETRIES = 5; async function retryThenFail( @@ -17,13 +18,16 @@ async function retryThenFail( ): Promise<any> { try { return await fn(); - } catch (e) { + } catch (e: any) { if (retries > 0) { return await retryThenFail(fn, retries - 1); } vscode.window.showErrorMessage( "Failed to set up Continue extension. Please email nate@continue.dev and we'll get this fixed ASAP!" ); + sendTelemetryEvent(TelemetryEvent.ExtensionSetupError, { + error: e.message, + }); throw e; } } @@ -47,6 +51,12 @@ async function runCommand(cmd: string): Promise<[string, string | undefined]> { stdout = ""; } + if (stderr) { + sendTelemetryEvent(TelemetryEvent.ExtensionSetupError, { + error: stderr, + }); + } + return [stdout, stderr]; } @@ -71,9 +81,11 @@ async function getPythonPipCommands() { } } + let pipCmd = pythonCmd.endsWith("3") ? "pip3" : "pip"; + const version = stdout.split(" ")[1]; const [major, minor] = version.split("."); - if (parseInt(major) !== 3 || parseInt(minor) < 7) { + if (parseInt(major) !== 3 || parseInt(minor) < 8) { // Need to check specific versions const checkPython3VersionExists = async (minorVersion: number) => { const [stdout, stderr] = await runCommand( @@ -82,24 +94,27 @@ async function getPythonPipCommands() { return typeof stderr === "undefined" || stderr === ""; }; - const validVersions = [7, 8, 9, 10, 11, 12]; + const VALID_VERSIONS = [8, 9, 10, 11, 12]; let versionExists = false; - for (const minorVersion of validVersions) { + for (const minorVersion of VALID_VERSIONS) { if (await checkPython3VersionExists(minorVersion)) { versionExists = true; - break; + pythonCmd = `python3.${minorVersion}`; + pipCmd = `pip3.${minorVersion}`; } } if (!versionExists) { vscode.window.showErrorMessage( - "Continue requires Python3 version 3.7 or greater. Please update your Python3 installation, reload VS Code, and try again." + "Continue requires Python3 version 3.8 or greater. Please update your Python3 installation, reload VS Code, and try again." ); - throw new Error("Python3 is not installed."); + throw new Error("Python3.8 or greater is not installed."); } + } else { + pythonCmd = `python${major}.${minor}`; + pipCmd = `pip${major}.${minor}`; } - const pipCmd = pythonCmd.endsWith("3") ? "pip3" : "pip"; return [pythonCmd, pipCmd]; } @@ -283,34 +298,33 @@ export async function startContinuePythonServer() { return; } - if (await checkServerRunning(serverUrl)) { - // Kill the server if it is running an old version - if (fs.existsSync(serverVersionPath())) { - const serverVersion = fs.readFileSync(serverVersionPath(), "utf8"); - if (serverVersion === getExtensionVersion()) { - return; + return await retryThenFail(async () => { + if (await checkServerRunning(serverUrl)) { + // Kill the server if it is running an old version + if (fs.existsSync(serverVersionPath())) { + const serverVersion = fs.readFileSync(serverVersionPath(), "utf8"); + if (serverVersion === getExtensionVersion()) { + return; + } } + console.log("Killing old server..."); + await fkill(":65432"); } - console.log("Killing old server..."); - await fkill(":65432"); - } - // Do this after above check so we don't have to waste time setting up the env - await setupPythonEnv(); + // Do this after above check so we don't have to waste time setting up the env + await setupPythonEnv(); - let activateCmd = ". env/bin/activate"; - let pythonCmd = "python3"; - if (process.platform == "win32") { - activateCmd = ".\\env\\Scripts\\activate"; - pythonCmd = "python"; - } + const [pythonCmd] = await getPythonPipCommands(); + const activateCmd = + process.platform == "win32" + ? ".\\env\\Scripts\\activate" + : ". env/bin/activate"; - let command = `cd "${path.join( - getExtensionUri().fsPath, - "scripts" - )}" && ${activateCmd} && cd .. && ${pythonCmd} -m scripts.run_continue_server`; + const command = `cd "${path.join( + getExtensionUri().fsPath, + "scripts" + )}" && ${activateCmd} && cd .. && ${pythonCmd} -m scripts.run_continue_server`; - return await retryThenFail(async () => { console.log("Starting Continue python server..."); return new Promise(async (resolve, reject) => { @@ -318,22 +332,25 @@ export async function startContinuePythonServer() { const child = spawn(command, { shell: true, }); - child.stdout.on("data", (data: any) => { - console.log(`stdout: ${data}`); - }); child.stderr.on("data", (data: any) => { + console.log(`stdout: ${data}`); if ( data.includes("Uvicorn running on") || // Successfully started the server data.includes("address already in use") // The server is already running (probably a simultaneously opened VS Code window) ) { console.log("Successfully started Continue python server"); resolve(null); - } else { - console.log(`stderr: ${data}`); + } else if (data.includes("ERROR") || data.includes("Traceback")) { + sendTelemetryEvent(TelemetryEvent.ExtensionSetupError, { + error: data, + }); } }); child.on("error", (error: any) => { console.log(`error: ${error.message}`); + sendTelemetryEvent(TelemetryEvent.ExtensionSetupError, { + error: error.message, + }); }); // Write the current version of vscode to a file called server_version.txt diff --git a/extension/src/continueIdeClient.ts b/extension/src/continueIdeClient.ts index 8f45b849..999bca88 100644 --- a/extension/src/continueIdeClient.ts +++ b/extension/src/continueIdeClient.ts @@ -408,6 +408,10 @@ class IdeProtocolClient { sendHighlightedCode(highlightedCode: (RangeInFile & { contents: string })[]) { this.messenger?.send("highlightedCodePush", { highlightedCode }); } + + sendAcceptRejectSuggestion(accepted: boolean) { + this.messenger?.send("acceptRejectSuggestion", { accepted }); + } } export default IdeProtocolClient; diff --git a/extension/src/suggestions.ts b/extension/src/suggestions.ts index baa49711..6e5a444f 100644 --- a/extension/src/suggestions.ts +++ b/extension/src/suggestions.ts @@ -5,7 +5,7 @@ import { translate, readFileAtRange } from "./util/vscode"; import * as fs from "fs"; import * as path from "path"; import { registerAllCodeLensProviders } from "./lang-server/codeLens"; -import { extensionContext } from "./activation/activate"; +import { extensionContext, ideProtocolClient } from "./activation/activate"; export interface SuggestionRanges { oldRange: vscode.Range; @@ -241,19 +241,14 @@ function selectSuggestion( suggestions = JSON.parse(rawData); } - if (accept === "new" || (accept === "selected" && suggestion.newSelected)) { - suggestions.push({ - accepted: true, - timestamp: Date.now(), - suggestion: suggestion.newContent, - }); - } else { - suggestions.push({ - accepted: false, - timestamp: Date.now(), - suggestion: suggestion.newContent, - }); - } + const accepted = + accept === "new" || (accept === "selected" && suggestion.newSelected); + suggestions.push({ + accepted, + timestamp: Date.now(), + suggestion: suggestion.newContent, + }); + ideProtocolClient.sendAcceptRejectSuggestion(accepted); // Write the updated suggestions back to the file fs.writeFileSync( diff --git a/extension/src/telemetry.ts b/extension/src/telemetry.ts index ea71a545..db5cb8ca 100644 --- a/extension/src/telemetry.ts +++ b/extension/src/telemetry.ts @@ -35,6 +35,8 @@ export enum TelemetryEvent { AutoDebugThisTest = "AutoDebugThisTest", // Command run to generate docstring GenerateDocstring = "GenerateDocstring", + // Error setting up the extension + ExtensionSetupError = "ExtensionSetupError", } export function sendTelemetryEvent( @@ -48,4 +50,4 @@ export function sendTelemetryEvent( userId: vscode.env.machineId, properties, }); -}
\ No newline at end of file +} |