§
    ‰eîiü&  ã                  ó   — 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dS )z1Managed Modal environment backed by tool-gateway.é    )ÚannotationsN)Ú	dataclass)ÚAnyÚDictÚOptional)ÚBaseModalExecutionEnvironmentÚModalExecStartÚPreparedModalExec)Úresolve_managed_tool_gatewayÚnameÚstrÚdefaultÚfloatÚreturnc                ó¨   — 	 t          t          j        | t          |¦  «        ¦  «        ¦  «        }|dk    r|n|S # t          t
          f$ r |cY S w xY w)Nr   )r   ÚosÚgetenvr   Ú	TypeErrorÚ
ValueError)r   r   Úvalues      úB/home/div/.hermes/hermes-agent/tools/environments/managed_modal.pyÚ_request_timeout_envr      sa   € ðÝ•b”i ¥c¨'¡l¤lÑ3Ô3Ñ4Ô4ˆØ š	˜	ˆuˆu wÐ.øÝ•zÐ"ð ð ð Øˆˆˆðøøøs   ‚8; »AÁAT)Úfrozenc                  ó   — e Zd ZU ded<   dS )Ú_ManagedModalExecHandler   Úexec_idN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    r   r   r      s   € € € € € € à€L€L�L€L€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dAd$„ZdBd&„Zd'„ ZdCd(„ZdDd)„Zdd*dd+œdEd3„ZdFd5„ZedGd9„¦   «         ZedHd<„¦   «         Zˆ xZS )IÚ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 failedú/rooté<   NTr   Úimager   ÚcwdÚtimeoutÚintÚmodal_sandbox_kwargsúOptional[Dict[str, Any]]Úpersistent_filesystemÚboolÚtask_idc                óÞ  •— t          ¦   «                              ||¬¦  «         |                      ¦   «          t          d¦  «        }|€t	          d¦  «        ‚|j                             d¦  «        | _        |j        | _	        || _
        || _        || _        t          |pi ¦  «        | _        t          t!          j        ¦   «         ¦  «        | _        |                      ¦   «         | _        d S )N)r,   r-   Ú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)	Úselfr+   r,   r-   r/   r1   r3   ÚgatewayÚ	__class__s	           €r   r8   z ManagedModalEnvironment.__init__.   sÕ   ø€ õ 	‰Œ×Ò˜S¨'ÐÑ2Ô2Ð2à×6Ò6Ñ8Ô8Ð8å.¨wÑ7Ô7ˆØˆ?ÝÐcÑdÔdÐdà&Ô5×<Ò<¸SÑAÔAˆÔØ 'Ô 7ˆÔØˆŒØ0ˆÔØˆŒÝ#Ð$8Ð$>¸BÑ?Ô?ˆÔÝ'*­4¬:©<¬<Ñ'8Ô'8ˆÔ$Ø×/Ò/Ñ1Ô1ˆÔÐÐr"   Úpreparedr
   r   r	   c           	     óœ  — t          t          j        ¦   «         ¦  «        }||j        |j        t          |j        dz  ¦  «        dœ}|j        �
|j        |d<   	 |                      dd| j	        › d�|d¬¦  «        }n=# t          $ r0}t          |                      d	|› �¦  «        ¬
¦  «        cY d }~S d }~ww xY w|j        dk    r7t          |                      |                      d|¦  «        ¦  «        ¬
¦  «        S |                     ¦   «         }|                     d¦  «        }|dv rLt          |                      |                     dd¦  «        |                     dd¦  «        ¦  «        ¬
¦  «        S |                     d¦  «        |k    r#t          |                      d¦  «        ¬
¦  «        S t          t%          |¬¦  «        ¬¦  «        S )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é   rO   z<Managed Modal exec start did not return the expected exec id)r   )Úhandle)r   rD   rE   rP   r,   r.   r-   Ú
stdin_dataÚ_requestrH   Ú	Exceptionr	   Ú_error_resultÚstatus_codeÚ_format_errorrW   ÚgetÚ_resultr   )rI   rL   r   ÚpayloadÚresponseÚexcÚbodyrZ   s           r   Ú_start_modal_execz)ManagedModalEnvironment._start_modal_execH   s(  € Ý•d”j‘l”lÑ#Ô#ˆàØÔ'Ø”<Ý˜XÔ-°Ñ4Ñ5Ô5ð	#
ð #
ˆð ÔÐ*Ø#+Ô#6ˆG�KÑ ð
	Ø—}’}ØØ9 Ô!1Ð9Ð9Ð9ØØð	 %ñ ô ˆHˆHøõ ð 	ð 	ð 	Ý!Ø!%×!3Ò!3Ð4WÐRUÐ4WÐ4WÑ!XÔ!Xðñ ô ð ð ð ð ð ð øøøøð	øøøð
 Ô 3Ò&Ð&Ý!Ø!%×!3Ò!3Ø×&Ò&Ð'BÀHÑMÔMñ"ô "ðñ ô ð ð �}Š}‰ŒˆØ—’˜(Ñ#Ô#ˆØÐDÐDÐDÝ!Ø!%§¢Ø—H’H˜X rÑ*Ô*Ø—H’H˜\¨1Ñ-Ô-ñ"ô "ðñ ô ð ð �8Š8�HÑÔ Ò(Ð(Ý!Ø!%×!3Ò!3ØRñ"ô "ðñ ô ð õ Õ%<ÀWÐ%MÑ%MÔ%MÐNÑNÔNÐNs   Á"A< Á<
B6Â%B1Â+B6Â1B6rb   r   údict | Nonec                óN  — 	 |                       dd| j        › d|j        › �| j        | j        f¬¦  «        }n/# t
          $ r"}|                      d|› �¦  «        cY d }~S d }~ww xY w|j        dk    r|                      d¦  «        S |j        dk    r)|                      |                      d	|¦  «        ¦  «        S | 	                    ¦   «         }| 
                    d
¦  «        }|dv r>|                      | 
                    dd¦  «        | 
                    dd¦  «        ¦  «        S d S )NÚGETrT   ú/execs/©r-   z Managed Modal exec poll failed: i”  zManaged Modal exec not foundrY   zManaged Modal exec poll failedrZ   >   r[   r-   r\   r]   r^   r_   r`   ra   )rd   rH   r   Ú_CONNECT_TIMEOUT_SECONDSÚ_POLL_READ_TIMEOUT_SECONDSre   rf   rg   rh   rW   ri   rj   )rI   rb   Ústatus_responserm   Ústatus_bodyrZ   s         r   Ú_poll_modal_execz(ManagedModalEnvironment._poll_modal_execy   sj  € ð	PØ"ŸmšmØØJ Ô!1ÐJÐJ¸&¼.ÐJÐJØÔ6¸Ô8WÐXð ,ñ ô ˆOˆOøõ
 ð 	Pð 	Pð 	PØ×%Ò%Ð&NÈÐ&NÐ&NÑOÔOÐOÐOÐOÐOÐOÐOøøøøð	Pøøøð Ô&¨#Ò-Ð-Ø×%Ò%Ð&DÑEÔEÐEàÔ&¨#Ò-Ð-Ø×%Ò%Ø×"Ò"Ð#CÀ_ÑUÔUñô ð ð &×*Ò*Ñ,Ô,ˆØ—’ Ñ*Ô*ˆØÐDÐDÐDØ—<’<Ø—’ ¨"Ñ-Ô-Ø—’ ¨aÑ0Ô0ñô ð ð ˆts   ‚47 ·
A#ÁAÁA#ÁA#ÚNonec                ó:   — |                       |j        ¦  «         d S ©N)Ú_cancel_execr   )rI   rb   s     r   Ú_cancel_modal_execz*ManagedModalEnvironment._cancel_modal_exec”   s   € Ø×Ò˜&œ.Ñ)Ô)Ð)Ð)Ð)r"   rB   c                ó6   — |                       d|› d�d¦  «        S )Nz#Managed Modal exec timed out after Úsé|   )rj   )rI   r-   s     r   Ú_timeout_result_for_modalz1ManagedModalEnvironment._timeout_result_for_modal—   s"   € Ø�|Š|ÐLÀ'ÐLÐLÐLÈcÑRÔRÐRr"   c                ó  — t          | dd ¦  «        sd S 	 |                      dd| j        › d�d| j        id¬¦  «         n2# t          $ r%}t
                               d|¦  «         Y d }~nd }~ww xY wd | _        d S # d | _        w xY w)	NrH   rS   rT   z
/terminateÚsnapshotBeforeTerminater*   rV   z Managed Modal cleanup failed: %s)Úgetattrrd   rH   r@   re   ÚloggerÚwarning)rI   rm   s     r   ÚcleanupzManagedModalEnvironment.cleanupš   sÓ   € Ý�t˜]¨DÑ1Ô1ð 	ØˆFð	$Ø�MŠMØØ= Ô!1Ð=Ð=Ð=à-¨tÔ/?ðð ð ñ ô ð ð øõ ð 	Dð 	Dð 	DÝ�NŠNÐ=¸sÑCÔCÐCÐCÐCÐCÐCÐCøøøøð	Døøøð  $ˆDÔÐÐø˜tˆDÔÐ#Ð#Ð#Ð#s,   •)? ¾A: ¿
A.Á	A)Á$A: Á)A.Á.A: Á:	Bc                óL  — |                       | j                             d¦  «        d¦  «        }|                       | j                             d| j                             d¦  «        ¦  «        d¦  «        }|                       | j                             d| j                             d¦  «        ¦  «        d ¦  «        }| j        | j        ||dt          d	t          | j        d
z  ¦  «        ¦  «        | j        | j	        dœ}|�||d<   |  
                    dd|dd| j        i¬¦  «        }|j        dk    r#t          |                      d|¦  «        ¦  «        ‚|                     ¦   «         }|                     d¦  «        }t!          |t"          ¦  «        r|st          d¦  «        ‚|S )NÚcpura   Ú	memoryMiBÚmemoryi   Úephemeral_diskÚdiskMiBi€î6 ià“ rN   )r+   r,   rŠ   r‹   rQ   ÚidleTimeoutMsÚpersistentFilesystemÚ
logicalKeyrS   z/v1/sandboxesr*   zx-idempotency-key©rW   r-   Úextra_headersrY   zManaged Modal create failedÚidz0Managed Modal create did not return a sandbox id)Ú_coerce_numberrC   ri   rA   r,   Úmaxr.   r-   r@   r?   rd   rF   rg   ÚRuntimeErrorrh   rW   Ú
isinstancer   )rI   rŠ   rŒ   ÚdiskÚcreate_payloadrl   rn   Ú
sandbox_ids           r   rG   z'ManagedModalEnvironment._create_sandbox¬   s±  € Ø×!Ò! $Ô"6×":Ò":¸5Ñ"AÔ"AÀ1ÑEÔEˆØ×$Ò$ØÔ ×$Ò$ [°$Ô2F×2JÒ2JÈ8Ñ2TÔ2TÑUÔUØñ
ô 
ˆð ×"Ò"ØÔ ×$Ò$Ð%5°tÔ7K×7OÒ7OÐPYÑ7ZÔ7ZÑ[Ô[Øñ
ô 
ˆð ”[Ø”8ØØØ"Ý  ­#¨d¬l¸TÑ.AÑ*BÔ*BÑCÔCØ$(Ô$4Øœ-ð	
ð 	
ˆð ÐØ(,ˆN˜9Ñ%à—=’=ØØØØà# TÔ%Aðð !ñ 
ô 
ˆð Ô 3Ò&Ð&Ý˜t×1Ò1Ð2OÐQYÑZÔZÑ[Ô[Ð[à�}Š}‰ŒˆØ—X’X˜d‘^”^ˆ
Ý˜*¥cÑ*Ô*ð 	S°*ð 	SÝÐQÑRÔRÐRØÐr"   c                ón   — 	 ddl m} n# t          $ r Y dS w xY w |¦   «         }|rt          d¦  «        ‚dS )z;Managed Modal does not sync or mount host credential files.r   )Úget_credential_file_mountsNz¢Managed 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�   re   r   )rI   r�   Úmountss      r   r9   zAManagedModalEnvironment._guard_unsupported_credential_passthroughÖ   sw   € ð	ØIÐIÐIÐIÐIÐIÐIøÝð 	ð 	ð 	ØˆFˆFð	øøøð ,Ð+Ñ-Ô-ˆØð 	Ýð7ñô ð ð	ð 	s   ‚	 ‰
–é   r’   ÚmethodÚpathrW   úDict[str, Any] | Noner“   úDict[str, str] | Noneúrequests.Responsec               óŽ   — d| j         › �ddœ}|r|                     |¦  «         t          j        || j        › |› �|||¬¦  «        S )NzBearer zapplication/json)ÚAuthorizationzContent-Type)ÚheadersrW   r-   )r>   ÚupdateÚrequestsÚrequestr<   )rI   r¡   r¢   rW   r-   r“   r¨   s          r   rd   z ManagedModalEnvironment._requestå   st   € ð
 ? tÔ'<Ð>Ð>Ø.ð
ð 
ˆð ð 	*Ø�NŠN˜=Ñ)Ô)Ð)åÔØØÔ#Ð+ TÐ+Ð+ØØØð
ñ 
ô 
ð 	
r"   r   c                óÎ   — 	 |                       dd| j        › d|› d�| j        | j        f¬¦  «         d S # t          $ r&}t
                               d|¦  «         Y d }~d S d }~ww xY w)NrS   rT   rs   z/cancelrt   z$Managed Modal exec cancel failed: %s)rd   rH   ru   Ú_CANCEL_READ_TIMEOUT_SECONDSre   r†   r‡   )rI   r   rm   s      r   r}   z$ManagedModalEnvironment._cancel_execø   s£   € ð	HØ�MŠMØØJ Ô!1ÐJÐJ¸'ÐJÐJÐJØÔ6¸Ô8YÐZð ñ ô ð ð ð øõ
 ð 	Hð 	Hð 	HÝ�NŠNÐAÀ3ÑGÔGÐGÐGÐGÐGÐGÐGÐGøøøøð	Høøøs   ‚04 ´
A$¾AÁA$r   r   r   c                ó\   — 	 | €|S t          | ¦  «        S # t          t          f$ r |cY S w xY wr|   )r   r   r   )r   r   s     r   r•   z&ManagedModalEnvironment._coerce_number  sF   € ð	Øˆ}Ø�Ý˜‘<”<ÐøÝ�:Ð&ð 	ð 	ð 	ØˆNˆNˆNð	øøøs   ‚ † •+ª+Úprefixrl   c                óÄ  — 	 |                      ¦   «         }t          |t          ¦  «        rx|                     d¦  «        p)|                     d¦  «        p|                     d¦  «        }t          |t          ¦  «        r	|r| › d|› �S | › dt          j        |d¬¦  «        › �S n# t          $ r Y nw xY w|j                             ¦   «         }|r| › d|› �S | › d|j	        › �S )NÚerrorÚmessageÚcodez: F)Úensure_asciiz: HTTP )
rW   r˜   rB   ri   r   Údumpsre   ÚtextÚstriprg   )r¯   rl   rk   r²   r¶   s        r   rh   z%ManagedModalEnvironment._format_error  s  € ð	Ø—m’m‘o”oˆGÝ˜'¥4Ñ(Ô(ð NØ!Ÿ+š+ gÑ.Ô.Ð_°'·+²+¸iÑ2HÔ2HÐ_ÈGÏKÊKÐX^ÑL_ÔL_�Ý˜g¥sÑ+Ô+ð 2°ð 2Ø$Ð1Ð1¨Ð1Ð1Ð1Ø ÐMÐM¥D¤J¨wÀUÐ$KÑ$KÔ$KÐMÐMÐMð	Nøõ
 ð 	ð 	ð 	ØˆDð	øøøð Œ}×"Ò"Ñ$Ô$ˆØð 	'ØÐ&Ð& Ð&Ð&Ð&ØÐ7Ð7 Ô!5Ð7Ð7Ð7s   ‚BB$ ÂB$ Â$
B1Â0B1)r)   r*   NTr   )r+   r   r,   r   r-   r.   r/   r0   r1   r2   r3   r   )rL   r
   r   r	   )rb   r   r   rp   )rb   r   r   rz   )r-   r.   r   rB   )r   r   )r   rz   )r¡   r   r¢   r   rW   r£   r-   r.   r“   r¤   r   r¥   )r   r   r   rz   )r   r   r   r   r   r   )r¯   r   rl   r¥   r   r   )r   r   r   Ú__doc__r   ru   rv   r­   Ú_client_timeout_grace_secondsÚ_interrupt_outputÚ_unexpected_error_prefixr8   ro   ry   r~   r‚   rˆ   rG   r9   rd   r}   Ústaticmethodr•   rh   Ú__classcell__)rK   s   @r   r$   r$   $   s¼  ø€ € € € € ØMÐMà3Ð3Ð4dÐfiÑjÔjÐØ!5Ð!5Ð6hÐjmÑ!nÔ!nÐØ#7Ð#7Ð8lÐnqÑ#rÔ#rÐ Ø$(Ð!ØNÐØ:Ðð
 ØØ9=Ø&*Ø ð2ð 2ð 2ð 2ð 2ð 2ð 2ð4/Oð /Oð /Oð /Oðbð ð ð ð6*ð *ð *ð *ðSð Sð Sð Sð$ð $ð $ð$(ð (ð (ð (ðTð ð ð ð  04Ø "Ø8<ð
ð 
ð 
ð 
ð 
ð 
ð&Hð Hð Hð Hð ðð ð ñ „\ðð ð8ð 8ð 8ñ „\ð8ð 8ð 8ð 8ð 8r"   r$   )r   r   r   r   r   r   )r¸   Ú
__future__r   rW   Úloggingr   rª   rD   Údataclassesr   Útypingr   r   r   Útools.environments.modal_utilsr   r	   r
   Útools.managed_tool_gatewayr   Ú	getLoggerr   r†   r   r   r$   r!   r"   r   ú<module>rÅ      sh  ðØ 7Ð 7à "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð
 DÐ CÐ CÐ CÐ CÐ Cà	ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð €�$ÐÑÔðð ð ð ð ñ ô ñ Ôððv8ð v8ð v8ð v8ð v8Ð;ñ v8ô v8ð v8ð v8ð v8r"   