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/core | |
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/core')
-rw-r--r-- | continuedev/src/continuedev/core/autopilot.py | 2 | ||||
-rw-r--r-- | continuedev/src/continuedev/core/context.py | 69 |
2 files changed, 64 insertions, 7 deletions
diff --git a/continuedev/src/continuedev/core/autopilot.py b/continuedev/src/continuedev/core/autopilot.py index 05a8a8f2..7b0661a5 100644 --- a/continuedev/src/continuedev/core/autopilot.py +++ b/continuedev/src/continuedev/core/autopilot.py @@ -108,7 +108,7 @@ class Autopilot(ContinueBaseModel): HighlightedCodeContextProvider(ide=self.ide), FileContextProvider(workspace_dir=self.ide.workspace_directory), ], - self.ide.workspace_directory, + self.continue_sdk, ) if full_state is not None: diff --git a/continuedev/src/continuedev/core/context.py b/continuedev/src/continuedev/core/context.py index 7172883f..4a5e64cc 100644 --- a/continuedev/src/continuedev/core/context.py +++ b/continuedev/src/continuedev/core/context.py @@ -1,7 +1,7 @@ import asyncio import time from abc import abstractmethod -from typing import Dict, List +from typing import Awaitable, Callable, Dict, List from meilisearch_python_async import Client from pydantic import BaseModel @@ -12,6 +12,13 @@ from ..libs.util.telemetry import posthog_logger from ..server.meilisearch_server import poll_meilisearch_running from .main import ChatMessage, ContextItem, ContextItemDescription, ContextItemId + +class ContinueSDK(BaseModel): + """To avoid circular imports""" + + ... + + SEARCH_INDEX_NAME = "continue_context_items" @@ -24,9 +31,22 @@ class ContextProvider(BaseModel): """ title: str + sdk: ContinueSDK = None + delete_documents: Callable[[List[str]], Awaitable] = None + update_documents: Callable[[List[ContextItem], str], Awaitable] = None selected_items: List[ContextItem] = [] + async def start(self, sdk: ContinueSDK, delete_documents, update_documents): + """ + Starts the context provider. + + Default implementation sets the sdk. + """ + self.sdk = sdk + self.delete_documents = delete_documents + self.update_documents = update_documents + async def get_selected_items(self) -> List[ContextItem]: """ Returns all of the selected ContextItems. @@ -168,9 +188,7 @@ class ContextManager: self.context_providers = {} self.provider_titles = set() - async def start( - self, context_providers: List[ContextProvider], workspace_directory: str - ): + async def start(self, context_providers: List[ContextProvider], sdk: ContinueSDK): """ Starts the context manager. """ @@ -189,17 +207,56 @@ class ContextManager: self.context_providers = { prov.title: prov for prov in context_providers } + for provider in context_providers: + await provider.start( + sdk, + ContextManager.delete_documents, + ContextManager.update_documents, + ) + logger.debug("Loading Meilisearch index...") - await self.load_index(workspace_directory) + await self.load_index(sdk.ide.workspace_directory) logger.debug("Loaded Meilisearch index") except asyncio.TimeoutError: - logger.warning("MeiliSearch did not start within 5 seconds") + logger.warning("MeiliSearch did not start within 20 seconds") logger.warning( "MeiliSearch not running, avoiding any dependent context providers" ) create_async_task(start_meilisearch(context_providers)) + @staticmethod + async def update_documents(context_items: List[ContextItem], workspace_dir: str): + """ + Updates the documents in the search index. + """ + documents = [ + { + "id": item.description.id.to_string(), + "name": item.description.name, + "description": item.description.description, + "content": item.content, + "workspace_dir": workspace_dir, + } + for item in context_items + ] + async with Client("http://localhost:7700") as search_client: + await asyncio.wait_for( + search_client.index(SEARCH_INDEX_NAME).add_documents(documents), + timeout=5, + ) + + @staticmethod + async def delete_documents(ids): + """ + Deletes the documents in the search index. + """ + async with Client("http://localhost:7700") as search_client: + await asyncio.wait_for( + search_client.index(SEARCH_INDEX_NAME).delete_documents(ids), + timeout=5, + ) + async def load_index(self, workspace_dir: str): try: async with Client("http://localhost:7700") as search_client: |