diff options
author | Nate Sesti <sestinj@gmail.com> | 2023-08-06 09:28:22 -0700 |
---|---|---|
committer | Nate Sesti <sestinj@gmail.com> | 2023-08-06 09:28:22 -0700 |
commit | f19345c652cfcf1bdf13d0a44a2f302e0cd1aa4c (patch) | |
tree | 4582964105452768a5346afcd764d26db6091504 /continuedev | |
parent | 98de69abbd221d0f6b7257a72b89b191356b10b7 (diff) | |
download | sncontinue-f19345c652cfcf1bdf13d0a44a2f302e0cd1aa4c.tar.gz sncontinue-f19345c652cfcf1bdf13d0a44a2f302e0cd1aa4c.tar.bz2 sncontinue-f19345c652cfcf1bdf13d0a44a2f302e0cd1aa4c.zip |
feat: :construction: Router and new history page
Diffstat (limited to 'continuedev')
-rw-r--r-- | continuedev/src/continuedev/core/autopilot.py | 10 | ||||
-rw-r--r-- | continuedev/src/continuedev/core/main.py | 6 | ||||
-rw-r--r-- | continuedev/src/continuedev/libs/util/paths.py | 6 | ||||
-rw-r--r-- | continuedev/src/continuedev/models/generate_json_schema.py | 4 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/gui.py | 3 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/main.py | 3 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/session_manager.py | 43 |
7 files changed, 64 insertions, 11 deletions
diff --git a/continuedev/src/continuedev/core/autopilot.py b/continuedev/src/continuedev/core/autopilot.py index f3a17d47..7e7ce5d8 100644 --- a/continuedev/src/continuedev/core/autopilot.py +++ b/continuedev/src/continuedev/core/autopilot.py @@ -1,7 +1,7 @@ from functools import cached_property import traceback import time -from typing import Callable, Coroutine, Dict, List, Union +from typing import Callable, Coroutine, Dict, List, Optional, Union from aiohttp import ClientPayloadError from pydantic import root_validator @@ -68,7 +68,7 @@ class Autopilot(ContinueBaseModel): started: bool = False - async def start(self): + async def start(self, full_state: Optional[FullState] = None): self.continue_sdk = await ContinueSDK.create(self) if override_policy := self.continue_sdk.config.policy_override: self.policy = override_policy @@ -84,6 +84,12 @@ class Autopilot(ContinueBaseModel): logger.debug("Loading index") create_async_task(self.context_manager.load_index( self.ide.workspace_directory)) + + if full_state is not None: + self.history = full_state.history + self.context_manager.context_providers["code"].adding_highlighted_code = full_state.adding_highlighted_code + await self.context_manager.set_selected_items(full_state.selected_context_items) + self.started = True class Config: diff --git a/continuedev/src/continuedev/core/main.py b/continuedev/src/continuedev/core/main.py index 2553850f..9a06f2e1 100644 --- a/continuedev/src/continuedev/core/main.py +++ b/continuedev/src/continuedev/core/main.py @@ -263,6 +263,12 @@ class FullState(ContinueBaseModel): selected_context_items: List[ContextItem] +class SessionInfo(ContinueBaseModel): + session_id: str + title: str + date_created: str + + class ContinueSDK: pass diff --git a/continuedev/src/continuedev/libs/util/paths.py b/continuedev/src/continuedev/libs/util/paths.py index 83a472ad..66c921f7 100644 --- a/continuedev/src/continuedev/libs/util/paths.py +++ b/continuedev/src/continuedev/libs/util/paths.py @@ -32,6 +32,12 @@ def getSessionFilePath(session_id: str): return path +def getSessionsListFilePath(): + path = os.path.join(getSessionsFolderPath(), "sessions.json") + os.makedirs(os.path.dirname(path), exist_ok=True) + return path + + def getConfigFilePath() -> str: path = os.path.join(getGlobalFolderPath(), "config.py") os.makedirs(os.path.dirname(path), exist_ok=True) diff --git a/continuedev/src/continuedev/models/generate_json_schema.py b/continuedev/src/continuedev/models/generate_json_schema.py index 2166bc37..4262ac55 100644 --- a/continuedev/src/continuedev/models/generate_json_schema.py +++ b/continuedev/src/continuedev/models/generate_json_schema.py @@ -1,7 +1,7 @@ from .main import * from .filesystem import RangeInFile, FileEdit from .filesystem_edit import FileEditWithFullContents -from ..core.main import History, HistoryNode, FullState +from ..core.main import History, HistoryNode, FullState, SessionInfo from ..core.context import ContextItem from pydantic import schema_json_of import os @@ -13,7 +13,7 @@ MODELS_TO_GENERATE = [ ] + [ FileEditWithFullContents ] + [ - History, HistoryNode, FullState + History, HistoryNode, FullState, SessionInfo ] + [ ContextItem ] diff --git a/continuedev/src/continuedev/server/gui.py b/continuedev/src/continuedev/server/gui.py index 7c89c5c2..b6f7b141 100644 --- a/continuedev/src/continuedev/server/gui.py +++ b/continuedev/src/continuedev/server/gui.py @@ -154,6 +154,9 @@ class GUIProtocolServer(AbstractGUIProtocolServer): create_async_task( self.session.autopilot.select_context_item(id, query), self.on_error) + async def reconnect_at_session(self, session_id: str): + await self._send_json("reconnect_at_session", {"session_id": session_id}) + @router.websocket("/ws") async def websocket_endpoint(websocket: WebSocket, session: Session = Depends(websocket_session)): diff --git a/continuedev/src/continuedev/server/main.py b/continuedev/src/continuedev/server/main.py index f8dfb009..f0a3f094 100644 --- a/continuedev/src/continuedev/server/main.py +++ b/continuedev/src/continuedev/server/main.py @@ -11,13 +11,14 @@ import argparse from .ide import router as ide_router from .gui import router as gui_router -from .session_manager import session_manager +from .session_manager import session_manager, router as sessions_router from ..libs.util.logging import logger app = FastAPI() app.include_router(ide_router) app.include_router(gui_router) +app.include_router(sessions_router) # Add CORS support app.add_middleware( diff --git a/continuedev/src/continuedev/server/session_manager.py b/continuedev/src/continuedev/server/session_manager.py index 56c92307..dade9853 100644 --- a/continuedev/src/continuedev/server/session_manager.py +++ b/continuedev/src/continuedev/server/session_manager.py @@ -1,6 +1,6 @@ import os import traceback -from fastapi import WebSocket +from fastapi import WebSocket, APIRouter from typing import Any, Coroutine, Dict, Union from uuid import uuid4 import json @@ -8,14 +8,16 @@ import json from fastapi.websockets import WebSocketState from ..plugins.steps.core.core import MessageStep -from ..libs.util.paths import getSessionFilePath, getSessionsFolderPath -from ..core.main import FullState, HistoryNode +from ..libs.util.paths import getSessionFilePath, getSessionsFolderPath, getSessionsListFilePath +from ..core.main import FullState, HistoryNode, SessionInfo from ..core.autopilot import Autopilot from .ide_protocol import AbstractIdeProtocolServer from ..libs.util.create_async_task import create_async_task from ..libs.util.errors import SessionNotFound from ..libs.util.logging import logger +router = APIRouter(prefix="/sessions", tags=["sessions"]) + class Session: session_id: str @@ -74,12 +76,12 @@ class SessionManager: # Start the autopilot (must be after session is added to sessions) and the policy try: - await autopilot.start() + await autopilot.start(full_state=full_state) except Exception as e: # Have to manually add to history because autopilot isn't started formatted_err = '\n'.join(traceback.format_exception(e)) msg_step = MessageStep( - name="Error loading context manager", message=formatted_err) + name="Error starting Autopilot", message=formatted_err) msg_step.description = f"```\n{formatted_err}\n```" autopilot.history.add_node(HistoryNode( step=msg_step, @@ -87,7 +89,7 @@ class SessionManager: depth=0, active=False )) - logger.warning(f"Error loading context manager: {e}") + logger.warning(f"Error starting Autopilot: {e}") def on_error(e: Exception) -> Coroutine: err_msg = '\n'.join(traceback.format_exception(e)) @@ -112,6 +114,27 @@ class SessionManager: with open(getSessionFilePath(session_id), "w") as f: json.dump(full_state.dict(), f) + # Read and update the sessions list + with open(getSessionsListFilePath(), "r") as f: + sessions_list = json.load(f) + + sessions_list.append(SessionInfo( + session_info=full_state.session_info + )) + + async def load_session(self, old_session_id: str, new_session_id: str): + """Load the session's FullState from a json file""" + + # First persist the current state + await self.persist_session(old_session_id) + + # Delete the old session, but keep the IDE + ide = self.registered_ides[old_session_id] + self.registered_ides[old_session_id] = None + + # Start the new session + await self.new_session(ide, session_id=new_session_id) + def register_websocket(self, session_id: str, ws: WebSocket): self.sessions[session_id].ws = ws logger.debug(f"Registered websocket for session {session_id}") @@ -130,3 +153,11 @@ class SessionManager: session_manager = SessionManager() + + +@router.get("/list") +async def list_sessions(): + """List all sessions""" + sessions_list_file = getSessionsListFilePath() + sessions = json.load(open(sessions_list_file, "r")) + return sessions |