diff options
author | Nate Sesti <33237525+sestinj@users.noreply.github.com> | 2023-08-22 13:12:40 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-22 13:12:40 -0700 |
commit | b6435e1e479edb1e4f049098dc8522e944317f2a (patch) | |
tree | 29935c22e503ed1a64ac6db1d899dff75915c6ed /continuedev/src/continuedev/server | |
parent | 7ed6b61a5b629b5e16fbd5c90ff0ad78300a77c2 (diff) | |
download | sncontinue-b6435e1e479edb1e4f049098dc8522e944317f2a.tar.gz sncontinue-b6435e1e479edb1e4f049098dc8522e944317f2a.tar.bz2 sncontinue-b6435e1e479edb1e4f049098dc8522e944317f2a.zip |
feat: :children_crossing: keep file context up to data by listening for filesystem events (#396)
Diffstat (limited to 'continuedev/src/continuedev/server')
-rw-r--r-- | continuedev/src/continuedev/server/ide.py | 53 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/ide_protocol.py | 34 |
2 files changed, 85 insertions, 2 deletions
diff --git a/continuedev/src/continuedev/server/ide.py b/continuedev/src/continuedev/server/ide.py index 5d85d57d..610a1a48 100644 --- a/continuedev/src/continuedev/server/ide.py +++ b/continuedev/src/continuedev/server/ide.py @@ -4,7 +4,7 @@ import json import os import traceback import uuid -from typing import Any, Coroutine, List, Type, TypeVar, Union +from typing import Any, Callable, Coroutine, List, Type, TypeVar, Union import nest_asyncio from fastapi import APIRouter, WebSocket @@ -247,6 +247,14 @@ class IdeProtocolServer(AbstractIdeProtocolServer): self.workspace_directory = data["workspaceDirectory"] elif message_type == "uniqueId": self.unique_id = data["uniqueId"] + elif message_type == "filesCreated": + self.onFilesCreated(data["filepaths"]) + elif message_type == "filesDeleted": + self.onFilesDeleted(data["filepaths"]) + elif message_type == "filesRenamed": + self.onFilesRenamed(data["old_filepaths"], data["new_filepaths"]) + elif message_type == "fileSaved": + self.onFileSaved(data["filepath"], data["contents"]) else: raise ValueError("Unknown message type", message_type) @@ -365,6 +373,49 @@ class IdeProtocolServer(AbstractIdeProtocolServer): autopilot.handle_highlighted_code(range_in_files), self.on_error ) + ## Subscriptions ## + + _files_created_callbacks = [] + _files_deleted_callbacks = [] + _files_renamed_callbacks = [] + _file_saved_callbacks = [] + + def call_callback(self, callback, *args, **kwargs): + if asyncio.iscoroutinefunction(callback): + create_async_task(callback(*args, **kwargs), self.on_error) + else: + callback(*args, **kwargs) + + def subscribeToFilesCreated(self, callback: Callable[[List[str]], None]): + self._files_created_callbacks.append(callback) + + def subscribeToFilesDeleted(self, callback: Callable[[List[str]], None]): + self._files_deleted_callbacks.append(callback) + + def subscribeToFilesRenamed(self, callback: Callable[[List[str], List[str]], None]): + self._files_renamed_callbacks.append(callback) + + def subscribeToFileSaved(self, callback: Callable[[str, str], None]): + self._file_saved_callbacks.append(callback) + + def onFilesCreated(self, filepaths: List[str]): + for callback in self._files_created_callbacks: + self.call_callback(callback, filepaths) + + def onFilesDeleted(self, filepaths: List[str]): + for callback in self._files_deleted_callbacks: + self.call_callback(callback, filepaths) + + def onFilesRenamed(self, old_filepaths: List[str], new_filepaths: List[str]): + for callback in self._files_renamed_callbacks: + self.call_callback(callback, old_filepaths, new_filepaths) + + def onFileSaved(self, filepath: str, contents: str): + for callback in self._file_saved_callbacks: + self.call_callback(callback, filepath, contents) + + ## END Subscriptions ## + def onMainUserInput(self, input: str): if autopilot := self.__get_autopilot(): create_async_task(autopilot.accept_user_input(input), self.on_error) diff --git a/continuedev/src/continuedev/server/ide_protocol.py b/continuedev/src/continuedev/server/ide_protocol.py index f63fecf8..435c82e2 100644 --- a/continuedev/src/continuedev/server/ide_protocol.py +++ b/continuedev/src/continuedev/server/ide_protocol.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Any, List, Union +from typing import Any, Callable, List, Union from fastapi import WebSocket @@ -115,5 +115,37 @@ class AbstractIdeProtocolServer(ABC): async def showDiff(self, filepath: str, replacement: str, step_index: int): """Show a diff""" + @abstractmethod + def subscribeToFilesCreated(self, callback: Callable[[List[str]], None]): + """Subscribe to files created event""" + + @abstractmethod + def subscribeToFilesDeleted(self, callback: Callable[[List[str]], None]): + """Subscribe to files deleted event""" + + @abstractmethod + def subscribeToFilesRenamed(self, callback: Callable[[List[str], List[str]], None]): + """Subscribe to files renamed event""" + + @abstractmethod + def subscribeToFileSaved(self, callback: Callable[[str, str], None]): + """Subscribe to file saved event""" + + @abstractmethod + def onFilesCreated(self, filepaths: List[str]): + """Called when files are created""" + + @abstractmethod + def onFilesDeleted(self, filepaths: List[str]): + """Called when files are deleted""" + + @abstractmethod + def onFilesRenamed(self, old_filepaths: List[str], new_filepaths: List[str]): + """Called when files are renamed""" + + @abstractmethod + def onFileSaved(self, filepath: str, contents: str): + """Called when a file is saved""" + workspace_directory: str unique_id: str |