
    `gj&                        d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZmZ ddlmZmZmZ ddlmZ  ej(                  e      ZddZ e	d	
       G d d             Z G d de      Zy)z1Managed Modal environment backed by tool-gateway.    )annotationsN)	dataclass)AnyDictOptional)BaseModalExecutionEnvironmentModalExecStartPreparedModalExec)resolve_managed_tool_gatewayc                    	 t        t        j                  | t        |                  }|dkD  r|S |S # t        t
        f$ r |cY S w xY w)Nr   )floatosgetenvstr	TypeError
ValueError)namedefaultvalues      S/root/.hermes/venv/lib/python3.12/site-packages/tools/environments/managed_modal.py_request_timeout_envr      sJ    biic'l34	u.w.z" s   .3 3 AAT)frozenc                      e Zd ZU ded<   y)_ManagedModalExecHandler   exec_idN)__name__
__module____qualname____annotations__     r   r   r      s    Lr!   r   c                  
    e Zd ZdZ edd      Z edd      Z edd      ZdZdZ	d	Z
	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 d fdZddZddZddZddZd ZddZd dZd
dd
d	 	 	 	 	 	 	 d!dZd"dZed#d       Zed$d       Z xZS )%ManagedModalEnvironmentzCGateway-owned Modal sandbox with Hermes-compatible execute/cleanup..TERMINAL_MANAGED_MODAL_CONNECT_TIMEOUT_SECONDSg      ?0TERMINAL_MANAGED_MODAL_POLL_READ_TIMEOUT_SECONDSg      @2TERMINAL_MANAGED_MODAL_CANCEL_READ_TIMEOUT_SECONDSg      $@z4[Command interrupted - Modal sandbox exec cancelled]Managed Modal exec failedNc                   t         |   ||       | j                          t        d      }|t	        d      |j
                  j                  d      | _        |j                  | _	        || _
        || _        || _        t        |xs i       | _        t        t!        j"                               | _        | j'                         | _        y )N)cwdtimeoutmodalzDManaged Modal requires a configured tool gateway and Nous user token/)super__init__)_guard_unsupported_credential_passthroughr   r   gateway_originrstrip_gateway_originnous_user_token_nous_user_token_task_id_persistent_imagedict_sandbox_kwargsr   uuiduuid4_create_idempotency_key_create_sandbox_sandbox_id)	selfimager)   r*   modal_sandbox_kwargspersistent_filesystemtask_idgateway	__class__s	           r   r.   z ManagedModalEnvironment.__init__.   s     	S'2668.w7?cdd&55<<SA ' 7 70#$8$>B?'*4::<'8$//1r!   c           	     D   t        t        j                               }||j                  |j                  t        |j                  dz        d}|j                  |j                  |d<   	 | j                  dd| j                   d|d      }|j                  dk\  r+t        | j                  | j                  d|            
      S |j                         }|j!                  d      }|dv r<t        | j#                  |j!                  dd      |j!                  dd            
      S |j!                  d      |k7  rt        | j                  d      
      S t        t%        |            S # t        $ r(}t        | j                  d	|       
      cY d }~S d }~ww xY w)N  )execIdcommandr)   	timeoutMs	stdinDataPOST/v1/sandboxes/z/execs
   jsonr*   zManaged Modal exec failed: )immediate_result  r'   status>   failedr*   	cancelled	completedoutput 
returncode   rH   z<Managed Modal exec start did not return the expected exec id)r   )handle)r   r:   r;   rI   r)   intr*   
stdin_data_requestr>   	Exceptionr	   _error_resultstatus_code_format_errorrP   get_resultr   )r?   preparedr   payloadresponseexcbodyrS   s           r   _start_modal_execz)ManagedModalEnvironment._start_modal_execH   s   djjl#''<<X--45	#
 *#+#6#6GK 
	}} !1!1 2&9	 % H 3&!!%!3!3&&'BHM"  }}(#DD!!%HHXr*HH\1-"  88H(!!%!3!3R"  %<W%MNN;  	!!%!3!36QRUQV4W!X 	s   +#E. .	F7FFFc                0   	 | j                  dd| j                   d|j                   | j                  | j                  f      }|j                  dk(  r| j                  d      S |j                  dk\  r!| j                  | j                  d	|            S |j                         }|j                  d
      }|dv r2| j                  |j                  dd      |j                  dd            S y # t
        $ r}| j                  d|       cY d }~S d }~ww xY w)NGETrM   /execs/r*   z Managed Modal exec poll failed: i  zManaged Modal exec not foundrR   zManaged Modal exec poll failedrS   >   rT   r*   rU   rV   rW   rX   rY   rZ   )r^   r>   r   _CONNECT_TIMEOUT_SECONDS_POLL_READ_TIMEOUT_SECONDSr_   r`   ra   rb   rP   rc   rd   )r?   r[   status_responserh   status_bodyrS   s         r   _poll_modal_execz(ManagedModalEnvironment._poll_modal_execy   s(   	P"mm !1!1 2'&..9IJ668W8WX , O &&#-%%&DEE&&#-%%""#C_U  &**,*DD<<"-a0  %  	P%%(H&NOO	Ps   AC. .	D7D
DDc                :    | j                  |j                         y N)_cancel_execr   )r?   r[   s     r   _cancel_modal_execz*ManagedModalEnvironment._cancel_modal_exec   s    &..)r!   c                .    | j                  d| dd      S )Nz#Managed Modal exec timed out after s|   )rd   )r?   r*   s     r   _timeout_result_for_modalz1ManagedModalEnvironment._timeout_result_for_modal   s    ||A'!LcRRr!   c                    t        | dd       sy 	 | j                  dd| j                   dd| j                  id       d | _        y # t        $ r }t
        j                  d|       Y d }~,d }~ww xY w# d | _        w xY w)	Nr>   rL   rM   z
/terminatesnapshotBeforeTerminate<   rO   z Managed Modal cleanup failed: %s)getattrr^   r>   r6   r_   loggerwarning)r?   rh   s     r   cleanupzManagedModalEnvironment.cleanup   s    t]D1	$MM !1!1 2*=-t/?/?     $D  	DNN=sCC	D  $Ds)   /A 	A0A+&A3 +A00A3 3	A<c                8   | j                  | j                  j                  d      d      }| j                  | j                  j                  d| j                  j                  d            d      }| j                  | j                  j                  d| j                  j                  d            d       }| j                  | j                  ||dt        d	t        | j                  d
z              | j                  | j                  d}|||d<   | j                  dd|dd| j                  i      }|j                  dk\  rt        | j                  d|            |j                         }|j                  d      }t!        |t"              r|st        d      |S )NcpurZ   	memoryMiBmemoryi   ephemeral_diskdiskMiBi6 i rG   )r@   r)   r   r   rJ   idleTimeoutMspersistentFilesystem
logicalKeyrL   z/v1/sandboxesr~   zx-idempotency-keyrP   r*   extra_headersrR   zManaged Modal create failedidz0Managed Modal create did not return a sandbox id)_coerce_numberr9   rc   r7   r)   maxr\   r*   r6   r5   r^   r<   ra   RuntimeErrorrb   rP   
isinstancer   )r?   r   r   diskcreate_payloadrg   ri   
sandbox_ids           r   r=   z'ManagedModalEnvironment._create_sandbox   s   !!$"6"6":":5"A1E$$  $$[$2F2F2J2J82TU
 ""  $$%5t7K7K7O7OPY7Z[
 [[88" #dllT.A*BC$($4$4--	
 (,N9%==#T%A%A ! 
 3&t112OQYZ[[}}XXd^
*c**QRRr!   c                X    	 ddl m}  |       }|rt        d      y# t        $ r Y yw xY w)z;Managed Modal does not sync or mount host credential files.r   )get_credential_file_mountsNzManaged Modal does not support host credential-file passthrough. Use TERMINAL_MODAL_MODE=direct when skills or config require credential files inside the sandbox.)tools.credential_filesr   r_   r   )r?   r   mountss      r   r/   zAManagedModalEnvironment._guard_unsupported_credential_passthrough   sB    	I ,-7  	  		s    	))   r   c                   d| j                    dd}|r|j                  |       t        j                  || j                   | |||      S )NzBearer zapplication/json)AuthorizationzContent-Type)headersrP   r*   )r4   updaterequestsrequestr2   )r?   methodpathrP   r*   r   r   s          r   r^   z ManagedModalEnvironment._request   sb    
  't'<'<&=>.
 NN=)##$TF+
 	
r!   c                    	 | j                  dd| j                   d| d| j                  | j                  f       y # t        $ r }t
        j                  d|       Y d }~y d }~ww xY w)NrL   rM   rm   z/cancelrn   z$Managed Modal exec cancel failed: %s)r^   r>   ro   _CANCEL_READ_TIMEOUT_SECONDSr_   r   r   )r?   r   rh   s      r   rv   z$ManagedModalEnvironment._cancel_exec   so    	HMM !1!1 2'''J668Y8YZ  
  	HNNA3GG	Hs   ;> 	A'A""A'c                P    	 | |S t        |       S # t        t        f$ r |cY S w xY wru   )r   r   r   )r   r   s     r   r   z&ManagedModalEnvironment._coerce_number  s4    	}<:& 	N	s    
 %%c                   	 |j                         }t        |t              rl|j                  d      xs$ |j                  d      xs |j                  d      }t        |t              r	|r|  d| S |  dt        j
                  |d       S 	 |j                  j                         }|r|  d| S |  d|j                   S # t        $ r Y ?w xY w)Nerrormessagecodez: F)ensure_asciiz: HTTP )
rP   r   r8   rc   r   dumpsr_   textstripra   )prefixrg   rf   r   r   s        r   rb   z%ManagedModalEnvironment._format_error  s    	mmoG'4(!++g._'++i2H_GKKX^L_gs+$XRy11 DJJwU$K#LMM	 ) }}""$XRv&&!5!5 677  		s   A/C 2C 	CC)z/rootr~   NTr   )r@   r   r)   r   r*   r\   rA   zOptional[Dict[str, Any]]rB   boolrC   r   )re   r
   returnr	   )r[   r   r   zdict | None)r[   r   r   None)r*   r\   r   r8   )r   r   )r   r   )r   r   r   r   rP   zDict[str, Any] | Noner*   r\   r   zDict[str, str] | Noner   requests.Response)r   r   r   r   )r   r   r   r   r   r   )r   r   rg   r   r   r   )r   r   r   __doc__r   ro   rp   r   _client_timeout_grace_seconds_interrupt_output_unexpected_error_prefixr.   rj   rs   rw   r{   r   r=   r/   r^   rv   staticmethodr   rb   __classcell__)rE   s   @r   r#   r#   $   s    M34dfij!56hjm!n#78lnq#r $(!N:
 9=&* 22 2 	2
 72  $2 24/Ob6*S$$(T  04 "8<
,

 !6
 BS
&H   8 8r!   r#   )r   r   r   r   r   r   )r   
__future__r   rP   loggingr   r   r:   dataclassesr   typingr   r   r   tools.environments.modal_utilsr   r	   r
   tools.managed_tool_gatewayr   	getLoggerr   r   r   r   r#   r    r!   r   <module>r      sw    7 "   	   ! & & 
 D			8	$ $  v8; v8r!   