summaryrefslogtreecommitdiff
path: root/continuedev/src/continuedev/server
diff options
context:
space:
mode:
authorNate Sesti <33237525+sestinj@users.noreply.github.com>2023-08-22 13:12:40 -0700
committerGitHub <noreply@github.com>2023-08-22 13:12:40 -0700
commitb6435e1e479edb1e4f049098dc8522e944317f2a (patch)
tree29935c22e503ed1a64ac6db1d899dff75915c6ed /continuedev/src/continuedev/server
parent7ed6b61a5b629b5e16fbd5c90ff0ad78300a77c2 (diff)
downloadsncontinue-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.py53
-rw-r--r--continuedev/src/continuedev/server/ide_protocol.py34
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