diff options
-rw-r--r-- | continuedev/src/continuedev/core/sdk.py | 20 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/ide.py | 35 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/ide_protocol.py | 4 | ||||
-rw-r--r-- | continuedev/src/continuedev/steps/core/core.py | 1 | ||||
-rw-r--r-- | continuedev/src/continuedev/steps/main.py | 2 | ||||
-rw-r--r-- | extension/package.json | 10 | ||||
-rw-r--r-- | extension/react-app/src/components/StepContainer.tsx | 10 | ||||
-rw-r--r-- | extension/src/continueIdeClient.ts | 27 |
8 files changed, 64 insertions, 45 deletions
diff --git a/continuedev/src/continuedev/core/sdk.py b/continuedev/src/continuedev/core/sdk.py index 5d0f03fe..5ae471c4 100644 --- a/continuedev/src/continuedev/core/sdk.py +++ b/continuedev/src/continuedev/core/sdk.py @@ -11,7 +11,6 @@ from .observation import Observation from ..server.ide_protocol import AbstractIdeProtocolServer from .main import History, Step from ..steps.core.core import * -from .env import get_env_var, make_sure_env_exists class Autopilot: @@ -105,24 +104,7 @@ class ContinueSDK: return await self.run_step(FileSystemEditStep(edit=DeleteDirectory(path=path))) async def get_user_secret(self, env_var: str, prompt: str) -> str: - make_sure_env_exists() - - val = None - while val is None: - try: - val = get_env_var(env_var) - if val is not None: - return val - except: - pass - server_dir = os.getcwd() - env_path = os.path.join(server_dir, ".env") - await self.ide.setFileOpen(env_path) - await self.append_to_file(env_path, f'\n{env_var}="<ENTER SECRET HERE>"') - await self.run_step(WaitForUserConfirmationStep(prompt=prompt)) - val = get_env_var(env_var) - - return val + return await self.ide.getUserSecret(env_var) async def get_config(self) -> ContinueConfig: dir = await self.ide.getWorkspaceDirectory() diff --git a/continuedev/src/continuedev/server/ide.py b/continuedev/src/continuedev/server/ide.py index 71017ce0..eec5b607 100644 --- a/continuedev/src/continuedev/server/ide.py +++ b/continuedev/src/continuedev/server/ide.py @@ -40,46 +40,42 @@ Server.handle_exit = AppStatus.handle_exit class FileEditsUpdate(BaseModel): - messageType: str = "fileEdits" fileEdits: List[FileEditWithFullContents] class OpenFilesResponse(BaseModel): - messageType: str = "openFiles" openFiles: List[str] class HighlightedCodeResponse(BaseModel): - messageType: str = "highlightedCode" highlightedCode: List[RangeInFile] class ShowSuggestionRequest(BaseModel): - messageType: str = "showSuggestion" suggestion: FileEdit class ShowSuggestionResponse(BaseModel): - messageType: str = "showSuggestion" suggestion: FileEdit accepted: bool class ReadFileResponse(BaseModel): - messageType: str = "readFile" contents: str class EditFileResponse(BaseModel): - messageType: str = "editFile" fileEdit: FileEditWithFullContents class WorkspaceDirectoryResponse(BaseModel): - messageType: str = "workspaceDirectory" workspaceDirectory: str +class GetUserSecretResponse(BaseModel): + value: str + + T = TypeVar("T", bound=BaseModel) @@ -114,7 +110,7 @@ class IdeProtocolServer(AbstractIdeProtocolServer): fileEdits = list( map(lambda d: FileEditWithFullContents.parse_obj(d), data["fileEdits"])) self.onFileEdits(fileEdits) - elif message_type in ["highlightedCode", "openFiles", "readFile", "editFile", "workspaceDirectory"]: + elif message_type in ["highlightedCode", "openFiles", "readFile", "editFile", "workspaceDirectory", "getUserSecret"]: self.sub_queue.post(message_type, data) else: raise ValueError("Unknown message type", message_type) @@ -183,31 +179,31 @@ class IdeProtocolServer(AbstractIdeProtocolServer): # Request information. Session doesn't matter. async def getOpenFiles(self) -> List[str]: - resp = await self._send_and_receive_json({ - "messageType": "openFiles" - }, OpenFilesResponse, "openFiles") + resp = await self._send_and_receive_json({}, OpenFilesResponse, "openFiles") return resp.openFiles async def getWorkspaceDirectory(self) -> str: - resp = await self._send_and_receive_json({ - "messageType": "workspaceDirectory" - }, WorkspaceDirectoryResponse, "workspaceDirectory") + resp = await self._send_and_receive_json({}, WorkspaceDirectoryResponse, "workspaceDirectory") return resp.workspaceDirectory async def getHighlightedCode(self) -> List[RangeInFile]: - resp = await self._send_and_receive_json({ - "messageType": "highlightedCode" - }, HighlightedCodeResponse, "highlightedCode") + resp = await self._send_and_receive_json({}, HighlightedCodeResponse, "highlightedCode") return resp.highlightedCode async def readFile(self, filepath: str) -> str: """Read a file""" resp = await self._send_and_receive_json({ - "messageType": "readFile", "filepath": filepath }, ReadFileResponse, "readFile") return resp.contents + async def getUserSecret(self, key: str) -> str: + """Get a user secret""" + resp = await self._send_and_receive_json({ + "key": key + }, GetUserSecretResponse, "getUserSecret") + return resp.value + async def saveFile(self, filepath: str): """Save a file""" await self._send_json("saveFile", { @@ -222,7 +218,6 @@ class IdeProtocolServer(AbstractIdeProtocolServer): async def editFile(self, edit: FileEdit) -> FileEditWithFullContents: """Edit a file""" resp = await self._send_and_receive_json({ - "messageType": "editFile", "edit": edit.dict() }, EditFileResponse, "editFile") return resp.fileEdit diff --git a/continuedev/src/continuedev/server/ide_protocol.py b/continuedev/src/continuedev/server/ide_protocol.py index 4f505e80..8f155415 100644 --- a/continuedev/src/continuedev/server/ide_protocol.py +++ b/continuedev/src/continuedev/server/ide_protocol.py @@ -78,3 +78,7 @@ class AbstractIdeProtocolServer(ABC): @abstractmethod async def saveFile(self, filepath: str): """Save a file""" + + @abstractmethod + async def getUserSecret(self, key: str): + """Get a user secret""" diff --git a/continuedev/src/continuedev/steps/core/core.py b/continuedev/src/continuedev/steps/core/core.py index e54a9a21..0f513f3e 100644 --- a/continuedev/src/continuedev/steps/core/core.py +++ b/continuedev/src/continuedev/steps/core/core.py @@ -205,4 +205,5 @@ class WaitForUserConfirmationStep(Step): async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]: self._description = self.prompt resp = await sdk.wait_for_user_input() + self.hide = True return TextObservation(text=resp) diff --git a/continuedev/src/continuedev/steps/main.py b/continuedev/src/continuedev/steps/main.py index bb720b20..dfb4f3be 100644 --- a/continuedev/src/continuedev/steps/main.py +++ b/continuedev/src/continuedev/steps/main.py @@ -190,7 +190,7 @@ class FasterEditHighlightedCodeStep(Step): class StarCoderEditHighlightedCodeStep(Step): user_input: str - name: str = "Editing code" + name: str = "Editing Code" hide = False _prompt: str = "<commit_before>{code}<commit_msg>{user_request}<commit_after>" diff --git a/extension/package.json b/extension/package.json index 13086954..cc8e18c4 100644 --- a/extension/package.json +++ b/extension/package.json @@ -39,6 +39,16 @@ "type": "string", "default": "http://localhost:8000", "description": "The URL of the Continue server to use." + }, + "continue.OPENAI_API_KEY": { + "type": "string", + "default": "", + "description": "The OpenAI API key to use for code generation." + }, + "continue.HUGGING_FACE_TOKEN": { + "type": "string", + "default": "", + "description": "The Hugging Face API token to use for code generation." } } }, diff --git a/extension/react-app/src/components/StepContainer.tsx b/extension/react-app/src/components/StepContainer.tsx index 5e979b34..fd29f21b 100644 --- a/extension/react-app/src/components/StepContainer.tsx +++ b/extension/react-app/src/components/StepContainer.tsx @@ -114,12 +114,12 @@ function StepContainer(props: StepContainerProps) { hidden={props.historyNode.step.hide as any} > <GradientBorder - className="m-2 overflow-hidden cursor-pointer" - onClick={() => setOpen((prev) => !prev)} + className="m-2 overflow-hidden" + // onClick={() => setOpen((prev) => !prev)} > <StepContainerDiv open={open}> <HeaderDiv> - <h4 className="m-2 cursor-pointer"> + <h4 className="m-2"> {open ? ( <ChevronDown size="1.4em" /> ) : ( @@ -127,14 +127,14 @@ function StepContainer(props: StepContainerProps) { )} {props.historyNode.step.name as any}: </h4> - <HeaderButton + {/* <HeaderButton onClick={(e) => { e.stopPropagation(); props.onReverse(); }} > <Backward size="1.6em" onClick={props.onReverse}></Backward> - </HeaderButton> + </HeaderButton> */} </HeaderDiv> <ReactMarkdown key={1} className="overflow-scroll"> diff --git a/extension/src/continueIdeClient.ts b/extension/src/continueIdeClient.ts index 03e5fbc5..a5a1c5dc 100644 --- a/extension/src/continueIdeClient.ts +++ b/extension/src/continueIdeClient.ts @@ -74,6 +74,12 @@ class IdeProtocolClient { this.messenger?.send("workspaceDirectory", { workspaceDirectory: this.getWorkspaceDirectory(), }); + break; + case "getUserSecret": + this.messenger?.send("getUserSecret", { + value: await this.getUserSecret(data.key), + }); + break; case "openFiles": this.messenger?.send("openFiles", { openFiles: this.getOpenFiles(), @@ -130,6 +136,27 @@ class IdeProtocolClient { openEditorAndRevealRange(filepath, undefined, vscode.ViewColumn.One); } + async getUserSecret(key: string) { + // Check if secret already exists in VS Code settings (global) + let secret = vscode.workspace.getConfiguration("continue").get(key); + if (secret && secret !== "") return secret; + + // If not, ask user for secret + while (typeof secret === "undefined" || secret === "") { + secret = await vscode.window.showInputBox({ + prompt: `Enter secret for ${key}`, + password: true, + }); + } + + // Add secret to VS Code settings + vscode.workspace + .getConfiguration("continue") + .update(key, secret, vscode.ConfigurationTarget.Global); + + return secret; + } + // ------------------------------------ // // Initiate Request |