From 011877c09e88ffcc715defc33e5c74c71ccc8aea Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Tue, 5 Sep 2023 12:11:47 -0700 Subject: feat: :sparkles: /cmd slash command --- .../continuedev/libs/constants/default_config.py | 8 +++++- continuedev/src/continuedev/libs/llm/__init__.py | 2 +- .../continuedev/plugins/context_providers/file.py | 2 +- continuedev/src/continuedev/plugins/steps/cmd.py | 30 ++++++++++++++++++++++ extension/src/continueIdeClient.ts | 4 +-- 5 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 continuedev/src/continuedev/plugins/steps/cmd.py diff --git a/continuedev/src/continuedev/libs/constants/default_config.py b/continuedev/src/continuedev/libs/constants/default_config.py index 76d66c02..c197680d 100644 --- a/continuedev/src/continuedev/libs/constants/default_config.py +++ b/continuedev/src/continuedev/libs/constants/default_config.py @@ -16,6 +16,7 @@ from continuedev.src.continuedev.plugins.steps.feedback import FeedbackStep from continuedev.src.continuedev.plugins.steps.comment_code import CommentCodeStep from continuedev.src.continuedev.plugins.steps.share_session import ShareSessionStep from continuedev.src.continuedev.plugins.steps.main import EditHighlightedCodeStep +from continuedev.src.continuedev.plugins.steps.cmd import GenerateShellCommandStep from continuedev.src.continuedev.plugins.context_providers.search import SearchContextProvider from continuedev.src.continuedev.plugins.context_providers.diff import DiffContextProvider from continuedev.src.continuedev.plugins.context_providers.url import URLContextProvider @@ -66,7 +67,12 @@ config = ContinueConfig( name="share", description="Download and share the session transcript", step=ShareSessionStep, - ) + ), + SlashCommand( + name="cmd", + description="Generate a shell command", + step=GenerateShellCommandStep, + ), ], context_providers=[ # GitHubIssuesContextProvider( diff --git a/continuedev/src/continuedev/libs/llm/__init__.py b/continuedev/src/continuedev/libs/llm/__init__.py index 90176be4..dcb0d2ef 100644 --- a/continuedev/src/continuedev/libs/llm/__init__.py +++ b/continuedev/src/continuedev/libs/llm/__init__.py @@ -185,7 +185,7 @@ class LLM(ContinueBaseModel): stop: Optional[List[str]] = None, max_tokens: Optional[int] = None, functions: Optional[List[Any]] = None, - ) -> Coroutine[Any, Any, str]: + ) -> str: """Yield completion response, either streamed or not.""" options = CompletionOptions( model=model or self.model, diff --git a/continuedev/src/continuedev/plugins/context_providers/file.py b/continuedev/src/continuedev/plugins/context_providers/file.py index 06d22348..a824a44d 100644 --- a/continuedev/src/continuedev/plugins/context_providers/file.py +++ b/continuedev/src/continuedev/plugins/context_providers/file.py @@ -8,7 +8,7 @@ from ...core.sdk import ContinueSDK from ...libs.util.filter_files import DEFAULT_IGNORE_PATTERNS from .util import remove_meilisearch_disallowed_chars -MAX_SIZE_IN_CHARS = 25_000 +MAX_SIZE_IN_CHARS = 50_000 async def get_file_contents(filepath: str, sdk: ContinueSDK) -> str: diff --git a/continuedev/src/continuedev/plugins/steps/cmd.py b/continuedev/src/continuedev/plugins/steps/cmd.py new file mode 100644 index 00000000..a38f6323 --- /dev/null +++ b/continuedev/src/continuedev/plugins/steps/cmd.py @@ -0,0 +1,30 @@ +from textwrap import dedent +from typing import Coroutine + +from ...core.main import Step +from ...core.observation import Observation +from ...core.sdk import ContinueSDK +from ...libs.util.strings import remove_quotes_and_escapes + + +class GenerateShellCommandStep(Step): + user_input: str + + async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]: + cmd = await sdk.models.default.complete( + dedent( + f"""\ + The user has made a request to run a shell command. Their description of what it should do is: + + "{self.user_input}" + + Please write a shell command that will do what the user requested. Your output should consist of only the command itself, without any explanation or example output. Do not use any newlines. Only output the command that when inserted into the terminal will do precisely what was requested. + """ + ) + ) + + cmd = remove_quotes_and_escapes(cmd.strip()).replace("\n", "").replace("\r", "") + + await sdk.ide.runCommand(cmd) + + self.description = f"Generated shell command: {cmd}" diff --git a/extension/src/continueIdeClient.ts b/extension/src/continueIdeClient.ts index 582caa53..48000b76 100644 --- a/extension/src/continueIdeClient.ts +++ b/extension/src/continueIdeClient.ts @@ -700,11 +700,11 @@ class IdeProtocolClient { async runCommand(command: string) { if (vscode.window.terminals.length) { - vscode.window.terminals[0].sendText(command); + vscode.window.terminals[0].sendText(command, false); } else { const terminal = vscode.window.createTerminal(); terminal.show(); - terminal.sendText(command); + terminal.sendText(command, false); } } -- cgit v1.2.3-70-g09d2