Ë
    ãß²jk)  ã                  óü   — 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Zddl	Z	ddl
mZmZmZ ddlmZ ddlmZ ddlmZ  ej(                  e«      Z eh d£«      Zd	Zdd
„Zdd„Zddd„Z G d„ de«      ZddlmZ y)a'  Managed Modal environment backed by tool-gateway.

Deliberately overrides :meth:`BaseEnvironment.execute`: the tool-gateway does command
preparation, CWD tracking and env-snapshot management server-side, so the base
``_wrap_command`` / ``_wait_for_process`` / snapshot machinery does not apply.
é    )ÚannotationsN)ÚAnyÚDictÚOptional)ÚBaseEnvironment)Úis_interrupted)Úresolve_managed_tool_gateway>   ÚfailedÚtimeoutÚ	cancelledÚ	completedg      $@c                óP   — 	 | €|S t        | «      S # t        t        f$ r |cY S w xY w)N)ÚfloatÚ	TypeErrorÚ
ValueError)ÚvalueÚdefaults     úE/home/ubuntu/.hermes/hermes-agent/tools/environments/managed_modal.pyÚ_coerce_numberr      s3   € ðØ˜-ˆwÐ9¬U°5«\Ð9øÜ”zÐ"ò ØŠðús   ‚ †
 ‘%¤%c                óR   — t        t        j                  | «      |«      }|dkD  r|S |S )Nr   )r   ÚosÚgetenv)Únamer   r   s      r   Ú_request_timeout_envr   $   s'   € Üœ2Ÿ9™9 T›?¨GÓ4€EØ˜A’Iˆ5Ð* 7Ð*ó    c                ó   — | |dœS )N©ÚoutputÚ
returncode© r   s     r   Ú_resultr!   )   s   € Ø¨JÑ7Ð7r   c                  óê   ‡ — e Zd ZdZdZ edd«      Z edd«      Z edd«      Z	 	 	 d	 	 	 	 	 dˆ fd
„Z	dddd	ddœ	 	 	 	 	 dd„Z
edd„«       Zdd„Zdd„Zd„ Zdd„Zddddœ	 	 	 dd„Zed d„«       Zˆ xZS )!ÚManagedModalEnvironmentzCGateway-owned Modal sandbox with Hermes-compatible execute/cleanup.ÚpayloadÚ.TERMINAL_MANAGED_MODAL_CONNECT_TIMEOUT_SECONDSg      ð?Ú0TERMINAL_MANAGED_MODAL_POLL_READ_TIMEOUT_SECONDSg      @Ú2TERMINAL_MANAGED_MODAL_CANCEL_READ_TIMEOUT_SECONDSNTc                óÔ  •— t         ‰	| �  ||¬«       	 ddlm} |� |«       rt        d«      ‚t        d«      }|€t        d«      ‚|j                  j                  d«      | _	        |j                  | _        |||c| _        | _        | _        t        |xs i «      | _        t#        t%        j&                  «       «      | _        | j+                  «       | _        y # t        $ r d }Y ŒÌw xY w)N)Úcwdr   r   )Úget_credential_file_mountsz¢Managed Modal does not support host credential-file passthrough. Use TERMINAL_MODAL_MODE=direct when skills or config require credential files inside the sandbox.ÚmodalzDManaged Modal requires a configured tool gateway and Nous user tokenú/)ÚsuperÚ__init__Útools.credential_filesr*   Ú	Exceptionr   r	   Úgateway_originÚrstripÚ_gateway_originÚnous_user_tokenÚ_nous_user_tokenÚ_task_idÚ_persistentÚ_imageÚdictÚ_sandbox_kwargsÚstrÚuuidÚuuid4Ú_create_idempotency_keyÚ_create_sandboxÚ_sandbox_id)
ÚselfÚimager)   r   Úmodal_sandbox_kwargsÚpersistent_filesystemÚtask_idr*   ÚgatewayÚ	__class__s
            €r   r.   z ManagedModalEnvironment.__init__5   sê   ø€ ô 	‰Ñ˜S¨'ÐÔ2ð	.ÝIð &Ð1Ñ6PÔ6RÜð7óð ô
 /¨wÓ7ˆØˆ?ÜÐcÓdÐdØ&×5Ñ5×<Ñ<¸SÓAˆÔØ '× 7Ñ 7ˆÔØ7>Ð@UÐW\Ð4ˆŒ�tÔ'¨¬Ü#Ð$8Ò$>¸BÓ?ˆÔÜ'*¬4¯:©:«<Ó'8ˆÔ$Ø×/Ñ/Ó1ˆÕøô! ò 	.Ø)-Ò&ð	.ús   ”C ÃC'Ã&C'F)r   Ú
stdin_dataÚrewrite_compound_backgroundÚbounded_capturec               ó°  — ~~| j                  |«      \  }}|�)dt        j                  |j                  «       «      › d|› �}|xs | j                  }t        t        j                  «       «      }	|	||xs | j                  t        |dz  «      dœ}
|�||
d<   	 | j                  dd| j                  › d�|
d	¬
«      }|j                  dk  r|j                  «       nd }|€t        | j!                  d|«      «      S | j#                  |«      x}�|S |j%                  d«      |	k7  rt        d«      S t'        j(                  «       |z   t*        z   }t'        j(                  «       }||dœ}	 t-        «       r| j/                  |	«       t        dd«      S 	 | j1                  |	«      x}�|S 	 t'        j(                  «       |k\  r!| j/                  |	«       t        d|› d�d«      S 	 ddlm}  ||d«       t'        j6                  d«       Œœ# t        $ r}t        d|› �«      cY d }~S d }~ww xY w# t        $ r}t        d|› �«      cY d }~S d }~ww xY w# t        $ r Y Œiw xY w)Nzprintf '%s\n' z | éè  )ÚexecIdÚcommandr)   Ú	timeoutMsÚ	stdinDataÚPOSTú/v1/sandboxes/z/execsé
   ©Újsonr   é�  zManaged Modal exec failed: zManaged Modal exec failedrM   z<Managed Modal exec start did not return the expected exec id)Ú
last_touchÚstartz4[Command interrupted - Modal sandbox exec cancelled]é‚   z#Managed Modal exec timed out after Úsé|   r   )Útouch_activity_if_duezmodal command runningg      Ð?)Ú_prepare_commandÚshlexÚquoter2   r   r;   r<   r=   r)   ÚintÚ_requestr@   Ústatus_coderU   r0   r!   Ú_format_errorÚ_result_from_bodyÚgetÚtimeÚ	monotonicÚ_CLIENT_TIMEOUT_GRACE_SECONDSr   Ú_cancel_execÚ
_poll_execÚtools.environments.baser\   Úsleep)rA   rN   r)   r   rH   rI   rJ   Úexec_commandÚ
sudo_stdinÚexec_idr$   ÚresponseÚbodyÚexcÚfinalÚdeadlineÚ_nowÚ_activity_stateÚresultr\   s                       r   ÚexecutezManagedModalEnvironment.executeN   sv  € ð (¨Ø#'×#8Ñ#8¸Ó#AÑ ˆ�jØÐ!à,¬U¯[©[¸×9JÑ9JÓ9LÓ-MÐ,NÈcÐR^ÐQ_Ð`ˆLØÒ)˜TŸ\™\ˆÜ”d—j‘j“lÓ#ˆØ-4ÀÐVYÒVeÐ]a×]eÑ]eÜ03°G¸d±NÓ0Cñ#EˆàÐ!Ø#-ˆG�KÑ ð	@Ø—}‘} V¨~¸d×>NÑ>NÐ=OÈvÐ-VÐ]dÐnp�}ÓqˆHØ&.×&:Ñ&:¸SÒ&@�8—=‘=”?ÀdˆDð ˆ<Ü˜4×-Ñ-Ð.IÈ8ÓTÓUÐUØ×+Ñ+¨DÓ1Ð1ˆEÐ>ØˆLØ�8‰8�HÓ Ò(ÜÐYÓZÐZÜ—>‘>Ó# gÑ-Ô0MÑMˆÜ�~‰~ÓˆØ)-¸Ñ=ˆØÜÔØ×!Ñ! 'Ô*ÜÐUÐWZÓ[Ð[ðDØ"Ÿo™o¨gÓ6Ð6�FÐCØ!�Mð Dô �~‰~Ó 8Ò+Ø×!Ñ! 'Ô*ÜÐ!DÀWÀIÈQÐOÐQTÓUÐUðÝIÙ% oÐ7NÔOô �J‰J�tÔð' øô ò 	@ÜÐ8¸¸Ð>Ó?Õ?ûð	@ûô$ ò DÜÐ!<¸S¸EÐBÓCÕCûðDûô ò ÙðúsO   ÂAH ÆH% ÇI	 È	H"È
HÈH"ÈH"È%	IÈ.IÈ;IÉIÉ		IÉIc                óŠ   — | j                  d«      t        v r,t        | j                  dd«      | j                  dd«      «      S y)zLFinal result dict if the exec body reports a terminal status, else ``None``.Ústatusr   Ú r   é   N)re   Ú_TERMINAL_EXEC_STATUSESr!   )rq   s    r   rd   z)ManagedModalEnvironment._result_from_body‚   s>   € ð �8‰8�HÓÔ!8Ñ8Ü˜4Ÿ8™8 H¨bÓ1°4·8±8¸LÈ!Ó3LÓMÐMð 9r   c                ó†  — 	 | j                  dd| j                  › d|› �| j                  | j                  f¬«      }|j                  dk(  rt        d«      S |j                  dk\  rt        | j                  d	|«      «      S | j                  |j                  «       «      S # t        $ r}t        d|› �«      cY d }~S d }~ww xY w)
NÚGETrR   ú/execs/©r   z Managed Modal exec poll failed: i”  zManaged Modal exec not foundrV   zManaged Modal exec poll failed)
ra   r@   Ú_CONNECT_TIMEOUT_SECONDSÚ_POLL_READ_TIMEOUT_SECONDSr0   r!   rb   rc   rd   rU   )rA   ro   rp   rr   s       r   rj   z"ManagedModalEnvironment._poll_execˆ   sÌ   € ð	EØ—}‘} U¨n¸T×=MÑ=MÐ<NÈgÐV]ÐU^Ð,_Ø.2×.KÑ.KÈT×MlÑMlÐ-mð %ó oˆHð ×Ñ 3Ò&ÜÐ9Ó:Ð:Ø×Ñ 3Ò&Ü˜4×-Ñ-Ð.NÐPXÓYÓZÐZØ×%Ñ% h§m¡m£oÓ6Ð6øô ò 	EÜÐ=¸c¸UÐCÓDÕDûð	Eús   ‚:B Â	C Â(B;Â5C Â;C 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)NrQ   rR   r€   z/cancelr�   z$Managed Modal exec cancel failed: %s)ra   r@   r‚   Ú_CANCEL_READ_TIMEOUT_SECONDSr0   ÚloggerÚwarning)rA   ro   rr   s      r   ri   z$ManagedModalEnvironment._cancel_exec”   sm   € ð	HØ�M‰M˜& N°4×3CÑ3CÐ2DÀGÈGÈ9ÐT[Ð"\Ø#'×#@Ñ#@À$×BcÑBcÐ"dð õ føäò 	HÜ�N‰NÐAÀ3×GÑGûð	Hús   ‚;> ¾	A'ÁA"Á"A'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@   rQ   rR   z
/terminateÚsnapshotBeforeTerminateé<   rT   z Managed Modal cleanup failed: %s)Úgetattrra   r@   r7   r0   r†   r‡   )rA   rr   s     r   ÚcleanupzManagedModalEnvironment.cleanup›   sˆ   € Ü�t˜]¨DÔ1Øð	$Ø�M‰M˜& N°4×3CÑ3CÐ2DÀJÐ"OØ 9¸4×;KÑ;KÐLÐVXð ô Zð
  $ˆDÕøô ò 	DÜ�N‰NÐ=¸s×CÑCûð	Dûð  $ˆDÕús)   �/A Á	A0ÁA+Á&A3 Á+A0Á0A3 Á3	A<c                óÄ  — | j                   }t        |j                  d«      d«      }t        |j                  d|j                  d«      «      d«      }t        |j                  d|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Úcpur|   Ú	memoryMiBÚmemoryi   Úephemeral_diskÚdiskMiBi€î6 ià“ rL   )rB   r)   rŽ   r�   rO   ÚidleTimeoutMsÚpersistentFilesystemÚ
logicalKeyrQ   z/v1/sandboxesrŠ   zx-idempotency-key©rU   r   Úextra_headersrV   zManaged Modal create failedÚidz0Managed Modal create did not return a sandbox id)r:   r   re   r8   r)   Úmaxr`   r   r7   r6   ra   r>   rb   ÚRuntimeErrorrc   rU   Ú
isinstancer;   )rA   ÚkwrŽ   r�   ÚdiskÚcreate_payloadrp   Ú
sandbox_ids           r   r?   z'ManagedModalEnvironment._create_sandbox¦   s=  € Ø×!Ñ!ˆÜ˜RŸV™V E›]¨AÓ.ˆÜ §¡ {°B·F±F¸8Ó4DÓ EÀtÓLˆÜ˜bŸf™fÐ%5°r·v±v¸iÓ7HÓIÈ4ÓPˆà—[‘[¨¯©¸#ÈFÐajÜ  ¬#¨d¯l©l¸TÑ.AÓ*BÓCØ$(×$4Ñ$4ÀDÇMÁMñ
ˆð
 ÐØ(,ˆN˜9Ñ%Ø—=‘= ¨¸~ÐWYØ0CÀT×EaÑEaÐ/bð !ó dˆà×Ñ 3Ò&Ü˜t×1Ñ1Ð2OÐQYÓZÓ[Ð[Ø—]‘]“_×(Ñ(¨Ó.ˆ
Ü˜*¤cÔ*±*ÜÐQÓRÐRØÐr   é   r–   c               ó‚   — d| j                   › �ddœ|xs i ¥}t        j                  || j                  › |› �|||¬«      S )NzBearer zapplication/json)ÚAuthorizationzContent-Type)ÚheadersrU   r   )r5   ÚrequestsÚrequestr3   )rA   ÚmethodÚpathrU   r   r—   r£   s          r   ra   z ManagedModalEnvironment._request»   sV   € à&-¨d×.CÑ.CÐ-DÐ$EÐWiñ ,Ø#Ò) rð,ˆä×Ñ ¨4×+?Ñ+?Ð*@ÀÀÐ(GÐQXÐ_cÐmtÔuÐur   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 )
rU   r›   r9   re   r;   Údumpsr0   ÚtextÚstriprb   )Úprefixrp   r$   rª   r®   s        r   rc   z%ManagedModalEnvironment._format_errorÁ   sØ   € ð	Ø—m‘m“oˆGÜ˜'¤4Ô(Ø!Ÿ+™+ gÓ.Ò_°'·+±+¸iÓ2HÒ_ÈGÏKÉKÐX^ÓL_�Ü˜g¤sÔ+±Ø$˜X R¨ yÐ1Ð1Ø ˜ ¤D§J¡J¨wÀUÔ$KÐ#LÐMÐMð	 )ð �}‰}×"Ñ"Ó$ˆÙ&*�&�˜˜D˜6Ð"ÐX°6°(¸'À(×BVÑBVÐAWÐ0XÐXøô ò 	Ùð	ús   ‚A/C Á2C Ã	CÃC)z/rootrŠ   NTr   )rB   r;   r)   r;   r   r`   rC   zOptional[Dict[str, Any]]rD   ÚboolrE   r;   )r{   )rN   r;   r)   r;   r   z
int | NonerH   z
str | NonerI   r±   rJ   r±   Úreturnr9   )rq   r9   r²   údict | None)ro   r;   r²   r³   )ro   r;   r²   ÚNone)r²   r;   )r¦   r;   r§   r;   rU   zDict[str, Any] | Noner   r`   r—   zDict[str, str] | Noner²   úrequests.Response)r°   r;   rp   rµ   r²   r;   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_stdin_moder   r‚   rƒ   r…   r.   rx   Ústaticmethodrd   rj   ri   rŒ   r?   ra   rc   Ú__classcell__)rG   s   @r   r#   r#   -   sò   ø„ ÙMà€KÙ3Ð4dÐfiÓjÐÙ!5Ð6hÐjmÓ!nÐÙ#7Ð8lÐnqÓ#rÐ àFHØBFØDMð2Ø'?ð2à(,ð2à>Aõ2ð22ÈDÐkoØ48ÐRWñ2Ø-1ð2ØKOð2Ø\`ó2ðh òNó ðNó

7óHò	$óð* QUÐegØ8<ñvØ 5ðvØARóvð òYó ôYr   r#   )Ú	dataclass)r   r   r   r   r²   r   )r   r;   r   r   r²   r   )r|   )r   r;   r   r`   r²   r9   ) r¹   Ú
__future__r   rU   Úloggingr   r¤   r^   rf   r<   Útypingr   r   r   rk   r   Útools.interruptr   Útools.managed_tool_gatewayr	   Ú	getLoggerr¶   r†   Ú	frozensetr}   rh   r   r   r!   r#   Údataclassesr½   r    r   r   ú<module>rÆ      s|   ðñõ #ã Û Û 	Û Û Û Û ß &Ñ &å 3Ý *Ý Cà	ˆ×	Ñ	˜8Ó	$€á#Ò$SÓTÐ Ø $Ð óó+ô
8ô`Y˜oô `YöN "r   