mirror of
https://github.com/OpenHands/OpenHands.git
synced 2026-03-22 13:47:19 +08:00
* refactor session mgmt * defer file handling to runtime * add todo * refactor sessions a bit more * remove messages logic from FE * fix up socket handshake * refactor frontend auth a bit * first pass at redoing file explorer * implement directory suffix * fix up file tree * close agent on websocket close * remove session saving * move file refresh * remove getWorkspace * plumb path/code differently * fix build issues * fix the tests * fix npm build * add session rehydration * fix event serialization * logspam * fix user message rehydration * add get_event fn * agent state restoration * change history tracking for codeact * fix responsiveness of init * fix lint * lint * delint * fix prop * update tests * logspam * lint * fix test * revert codeact * change fileService to use API * fix up session loading * delint * delint * fix integration tests * revert test * fix up access to options endpoints * fix initial files load * delint * fix file initialization * fix mock server * fixl int * fix auth for html * Update frontend/src/i18n/translation.json Co-authored-by: Xingyao Wang <xingyao6@illinois.edu> * refactor sessions and sockets * avoid reinitializing the same session * fix reconnect issue * change up intro message * more guards on reinit * rename agent_session * delint * fix a bunch of tests * delint * fix last test * remove code editor context * fix build * fix any * fix dot notation * Update frontend/src/services/api.ts Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * fix up error handling * Update opendevin/server/session/agent.py Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * Update opendevin/server/session/agent.py Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * Update frontend/src/services/session.ts Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * fix build errs * fix else * add closed state * delint * Update opendevin/server/session/session.py Co-authored-by: Engel Nyst <enyst@users.noreply.github.com> --------- Co-authored-by: Xingyao Wang <xingyao6@illinois.edu> Co-authored-by: Graham Neubig <neubig@gmail.com> Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
53 lines
2.0 KiB
Python
53 lines
2.0 KiB
Python
from opendevin.events.action import (
|
|
FileReadAction,
|
|
FileWriteAction,
|
|
)
|
|
from opendevin.events.observation import (
|
|
ErrorObservation,
|
|
FileReadObservation,
|
|
FileWriteObservation,
|
|
Observation,
|
|
)
|
|
from opendevin.events.stream import EventStream
|
|
from opendevin.runtime import Sandbox
|
|
from opendevin.runtime.server.files import insert_lines, read_lines
|
|
from opendevin.runtime.server.runtime import ServerRuntime
|
|
|
|
from .filestore import E2BFileStore
|
|
from .sandbox import E2BSandbox
|
|
|
|
|
|
class E2BRuntime(ServerRuntime):
|
|
def __init__(
|
|
self,
|
|
event_stream: EventStream,
|
|
sid: str = 'default',
|
|
sandbox: Sandbox | None = None,
|
|
):
|
|
super().__init__(event_stream, sid, sandbox)
|
|
if not isinstance(self.sandbox, E2BSandbox):
|
|
raise ValueError('E2BRuntime requires an E2BSandbox')
|
|
self.file_store = E2BFileStore(self.sandbox.filesystem)
|
|
|
|
async def read(self, action: FileReadAction) -> Observation:
|
|
content = self.file_store.read(action.path)
|
|
lines = read_lines(content.split('\n'), action.start, action.end)
|
|
code_view = ''.join(lines)
|
|
return FileReadObservation(code_view, path=action.path)
|
|
|
|
async def write(self, action: FileWriteAction) -> Observation:
|
|
if action.start == 0 and action.end == -1:
|
|
self.file_store.write(action.path, action.content)
|
|
return FileWriteObservation(content='', path=action.path)
|
|
files = self.file_store.list(action.path)
|
|
if action.path in files:
|
|
all_lines = self.file_store.read(action.path).split('\n')
|
|
new_file = insert_lines(
|
|
action.content.split('\n'), all_lines, action.start, action.end
|
|
)
|
|
self.file_store.write(action.path, ''.join(new_file))
|
|
return FileWriteObservation('', path=action.path)
|
|
else:
|
|
# FIXME: we should create a new file here
|
|
return ErrorObservation(f'File not found: {action.path}')
|