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 | 
