@@ -108,8 +108,12 @@ def _get_execute_request(
108108            }
109109        )
110110
111-     async  def  _wait_for_result (self , message_id : str ):
111+     async  def  _wait_for_result (
112+         self , message_id : str , sends_input_accepted : bool  =  False 
113+     ):
112114        queue  =  self ._executions [message_id ].queue 
115+         if  not  sends_input_accepted :
116+             self ._executions [message_id ].input_accepted  =  True 
113117
114118        while  True :
115119            output  =  await  queue .get ()
@@ -127,21 +131,37 @@ async def _wait_for_result(self, message_id: str):
127131
128132            yield  output .model_dump (exclude_none = True )
129133
130-     async  def  change_current_directory (self , path : Union [str , StrictStr ]):
134+     async  def  change_current_directory (
135+         self , path : Union [str , StrictStr ], language : str 
136+     ):
131137        message_id  =  str (uuid .uuid4 ())
132138        self ._executions [message_id ] =  Execution (in_background = True )
133-         request  =  self ._get_execute_request (message_id , f"%cd { path }  , True )
139+         if  language  ==  "python" :
140+             request  =  self ._get_execute_request (message_id , f"%cd { path }  , True )
141+         elif  language  ==  "jslab"  or  language  ==  "tslab" :
142+             request  =  self ._get_execute_request (
143+                 message_id , f"process.chdir('{ path }  , True 
144+             )
145+         elif  language  ==  "r" :
146+             request  =  self ._get_execute_request (message_id , f"setwd('{ path }  , True )
147+         elif  language  ==  "java" :
148+             request  =  self ._get_execute_request (
149+                 message_id , f"System.setProperty('user.dir', '{ path }  , True 
150+             )
151+         else :
152+             return 
134153
135154        await  self ._ws .send (request )
136155
137-         async  for  item  in  self ._wait_for_result (message_id ):
156+         async  for  item  in  self ._wait_for_result (message_id ,  False ):
138157            if  item ["type" ] ==  "error" :
139158                raise  ExecutionError (f"Error during execution: { item }  )
140159
141160    async  def  execute (
142161        self ,
143162        code : Union [str , StrictStr ],
144163        env_vars : Dict [StrictStr , str ] =  None ,
164+         sends_input_accepted : bool  =  False ,
145165    ):
146166        message_id  =  str (uuid .uuid4 ())
147167        logger .debug (f"Sending code for the execution ({ message_id } { code }  )
@@ -165,11 +185,12 @@ async def execute(
165185                        indent  =  len (line ) -  len (line .lstrip ())
166186                        break 
167187
168-                 code  =  (
169-                     indent  *  " " 
170-                     +  f"os.environ.set_envs_for_execution({ vars_to_set } \n " 
171-                     +  code 
172-                 )
188+                 if  self .language  ==  "python" :
189+                     code  =  (
190+                         indent  *  " " 
191+                         +  f"os.environ.set_envs_for_execution({ vars_to_set } \n " 
192+                         +  code 
193+                     )
173194
174195            logger .info (code )
175196            request  =  self ._get_execute_request (message_id , code , False )
@@ -178,7 +199,7 @@ async def execute(
178199            await  self ._ws .send (request )
179200
180201            # Stream the results 
181-             async  for  item  in  self ._wait_for_result (message_id ):
202+             async  for  item  in  self ._wait_for_result (message_id ,  sends_input_accepted ):
182203                yield  item 
183204
184205            del  self ._executions [message_id ]
@@ -192,7 +213,9 @@ async def _receive_message(self):
192213            async  for  message  in  self ._ws :
193214                await  self ._process_message (json .loads (message ))
194215        except  Exception  as  e :
195-             logger .error (f"WebSocket received error while receiving messages: { e }  )
216+             logger .error (
217+                 f"WebSocket received error while receiving messages: { type (e )} { str (e )}  
218+             )
196219
197220    async  def  _process_message (self , data : dict ):
198221        """ 
@@ -308,11 +331,21 @@ async def _process_message(self, data: dict):
308331                execution .errored  =  True 
309332                await  queue .put (
310333                    Error (
311-                         name = data ["content" ][ "ename" ] ,
312-                         value = data ["content" ][ "evalue" ] ,
313-                         traceback = "" .join (data ["content" ][ "traceback" ] ),
334+                         name = data ["content" ]. get ( "ename" ,  "" ) ,
335+                         value = data ["content" ]. get ( "evalue" ,  "" ) ,
336+                         traceback = "" .join (data ["content" ]. get ( "traceback" , []) ),
314337                    )
315338                )
339+             elif  data ["content" ]["status" ] ==  "abort" :
340+                 logger .debug (f"Execution { parent_msg_ig }  )
341+                 await  queue .put (
342+                     Error (
343+                         name = "ExecutionAborted" ,
344+                         value = "Execution was aborted" ,
345+                         traceback = "" ,
346+                     )
347+                 )
348+                 await  queue .put (EndOfExecution ())
316349            elif  data ["content" ]["status" ] ==  "ok" :
317350                pass 
318351
0 commit comments