summaryrefslogtreecommitdiff
path: root/continuedev/src/continuedev/libs/steps
diff options
context:
space:
mode:
Diffstat (limited to 'continuedev/src/continuedev/libs/steps')
-rw-r--r--continuedev/src/continuedev/libs/steps/chroma.py9
-rw-r--r--continuedev/src/continuedev/libs/steps/core/core.py216
-rw-r--r--continuedev/src/continuedev/libs/steps/draft/abstract_method.py3
-rw-r--r--continuedev/src/continuedev/libs/steps/draft/dlt.py3
-rw-r--r--continuedev/src/continuedev/libs/steps/draft/redux.py7
-rw-r--r--continuedev/src/continuedev/libs/steps/draft/typeorm.py3
-rw-r--r--continuedev/src/continuedev/libs/steps/main.py149
-rw-r--r--continuedev/src/continuedev/libs/steps/migration.py2
-rw-r--r--continuedev/src/continuedev/libs/steps/nate.py9
-rw-r--r--continuedev/src/continuedev/libs/steps/pytest.py2
-rw-r--r--continuedev/src/continuedev/libs/steps/ty.py8
11 files changed, 266 insertions, 145 deletions
diff --git a/continuedev/src/continuedev/libs/steps/chroma.py b/continuedev/src/continuedev/libs/steps/chroma.py
index 2d8742e8..f13a2bab 100644
--- a/continuedev/src/continuedev/libs/steps/chroma.py
+++ b/continuedev/src/continuedev/libs/steps/chroma.py
@@ -1,11 +1,10 @@
from textwrap import dedent
from typing import Coroutine, Union
-from ...models.filesystem_edit import AddDirectory, AddFile
-from ..observation import Observation, TextObservation
-from ..core import Step, ContinueSDK
-from .main import EditCodeStep, EditFileStep, RunCommandStep, WaitForUserConfirmationStep
+from ...core.observation import Observation, TextObservation
+from ...core.main import Step, ContinueSDK
+from .core.core import EditFileStep
from ..chroma.query import query_codebase_index
-from .main import EditFileStep
+from .core.core import EditFileStep
class AnswerQuestionChroma(Step):
diff --git a/continuedev/src/continuedev/libs/steps/core/core.py b/continuedev/src/continuedev/libs/steps/core/core.py
new file mode 100644
index 00000000..0338d635
--- /dev/null
+++ b/continuedev/src/continuedev/libs/steps/core/core.py
@@ -0,0 +1,216 @@
+# These steps are depended upon by ContinueSDK
+import subprocess
+from textwrap import dedent
+from typing import Coroutine, List, Union
+from ...llm.prompt_utils import MarkdownStyleEncoderDecoder
+
+from ...util.traceback_parsers import parse_python_traceback
+
+from ....models.filesystem_edit import EditDiff, FileEditWithFullContents, FileSystemEdit
+from ....models.filesystem import FileSystem, RangeInFile, RangeInFileWithContents
+from ...llm import LLM
+from ....core.observation import Observation, TextObservation, TracebackObservation, UserInputObservation
+from ....core.main import Step
+
+
+class ContinueSDK:
+ pass
+
+
+class SequentialStep(Step):
+ steps: list[Step]
+ hide: bool = True
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ for step in self.steps:
+ observation = await sdk.run_step(step)
+ return observation
+
+
+class ReversibleStep(Step):
+ async def reverse(self, sdk: ContinueSDK):
+ raise NotImplementedError
+
+
+class FileSystemEditStep(ReversibleStep):
+ edit: FileSystemEdit
+ _diff: Union[EditDiff, None] = None
+
+ hide: bool = True
+
+ async def run(self, sdk: "ContinueSDK") -> Coroutine[Observation, None, None]:
+ self._diff = await sdk.ide.applyFileSystemEdit(self.edit)
+ return None
+
+ async def reverse(self, sdk: "ContinueSDK"):
+ await sdk.ide.applyFileSystemEdit(self._diff.backward)
+ # Where and when should file saves happen?
+
+
+def ShellCommandsStep(Step):
+ cmds: List[str]
+ cwd: str | None = None
+ name: str = "Run Shell Commands"
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ return "\n".join(self.cmds)
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ cwd = await sdk.ide.getWorkspaceDirectory() if self.cwd is None else self.cwd
+
+ process = subprocess.Popen(
+ '/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=cwd)
+
+ stdin_input = "\n".join(self.cmds)
+ out, err = process.communicate(stdin_input.encode())
+
+ # If it fails, return the error
+ if err is not None and err != "":
+ return TextObservation(text=err)
+
+ return None
+
+
+class EditCodeStep(Step):
+ # Might make an even more specific atomic step, which is "apply file edit"
+ range_in_files: List[RangeInFile]
+ prompt: str # String with {code} somewhere
+ name: str = "Edit code"
+
+ _edit_diffs: Union[List[EditDiff], None] = None
+ _prompt: Union[str, None] = None
+ _completion: Union[str, None] = None
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ if self._edit_diffs is None:
+ return "Editing files: " + ", ".join(map(lambda rif: rif.filepath, self.range_in_files))
+ elif len(self._edit_diffs) == 0:
+ return "No edits made"
+ else:
+ return llm.complete(dedent(f"""{self._prompt}{self._completion}
+
+ Maximally concise summary of changes in bullet points (can use markdown):
+ """))
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ rif_with_contents = []
+ for range_in_file in self.range_in_files:
+ file_contents = await sdk.ide.readRangeInFile(range_in_file)
+ rif_with_contents.append(
+ RangeInFileWithContents.from_range_in_file(range_in_file, file_contents))
+ enc_dec = MarkdownStyleEncoderDecoder(rif_with_contents)
+ code_string = enc_dec.encode()
+ prompt = self.prompt.format(code=code_string)
+
+ completion = sdk.llm.complete(prompt)
+
+ # Temporarily doing this to generate description.
+ self._prompt = prompt
+ self._completion = completion
+
+ file_edits = enc_dec.decode(completion)
+
+ self._edit_diffs = []
+ for file_edit in file_edits:
+ diff = await sdk.apply_filesystem_edit(file_edit)
+ self._edit_diffs.append(diff)
+
+ for filepath in set([file_edit.filepath for file_edit in file_edits]):
+ await sdk.ide.saveFile(filepath)
+ await sdk.ide.setFileOpen(filepath)
+
+ return None
+
+
+class EditFileStep(Step):
+ filepath: str
+ prompt: str
+ hide: bool = True
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ return "Editing file: " + self.filepath
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ file_contents = await sdk.ide.readFile(self.filepath)
+ await sdk.run_step(EditCodeStep(
+ range_in_files=[RangeInFile.from_entire_file(
+ self.filepath, file_contents)],
+ prompt=self.prompt
+ ))
+
+
+class ManualEditStep(ReversibleStep):
+ edit_diff: EditDiff
+ hide: bool = True
+
+ hide: bool = True
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ return "Manual edit step"
+ # TODO - only handling FileEdit here, but need all other types of FileSystemEdits
+ # Also requires the merge_file_edit function
+ # return llm.complete(dedent(f"""This code was replaced:
+
+ # {self.edit_diff.backward.replacement}
+
+ # With this code:
+
+ # {self.edit_diff.forward.replacement}
+
+ # Maximally concise summary of changes in bullet points (can use markdown):
+ # """))
+
+ @classmethod
+ def from_sequence(cls, edits: List[FileEditWithFullContents]) -> "ManualEditStep":
+ diffs = []
+ for edit in edits:
+ _, diff = FileSystem.apply_edit_to_str(
+ edit.fileContents, edit.fileEdit)
+ diffs.append(diff)
+ return cls(edit_diff=EditDiff.from_sequence(diffs))
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ return None
+
+ async def reverse(self, sdk: ContinueSDK):
+ await sdk.ide.applyFileSystemEdit(self.edit_diff.backward)
+
+
+class UserInputStep(Step):
+ user_input: str
+ name: str = "User Input"
+ hide: bool = True
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ return self.user_input
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[UserInputObservation, None, None]:
+ return UserInputObservation(user_input=self.user_input)
+
+
+class WaitForUserInputStep(Step):
+ prompt: str
+ name: str = "Waiting for user input"
+
+ _description: Union[str, None] = None
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ return self.prompt
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ self._description = self.prompt
+ resp = await sdk.wait_for_user_input()
+ return TextObservation(text=resp)
+
+
+class WaitForUserConfirmationStep(Step):
+ prompt: str
+ name: str = "Waiting for user confirmation"
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ return self.prompt
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ self._description = self.prompt
+ resp = await sdk.wait_for_user_input()
+ return TextObservation(text=resp)
diff --git a/continuedev/src/continuedev/libs/steps/draft/abstract_method.py b/continuedev/src/continuedev/libs/steps/draft/abstract_method.py
index 927d93fd..f3131c4b 100644
--- a/continuedev/src/continuedev/libs/steps/draft/abstract_method.py
+++ b/continuedev/src/continuedev/libs/steps/draft/abstract_method.py
@@ -1,4 +1,5 @@
-from ...core import ContinueSDK, Step
+from ....core.sdk import ContinueSDK
+from ....core.main import Step
class ImplementAbstractMethodStep(Step):
diff --git a/continuedev/src/continuedev/libs/steps/draft/dlt.py b/continuedev/src/continuedev/libs/steps/draft/dlt.py
index 608f089a..5ba5692a 100644
--- a/continuedev/src/continuedev/libs/steps/draft/dlt.py
+++ b/continuedev/src/continuedev/libs/steps/draft/dlt.py
@@ -1,6 +1,7 @@
from textwrap import dedent
from ....models.filesystem_edit import AddFile
-from ...core import Step, ContinueSDK
+from ....core.main import Step
+from ....core.sdk import ContinueSDK
from ..main import WaitForUserInputStep
diff --git a/continuedev/src/continuedev/libs/steps/draft/redux.py b/continuedev/src/continuedev/libs/steps/draft/redux.py
index 52a8fbd8..efaa9ba4 100644
--- a/continuedev/src/continuedev/libs/steps/draft/redux.py
+++ b/continuedev/src/continuedev/libs/steps/draft/redux.py
@@ -1,7 +1,6 @@
-from textwrap import dedent
-from ....models.filesystem_edit import AddFile
-from ...core import Step, ContinueSDK
-from ..main import WaitForUserInputStep, EditFileStep
+from ....core.main import Step
+from ....core.sdk import ContinueSDK
+from ..core.core import EditFileStep
class EditReduxStateStep(Step):
diff --git a/continuedev/src/continuedev/libs/steps/draft/typeorm.py b/continuedev/src/continuedev/libs/steps/draft/typeorm.py
index 9d058f1e..d06a6fb4 100644
--- a/continuedev/src/continuedev/libs/steps/draft/typeorm.py
+++ b/continuedev/src/continuedev/libs/steps/draft/typeorm.py
@@ -1,5 +1,6 @@
from textwrap import dedent
-from ...core import Step, ContinueSDK
+from ....core.main import Step
+from ....core.sdk import ContinueSDK
class CreateTableStep(Step):
diff --git a/continuedev/src/continuedev/libs/steps/main.py b/continuedev/src/continuedev/libs/steps/main.py
index 70953e95..f28cb23f 100644
--- a/continuedev/src/continuedev/libs/steps/main.py
+++ b/continuedev/src/continuedev/libs/steps/main.py
@@ -1,18 +1,39 @@
-import time
from typing import Callable, Coroutine, List, Union
+from ..util.traceback_parsers import parse_python_traceback
from ..llm import LLM
from ...models.main import Traceback, Range
from ...models.filesystem_edit import EditDiff, FileEdit
from ...models.filesystem import RangeInFile, RangeInFileWithContents
-from ..observation import Observation, TextObservation
+from ...core.observation import Observation, TextObservation, TracebackObservation
from ..llm.prompt_utils import MarkdownStyleEncoderDecoder
from textwrap import dedent
-from ..core import History, Policy, Step, ContinueSDK, Observation
+from ...core.main import History, Policy, Step, ContinueSDK, Observation
import subprocess
-from ..util.traceback_parsers import parse_python_traceback
-from ..observation import TracebackObservation
import json
+from .core.core import EditCodeStep
+
+
+class RunCodeStep(Step):
+ cmd: str
+
+ async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
+ return f"Ran command: `{self.cmd}`"
+
+ async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
+ result = subprocess.run(
+ self.cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ stdout = result.stdout.decode("utf-8")
+ stderr = result.stderr.decode("utf-8")
+ print(stdout, stderr)
+
+ # If it fails, return the error
+ tb = parse_python_traceback(stdout) or parse_python_traceback(stderr)
+ if tb:
+ return TracebackObservation(traceback=tb)
+ else:
+ self.hide = True
+ return None
class RunPolicyUntilDoneStep(Step):
@@ -51,124 +72,6 @@ class RunCommandStep(Step):
return TextObservation(text=stdout)
-class WaitForUserInputStep(Step):
- prompt: str
- name: str = "Waiting for user input"
-
- _description: Union[str, None] = None
-
- async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
- return self.prompt
-
- async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
- self._description = self.prompt
- resp = await sdk.wait_for_user_input()
- return TextObservation(text=resp)
-
-
-class WaitForUserConfirmationStep(Step):
- prompt: str
- name: str = "Waiting for user confirmation"
-
- async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
- return self.prompt
-
- async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
- self._description = self.prompt
- resp = await sdk.wait_for_user_input()
- return TextObservation(text=resp)
-
-
-class RunCodeStep(Step):
- cmd: str
-
- async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
- return f"Ran command: `{self.cmd}`"
-
- async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
- result = subprocess.run(
- self.cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stdout = result.stdout.decode("utf-8")
- stderr = result.stderr.decode("utf-8")
- print(stdout, stderr)
-
- # If it fails, return the error
- tb = parse_python_traceback(stdout) or parse_python_traceback(stderr)
- if tb:
- return TracebackObservation(traceback=tb)
- else:
- self.hide = True
- return None
-
-
-class EditCodeStep(Step):
- # Might make an even more specific atomic step, which is "apply file edit"
- range_in_files: List[RangeInFile]
- prompt: str # String with {code} somewhere
- name: str = "Edit code"
-
- _edit_diffs: Union[List[EditDiff], None] = None
- _prompt: Union[str, None] = None
- _completion: Union[str, None] = None
-
- async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
- if self._edit_diffs is None:
- return "Editing files: " + ", ".join(map(lambda rif: rif.filepath, self.range_in_files))
- elif len(self._edit_diffs) == 0:
- return "No edits made"
- else:
- return llm.complete(dedent(f"""{self._prompt}{self._completion}
-
- Maximally concise summary of changes in bullet points (can use markdown):
- """))
-
- async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
- rif_with_contents = []
- for range_in_file in self.range_in_files:
- file_contents = await sdk.ide.readRangeInFile(range_in_file)
- rif_with_contents.append(
- RangeInFileWithContents.from_range_in_file(range_in_file, file_contents))
- enc_dec = MarkdownStyleEncoderDecoder(rif_with_contents)
- code_string = enc_dec.encode()
- prompt = self.prompt.format(code=code_string)
-
- completion = sdk.llm.complete(prompt)
-
- # Temporarily doing this to generate description.
- self._prompt = prompt
- self._completion = completion
-
- file_edits = enc_dec.decode(completion)
-
- self._edit_diffs = []
- for file_edit in file_edits:
- diff = await sdk.apply_filesystem_edit(file_edit)
- self._edit_diffs.append(diff)
-
- for filepath in set([file_edit.filepath for file_edit in file_edits]):
- await sdk.ide.saveFile(filepath)
- await sdk.ide.setFileOpen(filepath)
-
- return None
-
-
-class EditFileStep(Step):
- filepath: str
- prompt: str
- hide: bool = True
-
- async def describe(self, llm: LLM) -> Coroutine[str, None, None]:
- return "Editing file: " + self.filepath
-
- async def run(self, sdk: ContinueSDK) -> Coroutine[Observation, None, None]:
- file_contents = await sdk.ide.readFile(self.filepath)
- await sdk.run_step(EditCodeStep(
- range_in_files=[RangeInFile.from_entire_file(
- self.filepath, file_contents)],
- prompt=self.prompt
- ))
-
-
class FasterEditHighlightedCodeStep(Step):
user_input: str
hide = True
diff --git a/continuedev/src/continuedev/libs/steps/migration.py b/continuedev/src/continuedev/libs/steps/migration.py
index 04296836..f044a60f 100644
--- a/continuedev/src/continuedev/libs/steps/migration.py
+++ b/continuedev/src/continuedev/libs/steps/migration.py
@@ -3,7 +3,7 @@
from ...models.filesystem import RangeInFile
from .main import EditCodeStep, RunCommandStep
-from ..core import Step
+from ...core.main import Step
class MigrationStep(Step):
diff --git a/continuedev/src/continuedev/libs/steps/nate.py b/continuedev/src/continuedev/libs/steps/nate.py
index 80436fa4..a0e728e5 100644
--- a/continuedev/src/continuedev/libs/steps/nate.py
+++ b/continuedev/src/continuedev/libs/steps/nate.py
@@ -1,14 +1,13 @@
-import asyncio
from textwrap import dedent
import time
from typing import Coroutine, Union
-from ...models.main import Range
from ...models.filesystem import RangeInFile
from ...models.filesystem_edit import AddDirectory, AddFile
-from ..observation import Observation, TextObservation
-from ..core import Step, ContinueSDK
-from .main import EditCodeStep, EditFileStep, RunCommandStep, WaitForUserConfirmationStep
+from ...core.observation import Observation, TextObservation
+from ...core.main import Step, ContinueSDK
+from .main import RunCommandStep
+from .core.core import WaitForUserConfirmationStep, EditCodeStep, EditFileStep
import os
diff --git a/continuedev/src/continuedev/libs/steps/pytest.py b/continuedev/src/continuedev/libs/steps/pytest.py
index e53eb465..b4e6dfd2 100644
--- a/continuedev/src/continuedev/libs/steps/pytest.py
+++ b/continuedev/src/continuedev/libs/steps/pytest.py
@@ -1,6 +1,6 @@
from textwrap import dedent
from ...models.filesystem_edit import AddDirectory, AddFile
-from ..core import Step, ContinueSDK
+from ...core.main import Step, ContinueSDK
import os
diff --git a/continuedev/src/continuedev/libs/steps/ty.py b/continuedev/src/continuedev/libs/steps/ty.py
index 1eb6271d..5ff03f04 100644
--- a/continuedev/src/continuedev/libs/steps/ty.py
+++ b/continuedev/src/continuedev/libs/steps/ty.py
@@ -2,9 +2,11 @@ import subprocess
from ...models.main import Position, Range
from ...models.filesystem import RangeInFile
from ...models.filesystem_edit import AddDirectory, AddFile, FileEdit
-from ..observation import DictObservation
-from ..core import History, Step, ContinueSDK, Policy
-from .main import EditCodeStep, RunCommandStep, WaitForUserInputStep, WaitForUserConfirmationStep
+from ...core.observation import DictObservation
+from ...core.main import History, Step, Policy
+from ...core.sdk import ContinueSDK
+from .main import RunCommandStep
+from ..steps.core.core import EditCodeStep, WaitForUserConfirmationStep, WaitForUserInputStep
source_name = "weather_api"