Ë
    ãß²j 6  ã                   ó²  — d 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Zddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZ  ej>                  e «      Z!d
e
fd„Z"d
e#fd„Z$de#d
dfd„Z%de&d
e'e&dz  e(f   fd„Z)de&de&d
dfd„Z*dde&de&dz  d
dfd„Z+ded
efd„Z,de&de-d
dfd„Z.d
e&fd„Z/ G d„ d«      Z0 G d„ de«      Z1y)zœModal cloud execution environment using the native Modal SDK directly
(``Sandbox.create()`` + ``Sandbox.exec()``) with persistent snapshots across sessions.é    N)ÚPath)ÚAnyÚOptional©Úget_hermes_home)ÚBaseEnvironmentÚ_load_json_storeÚ_save_json_store)Ú_ThreadedProcessHandle)ÚFileSyncManagerÚiter_sync_filesÚquoted_mkdir_commandÚquoted_rm_commandÚunique_parent_dirs)Ú	bash_argvÚensure_lazy_depÚreturnc                  ó   — t        «       dz  S )Nzmodal_snapshots.jsonr   © ó    ú=/home/ubuntu/.hermes/hermes-agent/tools/environments/modal.pyÚ_snapshot_storer      s   € ô ÓÐ5Ñ5Ð5r   c                  ó(   — t        t        «       «      S ©N)r	   r   r   r   r   Ú_load_snapshotsr      s   € ÜœOÓ-Ó.Ð.r   Údatac                 ó,   — t        t        «       | «       y r   )r
   r   )r   s    r   Ú_save_snapshotsr   "   s   € Ü”_Ó&¨Õ-r   Útask_idc                 ó’   — t        «       }d| › �df| dffD ]/  \  }}|j                  |«      }t        |t        «      sŒ(|sŒ+||fc S  y)z\Return (snapshot_id, from_legacy_key); the namespaced key wins over the legacy bare task id.údirect:FT©NF)r   ÚgetÚ
isinstanceÚstr)r   Ú	snapshotsÚkeyÚlegacyÚsnapshot_ids        r   Ú_get_snapshot_restore_candidater*   &   s\   € äÓ!€IØ" 7 )Ð,¨eÐ4°wÀ°oÐFò '‰ˆˆVØ—m‘m CÓ(ˆÜ�k¤3Õ'ªKØ Ð&Ò&ð'ð r   r)   c                 ób   — t        «       }||d| › �<   |j                  | d «       t        |«       y ©Nr!   )r   Úpopr   )r   r)   r&   s      r   Ú_store_direct_snapshotr.   0   s1   € ÜÓ!€IØ%0€I�˜�yÐ!Ñ"Ø‡M�M�'˜4Ô Ü�IÕr   c                 óÊ   — t        «       }d| › �| fD �cg c]  }|j                  |«      �|d ||   fv r|‘Œ  }}|D ]  }|j                  |«       Œ |rt        |«       y y c c}w r,   )r   r#   r-   r   )r   r)   r&   ÚkÚstaler'   s         r   Ú_delete_direct_snapshotr2   7   s†   € ÜÓ!€IØ" 7 )Ð,¨gÐ6ö V�1Ø—‘˜aÓ Ð,°ÀÀyÐQRÁ|Ð@TÑ1Tò ð V€Eð Vàò ˆØ�‰�cÕðáÜ˜	Õ"ð ùò	Vs   ”#A Ú
image_specc                 ó*  ‡ — t        d«       ddl}t        ‰ t        «      s‰ S ‰ j	                  d«      r|j
                  j                  ‰ «      S dg}t        ˆ fd„dD «       «      r|j                  dd«       |j
                  j                  ‰ |¬	«      S )
z°Convert registry references or snapshot ids into Modal image objects. Registry images
    get pip repaired (ensurepip) before Modal's bootstrap; ubuntu/debian also get python3.úterminal.modalr   Nzim-z�RUN rm -rf /usr/local/lib/python*/site-packages/pip* 2>/dev/null; python -m ensurepip --upgrade --default-pip 2>/dev/null || truec              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­wr   )Úlower)Ú.0Úbaser3   s     €r   ú	<genexpr>z'_resolve_modal_image.<locals>.<genexpr>N   s   øè ø€ Ò
G¨$ˆ4�:×#Ñ#Ó%Ô%Ñ
Gùs   ƒ)ÚubuntuÚdebianz^RUN apt-get update -qq && apt-get install -y -qq python3 python3-venv > /dev/null 2>&1 || true)Úsetup_dockerfile_commands)
r   Úmodalr$   r%   Ú
startswithÚImageÚfrom_idÚanyÚinsertÚfrom_registry)r3   Ú_modalÚsetup_commandss   `  r   Ú_resolve_modal_imagerG   A   s‘   ø€ ô Ð$Ô%Ûä�j¤#Ô&ØÐØ×Ñ˜UÔ#Ø�|‰|×#Ñ# JÓ/Ð/ð	JðK€Nô Ó
GÐ2FÔ
GÔGØ×Ñ˜aØlô	nà�<‰<×%Ñ% jÈNÐ%Ó[Ð[r   ÚpayloadÚ
chunk_sizec              ƒ   óp  K  — t        dt        |«      |«      D ]O  }| j                  j                  ||||z    «       | j                  j                  j                  «       ƒ d{  –—†  ŒQ | j                  j                  «        | j                  j                  j                  «       ƒ d{  –—†  y7 ŒM7 Œ­w)z\Write ``payload`` to ``proc.stdin`` in ``chunk_size`` pieces, draining after each, then EOF.r   N)ÚrangeÚlenÚstdinÚwriteÚdrainÚaioÚ	write_eof)ÚprocrH   rI   Úoffsets       r   Ú_stream_stdinrT   T   s“   è ø€ ä˜œ3˜w›<¨Ó4ò %ˆØ�
‰
×Ñ˜ ¨°Ñ(;Ð<Ô=Ø�j‰j×Ñ×"Ñ"Ó$×$Ñ$ð%ð 	‡J�J×ÑÔØ
�*‰*×
Ñ
×
Ñ
Ó
 × Ñ ð 	%øà ús%   ‚A"B6Á$B2Á%AB6Â,B4Â-B6Â4B6c                 óL   — t        | t        «      r| j                  dd¬«      S | S )Nzutf-8Úreplace)Úerrors)r$   ÚbytesÚdecode)Úvalues    r   Ú_as_textr[   ]   s$   € Ü6@ÀÌÔ6Nˆ5�<‰<˜¨	ˆ<Ó2ÐYÐTYÐYr   c                   ó*   — e Zd ZdZd„ Zd„ Zdd„Zd„ Zy)Ú_AsyncWorkerzEBackground thread with its own event loop for async-safe Modal calls.c                 óR   — d | _         d | _        t        j                  «       | _        y r   )Ú_loopÚ_threadÚ	threadingÚEventÚ_started©Úselfs    r   Ú__init__z_AsyncWorker.__init__d   s   € Ø:>ˆŒ
Ø37ˆŒÜ!Ÿ™Ó)ˆ�r   c                 ó´   ‡ — ˆ fd„}t        j                  |d¬«      ‰ _        ‰ j                  j                  «        ‰ j                  j                  d¬«       y )Nc                  óÞ   •— t        j                  «       ‰ _        t        j                  ‰ j                  «       ‰ j                  j                  «        ‰ j                  j                  «        y r   )ÚasyncioÚnew_event_loopr_   Úset_event_looprc   ÚsetÚrun_foreverrd   s   €r   Ú	_run_loopz%_AsyncWorker.start.<locals>._run_loopj   sE   ø€ Ü ×/Ñ/Ó1ˆDŒJÜ×"Ñ" 4§:¡:Ô.Ø�M‰M×ÑÔØ�J‰J×"Ñ"Õ$r   T)ÚtargetÚdaemoné   ©Útimeout)ra   ÚThreadr`   Ústartrc   Úwait)re   rn   s   ` r   ru   z_AsyncWorker.starti   sC   ø€ ô	%ô
 !×'Ñ'¨yÀÔFˆŒØ�‰×ÑÔØ�‰×Ñ 2ÐÕ&r   c                 ór   — ddl m}  ||| j                  «      }|€t        d«      ‚|j	                  |¬«      S )Nr   )Úsafe_schedule_threadsafezAsyncWorker loop is not runningrr   )Úagent.async_utilsrx   r_   ÚRuntimeErrorÚresult)re   Úcorors   rx   Úfutures        r   Úrun_coroutinez_AsyncWorker.run_coroutines   s7   € Ý>á)¨$°·
±
Ó;ˆØˆ>ÜÐ@ÓAÐAØ�}‰} Wˆ}Ó-Ð-r   c                 ó   — | j                   rI| j                   j                  «       r/| j                   j                  | j                   j                  «       | j                  r| j                  j                  d¬«       y y )Né
   rr   )r_   Ú
is_runningÚcall_soon_threadsafeÚstopr`   Újoinrd   s    r   rƒ   z_AsyncWorker.stop{   sS   € Ø�:Š:˜$Ÿ*™*×/Ñ/Ô1Ø�J‰J×+Ñ+¨D¯J©J¯O©OÔ<Ø�<Š<Ø�L‰L×Ñ bÐÕ)ð r   N)iX  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rf   ru   r~   rƒ   r   r   r   r]   r]   a   s   „ ÙOò*ò
'ó.ó*r   r]   c                   ó"  ‡ — e Zd ZdZdZdZdZ	 	 	 d&dededed	e	e
eef      d
edefˆ fd„Zddddœdedededz  dedz  def
d„Zdededdfd„Zdeeeef      ddfd„Zdeddfd„Zdee   ddfd„Zd'd„Zdddd œd!ed"eded#edz  fd$„Zd%„ Zˆ xZS )(ÚModalEnvironmentzµModal cloud execution via native Modal sandboxes: spawn-per-call via _ThreadedProcessHandle
    wrapping async SDK calls, cancel_fn wired to sandbox.terminate for interrupt support.Úheredocé<   i   NÚimageÚcwdrs   Úmodal_sandbox_kwargsÚpersistent_filesystemr   c                 ó@  •‡ ‡‡‡— t         ‰‰ �  ||¬«       ||c‰ _        ‰ _        d x‰ _        ‰ _        t        «       ‰ _        d ‰ _        ‰ j                  rt        ‰ j                  «      nd\  }}|rt        j                  d|d d «       t        d«       dd lŠg Š	 ddlm}	m}
m} t$        j&                  j)                  d„ |	|
|fD «       «      D ]4  }‰j+                  ‰j,                  j/                  |d	   |d
   ¬«      «       Œ6 	 ‰ j                  j5                  «        dt6        dd fˆˆˆˆ fd„}	 	  |t9        |xs |«      «       |r|rt;        ‰ j                  |«       	 t        j                  d‰ j                  «       tC        d„ ‰ jD                  ‰ jF                  ‰ jH                  ‰ jJ                  ¬«      ‰ _        ‰ j                  jM                  d¬«       ‰ jO                  «        y # t0        $ r!}t        j3                  d|«       Y d }~�Œd }~ww xY w# t0        $ rO}|s‚ t        j=                  d|d d |«       t?        ‰ j                  |«        |t9        |«      «       Y d }~�Œd }~ww xY w# t0        $ r ‰ j                  jA                  «        ‚ w xY w)N)rŽ   rs   r"   z!Modal: restoring from snapshot %sé   r5   r   )Úget_credential_file_mountsÚiter_skills_filesÚiter_cache_filesc              3   ó*   K  — | ]  } |«       –— Œ y ­wr   r   )r8   Úfns     r   r:   z,ModalEnvironment.__init__.<locals>.<genexpr>ž   s   è ø€ ò 7fØ‘B—Dñ7fùs   ‚Ú	host_pathÚcontainer_path)Úremote_pathz0Modal: could not load credential file mounts: %sr3   r   c                 óv   •‡ — ˆˆˆ ˆfd„}‰j                   j                   |«       d¬«      \  ‰_        ‰_        y )Nc               “   óv  •K  — ‰j                   j                  j                  dd¬«      ƒ d {  –—† } t        ‰xs i «      }‰r!t	        |j                  dg «      «      ‰z   |d<    ‰j                  j                  j                  	 d‰| t        |j                  dd«      «      dœ|¤Žƒ d {  –—† }| |fS 7 Œ†7 Œ
­w)	Nzhermes-agentT)Úcreate_if_missingÚmountsrs   i  )r�   Úapprs   )ÚsleepÚinfinity)	ÚAppÚlookuprP   ÚdictÚlistr-   ÚSandboxÚcreateÚint)rŸ   Úcreate_kwargsÚsandboxrE   Úcred_mountsr3   r�   s      €€€€r   Ú_create_sandboxzCModalEnvironment.__init__.<locals>._create.<locals>._create_sandbox§   sÇ   øè ø€ Ø"ŸJ™J×-Ñ-×1Ñ1°.ÐTXÐ1ÓY×Y�Ü $Ð%9Ò%?¸RÓ @�ÙÜ.2°=×3DÑ3DÀXÈrÓ3RÓ.SÐVaÑ.a�M (Ñ+Ø 9 §¡× 5Ñ 5× 9Ñ 9Ø'ð!VØ/9¸sÜ × 1Ñ 1°)¸TÓ BÓCñ!VàGTñ!V÷ V�ð ˜G�|Ð#ð ZøðVús"   ƒ+B9®B5¯A=B9Â,B7Â-	B9Â7B9i,  rr   )Ú_workerr~   Ú_appÚ_sandbox)r3   r¬   rE   r«   r�   re   s   ` €€€€r   Ú_createz*ModalEnvironment.__init__.<locals>._create¦   s0   ù€ ÷$ð (,§|¡|×'AÑ'AÁ/ÓBSÐ]`Ð'AÓ'aÑ$ˆDŒI�t•}r   zBModal: failed to restore snapshot %s, retrying with base image: %sz Modal: sandbox created (task=%s)c                  ó   — t        d«      S )Nz/root/.hermes)r   r   r   r   ú<lambda>z+ModalEnvironment.__init__.<locals>.<lambda>Ã   s   € ¤°Ó!A€ r   )Úget_files_fnÚ	upload_fnÚ	delete_fnÚbulk_upload_fnÚbulk_download_fnT)Úforce)(Úsuperrf   Ú_persistentÚ_task_idr¯   r®   r]   r­   Ú_sync_managerr*   ÚloggerÚinfor   r>   Útools.credential_filesr“   r”   r•   Ú	itertoolsÚchainÚfrom_iterableÚappendÚMountÚfrom_local_fileÚ	ExceptionÚdebugru   r   rG   r.   Úwarningr2   rƒ   r   Ú_modal_uploadÚ_modal_deleteÚ_modal_bulk_uploadÚ_modal_bulk_downloadÚsyncÚinit_session)re   r�   rŽ   rs   r�   r�   r   Úrestored_snapshot_idÚrestored_from_legacy_keyr“   r”   r•   ÚentryÚer°   ÚexcrE   r«   Ú	__class__s   `   `           @@€r   rf   zModalEnvironment.__init__Œ   s{  ü€ ô 	‰Ñ˜S¨'ÐÔ2Ø*?ÀÐ'ˆÔ˜$œ-Ø$(Ð(ˆŒ˜œ	Ü#“~ˆŒØ59ˆÔà>B×>NÒ>NÔ+¨D¯M©MÔ:ÐTañ 	7ÐÐ6áÜ�K‰KÐ;Ð=QÐRUÐSUÐ=VÔWÜÐ(Ô)ÛØˆð	PßnÑnä"Ÿ™×6Ñ6ñ 7fØ$>Ð@QÐScÐ#dô7fó fò k�à×"Ñ"Ø—L‘L×0Ñ0°°{Ñ1CÐQVÐWgÑQhÐ0Óiõkñkð 	�‰×ÑÔð
	b¤ð 
	b¨÷ 
	bð 
	bð	ðPÙÔ,Ð-AÒ-JÀUÓKÔLñ (Ñ,DÜ*¨4¯=©=Ð:NÕOô 	�‰Ð6¸¿¹ÔFÜ,ÙAØ×(Ñ(°D×4FÑ4FØ×2Ñ2ÀT×E^ÑE^ô`ˆÔð 	×Ñ×Ñ dÐÔ+Ø×ÑÕøôK ò 	PÜ�L‰LÐKÈQ×OÒOûð	Pûô$ ò 5Ù+ØÜ—‘ÐcØ3°C°RÐ8¸#ô?ä'¨¯©Ð7KÔLÙÔ,¨UÓ3×4Ò4ûð5ûô ò 	Ø�L‰L×ÑÔØð	úsJ   ÂA*G0 Ä5H Å
I8 Ç0	HÇ9HÈHÈ	I5È&AI0É*I8 É0I5É5I8 É8%JF)rM   Ú
fail_labelÚcaptureÚcmdrM   rÕ   rÖ   c                ób   ‡ ‡‡‡‡— ˆˆˆˆ ˆfd„}‰ j                   j                   |«       |¬«      S )z¿Run ``bash -c cmd`` in the sandbox. ``stdin`` is streamed in chunks; ``capture`` returns
        stdout; ``fail_label`` turns a non-zero exit into RuntimeError (with stderr unless capturing).c               “   ó  •K  — ‰j                   j                  j                  dd‰«      ƒ d {  –—† } ‰�t        | ‰‰j                  «      ƒ d {  –—†  ‰r,| j
                  j                  j                  «       ƒ d {  –—† nd }| j                  j                  «       ƒ d {  –—† }‰rL|dk7  rG‰rdn.d| j                  j                  j                  «       ƒ d {  –—† › �}t        d‰› d|› d|› �«      ‚|S 7 ŒÇ7 Œ¨7 Œ|7 ŒZ7 Œ$­w)	NÚbashz-cr   Ú z: zModal z failed (exit ú))
r¯   ÚexecrP   rT   Ú_STDIN_CHUNK_SIZEÚstdoutÚreadrv   Ústderrrz   )	rR   r   Ú	exit_codeÚdetailrÖ   r×   rÕ   re   rM   s	       €€€€€r   Ú_runz$ModalEnvironment._exec.<locals>._runÍ   sæ   øè ø€ ØŸ™×+Ñ+×/Ñ/°¸¸cÓB×BˆDØÐ Ü# D¨%°×1GÑ1GÓH×HÐHÙ3:˜Ÿ™×)Ñ)×-Ñ-Ó/×/Ð/ÀˆDØ"Ÿi™iŸm™m›o×-ˆIÙ˜i¨1šnÙ&™¨b°t·{±{×7GÑ7G×7KÑ7KÓ7M×1MÐ0NÐ,O�Ü" V¨J¨<°~ÀiÀ[ÐPQÐRXÐQYÐ#ZÓ[Ð[ØˆKð CøàHøØ/øØ-øà1MúsW   ƒ+D ®C6¯ D ÁC8Á-D Á=C:Á>#D Â!C<Â"7D ÃC>ÃD Ã8D Ã:D Ã<D Ã>D rr   )r­   r~   )re   r×   rs   rM   rÕ   rÖ   rä   s   `` ``` r   Ú_execzModalEnvironment._execÉ   s+   ü€ ÷		ð 		ð �|‰|×)Ñ)©$«&¸'Ð)ÓBÐBr   r˜   rš   r   c                 ó2  — dt        j                  t        t        |«      j                  «      «      › dt        j                  |«      › �}| j                  |t        j                  t        |«      j                  «       «      j                  d«      d¬«       y)z4Upload a single file via base64 piped through stdin.z	mkdir -p z && base64 -d > Úasciirq   )rM   rs   N)
ÚshlexÚquoter%   r   Úparentrå   Úbase64Ú	b64encodeÚ
read_bytesrY   )re   r˜   rš   r×   s       r   rÉ   zModalEnvironment._modal_uploadÙ   st   € àœ%Ÿ+™+¤c¬$¨{Ó*;×*BÑ*BÓ&CÓDÐEÐEUÔV[×VaÑVaÐbmÓVnÐUoÐpˆØ�
‰
�3œf×.Ñ.¬t°I«×/IÑ/IÓ/KÓL×SÑSÐT[Ó\Ðfhˆ
Õir   Úfilesc                 ó   — |syt        j                  «       }t        j                  |d¬«      5 }|D ]'  \  }}|j	                  ||j                  d«      ¬«       Œ) 	 ddd«       t        j                  |j                  «       «      j                  d«      }t        t        |«      «      › d�}| j                  ||dd	¬
«       y# 1 sw Y   ŒhxY w)z–Upload many files as one in-memory gzipped tar streamed through stdin
        into ``base64 -d | tar xzf -``, avoiding the SDK's 64 KB exec-arg limit.Nzw:gz)ÚfileobjÚmodeú/)Úarcnamerç   z && base64 -d | tar xzf - -C /éx   zbulk upload)rM   rs   rÕ   )ÚioÚBytesIOÚtarfileÚopenÚaddÚlstriprë   rì   ÚgetvaluerY   r   r   rå   )re   rî   ÚbufÚtarr˜   rš   rH   r×   s           r   rË   z#ModalEnvironment._modal_bulk_uploadÞ   s¿   € ñ ØÜ�j‰j‹lˆÜ�\‰\ #¨FÔ3ð 	D°sØ*/ò DÑ&�	˜;Ø—‘˜	¨;×+=Ñ+=¸cÓ+B�ÕCñD÷	Dô ×"Ñ" 3§<¡<£>Ó2×9Ñ9¸'ÓBˆÜ%Ô&8¸Ó&?Ó@ÐAÐA_Ð`ˆØ�
‰
�3˜g¨s¸}ˆ
ÕM÷	Dð 	Dús   ¯-CÃCÚdestc                 óš   — | j                  dddd¬«      }|j                  t        |t        «      r|j	                  «       «       y|«       y)zTDownload remote .hermes/ as a tar archive (sandboxes run as root, so /root/.hermes).z-tar cf - --exclude='*.sock' -C / root/.hermesrô   zbulk downloadT)rs   rÕ   rÖ   N)rå   Úwrite_bytesr$   r%   Úencode)re   rþ   r   s      r   rÌ   z%ModalEnvironment._modal_bulk_downloadë   sG   € ð �z‰zÐIÐSVÐcrð  }Aˆzó  BˆØ×Ñ¬*°T¼3Ô*?˜Ÿ™›ÕJÀTÕJr   Úremote_pathsc                 ó<   — | j                  t        |«      d¬«       y ©Né   rr   )rå   r   )re   r  s     r   rÊ   zModalEnvironment._modal_deleteñ   s   € Ø�
‰
Ô$ \Ó2¸Bˆ
Õ?r   c                 ó8   — | j                   j                  «        y r   )r¼   rÍ   rd   s    r   Ú_before_executez ModalEnvironment._before_executeô   s   € Ø×Ñ×ÑÕ!r   rô   )Úloginrs   Ú
stdin_dataÚ
cmd_stringr  r	  c                óž   ‡‡‡‡‡— | j                   | j                  cŠŠˆˆfd„}dt        t        t        f   fˆˆˆˆˆfd„}t        ||¬«      S )Nc                  ó\   •— ‰j                  ‰ j                  j                  «       d¬«       y r  )r~   Ú	terminaterP   )rª   Úworkers   €€r   Úcancelz*ModalEnvironment._run_bash.<locals>.cancelú   s%   ø€ Ø× Ñ  ×!2Ñ!2×!6Ñ!6Ó!8À"Ð ÕEr   r   c                  óJ   •— ˆˆˆˆfd„} ‰j                   | «       ‰dz   ¬«      S )Nc               “   óÈ  •K  —  ‰j                   j                  t        ‰‰«      d‰iŽƒ d {  –—† } t        | j                  j
                  j                  «       ƒ d {  –—† «      }t        | j                  j
                  j                  «       ƒ d {  –—† «      }| j                  j                  «       ƒ d {  –—† }dj                  d„ ||fD «       «      |fS 7 Œ¬7 Œ}7 ŒJ7 Œ&­w)Nrs   Ú
c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wr   r   )r8   Úparts     r   r:   zKModalEnvironment._run_bash.<locals>.exec_fn.<locals>._do.<locals>.<genexpr>  s   è ø€ Ò K¨$Âd¤Ñ Kùs   ‚Š)	rÝ   rP   r   r[   rß   rà   rá   rv   r„   )Úprocessrß   rá   râ   r
  r  rª   rs   s       €€€€r   Ú_doz8ModalEnvironment._run_bash.<locals>.exec_fn.<locals>._doþ   s³   øè ø€ Ø 0 §¡× 0Ñ 0´)¸JÈÓ2NÐ `ÐX_Ñ `×`�Ü!¨¯©×(;Ñ(;×(?Ñ(?Ó(A×"AÓB�Ü!¨¯©×(;Ñ(;×(?Ñ(?Ó(A×"AÓB�Ø")§,¡,×"2Ñ"2Ó"4×4�	Ø—y‘yÑ K°6¸6Ð2BÔ KÓKÈYÐVÐVð	 aøØ"AøØ"AøØ4úsE   ƒ*C"­C®0C"ÁCÁ4C"ÂCÂ%C"Â9C Â:!C"ÃC"ÃC"Ã C"rq   rr   )r~   )r  r
  r  rª   rs   r  s    €€€€€r   Úexec_fnz+ModalEnvironment._run_bash.<locals>.exec_fný   s'   ø€ ÷Wð ×'Ñ'©«°wÀ±|Ð'ÓDÐDr   )Ú	cancel_fn)r¯   r­   Útupler%   r¨   r   )	re   r
  r  rs   r	  r  r  rª   r  s	    ```   @@r   Ú	_run_bashzModalEnvironment._run_bash÷   sG   ü€ ØŸ-™-¨¯©ˆˆ�õ	Fð	Eœœs¤C˜x™÷ 	Eñ 	Eô & g¸Ô@Ð@r   c                 ó:  ‡ — ‰ j                   €y‰ j                  r/t        j                  d«       ‰ j                  j	                  «        ‰ j
                  reˆ fd„}	 ‰ j                  j                   |«       d¬«      }|r;	 t        ‰ j                  |«       t        j                  d|dd ‰ j                  «       	 ‰ j                  j                  ‰ j                   j                  j                  «       d	¬«       ‰ j                  j                  «        dx‰ _         ‰ _        y# t        $ r d}Y Œ³w xY w# t        $ r }t        j                  d|«       Y d}~Œžd}~ww xY w# t        $ r Y Œqw xY w# ‰ j                  j                  «        dx‰ _         ‰ _        w xY w)
z>Snapshot the filesystem (if persistent) then stop the sandbox.Nz$Modal: syncing files from sandbox...c               “   ó|   •K  — ‰ j                   j                  j                  «       ƒ d {  –—† j                  S 7 Œ­wr   )r¯   Úsnapshot_filesystemrP   Ú	object_idrd   s   €r   Ú	_snapshotz+ModalEnvironment.cleanup.<locals>._snapshot  s,   øè ø€ Ø"Ÿm™m×?Ñ?×CÑCÓE×E×PÑPÐPÐEús   ƒ(<«:¬<rŒ   rr   z/Modal: saved filesystem snapshot %s for task %sr’   z%Modal: filesystem snapshot failed: %sr  )r¯   r¼   r½   r¾   Ú	sync_backrº   r­   r~   rÆ   r.   r»   rÈ   r  rP   rƒ   r®   )re   r  r)   rÒ   s   `   r   ÚcleanupzModalEnvironment.cleanup  s`  ø€ à�=‰=Ð ØØ×ÒÜ�K‰KÐ>Ô?Ø×Ñ×(Ñ(Ô*Ø×ÒôQð#Ø"Ÿl™l×8Ñ8¹»ÈbÐ8ÓQ�ñ ðOÜ*¨4¯=©=¸+ÔFÜ—K‘KÐ QÐS^Ð_bÐ`bÐScÐei×erÑerÔsð	-Ø�L‰L×&Ñ& t§}¡}×'>Ñ'>×'BÑ'BÓ'DÈbÐ&ÔQð �L‰L×ÑÔØ(,Ð,ˆDŒM˜D�Iøô ò #Ø"’ð#ûô !ò OÜ—N‘NÐ#JÈA×NÑNûðOûô ò 	Ùð	ûð �L‰L×ÑÔØ(,Ð,ˆDŒM˜D�IúsN   Á"D$ Â:D5 Â<?E! Ä$D2Ä1D2Ä5	EÄ>EÅEÅ!	E-Å*E0 Å,E-Å-E0 Å0*F)z/rootrŒ   NTÚdefault)r   N)r…   r†   r‡   rˆ   Ú_stdin_modeÚ_snapshot_timeoutrÞ   r%   r¨   r   r¤   r   Úboolrf   rå   rÉ   r¥   r  rË   r   rÌ   rÊ   r  r  r!  Ú__classcell__)rÔ   s   @r   rŠ   rŠ   ‚   sb  ø„ ñ]ð €KØÐð (ÐàFHØBFØDMñ;˜cð ;¨ð ;Àð ;Ø'/°°S¸#°X±Ñ'?ð;à(,ð;à>Aõ;ðz DHÐbfØ#òC˜ð C¨#ð C°c¸D±jð CÐUXÐ[_ÑU_ð CØóCð j sð j¸ð jÀó jð
N¨¨U°3¸°8©_Ñ(=ð NÀ$ó NðK¨ð K°$ó Kð@¨$¨s©)ð @¸ó @ó"ð ;@ÐPSÐnrò A Cð A°4ð AÈ#ð AÐadÐgkÑakó Aö -r   rŠ   r   )2rˆ   ri   rë   rõ   rÀ   Úloggingrè   r÷   ra   Úpathlibr   Útypingr   r   Úhermes_constantsr   Útools.environments.baser   r	   r
   Útools.environments.base_outputr   Útools.environments.file_syncr   r   r   r   r   Ú tools.environments.remote_commonr   r   Ú	getLoggerr…   r½   r   r¤   r   r   r%   r  r%  r*   r.   r2   rG   r¨   rT   r[   r]   rŠ   r   r   r   ú<module>r0     s3  ðñZó Û Û 	Û Û Û Û Û Ý ß  å ,ß WÑ WÝ A÷cõ cç Gà	ˆ×	Ñ	˜8Ó	$€ð6˜ó 6ð/˜ó /ð.˜$ð . 4ó .ð¨Sð °U¸3À¹:ÀtÐ;KÑ5Ló ð Cð °cð ¸dó ñ# Sð #°s¸T±zð #ÈTó #ð\ Sð \¨Só \ð&! sð !¸ð !Àó !ðZ�só Z÷*ñ *ôB_-�õ _-r   