summaryrefslogtreecommitdiff
path: root/continuedev
diff options
context:
space:
mode:
authorNate Sesti <sestinj@gmail.com>2023-08-06 09:28:22 -0700
committerNate Sesti <sestinj@gmail.com>2023-08-06 09:28:22 -0700
commitf19345c652cfcf1bdf13d0a44a2f302e0cd1aa4c (patch)
tree4582964105452768a5346afcd764d26db6091504 /continuedev
parent98de69abbd221d0f6b7257a72b89b191356b10b7 (diff)
downloadsncontinue-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.py10
-rw-r--r--continuedev/src/continuedev/core/main.py6
-rw-r--r--continuedev/src/continuedev/libs/util/paths.py6
-rw-r--r--continuedev/src/continuedev/models/generate_json_schema.py4
-rw-r--r--continuedev/src/continuedev/server/gui.py3
-rw-r--r--continuedev/src/continuedev/server/main.py3
-rw-r--r--continuedev/src/continuedev/server/session_manager.py43
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