use codex_app_server_protocol::FsCopyParams; use codex_app_server_protocol::FsCopyResponse; use codex_app_server_protocol::FsCreateDirectoryParams; use codex_app_server_protocol::FsCreateDirectoryResponse; use codex_app_server_protocol::FsGetMetadataParams; use codex_app_server_protocol::FsGetMetadataResponse; use codex_app_server_protocol::FsReadDirectoryParams; use codex_app_server_protocol::FsReadDirectoryResponse; use codex_app_server_protocol::FsReadFileParams; use codex_app_server_protocol::FsReadFileResponse; use codex_app_server_protocol::FsRemoveParams; use codex_app_server_protocol::FsRemoveResponse; use codex_app_server_protocol::FsWriteFileParams; use codex_app_server_protocol::FsWriteFileResponse; use codex_app_server_protocol::JSONRPCErrorError; use crate::protocol::ExecParams; use crate::protocol::ExecResponse; use crate::protocol::InitializeResponse; use crate::protocol::ReadParams; use crate::protocol::ReadResponse; use crate::protocol::TerminateParams; use crate::protocol::TerminateResponse; use crate::protocol::WriteParams; use crate::protocol::WriteResponse; use crate::rpc::RpcNotificationSender; use crate::server::file_system_handler::FileSystemHandler; use crate::server::process_handler::ProcessHandler; #[derive(Clone)] pub(crate) struct ExecServerHandler { process: ProcessHandler, file_system: FileSystemHandler, } impl ExecServerHandler { pub(crate) fn new(notifications: RpcNotificationSender) -> Self { Self { process: ProcessHandler::new(notifications), file_system: FileSystemHandler::default(), } } pub(crate) async fn shutdown(&self) { self.process.shutdown().await; } pub(crate) fn initialize(&self) -> Result { self.process.initialize() } pub(crate) fn initialized(&self) -> Result<(), String> { self.process.initialized() } pub(crate) async fn exec(&self, params: ExecParams) -> Result { self.process.exec(params).await } pub(crate) async fn exec_read( &self, params: ReadParams, ) -> Result { self.process.exec_read(params).await } pub(crate) async fn exec_write( &self, params: WriteParams, ) -> Result { self.process.exec_write(params).await } pub(crate) async fn terminate( &self, params: TerminateParams, ) -> Result { self.process.terminate(params).await } pub(crate) async fn fs_read_file( &self, params: FsReadFileParams, ) -> Result { self.process.require_initialized_for("filesystem")?; self.file_system.read_file(params).await } pub(crate) async fn fs_write_file( &self, params: FsWriteFileParams, ) -> Result { self.process.require_initialized_for("filesystem")?; self.file_system.write_file(params).await } pub(crate) async fn fs_create_directory( &self, params: FsCreateDirectoryParams, ) -> Result { self.process.require_initialized_for("filesystem")?; self.file_system.create_directory(params).await } pub(crate) async fn fs_get_metadata( &self, params: FsGetMetadataParams, ) -> Result { self.process.require_initialized_for("filesystem")?; self.file_system.get_metadata(params).await } pub(crate) async fn fs_read_directory( &self, params: FsReadDirectoryParams, ) -> Result { self.process.require_initialized_for("filesystem")?; self.file_system.read_directory(params).await } pub(crate) async fn fs_remove( &self, params: FsRemoveParams, ) -> Result { self.process.require_initialized_for("filesystem")?; self.file_system.remove(params).await } pub(crate) async fn fs_copy( &self, params: FsCopyParams, ) -> Result { self.process.require_initialized_for("filesystem")?; self.file_system.copy(params).await } } #[cfg(test)] mod tests;